Hi list,

Please Cc: me when replying.

I've coded the following function (in Postfix FWIW).  Nothing tricky:

% char   *tls_serial_number(X509 *peer)
% {
%         ASN1_INTEGER *sn;
%         BIGNUM bn;
%         char *bnstr, *snstr;
%         size_t len;
% 
%         if ((sn = X509_get_serialNumber(peer)) == 0)
%                 return (0);
%         ASN1_INTEGER_to_BN(sn, &bn);
%         if ((bnstr = BN_bn2hex(&bn)) == NULL)
%             msg_fatal("insufficient memory for bignum stringification: %m");
%         snstr = mystrdup(bnstr);
%         OPENSSL_free(bnstr);
%         return (snstr);
% }

Unfortunately, ASN1_INTEGER_to_BN() happens to trigger a SEGFAULT.
Here is the trace from gdb(1):

% (gdb) bt
% #0  0x281cf1c8 in BN_new () from /lib/libcrypto.so.4
% #1  0x281cf2c5 in bn_expand2 () from /lib/libcrypto.so.4
% #2  0x281cf6cb in BN_bin2bn () from /lib/libcrypto.so.4
% #3  0x281c93c9 in ASN1_INTEGER_to_BN () from /lib/libcrypto.so.4
% #4  0x0805e106 in tls_serial_number (peer=0x80b1700) at tls_verify.c:332
% #5  0x0805cf55 in tls_server_start (props=0xbfbfe280) at tls_server.c:682
% #6  0x080501be in smtpd_start_tls (state=0xbfbfe320) at smtpd.c:3569
% #7  0x0805038b in starttls_cmd (state=0xbfbfe320, argc=1,
%     unused_argv=0x809fe48) at smtpd.c:3699
% #8  0x08050a81 in smtpd_proto (state=0xbfbfe320) at smtpd.c:4022
% #9  0x08050ecd in smtpd_service (stream=0x80b2608, service=0xbfbfef2d "smtp",
%     argv=0xbfbfe280) at smtpd.c:4149
% #10 0x0805ae2a in single_server_wakeup (fd=134933256) at single_server.c:257
% #11 0x08074c96 in event_loop (delay=-1077942944) at events.c:1080
% #12 0x0805b62c in single_server_main (argc=8, argv=0xbfbfee74,
%     service=0x8050de8 <smtpd_service>) at single_server.c:722
% #13 0x080515d1 in main (argc=8, argv=0xbfbfee74) at smtpd.c:4585
% (gdb) frame 4
% #4  0x0805e106 in tls_serial_number (peer=0x80b1700) at tls_verify.c:332
% 332             ASN1_INTEGER_to_BN(sn, &bn);
% (gdb) print *peer
% $1 = {cert_info = 0x80af080, sig_alg = 0x80b0590, signature = 0x80b05a0,
%   valid = 1, references = 2,
%   name = 0x80d4400 "/C=FR/O=TEST/OU=Clients/CN=diogene.jeremie.int",
%   ex_data = {sk = 0x0, dummy = 0}, ex_pathlen = -1, ex_flags = 263,
%   ex_kusage = 128, ex_xkusage = 2, ex_nscert = 0, skid = 0x80d5030,
%   akid = 0x80d5080, sha1_hash = "\016ûd2v;\177QØ61Ä\005I^\0252hMJ", aux = 0x0}
% (gdb) print *peer->cert_info
% $2 = {version = 0x80b05b0, serialNumber = 0x80b04b0, signature = 0x80b04c0,
%   issuer = 0x80b04d0, validity = 0x80b0500, subject = 0x80b0530,
%   key = 0x80b0560, issuerUID = 0x0, subjectUID = 0x0, extensions = 0x80d2320}
% (gdb) print sn
% $2 = (ASN1_INTEGER *) 0xbfbfe280
% (gdb) print *sn
% $1 = {length = 134834432, type = 134948360,
%   data = 0x2 <Error reading address 0x2: Bad address>, flags = 300}

What's wrong with my code?  The certificate used by the TLS client is
not special in any way:

% Certificate:
%     Data:
%         Version: 3 (0x2)
%         Serial Number:
%             d3:f9:b3:9a:02:3a:72:10
%         Signature Algorithm: sha1WithRSAEncryption
%         Issuer: C=FR, O=TEST, OU=JEREMIE, CN=Autorite de certification racine 
Test
%         Validity
%             Not Before: Jul 25 19:00:13 2007 GMT
%             Not After : Jul 24 19:00:13 2008 GMT
%         Subject: C=FR, O=TEST, OU=Clients, CN=diogene.jeremie.int
%         Subject Public Key Info:
%             Public Key Algorithm: rsaEncryption
%             RSA Public Key: (2048 bit)
%                 Modulus (2048 bit):
%                   ...
%         X509v3 extensions:
%             X509v3 Subject Key Identifier:
%                 2A:E9:A1:01:9A:74:4F:EE:23:10:A9:9C:97:C3:B7:77:55:E0:B4:45
%             X509v3 Authority Key Identifier:
%                 
keyid:FE:CF:61:36:EF:9B:78:5C:BE:72:B2:58:AA:8D:B3:F9:67:80:98:7C
%                 DirName:/C=FR/O=TEST/OU=JEREMIE/CN=Autorite de certification 
racine Test
%                 serial:A6:A6:76:4D:F0:1F:36:7D
% 
%             X509v3 Basic Constraints: critical
%                 CA:FALSE
%             X509v3 Key Usage:
%                 Digital Signature
%             X509v3 Extended Key Usage:
%                 TLS Web Client Authentication
%             X509v3 Subject Alternative Name:
%                 DNS:diogene.jeremie.int, email:[EMAIL PROTECTED]
%     Signature Algorithm: sha1WithRSAEncryption
%         ...

Thank you for your help.
Best regards,
-- 
Jeremie Le Hen
< jeremie at le-hen dot org >< ttz at chchile dot org >
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to