Artifact 0fcacfecab19b44530dc77688ce07010078bc94f:
- File
asn1-x509.c
— part of check-in
[a3d727289c]
at
2010-05-12 14:52:58
on branch trunk
— Added test driver (from libssh-agent-pkcs11-provider)
Added basic ASN.1 X.509 BER decoder (from libssh-agent-pkcs11-provider)
Work towards updating CACKey to talk to CAC using PC/SC (user: rkeene, size: 3695) [annotate] [blame] [check-ins using]
0000: 2f 2a 0a 20 2a 20 42 61 73 69 63 20 69 6d 70 6c /*. * Basic impl 0010: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 49 54 ementation of IT 0020: 55 2d 54 20 58 2e 36 39 30 20 28 30 37 2f 32 30 U-T X.690 (07/20 0030: 30 32 29 20 66 6f 72 20 70 61 72 73 69 6e 67 20 02) for parsing 0040: 42 45 52 20 65 6e 63 6f 64 65 64 0a 20 2a 20 58 BER encoded. * X 0050: 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 .509 certificate 0060: 73 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 48 41 s. */..#ifdef HA 0070: 56 45 5f 43 4f 4e 46 49 47 5f 48 0a 23 20 20 69 VE_CONFIG_H.# i 0080: 6e 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 nclude "config.h 0090: 22 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 ".#endif..#ifdef 00a0: 20 48 41 56 45 5f 55 4e 49 53 54 44 5f 48 0a 23 HAVE_UNISTD_H.# 00b0: 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 include <unist 00c0: 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 d.h>.#endif.#ifd 00d0: 65 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 ef HAVE_STDLIB_H 00e0: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 .# include <std 00f0: 6c 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 lib.h>.#endif.#i 0100: 66 64 65 66 20 48 41 56 45 5f 53 54 44 41 52 47 fdef HAVE_STDARG 0110: 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 _H.# include <s 0120: 74 64 61 72 67 2e 68 3e 0a 23 65 6e 64 69 66 0a tdarg.h>.#endif. 0130: 0a 23 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d .#include "asn1- 0140: 78 35 30 39 2e 68 22 0a 0a 73 74 72 75 63 74 20 x509.h"..struct 0150: 61 73 6e 31 5f 6f 62 6a 65 63 74 20 7b 0a 09 75 asn1_object {..u 0160: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 74 61 67 nsigned long tag 0170: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 ;..unsigned long 0180: 20 73 69 7a 65 3b 0a 09 76 6f 69 64 20 2a 63 6f size;..void *co 0190: 6e 74 65 6e 74 73 3b 0a 0a 09 75 6e 73 69 67 6e ntents;...unsign 01a0: 65 64 20 6c 6f 6e 67 20 61 73 6e 31 72 65 70 5f ed long asn1rep_ 01b0: 6c 65 6e 3b 0a 09 76 6f 69 64 20 2a 61 73 6e 31 len;..void *asn1 01c0: 72 65 70 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 rep;.};..struct 01d0: 78 35 30 39 5f 6f 62 6a 65 63 74 20 7b 0a 09 73 x509_object {..s 01e0: 74 72 75 63 74 20 61 73 6e 31 5f 6f 62 6a 65 63 truct asn1_objec 01f0: 74 20 77 68 6f 6c 65 74 68 69 6e 67 3b 0a 09 09 t wholething;... 0200: 73 74 72 75 63 74 20 61 73 6e 31 5f 6f 62 6a 65 struct asn1_obje 0210: 63 74 20 63 65 72 74 69 66 69 63 61 74 65 3b 0a ct certificate;. 0220: 09 09 09 73 74 72 75 63 74 20 61 73 6e 31 5f 6f ...struct asn1_o 0230: 62 6a 65 63 74 20 76 65 72 73 69 6f 6e 3b 0a 09 bject version;.. 0240: 09 09 73 74 72 75 63 74 20 61 73 6e 31 5f 6f 62 ..struct asn1_ob 0250: 6a 65 63 74 20 73 65 72 69 61 6c 5f 6e 75 6d 62 ject serial_numb 0260: 65 72 3b 0a 09 09 09 73 74 72 75 63 74 20 61 73 er;....struct as 0270: 6e 31 5f 6f 62 6a 65 63 74 20 73 69 67 6e 61 74 n1_object signat 0280: 75 72 65 5f 61 6c 67 6f 3b 0a 09 09 09 73 74 72 ure_algo;....str 0290: 75 63 74 20 61 73 6e 31 5f 6f 62 6a 65 63 74 20 uct asn1_object 02a0: 69 73 73 75 65 72 3b 0a 09 09 09 73 74 72 75 63 issuer;....struc 02b0: 74 20 61 73 6e 31 5f 6f 62 6a 65 63 74 20 76 61 t asn1_object va 02c0: 6c 69 64 69 74 79 3b 0a 09 09 09 73 74 72 75 63 lidity;....struc 02d0: 74 20 61 73 6e 31 5f 6f 62 6a 65 63 74 20 73 75 t asn1_object su 02e0: 62 6a 65 63 74 3b 0a 09 09 73 74 72 75 63 74 20 bject;...struct 02f0: 61 73 6e 31 5f 6f 62 6a 65 63 74 20 73 69 67 6e asn1_object sign 0300: 61 74 75 72 65 3b 0a 7d 3b 0a 0a 73 74 61 74 69 ature;.};..stati 0310: 63 20 69 6e 74 20 5f 61 73 6e 31 5f 78 35 30 39 c int _asn1_x509 0320: 5f 72 65 61 64 5f 61 73 6e 31 5f 6f 62 6a 65 63 _read_asn1_objec 0330: 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t(unsigned char 0340: 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 62 75 66 *buf, size_t buf 0350: 6c 65 6e 2c 20 76 61 5f 6c 69 73 74 20 2a 61 72 len, va_list *ar 0360: 67 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 gs) {..unsigned 0370: 63 68 61 72 20 73 6d 61 6c 6c 5f 6f 62 6a 65 63 char small_objec 0380: 74 5f 73 69 7a 65 3b 0a 09 75 6e 73 69 67 6e 65 t_size;..unsigne 0390: 64 20 63 68 61 72 20 2a 62 75 66 5f 70 3b 0a 09 d char *buf_p;.. 03a0: 73 74 72 75 63 74 20 61 73 6e 31 5f 6f 62 6a 65 struct asn1_obje 03b0: 63 74 20 2a 6f 75 74 62 75 66 3b 0a 0a 09 6f 75 ct *outbuf;...ou 03c0: 74 62 75 66 20 3d 20 76 61 5f 61 72 67 28 2a 61 tbuf = va_arg(*a 03d0: 72 67 73 2c 20 73 74 72 75 63 74 20 61 73 6e 31 rgs, struct asn1 03e0: 5f 6f 62 6a 65 63 74 20 2a 29 3b 0a 0a 09 69 66 _object *);...if 03f0: 20 28 6f 75 74 62 75 66 20 3d 3d 20 4e 55 4c 4c (outbuf == NULL 0400: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b ) {...return(0); 0410: 0a 09 7d 0a 0a 09 69 66 20 28 62 75 66 6c 65 6e ..}...if (buflen 0420: 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 == 0) {...retur 0430: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 62 75 66 5f n(-1);..}...buf_ 0440: 70 20 3d 20 62 75 66 3b 0a 0a 09 6f 75 74 62 75 p = buf;...outbu 0450: 66 2d 3e 74 61 67 20 3d 20 2a 62 75 66 5f 70 3b f->tag = *buf_p; 0460: 0a 09 62 75 66 5f 70 2b 2b 3b 0a 09 62 75 66 6c ..buf_p++;..bufl 0470: 65 6e 2d 2d 3b 0a 09 69 66 20 28 62 75 66 6c 65 en--;..if (bufle 0480: 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 n == 0) {...retu 0490: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 73 6d 61 rn(-1);..}...sma 04a0: 6c 6c 5f 6f 62 6a 65 63 74 5f 73 69 7a 65 20 3d ll_object_size = 04b0: 20 2a 62 75 66 5f 70 3b 0a 09 62 75 66 5f 70 2b *buf_p;..buf_p+ 04c0: 2b 3b 0a 09 62 75 66 6c 65 6e 2d 2d 3b 0a 09 69 +;..buflen--;..i 04d0: 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 30 29 20 f (buflen == 0) 04e0: 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a {...return(-1);. 04f0: 09 7d 0a 0a 09 69 66 20 28 28 73 6d 61 6c 6c 5f .}...if ((small_ 0500: 6f 62 6a 65 63 74 5f 73 69 7a 65 20 26 20 30 78 object_size & 0x 0510: 38 30 29 20 3d 3d 20 30 78 38 30 29 20 7b 0a 09 80) == 0x80) {.. 0520: 09 6f 75 74 62 75 66 2d 3e 73 69 7a 65 20 3d 20 .outbuf->size = 0530: 30 3b 0a 0a 09 09 66 6f 72 20 28 73 6d 61 6c 6c 0;....for (small 0540: 5f 6f 62 6a 65 63 74 5f 73 69 7a 65 20 5e 3d 20 _object_size ^= 0550: 30 78 38 30 3b 20 73 6d 61 6c 6c 5f 6f 62 6a 65 0x80; small_obje 0560: 63 74 5f 73 69 7a 65 3b 20 73 6d 61 6c 6c 5f 6f ct_size; small_o 0570: 62 6a 65 63 74 5f 73 69 7a 65 2d 2d 29 20 7b 0a bject_size--) {. 0580: 09 09 09 6f 75 74 62 75 66 2d 3e 73 69 7a 65 20 ...outbuf->size 0590: 3c 3c 3d 20 38 3b 0a 09 09 09 6f 75 74 62 75 66 <<= 8;....outbuf 05a0: 2d 3e 73 69 7a 65 20 2b 3d 20 2a 62 75 66 5f 70 ->size += *buf_p 05b0: 3b 0a 0a 09 09 09 62 75 66 5f 70 2b 2b 3b 0a 09 ;.....buf_p++;.. 05c0: 09 09 62 75 66 6c 65 6e 2d 2d 3b 0a 09 09 09 69 ..buflen--;....i 05d0: 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 30 29 20 f (buflen == 0) 05e0: 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 {.....break;.... 05f0: 7d 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a }...}..} else {. 0600: 09 09 6f 75 74 62 75 66 2d 3e 73 69 7a 65 20 3d ..outbuf->size = 0610: 20 73 6d 61 6c 6c 5f 6f 62 6a 65 63 74 5f 73 69 small_object_si 0620: 7a 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 ze;..}...if (out 0630: 62 75 66 2d 3e 73 69 7a 65 20 3e 20 62 75 66 6c buf->size > bufl 0640: 65 6e 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d en) {...return(- 0650: 31 29 3b 0a 09 7d 0a 0a 09 6f 75 74 62 75 66 2d 1);..}...outbuf- 0660: 3e 63 6f 6e 74 65 6e 74 73 20 3d 20 62 75 66 5f >contents = buf_ 0670: 70 3b 0a 09 6f 75 74 62 75 66 2d 3e 61 73 6e 31 p;..outbuf->asn1 0680: 72 65 70 5f 6c 65 6e 20 3d 20 6f 75 74 62 75 66 rep_len = outbuf 0690: 2d 3e 73 69 7a 65 20 2b 20 28 62 75 66 5f 70 20 ->size + (buf_p 06a0: 2d 20 62 75 66 29 3b 0a 09 6f 75 74 62 75 66 2d - buf);..outbuf- 06b0: 3e 61 73 6e 31 72 65 70 20 3d 20 62 75 66 3b 0a >asn1rep = buf;. 06c0: 0a 09 62 75 66 5f 70 20 2b 3d 20 6f 75 74 62 75 ..buf_p += outbu 06d0: 66 2d 3e 73 69 7a 65 3b 0a 09 62 75 66 6c 65 6e f->size;..buflen 06e0: 20 2d 3d 20 6f 75 74 62 75 66 2d 3e 73 69 7a 65 -= outbuf->size 06f0: 3b 0a 0a 09 72 65 74 75 72 6e 28 5f 61 73 6e 31 ;...return(_asn1 0700: 5f 78 35 30 39 5f 72 65 61 64 5f 61 73 6e 31 5f _x509_read_asn1_ 0710: 6f 62 6a 65 63 74 28 62 75 66 5f 70 2c 20 62 75 object(buf_p, bu 0720: 66 6c 65 6e 2c 20 61 72 67 73 29 29 3b 0a 7d 0a flen, args));.}. 0730: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73 6e 31 .static int asn1 0740: 5f 78 35 30 39 5f 72 65 61 64 5f 61 73 6e 31 5f _x509_read_asn1_ 0750: 6f 62 6a 65 63 74 28 75 6e 73 69 67 6e 65 64 20 object(unsigned 0760: 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f char *buf, size_ 0770: 74 20 62 75 66 6c 65 6e 2c 20 2e 2e 2e 29 20 7b t buflen, ...) { 0780: 0a 09 76 61 5f 6c 69 73 74 20 61 72 67 73 3b 0a ..va_list args;. 0790: 09 69 6e 74 20 72 65 74 76 61 6c 3b 0a 0a 09 76 .int retval;...v 07a0: 61 5f 73 74 61 72 74 28 61 72 67 73 2c 20 62 75 a_start(args, bu 07b0: 66 6c 65 6e 29 3b 0a 0a 09 72 65 74 76 61 6c 20 flen);...retval 07c0: 3d 20 5f 61 73 6e 31 5f 78 35 30 39 5f 72 65 61 = _asn1_x509_rea 07d0: 64 5f 61 73 6e 31 5f 6f 62 6a 65 63 74 28 62 75 d_asn1_object(bu 07e0: 66 2c 20 62 75 66 6c 65 6e 2c 20 26 61 72 67 73 f, buflen, &args 07f0: 29 3b 0a 0a 09 76 61 5f 65 6e 64 28 61 72 67 73 );...va_end(args 0800: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 );...return(retv 0810: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 al);.}..static i 0820: 6e 74 20 61 73 6e 31 5f 78 35 30 39 5f 72 65 61 nt asn1_x509_rea 0830: 64 5f 6f 62 6a 65 63 74 28 75 6e 73 69 67 6e 65 d_object(unsigne 0840: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a d char *buf, siz 0850: 65 5f 74 20 62 75 66 6c 65 6e 2c 20 73 74 72 75 e_t buflen, stru 0860: 63 74 20 78 35 30 39 5f 6f 62 6a 65 63 74 20 2a ct x509_object * 0870: 6f 75 74 62 75 66 29 20 7b 0a 09 69 6e 74 20 72 outbuf) {..int r 0880: 65 61 64 5f 72 65 74 3b 0a 0a 09 72 65 61 64 5f ead_ret;...read_ 0890: 72 65 74 20 3d 20 61 73 6e 31 5f 78 35 30 39 5f ret = asn1_x509_ 08a0: 72 65 61 64 5f 61 73 6e 31 5f 6f 62 6a 65 63 74 read_asn1_object 08b0: 28 62 75 66 2c 20 62 75 66 6c 65 6e 2c 20 26 6f (buf, buflen, &o 08c0: 75 74 62 75 66 2d 3e 77 68 6f 6c 65 74 68 69 6e utbuf->wholethin 08d0: 67 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 72 g, NULL);..if (r 08e0: 65 61 64 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a ead_ret != 0) {. 08f0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d ..return(-1);..} 0900: 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 61 73 ...read_ret = as 0910: 6e 31 5f 78 35 30 39 5f 72 65 61 64 5f 61 73 6e n1_x509_read_asn 0920: 31 5f 6f 62 6a 65 63 74 28 6f 75 74 62 75 66 2d 1_object(outbuf- 0930: 3e 77 68 6f 6c 65 74 68 69 6e 67 2e 63 6f 6e 74 >wholething.cont 0940: 65 6e 74 73 2c 20 6f 75 74 62 75 66 2d 3e 77 68 ents, outbuf->wh 0950: 6f 6c 65 74 68 69 6e 67 2e 73 69 7a 65 2c 20 26 olething.size, & 0960: 6f 75 74 62 75 66 2d 3e 63 65 72 74 69 66 69 63 outbuf->certific 0970: 61 74 65 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 ate, NULL);..if 0980: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 30 29 20 (read_ret != 0) 0990: 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a {...return(-1);. 09a0: 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 .}...read_ret = 09b0: 61 73 6e 31 5f 78 35 30 39 5f 72 65 61 64 5f 61 asn1_x509_read_a 09c0: 73 6e 31 5f 6f 62 6a 65 63 74 28 6f 75 74 62 75 sn1_object(outbu 09d0: 66 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2e 63 f->certificate.c 09e0: 6f 6e 74 65 6e 74 73 2c 20 6f 75 74 62 75 66 2d ontents, outbuf- 09f0: 3e 63 65 72 74 69 66 69 63 61 74 65 2e 73 69 7a >certificate.siz 0a00: 65 2c 20 26 6f 75 74 62 75 66 2d 3e 76 65 72 73 e, &outbuf->vers 0a10: 69 6f 6e 2c 20 26 6f 75 74 62 75 66 2d 3e 73 65 ion, &outbuf->se 0a20: 72 69 61 6c 5f 6e 75 6d 62 65 72 2c 20 26 6f 75 rial_number, &ou 0a30: 74 62 75 66 2d 3e 73 69 67 6e 61 74 75 72 65 5f tbuf->signature_ 0a40: 61 6c 67 6f 2c 20 26 6f 75 74 62 75 66 2d 3e 69 algo, &outbuf->i 0a50: 73 73 75 65 72 2c 20 26 6f 75 74 62 75 66 2d 3e ssuer, &outbuf-> 0a60: 76 61 6c 69 64 69 74 79 2c 20 26 6f 75 74 62 75 validity, &outbu 0a70: 66 2d 3e 73 75 62 6a 65 63 74 2c 20 4e 55 4c 4c f->subject, NULL 0a80: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 );..if (read_ret 0a90: 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 != 0) {...retur 0aa0: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 n(-1);..}...retu 0ab0: 72 6e 28 30 29 3b 0a 7d 0a 0a 73 73 69 7a 65 5f rn(0);.}..ssize_ 0ac0: 74 20 78 35 30 39 5f 74 6f 5f 69 73 73 75 65 72 t x509_to_issuer 0ad0: 28 76 6f 69 64 20 2a 78 35 30 39 5f 64 65 72 5f (void *x509_der_ 0ae0: 62 75 66 2c 20 73 69 7a 65 5f 74 20 78 35 30 39 buf, size_t x509 0af0: 5f 64 65 72 5f 62 75 66 5f 6c 65 6e 2c 20 76 6f _der_buf_len, vo 0b00: 69 64 20 2a 2a 6f 75 74 62 75 66 29 20 7b 0a 09 id **outbuf) {.. 0b10: 73 74 72 75 63 74 20 78 35 30 39 5f 6f 62 6a 65 struct x509_obje 0b20: 63 74 20 78 35 30 39 3b 0a 09 69 6e 74 20 72 65 ct x509;..int re 0b30: 61 64 5f 72 65 74 3b 0a 0a 09 72 65 61 64 5f 72 ad_ret;...read_r 0b40: 65 74 20 3d 20 61 73 6e 31 5f 78 35 30 39 5f 72 et = asn1_x509_r 0b50: 65 61 64 5f 6f 62 6a 65 63 74 28 78 35 30 39 5f ead_object(x509_ 0b60: 64 65 72 5f 62 75 66 2c 20 78 35 30 39 5f 64 65 der_buf, x509_de 0b70: 72 5f 62 75 66 5f 6c 65 6e 2c 20 26 78 35 30 39 r_buf_len, &x509 0b80: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 );..if (read_ret 0b90: 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 != 0) {...retur 0ba0: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2a 6f 75 74 n(-1);..}...*out 0bb0: 62 75 66 20 3d 20 78 35 30 39 2e 69 73 73 75 65 buf = x509.issue 0bc0: 72 2e 61 73 6e 31 72 65 70 3b 0a 0a 09 72 65 74 r.asn1rep;...ret 0bd0: 75 72 6e 28 78 35 30 39 2e 69 73 73 75 65 72 2e urn(x509.issuer. 0be0: 61 73 6e 31 72 65 70 5f 6c 65 6e 29 3b 0a 7d 0a asn1rep_len);.}. 0bf0: 0a 73 73 69 7a 65 5f 74 20 78 35 30 39 5f 74 6f .ssize_t x509_to 0c00: 5f 73 75 62 6a 65 63 74 28 76 6f 69 64 20 2a 78 _subject(void *x 0c10: 35 30 39 5f 64 65 72 5f 62 75 66 2c 20 73 69 7a 509_der_buf, siz 0c20: 65 5f 74 20 78 35 30 39 5f 64 65 72 5f 62 75 66 e_t x509_der_buf 0c30: 5f 6c 65 6e 2c 20 76 6f 69 64 20 2a 2a 6f 75 74 _len, void **out 0c40: 62 75 66 29 20 7b 0a 09 73 74 72 75 63 74 20 78 buf) {..struct x 0c50: 35 30 39 5f 6f 62 6a 65 63 74 20 78 35 30 39 3b 509_object x509; 0c60: 0a 09 69 6e 74 20 72 65 61 64 5f 72 65 74 3b 0a ..int read_ret;. 0c70: 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 61 73 6e ..read_ret = asn 0c80: 31 5f 78 35 30 39 5f 72 65 61 64 5f 6f 62 6a 65 1_x509_read_obje 0c90: 63 74 28 78 35 30 39 5f 64 65 72 5f 62 75 66 2c ct(x509_der_buf, 0ca0: 20 78 35 30 39 5f 64 65 72 5f 62 75 66 5f 6c 65 x509_der_buf_le 0cb0: 6e 2c 20 26 78 35 30 39 29 3b 0a 09 69 66 20 28 n, &x509);..if ( 0cc0: 72 65 61 64 5f 72 65 74 20 21 3d 20 30 29 20 7b read_ret != 0) { 0cd0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 ...return(-1);.. 0ce0: 7d 0a 0a 09 2a 6f 75 74 62 75 66 20 3d 20 78 35 }...*outbuf = x5 0cf0: 30 39 2e 73 75 62 6a 65 63 74 2e 61 73 6e 31 72 09.subject.asn1r 0d00: 65 70 3b 0a 0a 09 72 65 74 75 72 6e 28 78 35 30 ep;...return(x50 0d10: 39 2e 73 75 62 6a 65 63 74 2e 61 73 6e 31 72 65 9.subject.asn1re 0d20: 70 5f 6c 65 6e 29 3b 0a 7d 0a 0a 73 73 69 7a 65 p_len);.}..ssize 0d30: 5f 74 20 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 _t x509_to_seria 0d40: 6c 28 76 6f 69 64 20 2a 78 35 30 39 5f 64 65 72 l(void *x509_der 0d50: 5f 62 75 66 2c 20 73 69 7a 65 5f 74 20 78 35 30 _buf, size_t x50 0d60: 39 5f 64 65 72 5f 62 75 66 5f 6c 65 6e 2c 20 76 9_der_buf_len, v 0d70: 6f 69 64 20 2a 2a 6f 75 74 62 75 66 29 20 7b 0a oid **outbuf) {. 0d80: 09 73 74 72 75 63 74 20 78 35 30 39 5f 6f 62 6a .struct x509_obj 0d90: 65 63 74 20 78 35 30 39 3b 0a 09 69 6e 74 20 72 ect x509;..int r 0da0: 65 61 64 5f 72 65 74 3b 0a 0a 09 72 65 61 64 5f ead_ret;...read_ 0db0: 72 65 74 20 3d 20 61 73 6e 31 5f 78 35 30 39 5f ret = asn1_x509_ 0dc0: 72 65 61 64 5f 6f 62 6a 65 63 74 28 78 35 30 39 read_object(x509 0dd0: 5f 64 65 72 5f 62 75 66 2c 20 78 35 30 39 5f 64 _der_buf, x509_d 0de0: 65 72 5f 62 75 66 5f 6c 65 6e 2c 20 26 78 35 30 er_buf_len, &x50 0df0: 39 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 9);..if (read_re 0e00: 74 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 t != 0) {...retu 0e10: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2a 6f 75 rn(-1);..}...*ou 0e20: 74 62 75 66 20 3d 20 78 35 30 39 2e 73 65 72 69 tbuf = x509.seri 0e30: 61 6c 5f 6e 75 6d 62 65 72 2e 61 73 6e 31 72 65 al_number.asn1re 0e40: 70 3b 0a 0a 09 72 65 74 75 72 6e 28 78 35 30 39 p;...return(x509 0e50: 2e 73 65 72 69 61 6c 5f 6e 75 6d 62 65 72 2e 61 .serial_number.a 0e60: 73 6e 31 72 65 70 5f 6c 65 6e 29 3b 0a 7d 0a sn1rep_len);.}.