Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6598154

api/javax_xml/crypto/dsig/XMLSignature/index.html#methods[Signature2011] fails since JDK 7 b16

XMLWordPrintable

    • b21
    • generic
    • generic
    • Verified

        JCK 6b b04
        FAIL: JDK 7 b16 PASS JDK 7 b15; JDK6u4 b02

        JCK test api/javax_xml/crypto/dsig/XMLSignature/index.html#methods[Signature2011] fails since JDK 7 b16. The problem is an internal implementation of XMLSignature violates statement from documentation:
        "Throws:
            ClassCastException - if the type of validateContext is not compatible with this XMLSignature
            NullPointerException - if validateContext is null "
        and throws NPE even if validateContext is not null.

        Steps to reproduce:

        compile and run the following example:

        import java.io.PrintWriter;
        import java.security.InvalidAlgorithmParameterException;
        import java.security.NoSuchAlgorithmException;
        import java.security.spec.AlgorithmParameterSpec;
        import java.util.Collections;
        import java.util.List;
        import java.util.Vector;
        import javax.xml.crypto.*;
        import javax.xml.crypto.dsig.*;
        import javax.xml.crypto.dsig.keyinfo.*;
        import javax.xml.crypto.dsig.spec.*;


        public class Crypto2 {

            public class MyXMLContext implements XMLValidateContext, XMLSignContext {
            
                MyXMLContext() {
                }
                
                public String getBaseURI() {
                    return null;
                }

                public void setBaseURI(String baseURI) {
                }

                public KeySelector getKeySelector() {
                    return null;
                }

                public void setKeySelector(KeySelector ks) {
                }

                public URIDereferencer getURIDereferencer() {
                    return null;
                }

                public void setURIDereferencer(URIDereferencer dereferencer) {
                }

                public Object get(Object key) {
                    return null;
                }

                public Object getProperty(String name) {
                    return null;
                }

                public Object put(Object key, Object value) {
                    return null;
                }

                public Object setProperty(String name, Object value) {
                    return null;
                }
                
                public String getDefaultNamespacePrefix() {
                    return null;
                }
                
                public void setDefaultNamespacePrefix(String defaultPrefix) {
                
                }
                
                public String putNamespacePrefix(String namespaceURI,
                                         String prefix) {
                    return null;
                }
                
                public String getNamespacePrefix(String namespaceURI,
                                         String defaultPrefix) {
                    return "";
                }
                
                
            }
            

            protected XMLSignatureFactory getCurrentXMLFactory()
        {
        try {
        return XMLSignatureFactory.getInstance();
        } catch (Exception e) {
        e.printStackTrace();
        System.exit(1);
        return null;
        }

            }

            protected XMLSignature getXMLSignature() {
            try {
                XMLSignatureFactory xmlSignatureFactory = getCurrentXMLFactory();
                DigestMethod dm = xmlSignatureFactory.newDigestMethod(DigestMethod.SHA1, (DigestMethodParameterSpec) null);
                Reference ref1 = xmlSignatureFactory.newReference("", dm);
                CanonicalizationMethod cm = xmlSignatureFactory.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE,(C14NMethodParameterSpec) null);
                SignatureMethod sm = xmlSignatureFactory.newSignatureMethod(SignatureMethod.DSA_SHA1, (SignatureMethodParameterSpec) null);
                SignedInfo si = xmlSignatureFactory.newSignedInfo(cm, sm, Collections.singletonList(ref1));
                KeyInfoFactory keyFactory = xmlSignatureFactory.getKeyInfoFactory();
                KeyInfo keyInfo = keyFactory.newKeyInfo (Collections.singletonList(keyFactory.newKeyName("mykey")), "myinfo");
                return xmlSignatureFactory.newXMLSignature(si, keyInfo);
                } catch (Exception e) {
                    System.out.println("Unexpected " + e);
                }
        System.exit(1);
                return null;
            }

            /* standalone interface */
            public static void main(String argv[]) {
                Crypto2 test = new Crypto2();
        test.Signature2011();
                
            }

            /**
             * Assertion testing
             * for public boolean validate(XMLValidateContext validateContext) throws XMLSignatureException,
             * ClassCastException will be thrown if the type of validateContext is not compatible with this XMLSignature.
             */
            public void Signature2011() {
                XMLSignature xmlSig = getXMLSignature();
                if (xmlSig != null) {
                    try {
                        xmlSig.validate(new MyXMLContext());
                        System.out.println("ClassCastException was not thrown ");
                    } catch (ClassCastException e) {
                        e.printStackTrace();
                    } catch (XMLSignatureException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

        for different versions of JDK it will return different output:
        for build 16:
        C:\tests\crypto2>Z:\Links\stt\jdk_promotions\JDK7.0\b16\binaries\windows-i586\jdk1.7.0\bin\java.exe -cp . Crypto2
        Exception in thread "main" java.lang.NullPointerException
                at org.jcp.xml.dsig.internal.dom.DOMXMLSignature$DOMSignatureValue.validate(DOMXMLSignature.java:516)
                at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.validate(DOMXMLSignature.java:248)
                at Crypto2.Signature2011(Crypto2.java:126)
                at Crypto2.main(Crypto2.java:113)

        for build 15:
        C:\tests\crypto2>Z:\Links\stt\jdk_promotions\JDK7.0\b15\binaries\windows-i586\jdk1.7.0\bin\java.exe -cp . Crypto2
        java.lang.ClassCastException: Crypto2$MyXMLContext cannot be cast to javax.xml.crypto.dom.DOMCryptoContext
                at org.jcp.xml.dsig.internal.dom.DOMURIDereferencer.dereference(DOMURIDereferencer.java:71)
                at org.jcp.xml.dsig.internal.dom.DOMReference.dereference(DOMReference.java:366)
                at org.jcp.xml.dsig.internal.dom.DOMReference.validate(DOMReference.java:333)
                at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.validate(DOMXMLSignature.java:252)
                at Crypto2.Signature2011(Crypto2.java:126)
                at Crypto2.main(Crypto2.java:113)

              mullan Sean Mullan
              pastepan Pavel Stepanov (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

                Created:
                Updated:
                Resolved:
                Imported:
                Indexed: