From 3117a104d7e3b8fabd6aef5882925081fa281d2f Mon Sep 17 00:00:00 2001 From: "Neil A. Wilson" Date: Mon, 4 Dec 2017 12:10:07 -0600 Subject: [PATCH] Fix certificate and CSR signature bugs Fixed a pretty serious bug in the way that the LDAP SDK generated and verified signatures in X.509 certificates and PKCS #10 certificate signing requests. --- .../cert/PKCS10CertificateSigningRequest.java | 40 +++--------------- .../util/ssl/cert/X509Certificate.java | 42 ++----------------- 2 files changed, 10 insertions(+), 72 deletions(-) diff --git a/src/com/unboundid/util/ssl/cert/PKCS10CertificateSigningRequest.java b/src/com/unboundid/util/ssl/cert/PKCS10CertificateSigningRequest.java index 5cd4ab620..8c5b680e5 100644 --- a/src/com/unboundid/util/ssl/cert/PKCS10CertificateSigningRequest.java +++ b/src/com/unboundid/util/ssl/cert/PKCS10CertificateSigningRequest.java @@ -880,7 +880,7 @@ private static ASN1BitString generateSignature( requestInfoElements.add(new ASN1Set(TYPE_ATTRIBUTES, attrElements)); final byte[] certificationRequestInfoBytes = - new ASN1Sequence(requestInfoElements).getValue(); + new ASN1Sequence(requestInfoElements).encode(); signature.update(certificationRequestInfoBytes); final byte[] signatureBytes = signature.sign(); @@ -1206,39 +1206,11 @@ public void verifySignature() final boolean signatureIsValid; try { - final ArrayList requestInfoElements = new ArrayList<>(4); - requestInfoElements.add(new ASN1Integer(version.getIntValue())); - requestInfoElements.add(X509Certificate.encodeName(subjectDN)); - - if (publicKeyAlgorithmParameters == null) - { - requestInfoElements.add(new ASN1Sequence( - new ASN1Sequence( - new ASN1ObjectIdentifier(publicKeyAlgorithmOID)), - encodedPublicKey)); - } - else - { - requestInfoElements.add(new ASN1Sequence( - new ASN1Sequence( - new ASN1ObjectIdentifier(publicKeyAlgorithmOID), - publicKeyAlgorithmParameters), - encodedPublicKey)); - } - - final ArrayList attrElements = - new ArrayList<>(requestAttributes.size()); - for (final ObjectPair p : requestAttributes) - { - attrElements.add(new ASN1Sequence( - new ASN1ObjectIdentifier(p.getFirst()), - p.getSecond())); - } - requestInfoElements.add(new ASN1Set(TYPE_ATTRIBUTES, attrElements)); - - final byte[] certificationRequestInfoBytes = - new ASN1Sequence(requestInfoElements).getValue(); - signature.update(certificationRequestInfoBytes); + final ASN1Element[] requestInfoElements = + ASN1Sequence.decodeAsSequence( + pkcs10CertificateSigningRequestBytes).elements(); + final byte[] requestInfoBytes = requestInfoElements[0].encode(); + signature.update(requestInfoBytes); signatureIsValid = signature.verify(signatureValue.getBytes()); } catch (final Exception e) diff --git a/src/com/unboundid/util/ssl/cert/X509Certificate.java b/src/com/unboundid/util/ssl/cert/X509Certificate.java index 1020289d7..3474e756e 100644 --- a/src/com/unboundid/util/ssl/cert/X509Certificate.java +++ b/src/com/unboundid/util/ssl/cert/X509Certificate.java @@ -1621,7 +1621,7 @@ private static ASN1BitString generateSignature( new ASN1Sequence(extensionElements).encode())); final byte[] tbsCertificateBytes = - new ASN1Sequence(tbsCertificateElements).getValue(); + new ASN1Sequence(tbsCertificateElements).encode(); signature.update(tbsCertificateBytes); final byte[] signatureBytes = signature.sign(); @@ -2035,43 +2035,9 @@ public void verifySignature(final X509Certificate issuerCertificate) // signature. try { - final ArrayList tbsCertificateElements = new ArrayList<>(8); - tbsCertificateElements.add(new ASN1Element(TYPE_EXPLICIT_VERSION, - new ASN1Integer(version.getIntValue()).encode())); - tbsCertificateElements.add(new ASN1BigInteger(serialNumber)); - tbsCertificateElements.add(new ASN1Sequence( - new ASN1ObjectIdentifier(signatureAlgorithm.getOID()))); - tbsCertificateElements.add(encodeName(issuerDN)); - tbsCertificateElements.add(encodeValiditySequence(notBefore, notAfter)); - tbsCertificateElements.add(encodeName(subjectDN)); - - if (publicKeyAlgorithmParameters == null) - { - tbsCertificateElements.add(new ASN1Sequence( - new ASN1Sequence( - new ASN1ObjectIdentifier(publicKeyAlgorithmOID)), - encodedPublicKey)); - } - else - { - tbsCertificateElements.add(new ASN1Sequence( - new ASN1Sequence( - new ASN1ObjectIdentifier(publicKeyAlgorithmOID), - publicKeyAlgorithmParameters), - encodedPublicKey)); - } - - final ArrayList extensionElements = - new ArrayList<>(extensions.size()); - for (final X509CertificateExtension e : extensions) - { - extensionElements.add(e.encode()); - } - tbsCertificateElements.add(new ASN1Element(TYPE_EXPLICIT_EXTENSIONS, - new ASN1Sequence(extensionElements).encode())); - - final byte[] tbsCertificateBytes = - new ASN1Sequence(tbsCertificateElements).getValue(); + final ASN1Element[] x509CertificateElements = + ASN1Sequence.decodeAsSequence(x509CertificateBytes).elements(); + final byte[] tbsCertificateBytes = x509CertificateElements[0].encode(); signature.update(tbsCertificateBytes); } catch (final Exception e)