On Mon, Aug 30, 2010, Goran Rakic wrote:

> ?? ??????, 29. 08 2010. ?? 04:17 +0200, Mounir IDRASSI ????????:
> >
> > After some digging, I found that part of the problem is caused by the 
> > functions c2i_ASN1_INTEGER and d2i_ASN1_UINTEGER in file 
> > crypto\asn1\a_int.c. At lines 244 and 314, there is an if block that 
> > removes any leading zeros. Commenting out these blocks solves the DER 
> > encoding mismatch but the verification still fails because the computed 
> > digest is different from the recovered one.
> 
> Thank you, I can confirm that your suggestion is working.
> 
> Applying a patch that you described does solve a problem for me. The
> MUPCAGradjani certificate can be verified against the MUPCARoot, as well
> as certificates issued by the MUPCAGradjani, like the two personal
> certificates I have on my eID card. I had to reconvert DER to PEM with
> patched openssl to get PEM certificates with "correct" serial number
> encoding.
> 
> I read the other messages in this thread, but I am not an expert in the
> field so I do not know if openssl should add a support for "incorrect"
> serial numbers. In RFC 3280 there is a note about "Non-conforming CAs"
> where section "4.1.2.2 Serial number" is saying that "certificate users
> SHOULD be prepared to gracefully handle such certificates". Maybe the
> note can apply in this case?
> 
> What I do know is that without a patch openssl can not be used with
> certificates issued on a Serbian national eID card. At least one other
> Serbian CA is hit by the same problem (http://ca.pks.rs/certs/) where
> PKI solution was provided by a same company.
> 
> I have published patched openssl package for Ubuntu GNU/Linux
> distribution in my Ubuntu PPA at:
> https://launchpad.net/~grakic/+archive/serbian-eid
> 

I wouldn't advise changing the code in that way (FYI I wrote it). The normal
workaround in OpenSSL for broken encodings is to use the original encoding
by caching it. The attached three line patch adds this workaround for
certificates.

Steve.
--
Dr Stephen N. Henson. OpenSSL project core developer.
Commercial tech support now available see: http://www.openssl.org
Index: crypto/asn1/x_x509.c
===================================================================
RCS file: /v/openssl/cvs/openssl/crypto/asn1/x_x509.c,v
retrieving revision 1.29
diff -u -r1.29 x_x509.c
--- crypto/asn1/x_x509.c        8 Aug 2008 15:35:27 -0000       1.29
+++ crypto/asn1/x_x509.c        29 Aug 2010 23:08:35 -0000
@@ -63,7 +63,7 @@
 #include <openssl/x509.h>
 #include <openssl/x509v3.h>
 
-ASN1_SEQUENCE(X509_CINF) = {
+ASN1_SEQUENCE_enc(X509_CINF, enc, 0) = {
        ASN1_EXP_OPT(X509_CINF, version, ASN1_INTEGER, 0),
        ASN1_SIMPLE(X509_CINF, serialNumber, ASN1_INTEGER),
        ASN1_SIMPLE(X509_CINF, signature, X509_ALGOR),
@@ -74,7 +74,7 @@
        ASN1_IMP_OPT(X509_CINF, issuerUID, ASN1_BIT_STRING, 1),
        ASN1_IMP_OPT(X509_CINF, subjectUID, ASN1_BIT_STRING, 2),
        ASN1_EXP_SEQUENCE_OF_OPT(X509_CINF, extensions, X509_EXTENSION, 3)
-} ASN1_SEQUENCE_END(X509_CINF)
+} ASN1_SEQUENCE_END_enc(X509_CINF, X509_CINF)
 
 IMPLEMENT_ASN1_FUNCTIONS(X509_CINF)
 /* X509 top level structure needs a bit of customisation */
Index: crypto/x509/x509.h
===================================================================
RCS file: /v/openssl/cvs/openssl/crypto/x509/x509.h,v
retrieving revision 1.171
diff -u -r1.171 x509.h
--- crypto/x509/x509.h  14 Mar 2010 12:52:38 -0000      1.171
+++ crypto/x509/x509.h  29 Aug 2010 23:04:30 -0000
@@ -258,6 +258,7 @@
        ASN1_BIT_STRING *issuerUID;             /* [ 1 ] optional in v2 */
        ASN1_BIT_STRING *subjectUID;            /* [ 2 ] optional in v2 */
        STACK_OF(X509_EXTENSION) *extensions;   /* [ 3 ] optional in v3 */
+       ASN1_ENCODING enc;
        } X509_CINF;
 
 /* This stuff is certificate "auxiliary info"

Reply via email to