Artifact b4f2f9070a80621895dbf5bc2d2da6295e0d6319:
- File
asn1-x509.c
— part of check-in
[ef50f6c143]
at
2010-05-20 23:45:53
on branch trunk
— Corrected unpadding
Changed label to be generated, rather than derived from card
Added support for reading the modulus and exponent from an X.509 certificate
Added additional attributes (user: rkeene, size: 9503) [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: 23 69 66 64 65 66 20 48 41 56 45 5f 53 54 44 49 #ifdef HAVE_STDI 0140: 4f 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c O_H.# include < 0150: 73 74 64 69 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a stdio.h>.#endif. 0160: 23 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 #ifdef HAVE_STRI 0170: 4e 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 NG_H.# include 0180: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 <string.h>.#endi 0190: 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22 61 73 6e f..#include "asn 01a0: 31 2d 78 35 30 39 2e 68 22 0a 0a 73 74 72 75 63 1-x509.h"..struc 01b0: 74 20 61 73 6e 31 5f 6f 62 6a 65 63 74 20 7b 0a t asn1_object {. 01c0: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 74 .unsigned long t 01d0: 61 67 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f ag;..unsigned lo 01e0: 6e 67 20 73 69 7a 65 3b 0a 09 76 6f 69 64 20 2a ng size;..void * 01f0: 63 6f 6e 74 65 6e 74 73 3b 0a 0a 09 75 6e 73 69 contents;...unsi 0200: 67 6e 65 64 20 6c 6f 6e 67 20 61 73 6e 31 72 65 gned long asn1re 0210: 70 5f 6c 65 6e 3b 0a 09 76 6f 69 64 20 2a 61 73 p_len;..void *as 0220: 6e 31 72 65 70 3b 0a 7d 3b 0a 0a 73 74 72 75 63 n1rep;.};..struc 0230: 74 20 78 35 30 39 5f 6f 62 6a 65 63 74 20 7b 0a t x509_object {. 0240: 09 73 74 72 75 63 74 20 61 73 6e 31 5f 6f 62 6a .struct asn1_obj 0250: 65 63 74 20 77 68 6f 6c 65 74 68 69 6e 67 3b 0a ect wholething;. 0260: 09 09 73 74 72 75 63 74 20 61 73 6e 31 5f 6f 62 ..struct asn1_ob 0270: 6a 65 63 74 20 63 65 72 74 69 66 69 63 61 74 65 ject certificate 0280: 3b 0a 09 09 09 73 74 72 75 63 74 20 61 73 6e 31 ;....struct asn1 0290: 5f 6f 62 6a 65 63 74 20 76 65 72 73 69 6f 6e 3b _object version; 02a0: 0a 09 09 09 73 74 72 75 63 74 20 61 73 6e 31 5f ....struct asn1_ 02b0: 6f 62 6a 65 63 74 20 73 65 72 69 61 6c 5f 6e 75 object serial_nu 02c0: 6d 62 65 72 3b 0a 09 09 09 73 74 72 75 63 74 20 mber;....struct 02d0: 61 73 6e 31 5f 6f 62 6a 65 63 74 20 73 69 67 6e asn1_object sign 02e0: 61 74 75 72 65 5f 61 6c 67 6f 3b 0a 09 09 09 73 ature_algo;....s 02f0: 74 72 75 63 74 20 61 73 6e 31 5f 6f 62 6a 65 63 truct asn1_objec 0300: 74 20 69 73 73 75 65 72 3b 0a 09 09 09 73 74 72 t issuer;....str 0310: 75 63 74 20 61 73 6e 31 5f 6f 62 6a 65 63 74 20 uct asn1_object 0320: 76 61 6c 69 64 69 74 79 3b 0a 09 09 09 73 74 72 validity;....str 0330: 75 63 74 20 61 73 6e 31 5f 6f 62 6a 65 63 74 20 uct asn1_object 0340: 73 75 62 6a 65 63 74 3b 0a 09 09 09 73 74 72 75 subject;....stru 0350: 63 74 20 61 73 6e 31 5f 6f 62 6a 65 63 74 20 70 ct asn1_object p 0360: 75 62 6b 65 79 69 6e 66 6f 3b 0a 09 09 09 09 73 ubkeyinfo;.....s 0370: 74 72 75 63 74 20 61 73 6e 31 5f 6f 62 6a 65 63 truct asn1_objec 0380: 74 20 70 75 62 6b 65 79 5f 61 6c 67 6f 69 64 3b t pubkey_algoid; 0390: 0a 09 09 09 09 09 73 74 72 75 63 74 20 61 73 6e ......struct asn 03a0: 31 5f 6f 62 6a 65 63 74 20 70 75 62 6b 65 79 5f 1_object pubkey_ 03b0: 61 6c 67 6f 3b 0a 09 09 09 09 09 73 74 72 75 63 algo;......struc 03c0: 74 20 61 73 6e 31 5f 6f 62 6a 65 63 74 20 70 75 t asn1_object pu 03d0: 62 6b 65 79 5f 61 6c 67 6f 70 61 72 6d 3b 0a 09 bkey_algoparm;.. 03e0: 09 09 09 73 74 72 75 63 74 20 61 73 6e 31 5f 6f ...struct asn1_o 03f0: 62 6a 65 63 74 20 70 75 62 6b 65 79 3b 0a 7d 3b bject pubkey;.}; 0400: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 61 73 ..static int _as 0410: 6e 31 5f 78 35 30 39 5f 72 65 61 64 5f 61 73 6e n1_x509_read_asn 0420: 31 5f 6f 62 6a 65 63 74 28 75 6e 73 69 67 6e 65 1_object(unsigne 0430: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a d char *buf, siz 0440: 65 5f 74 20 62 75 66 6c 65 6e 2c 20 76 61 5f 6c e_t buflen, va_l 0450: 69 73 74 20 2a 61 72 67 73 29 20 7b 0a 09 75 6e ist *args) {..un 0460: 73 69 67 6e 65 64 20 63 68 61 72 20 73 6d 61 6c signed char smal 0470: 6c 5f 6f 62 6a 65 63 74 5f 73 69 7a 65 3b 0a 09 l_object_size;.. 0480: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 unsigned char *b 0490: 75 66 5f 70 3b 0a 09 73 74 72 75 63 74 20 61 73 uf_p;..struct as 04a0: 6e 31 5f 6f 62 6a 65 63 74 20 2a 6f 75 74 62 75 n1_object *outbu 04b0: 66 3b 0a 0a 09 6f 75 74 62 75 66 20 3d 20 76 61 f;...outbuf = va 04c0: 5f 61 72 67 28 2a 61 72 67 73 2c 20 73 74 72 75 _arg(*args, stru 04d0: 63 74 20 61 73 6e 31 5f 6f 62 6a 65 63 74 20 2a ct asn1_object * 04e0: 29 3b 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 20 );...if (outbuf 04f0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 == NULL) {...ret 0500: 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 69 66 20 urn(0);..}...if 0510: 28 62 75 66 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a (buflen == 0) {. 0520: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d ..return(-1);..} 0530: 0a 0a 09 62 75 66 5f 70 20 3d 20 62 75 66 3b 0a ...buf_p = buf;. 0540: 0a 09 6f 75 74 62 75 66 2d 3e 74 61 67 20 3d 20 ..outbuf->tag = 0550: 2a 62 75 66 5f 70 3b 0a 09 62 75 66 5f 70 2b 2b *buf_p;..buf_p++ 0560: 3b 0a 09 62 75 66 6c 65 6e 2d 2d 3b 0a 09 69 66 ;..buflen--;..if 0570: 20 28 62 75 66 6c 65 6e 20 3d 3d 20 30 29 20 7b (buflen == 0) { 0580: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 ...return(-1);.. 0590: 7d 0a 0a 09 2f 2a 20 4e 55 4c 4c 20 54 61 67 20 }.../* NULL Tag 05a0: 2d 2d 20 6e 6f 20 73 69 7a 65 20 69 73 20 72 65 -- no size is re 05b0: 71 75 69 72 65 64 20 2a 2f 0a 09 69 66 20 28 6f quired */..if (o 05c0: 75 74 62 75 66 2d 3e 74 61 67 20 3d 3d 20 30 78 utbuf->tag == 0x 05d0: 30 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 5f 00) {...return(_ 05e0: 61 73 6e 31 5f 78 35 30 39 5f 72 65 61 64 5f 61 asn1_x509_read_a 05f0: 73 6e 31 5f 6f 62 6a 65 63 74 28 62 75 66 5f 70 sn1_object(buf_p 0600: 2c 20 62 75 66 6c 65 6e 2c 20 61 72 67 73 29 29 , buflen, args)) 0610: 3b 0a 09 7d 0a 0a 09 73 6d 61 6c 6c 5f 6f 62 6a ;..}...small_obj 0620: 65 63 74 5f 73 69 7a 65 20 3d 20 2a 62 75 66 5f ect_size = *buf_ 0630: 70 3b 0a 09 62 75 66 5f 70 2b 2b 3b 0a 09 62 75 p;..buf_p++;..bu 0640: 66 6c 65 6e 2d 2d 3b 0a 09 69 66 20 28 62 75 66 flen--;..if (buf 0650: 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 len == 0) {...re 0660: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 turn(-1);..}...i 0670: 66 20 28 28 73 6d 61 6c 6c 5f 6f 62 6a 65 63 74 f ((small_object 0680: 5f 73 69 7a 65 20 26 20 30 78 38 30 29 20 3d 3d _size & 0x80) == 0690: 20 30 78 38 30 29 20 7b 0a 09 09 6f 75 74 62 75 0x80) {...outbu 06a0: 66 2d 3e 73 69 7a 65 20 3d 20 30 3b 0a 0a 09 09 f->size = 0;.... 06b0: 66 6f 72 20 28 73 6d 61 6c 6c 5f 6f 62 6a 65 63 for (small_objec 06c0: 74 5f 73 69 7a 65 20 5e 3d 20 30 78 38 30 3b 20 t_size ^= 0x80; 06d0: 73 6d 61 6c 6c 5f 6f 62 6a 65 63 74 5f 73 69 7a small_object_siz 06e0: 65 3b 20 73 6d 61 6c 6c 5f 6f 62 6a 65 63 74 5f e; small_object_ 06f0: 73 69 7a 65 2d 2d 29 20 7b 0a 09 09 09 6f 75 74 size--) {....out 0700: 62 75 66 2d 3e 73 69 7a 65 20 3c 3c 3d 20 38 3b buf->size <<= 8; 0710: 0a 09 09 09 6f 75 74 62 75 66 2d 3e 73 69 7a 65 ....outbuf->size 0720: 20 2b 3d 20 2a 62 75 66 5f 70 3b 0a 0a 09 09 09 += *buf_p;..... 0730: 62 75 66 5f 70 2b 2b 3b 0a 09 09 09 62 75 66 6c buf_p++;....bufl 0740: 65 6e 2d 2d 3b 0a 09 09 09 69 66 20 28 62 75 66 en--;....if (buf 0750: 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 len == 0) {..... 0760: 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a break;....}...}. 0770: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6f 75 74 62 .} else {...outb 0780: 75 66 2d 3e 73 69 7a 65 20 3d 20 73 6d 61 6c 6c uf->size = small 0790: 5f 6f 62 6a 65 63 74 5f 73 69 7a 65 3b 0a 09 7d _object_size;..} 07a0: 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 2d 3e 73 ...if (outbuf->s 07b0: 69 7a 65 20 3e 20 62 75 66 6c 65 6e 29 20 7b 0a ize > buflen) {. 07c0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d ..return(-1);..} 07d0: 0a 0a 09 6f 75 74 62 75 66 2d 3e 63 6f 6e 74 65 ...outbuf->conte 07e0: 6e 74 73 20 3d 20 62 75 66 5f 70 3b 0a 09 6f 75 nts = buf_p;..ou 07f0: 74 62 75 66 2d 3e 61 73 6e 31 72 65 70 5f 6c 65 tbuf->asn1rep_le 0800: 6e 20 3d 20 6f 75 74 62 75 66 2d 3e 73 69 7a 65 n = outbuf->size 0810: 20 2b 20 28 62 75 66 5f 70 20 2d 20 62 75 66 29 + (buf_p - buf) 0820: 3b 0a 09 6f 75 74 62 75 66 2d 3e 61 73 6e 31 72 ;..outbuf->asn1r 0830: 65 70 20 3d 20 62 75 66 3b 0a 0a 09 62 75 66 5f ep = buf;...buf_ 0840: 70 20 2b 3d 20 6f 75 74 62 75 66 2d 3e 73 69 7a p += outbuf->siz 0850: 65 3b 0a 09 62 75 66 6c 65 6e 20 2d 3d 20 6f 75 e;..buflen -= ou 0860: 74 62 75 66 2d 3e 73 69 7a 65 3b 0a 0a 09 72 65 tbuf->size;...re 0870: 74 75 72 6e 28 5f 61 73 6e 31 5f 78 35 30 39 5f turn(_asn1_x509_ 0880: 72 65 61 64 5f 61 73 6e 31 5f 6f 62 6a 65 63 74 read_asn1_object 0890: 28 62 75 66 5f 70 2c 20 62 75 66 6c 65 6e 2c 20 (buf_p, buflen, 08a0: 61 72 67 73 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 args));.}..stati 08b0: 63 20 69 6e 74 20 61 73 6e 31 5f 78 35 30 39 5f c int asn1_x509_ 08c0: 72 65 61 64 5f 61 73 6e 31 5f 6f 62 6a 65 63 74 read_asn1_object 08d0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a (unsigned char * 08e0: 62 75 66 2c 20 73 69 7a 65 5f 74 20 62 75 66 6c buf, size_t bufl 08f0: 65 6e 2c 20 2e 2e 2e 29 20 7b 0a 09 76 61 5f 6c en, ...) {..va_l 0900: 69 73 74 20 61 72 67 73 3b 0a 09 69 6e 74 20 72 ist args;..int r 0910: 65 74 76 61 6c 3b 0a 0a 09 76 61 5f 73 74 61 72 etval;...va_star 0920: 74 28 61 72 67 73 2c 20 62 75 66 6c 65 6e 29 3b t(args, buflen); 0930: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 5f 61 73 6e ...retval = _asn 0940: 31 5f 78 35 30 39 5f 72 65 61 64 5f 61 73 6e 31 1_x509_read_asn1 0950: 5f 6f 62 6a 65 63 74 28 62 75 66 2c 20 62 75 66 _object(buf, buf 0960: 6c 65 6e 2c 20 26 61 72 67 73 29 3b 0a 0a 09 76 len, &args);...v 0970: 61 5f 65 6e 64 28 61 72 67 73 29 3b 0a 0a 09 72 a_end(args);...r 0980: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d eturn(retval);.} 0990: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73 6e ..static int asn 09a0: 31 5f 78 35 30 39 5f 72 65 61 64 5f 6f 62 6a 65 1_x509_read_obje 09b0: 63 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ct(unsigned char 09c0: 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 62 75 *buf, size_t bu 09d0: 66 6c 65 6e 2c 20 73 74 72 75 63 74 20 78 35 30 flen, struct x50 09e0: 39 5f 6f 62 6a 65 63 74 20 2a 6f 75 74 62 75 66 9_object *outbuf 09f0: 29 20 7b 0a 09 69 6e 74 20 72 65 61 64 5f 72 65 ) {..int read_re 0a00: 74 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 t;...read_ret = 0a10: 61 73 6e 31 5f 78 35 30 39 5f 72 65 61 64 5f 61 asn1_x509_read_a 0a20: 73 6e 31 5f 6f 62 6a 65 63 74 28 62 75 66 2c 20 sn1_object(buf, 0a30: 62 75 66 6c 65 6e 2c 20 26 6f 75 74 62 75 66 2d buflen, &outbuf- 0a40: 3e 77 68 6f 6c 65 74 68 69 6e 67 2c 20 4e 55 4c >wholething, NUL 0a50: 4c 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 L);..if (read_re 0a60: 74 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 t != 0) {...retu 0a70: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 72 65 61 rn(-1);..}...rea 0a80: 64 5f 72 65 74 20 3d 20 61 73 6e 31 5f 78 35 30 d_ret = asn1_x50 0a90: 39 5f 72 65 61 64 5f 61 73 6e 31 5f 6f 62 6a 65 9_read_asn1_obje 0aa0: 63 74 28 6f 75 74 62 75 66 2d 3e 77 68 6f 6c 65 ct(outbuf->whole 0ab0: 74 68 69 6e 67 2e 63 6f 6e 74 65 6e 74 73 2c 20 thing.contents, 0ac0: 6f 75 74 62 75 66 2d 3e 77 68 6f 6c 65 74 68 69 outbuf->wholethi 0ad0: 6e 67 2e 73 69 7a 65 2c 20 26 6f 75 74 62 75 66 ng.size, &outbuf 0ae0: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 4e ->certificate, N 0af0: 55 4c 4c 29 3b 0a 09 69 66 20 28 72 65 61 64 5f ULL);..if (read_ 0b00: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 ret != 0) {...re 0b10: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 72 turn(-1);..}...r 0b20: 65 61 64 5f 72 65 74 20 3d 20 61 73 6e 31 5f 78 ead_ret = asn1_x 0b30: 35 30 39 5f 72 65 61 64 5f 61 73 6e 31 5f 6f 62 509_read_asn1_ob 0b40: 6a 65 63 74 28 6f 75 74 62 75 66 2d 3e 63 65 72 ject(outbuf->cer 0b50: 74 69 66 69 63 61 74 65 2e 63 6f 6e 74 65 6e 74 tificate.content 0b60: 73 2c 20 6f 75 74 62 75 66 2d 3e 63 65 72 74 69 s, outbuf->certi 0b70: 66 69 63 61 74 65 2e 73 69 7a 65 2c 20 26 6f 75 ficate.size, &ou 0b80: 74 62 75 66 2d 3e 76 65 72 73 69 6f 6e 2c 20 26 tbuf->version, & 0b90: 6f 75 74 62 75 66 2d 3e 73 65 72 69 61 6c 5f 6e outbuf->serial_n 0ba0: 75 6d 62 65 72 2c 20 26 6f 75 74 62 75 66 2d 3e umber, &outbuf-> 0bb0: 73 69 67 6e 61 74 75 72 65 5f 61 6c 67 6f 2c 20 signature_algo, 0bc0: 26 6f 75 74 62 75 66 2d 3e 69 73 73 75 65 72 2c &outbuf->issuer, 0bd0: 20 26 6f 75 74 62 75 66 2d 3e 76 61 6c 69 64 69 &outbuf->validi 0be0: 74 79 2c 20 26 6f 75 74 62 75 66 2d 3e 73 75 62 ty, &outbuf->sub 0bf0: 6a 65 63 74 2c 20 26 6f 75 74 62 75 66 2d 3e 70 ject, &outbuf->p 0c00: 75 62 6b 65 79 69 6e 66 6f 2c 20 4e 55 4c 4c 29 ubkeyinfo, NULL) 0c10: 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 ;..if (read_ret 0c20: 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e != 0) {...return 0c30: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f (-1);..}...read_ 0c40: 72 65 74 20 3d 20 61 73 6e 31 5f 78 35 30 39 5f ret = asn1_x509_ 0c50: 72 65 61 64 5f 61 73 6e 31 5f 6f 62 6a 65 63 74 read_asn1_object 0c60: 28 6f 75 74 62 75 66 2d 3e 70 75 62 6b 65 79 69 (outbuf->pubkeyi 0c70: 6e 66 6f 2e 63 6f 6e 74 65 6e 74 73 2c 20 6f 75 nfo.contents, ou 0c80: 74 62 75 66 2d 3e 70 75 62 6b 65 79 69 6e 66 6f tbuf->pubkeyinfo 0c90: 2e 73 69 7a 65 2c 20 26 6f 75 74 62 75 66 2d 3e .size, &outbuf-> 0ca0: 70 75 62 6b 65 79 5f 61 6c 67 6f 69 64 2c 20 26 pubkey_algoid, & 0cb0: 6f 75 74 62 75 66 2d 3e 70 75 62 6b 65 79 2c 20 outbuf->pubkey, 0cc0: 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 72 65 61 64 NULL);..if (read 0cd0: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 72 _ret != 0) {...r 0ce0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 eturn(-1);..}... 0cf0: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 73 return(0);.}..ss 0d00: 69 7a 65 5f 74 20 78 35 30 39 5f 74 6f 5f 69 73 ize_t x509_to_is 0d10: 73 75 65 72 28 76 6f 69 64 20 2a 78 35 30 39 5f suer(void *x509_ 0d20: 64 65 72 5f 62 75 66 2c 20 73 69 7a 65 5f 74 20 der_buf, size_t 0d30: 78 35 30 39 5f 64 65 72 5f 62 75 66 5f 6c 65 6e x509_der_buf_len 0d40: 2c 20 76 6f 69 64 20 2a 2a 6f 75 74 62 75 66 29 , void **outbuf) 0d50: 20 7b 0a 09 73 74 72 75 63 74 20 78 35 30 39 5f {..struct x509_ 0d60: 6f 62 6a 65 63 74 20 78 35 30 39 3b 0a 09 69 6e object x509;..in 0d70: 74 20 72 65 61 64 5f 72 65 74 3b 0a 0a 09 72 65 t read_ret;...re 0d80: 61 64 5f 72 65 74 20 3d 20 61 73 6e 31 5f 78 35 ad_ret = asn1_x5 0d90: 30 39 5f 72 65 61 64 5f 6f 62 6a 65 63 74 28 78 09_read_object(x 0da0: 35 30 39 5f 64 65 72 5f 62 75 66 2c 20 78 35 30 509_der_buf, x50 0db0: 39 5f 64 65 72 5f 62 75 66 5f 6c 65 6e 2c 20 26 9_der_buf_len, & 0dc0: 78 35 30 39 29 3b 0a 09 69 66 20 28 72 65 61 64 x509);..if (read 0dd0: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 72 _ret != 0) {...r 0de0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 eturn(-1);..}... 0df0: 69 66 20 28 6f 75 74 62 75 66 29 20 7b 0a 09 09 if (outbuf) {... 0e00: 2a 6f 75 74 62 75 66 20 3d 20 78 35 30 39 2e 69 *outbuf = x509.i 0e10: 73 73 75 65 72 2e 61 73 6e 31 72 65 70 3b 0a 09 ssuer.asn1rep;.. 0e20: 7d 0a 0a 09 72 65 74 75 72 6e 28 78 35 30 39 2e }...return(x509. 0e30: 69 73 73 75 65 72 2e 61 73 6e 31 72 65 70 5f 6c issuer.asn1rep_l 0e40: 65 6e 29 3b 0a 7d 0a 0a 73 73 69 7a 65 5f 74 20 en);.}..ssize_t 0e50: 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 x509_to_subject( 0e60: 76 6f 69 64 20 2a 78 35 30 39 5f 64 65 72 5f 62 void *x509_der_b 0e70: 75 66 2c 20 73 69 7a 65 5f 74 20 78 35 30 39 5f uf, size_t x509_ 0e80: 64 65 72 5f 62 75 66 5f 6c 65 6e 2c 20 76 6f 69 der_buf_len, voi 0e90: 64 20 2a 2a 6f 75 74 62 75 66 29 20 7b 0a 09 73 d **outbuf) {..s 0ea0: 74 72 75 63 74 20 78 35 30 39 5f 6f 62 6a 65 63 truct x509_objec 0eb0: 74 20 78 35 30 39 3b 0a 09 69 6e 74 20 72 65 61 t x509;..int rea 0ec0: 64 5f 72 65 74 3b 0a 0a 09 72 65 61 64 5f 72 65 d_ret;...read_re 0ed0: 74 20 3d 20 61 73 6e 31 5f 78 35 30 39 5f 72 65 t = asn1_x509_re 0ee0: 61 64 5f 6f 62 6a 65 63 74 28 78 35 30 39 5f 64 ad_object(x509_d 0ef0: 65 72 5f 62 75 66 2c 20 78 35 30 39 5f 64 65 72 er_buf, x509_der 0f00: 5f 62 75 66 5f 6c 65 6e 2c 20 26 78 35 30 39 29 _buf_len, &x509) 0f10: 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 ;..if (read_ret 0f20: 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e != 0) {...return 0f30: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f (-1);..}...if (o 0f40: 75 74 62 75 66 29 20 7b 0a 09 09 2a 6f 75 74 62 utbuf) {...*outb 0f50: 75 66 20 3d 20 78 35 30 39 2e 73 75 62 6a 65 63 uf = x509.subjec 0f60: 74 2e 61 73 6e 31 72 65 70 3b 0a 09 7d 0a 0a 09 t.asn1rep;..}... 0f70: 72 65 74 75 72 6e 28 78 35 30 39 2e 73 75 62 6a return(x509.subj 0f80: 65 63 74 2e 61 73 6e 31 72 65 70 5f 6c 65 6e 29 ect.asn1rep_len) 0f90: 3b 0a 7d 0a 0a 73 73 69 7a 65 5f 74 20 78 35 30 ;.}..ssize_t x50 0fa0: 39 5f 74 6f 5f 73 65 72 69 61 6c 28 76 6f 69 64 9_to_serial(void 0fb0: 20 2a 78 35 30 39 5f 64 65 72 5f 62 75 66 2c 20 *x509_der_buf, 0fc0: 73 69 7a 65 5f 74 20 78 35 30 39 5f 64 65 72 5f size_t x509_der_ 0fd0: 62 75 66 5f 6c 65 6e 2c 20 76 6f 69 64 20 2a 2a buf_len, void ** 0fe0: 6f 75 74 62 75 66 29 20 7b 0a 09 73 74 72 75 63 outbuf) {..struc 0ff0: 74 20 78 35 30 39 5f 6f 62 6a 65 63 74 20 78 35 t x509_object x5 1000: 30 39 3b 0a 09 69 6e 74 20 72 65 61 64 5f 72 65 09;..int read_re 1010: 74 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 t;...read_ret = 1020: 61 73 6e 31 5f 78 35 30 39 5f 72 65 61 64 5f 6f asn1_x509_read_o 1030: 62 6a 65 63 74 28 78 35 30 39 5f 64 65 72 5f 62 bject(x509_der_b 1040: 75 66 2c 20 78 35 30 39 5f 64 65 72 5f 62 75 66 uf, x509_der_buf 1050: 5f 6c 65 6e 2c 20 26 78 35 30 39 29 3b 0a 09 69 _len, &x509);..i 1060: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 30 f (read_ret != 0 1070: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 ) {...return(-1) 1080: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 ;..}...if (outbu 1090: 66 29 20 7b 0a 09 09 2a 6f 75 74 62 75 66 20 3d f) {...*outbuf = 10a0: 20 78 35 30 39 2e 73 65 72 69 61 6c 5f 6e 75 6d x509.serial_num 10b0: 62 65 72 2e 61 73 6e 31 72 65 70 3b 0a 09 7d 0a ber.asn1rep;..}. 10c0: 0a 09 72 65 74 75 72 6e 28 78 35 30 39 2e 73 65 ..return(x509.se 10d0: 72 69 61 6c 5f 6e 75 6d 62 65 72 2e 61 73 6e 31 rial_number.asn1 10e0: 72 65 70 5f 6c 65 6e 29 3b 0a 7d 0a 0a 73 73 69 rep_len);.}..ssi 10f0: 7a 65 5f 74 20 78 35 30 39 5f 74 6f 5f 6d 6f 64 ze_t x509_to_mod 1100: 75 6c 75 73 28 76 6f 69 64 20 2a 78 35 30 39 5f ulus(void *x509_ 1110: 64 65 72 5f 62 75 66 2c 20 73 69 7a 65 5f 74 20 der_buf, size_t 1120: 78 35 30 39 5f 64 65 72 5f 62 75 66 5f 6c 65 6e x509_der_buf_len 1130: 2c 20 76 6f 69 64 20 2a 2a 6f 75 74 62 75 66 29 , void **outbuf) 1140: 20 7b 0a 09 73 74 72 75 63 74 20 61 73 6e 31 5f {..struct asn1_ 1150: 6f 62 6a 65 63 74 20 6e 75 6c 6c 2c 20 70 75 62 object null, pub 1160: 6b 65 79 2c 20 6d 6f 64 75 6c 75 73 2c 20 65 78 key, modulus, ex 1170: 70 6f 6e 65 6e 74 3b 0a 09 73 74 72 75 63 74 20 ponent;..struct 1180: 78 35 30 39 5f 6f 62 6a 65 63 74 20 78 35 30 39 x509_object x509 1190: 3b 0a 09 69 6e 74 20 72 65 61 64 5f 72 65 74 3b ;..int read_ret; 11a0: 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 61 73 ...read_ret = as 11b0: 6e 31 5f 78 35 30 39 5f 72 65 61 64 5f 6f 62 6a n1_x509_read_obj 11c0: 65 63 74 28 78 35 30 39 5f 64 65 72 5f 62 75 66 ect(x509_der_buf 11d0: 2c 20 78 35 30 39 5f 64 65 72 5f 62 75 66 5f 6c , x509_der_buf_l 11e0: 65 6e 2c 20 26 78 35 30 39 29 3b 0a 09 69 66 20 en, &x509);..if 11f0: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 30 29 20 (read_ret != 0) 1200: 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a {...return(-1);. 1210: 09 7d 0a 0a 09 2f 2a 20 54 68 65 20 73 74 72 75 .}.../* The stru 1220: 63 74 75 72 65 20 6f 66 20 22 70 75 62 6b 65 79 cture of "pubkey 1230: 22 20 69 73 20 73 70 65 63 69 66 69 65 64 20 69 " is specified i 1240: 6e 20 50 4b 43 53 20 23 31 20 2a 2f 0a 09 72 65 n PKCS #1 */..re 1250: 61 64 5f 72 65 74 20 3d 20 61 73 6e 31 5f 78 35 ad_ret = asn1_x5 1260: 30 39 5f 72 65 61 64 5f 61 73 6e 31 5f 6f 62 6a 09_read_asn1_obj 1270: 65 63 74 28 78 35 30 39 2e 70 75 62 6b 65 79 2e ect(x509.pubkey. 1280: 63 6f 6e 74 65 6e 74 73 2c 20 78 35 30 39 2e 70 contents, x509.p 1290: 75 62 6b 65 79 2e 73 69 7a 65 2c 20 26 6e 75 6c ubkey.size, &nul 12a0: 6c 2c 20 26 70 75 62 6b 65 79 2c 20 4e 55 4c 4c l, &pubkey, NULL 12b0: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 );..if (read_ret 12c0: 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 != 0) {...retur 12d0: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 n(-1);..}...read 12e0: 5f 72 65 74 20 3d 20 61 73 6e 31 5f 78 35 30 39 _ret = asn1_x509 12f0: 5f 72 65 61 64 5f 61 73 6e 31 5f 6f 62 6a 65 63 _read_asn1_objec 1300: 74 28 70 75 62 6b 65 79 2e 63 6f 6e 74 65 6e 74 t(pubkey.content 1310: 73 2c 20 70 75 62 6b 65 79 2e 73 69 7a 65 2c 20 s, pubkey.size, 1320: 26 6d 6f 64 75 6c 75 73 2c 20 26 65 78 70 6f 6e &modulus, &expon 1330: 65 6e 74 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 ent, NULL);..if 1340: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 30 29 20 (read_ret != 0) 1350: 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a {...return(-1);. 1360: 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 29 .}...if (outbuf) 1370: 20 7b 0a 09 09 2a 6f 75 74 62 75 66 20 3d 20 6d {...*outbuf = m 1380: 6f 64 75 6c 75 73 2e 63 6f 6e 74 65 6e 74 73 3b odulus.contents; 1390: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 6d 6f 64 ..}...return(mod 13a0: 75 6c 75 73 2e 73 69 7a 65 29 3b 0a 7d 0a 0a 73 ulus.size);.}..s 13b0: 73 69 7a 65 5f 74 20 78 35 30 39 5f 74 6f 5f 65 size_t x509_to_e 13c0: 78 70 6f 6e 65 6e 74 28 76 6f 69 64 20 2a 78 35 xponent(void *x5 13d0: 30 39 5f 64 65 72 5f 62 75 66 2c 20 73 69 7a 65 09_der_buf, size 13e0: 5f 74 20 78 35 30 39 5f 64 65 72 5f 62 75 66 5f _t x509_der_buf_ 13f0: 6c 65 6e 2c 20 76 6f 69 64 20 2a 2a 6f 75 74 62 len, void **outb 1400: 75 66 29 20 7b 0a 09 73 74 72 75 63 74 20 61 73 uf) {..struct as 1410: 6e 31 5f 6f 62 6a 65 63 74 20 6e 75 6c 6c 2c 20 n1_object null, 1420: 70 75 62 6b 65 79 2c 20 6d 6f 64 75 6c 75 73 2c pubkey, modulus, 1430: 20 65 78 70 6f 6e 65 6e 74 3b 0a 09 73 74 72 75 exponent;..stru 1440: 63 74 20 78 35 30 39 5f 6f 62 6a 65 63 74 20 78 ct x509_object x 1450: 35 30 39 3b 0a 09 69 6e 74 20 72 65 61 64 5f 72 509;..int read_r 1460: 65 74 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d et;...read_ret = 1470: 20 61 73 6e 31 5f 78 35 30 39 5f 72 65 61 64 5f asn1_x509_read_ 1480: 6f 62 6a 65 63 74 28 78 35 30 39 5f 64 65 72 5f object(x509_der_ 1490: 62 75 66 2c 20 78 35 30 39 5f 64 65 72 5f 62 75 buf, x509_der_bu 14a0: 66 5f 6c 65 6e 2c 20 26 78 35 30 39 29 3b 0a 09 f_len, &x509);.. 14b0: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 if (read_ret != 14c0: 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 0) {...return(-1 14d0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 68 65 20 73 );..}.../* The s 14e0: 74 72 75 63 74 75 72 65 20 6f 66 20 22 70 75 62 tructure of "pub 14f0: 6b 65 79 22 20 69 73 20 73 70 65 63 69 66 69 65 key" is specifie 1500: 64 20 69 6e 20 50 4b 43 53 20 23 31 20 2a 2f 0a d in PKCS #1 */. 1510: 09 72 65 61 64 5f 72 65 74 20 3d 20 61 73 6e 31 .read_ret = asn1 1520: 5f 78 35 30 39 5f 72 65 61 64 5f 61 73 6e 31 5f _x509_read_asn1_ 1530: 6f 62 6a 65 63 74 28 78 35 30 39 2e 70 75 62 6b object(x509.pubk 1540: 65 79 2e 63 6f 6e 74 65 6e 74 73 2c 20 78 35 30 ey.contents, x50 1550: 39 2e 70 75 62 6b 65 79 2e 73 69 7a 65 2c 20 26 9.pubkey.size, & 1560: 6e 75 6c 6c 2c 20 26 70 75 62 6b 65 79 2c 20 4e null, &pubkey, N 1570: 55 4c 4c 29 3b 0a 09 69 66 20 28 72 65 61 64 5f ULL);..if (read_ 1580: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 ret != 0) {...re 1590: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 72 turn(-1);..}...r 15a0: 65 61 64 5f 72 65 74 20 3d 20 61 73 6e 31 5f 78 ead_ret = asn1_x 15b0: 35 30 39 5f 72 65 61 64 5f 61 73 6e 31 5f 6f 62 509_read_asn1_ob 15c0: 6a 65 63 74 28 70 75 62 6b 65 79 2e 63 6f 6e 74 ject(pubkey.cont 15d0: 65 6e 74 73 2c 20 70 75 62 6b 65 79 2e 73 69 7a ents, pubkey.siz 15e0: 65 2c 20 26 6d 6f 64 75 6c 75 73 2c 20 26 65 78 e, &modulus, &ex 15f0: 70 6f 6e 65 6e 74 2c 20 4e 55 4c 4c 29 3b 0a 09 ponent, NULL);.. 1600: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 if (read_ret != 1610: 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 0) {...return(-1 1620: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 );..}...if (outb 1630: 75 66 29 20 7b 0a 09 09 2a 6f 75 74 62 75 66 20 uf) {...*outbuf 1640: 3d 20 65 78 70 6f 6e 65 6e 74 2e 63 6f 6e 74 65 = exponent.conte 1650: 6e 74 73 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e nts;..}...return 1660: 28 65 78 70 6f 6e 65 6e 74 2e 73 69 7a 65 29 3b (exponent.size); 1670: 0a 7d 0a 0a 73 73 69 7a 65 5f 74 20 78 35 30 39 .}..ssize_t x509 1680: 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 76 6f 69 64 _to_keysize(void 1690: 20 2a 78 35 30 39 5f 64 65 72 5f 62 75 66 2c 20 *x509_der_buf, 16a0: 73 69 7a 65 5f 74 20 78 35 30 39 5f 64 65 72 5f size_t x509_der_ 16b0: 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 73 74 72 75 buf_len) {..stru 16c0: 63 74 20 61 73 6e 31 5f 6f 62 6a 65 63 74 20 6e ct asn1_object n 16d0: 75 6c 6c 2c 20 70 75 62 6b 65 79 2c 20 6d 6f 64 ull, pubkey, mod 16e0: 75 6c 75 73 2c 20 65 78 70 6f 6e 65 6e 74 3b 0a ulus, exponent;. 16f0: 09 73 74 72 75 63 74 20 78 35 30 39 5f 6f 62 6a .struct x509_obj 1700: 65 63 74 20 78 35 30 39 3b 0a 09 69 6e 74 20 72 ect x509;..int r 1710: 65 61 64 5f 72 65 74 3b 0a 0a 09 72 65 61 64 5f ead_ret;...read_ 1720: 72 65 74 20 3d 20 61 73 6e 31 5f 78 35 30 39 5f ret = asn1_x509_ 1730: 72 65 61 64 5f 6f 62 6a 65 63 74 28 78 35 30 39 read_object(x509 1740: 5f 64 65 72 5f 62 75 66 2c 20 78 35 30 39 5f 64 _der_buf, x509_d 1750: 65 72 5f 62 75 66 5f 6c 65 6e 2c 20 26 78 35 30 er_buf_len, &x50 1760: 39 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 9);..if (read_re 1770: 74 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 t != 0) {...retu 1780: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 rn(-1);..}.../* 1790: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 6f 66 The structure of 17a0: 20 22 70 75 62 6b 65 79 22 20 69 73 20 73 70 65 "pubkey" is spe 17b0: 63 69 66 69 65 64 20 69 6e 20 50 4b 43 53 20 23 cified in PKCS # 17c0: 31 20 2a 2f 0a 09 72 65 61 64 5f 72 65 74 20 3d 1 */..read_ret = 17d0: 20 61 73 6e 31 5f 78 35 30 39 5f 72 65 61 64 5f asn1_x509_read_ 17e0: 61 73 6e 31 5f 6f 62 6a 65 63 74 28 78 35 30 39 asn1_object(x509 17f0: 2e 70 75 62 6b 65 79 2e 63 6f 6e 74 65 6e 74 73 .pubkey.contents 1800: 2c 20 78 35 30 39 2e 70 75 62 6b 65 79 2e 73 69 , x509.pubkey.si 1810: 7a 65 2c 20 26 6e 75 6c 6c 2c 20 26 70 75 62 6b ze, &null, &pubk 1820: 65 79 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 ey, NULL);..if ( 1830: 72 65 61 64 5f 72 65 74 20 21 3d 20 30 29 20 7b read_ret != 0) { 1840: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 ...return(-1);.. 1850: 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 61 }...read_ret = a 1860: 73 6e 31 5f 78 35 30 39 5f 72 65 61 64 5f 61 73 sn1_x509_read_as 1870: 6e 31 5f 6f 62 6a 65 63 74 28 70 75 62 6b 65 79 n1_object(pubkey 1880: 2e 63 6f 6e 74 65 6e 74 73 2c 20 70 75 62 6b 65 .contents, pubke 1890: 79 2e 73 69 7a 65 2c 20 26 6d 6f 64 75 6c 75 73 y.size, &modulus 18a0: 2c 20 26 65 78 70 6f 6e 65 6e 74 2c 20 4e 55 4c , &exponent, NUL 18b0: 4c 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 L);..if (read_re 18c0: 74 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 t != 0) {...retu 18d0: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 72 65 74 rn(-1);..}...ret 18e0: 75 72 6e 28 6d 6f 64 75 6c 75 73 2e 73 69 7a 65 urn(modulus.size 18f0: 20 2d 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 - 1);.}../*. * 1900: 68 74 74 70 3a 2f 2f 77 77 77 2e 62 6c 61 63 6b http://www.black 1910: 62 65 72 72 79 2e 63 6f 6d 2f 64 65 76 65 6c 6f berry.com/develo 1920: 70 65 72 73 2f 64 6f 63 73 2f 34 2e 36 2e 30 61 pers/docs/4.6.0a 1930: 70 69 2f 6a 61 76 61 78 2f 6d 69 63 72 6f 65 64 pi/javax/microed 1940: 69 74 69 6f 6e 2f 70 6b 69 2f 43 65 72 74 69 66 ition/pki/Certif 1950: 69 63 61 74 65 2e 68 74 6d 6c 0a 20 2a 2f 0a 73 icate.html. */.s 1960: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 tatic const char 1970: 20 2a 5f 78 35 30 39 5f 6f 62 6a 65 63 74 69 64 *_x509_objectid 1980: 5f 74 6f 5f 6c 61 62 65 6c 5f 73 74 72 69 6e 67 _to_label_string 1990: 28 76 6f 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 (void *buf, size 19a0: 5f 74 20 62 75 66 6c 65 6e 29 20 7b 0a 09 73 77 _t buflen) {..sw 19b0: 69 74 63 68 20 28 62 75 66 6c 65 6e 29 20 7b 0a itch (buflen) {. 19c0: 09 09 63 61 73 65 20 33 3a 0a 09 09 09 69 66 20 ..case 3:....if 19d0: 28 6d 65 6d 63 6d 70 28 62 75 66 2c 20 22 5c 78 (memcmp(buf, "\x 19e0: 35 35 5c 78 30 34 5c 78 30 33 22 2c 20 33 29 20 55\x04\x03", 3) 19f0: 3d 3d 20 30 29 20 7b 0a 09 09 09 09 72 65 74 75 == 0) {.....retu 1a00: 72 6e 28 22 43 4e 22 29 3b 0a 09 09 09 7d 0a 09 rn("CN");....}.. 1a10: 09 09 69 66 20 28 6d 65 6d 63 6d 70 28 62 75 66 ..if (memcmp(buf 1a20: 2c 20 22 5c 78 35 35 5c 78 30 34 5c 78 30 34 22 , "\x55\x04\x04" 1a30: 2c 20 33 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 , 3) == 0) {.... 1a40: 09 72 65 74 75 72 6e 28 22 53 4e 22 29 3b 0a 09 .return("SN");.. 1a50: 09 09 7d 0a 09 09 09 69 66 20 28 6d 65 6d 63 6d ..}....if (memcm 1a60: 70 28 62 75 66 2c 20 22 5c 78 35 35 5c 78 30 34 p(buf, "\x55\x04 1a70: 5c 78 30 36 22 2c 20 33 29 20 3d 3d 20 30 29 20 \x06", 3) == 0) 1a80: 7b 0a 09 09 09 09 72 65 74 75 72 6e 28 22 43 22 {.....return("C" 1a90: 29 3b 0a 09 09 09 7d 0a 09 09 09 69 66 20 28 6d );....}....if (m 1aa0: 65 6d 63 6d 70 28 62 75 66 2c 20 22 5c 78 35 35 emcmp(buf, "\x55 1ab0: 5c 78 30 34 5c 78 30 37 22 2c 20 33 29 20 3d 3d \x04\x07", 3) == 1ac0: 20 30 29 20 7b 0a 09 09 09 09 72 65 74 75 72 6e 0) {.....return 1ad0: 28 22 4c 22 29 3b 0a 09 09 09 7d 0a 09 09 09 69 ("L");....}....i 1ae0: 66 20 28 6d 65 6d 63 6d 70 28 62 75 66 2c 20 22 f (memcmp(buf, " 1af0: 5c 78 35 35 5c 78 30 34 5c 78 30 38 22 2c 20 33 \x55\x04\x08", 3 1b00: 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 72 65 ) == 0) {.....re 1b10: 74 75 72 6e 28 22 53 54 22 29 3b 0a 09 09 09 7d turn("ST");....} 1b20: 0a 09 09 09 69 66 20 28 6d 65 6d 63 6d 70 28 62 ....if (memcmp(b 1b30: 75 66 2c 20 22 5c 78 35 35 5c 78 30 34 5c 78 30 uf, "\x55\x04\x0 1b40: 39 22 2c 20 33 29 20 3d 3d 20 30 29 20 7b 0a 09 9", 3) == 0) {.. 1b50: 09 09 09 72 65 74 75 72 6e 28 22 53 54 52 45 45 ...return("STREE 1b60: 54 22 29 3b 0a 09 09 09 7d 0a 09 09 09 69 66 20 T");....}....if 1b70: 28 6d 65 6d 63 6d 70 28 62 75 66 2c 20 22 5c 78 (memcmp(buf, "\x 1b80: 35 35 5c 78 30 34 5c 78 30 41 22 2c 20 33 29 20 55\x04\x0A", 3) 1b90: 3d 3d 20 30 29 20 7b 0a 09 09 09 09 72 65 74 75 == 0) {.....retu 1ba0: 72 6e 28 22 4f 22 29 3b 0a 09 09 09 7d 0a 09 09 rn("O");....}... 1bb0: 09 69 66 20 28 6d 65 6d 63 6d 70 28 62 75 66 2c .if (memcmp(buf, 1bc0: 20 22 5c 78 35 35 5c 78 30 34 5c 78 30 42 22 2c "\x55\x04\x0B", 1bd0: 20 33 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 3) == 0) {..... 1be0: 72 65 74 75 72 6e 28 22 4f 55 22 29 3b 0a 09 09 return("OU");... 1bf0: 09 7d 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 .}....break;...c 1c00: 61 73 65 20 39 3a 0a 09 09 09 69 66 20 28 6d 65 ase 9:....if (me 1c10: 6d 63 6d 70 28 62 75 66 2c 20 22 5c 78 32 41 5c mcmp(buf, "\x2A\ 1c20: 78 38 36 5c 78 34 38 5c 78 38 36 5c 78 46 37 5c x86\x48\x86\xF7\ 1c30: 78 30 44 5c 78 30 31 5c 78 30 39 5c 78 30 31 22 x0D\x01\x09\x01" 1c40: 2c 20 39 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 , 9) == 0) {.... 1c50: 09 72 65 74 75 72 6e 28 22 45 6d 61 69 6c 41 64 .return("EmailAd 1c60: 64 72 65 73 73 22 29 3b 0a 09 09 09 7d 0a 09 09 dress");....}... 1c70: 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 .break;..}...ret 1c80: 75 72 6e 28 22 3f 3f 3f 22 29 3b 0a 7d 0a 0a 73 urn("???");.}..s 1c90: 73 69 7a 65 5f 74 20 78 35 30 39 5f 64 6e 5f 74 size_t x509_dn_t 1ca0: 6f 5f 73 74 72 69 6e 67 28 76 6f 69 64 20 2a 61 o_string(void *a 1cb0: 73 6e 31 5f 64 65 72 5f 62 75 66 2c 20 73 69 7a sn1_der_buf, siz 1cc0: 65 5f 74 20 61 73 6e 31 5f 64 65 72 5f 62 75 66 e_t asn1_der_buf 1cd0: 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 6f 75 74 62 _len, char *outb 1ce0: 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74 62 75 uf, size_t outbu 1cf0: 66 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 6d 61 74 f_len, char *mat 1d00: 63 68 6c 61 62 65 6c 29 20 7b 0a 09 73 74 72 75 chlabel) {..stru 1d10: 63 74 20 61 73 6e 31 5f 6f 62 6a 65 63 74 20 77 ct asn1_object w 1d20: 68 6f 6c 65 5f 74 68 69 6e 67 2c 20 63 75 72 72 hole_thing, curr 1d30: 65 6e 74 5f 73 65 74 2c 20 63 75 72 72 65 6e 74 ent_set, current 1d40: 5f 73 65 71 3b 0a 09 73 74 72 75 63 74 20 61 73 _seq;..struct as 1d50: 6e 31 5f 6f 62 6a 65 63 74 20 6c 61 62 65 6c 2c n1_object label, 1d60: 20 76 61 6c 75 65 3b 0a 09 63 6f 6e 73 74 20 63 value;..const c 1d70: 68 61 72 20 2a 6c 61 62 65 6c 5f 73 74 72 3b 0a har *label_str;. 1d80: 09 73 73 69 7a 65 5f 74 20 73 6e 70 72 69 6e 74 .ssize_t snprint 1d90: 66 5f 72 65 74 2c 20 72 65 74 76 61 6c 3b 0a 09 f_ret, retval;.. 1da0: 63 68 61 72 20 2a 6f 75 74 62 75 66 5f 73 3b 0a char *outbuf_s;. 1db0: 09 69 6e 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 .int read_ret;.. 1dc0: 69 6e 74 20 6f 66 66 73 65 74 3b 0a 0a 09 69 66 int offset;...if 1dd0: 20 28 6f 75 74 62 75 66 20 3d 3d 20 4e 55 4c 4c (outbuf == NULL 1de0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 ) {...return(-1) 1df0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 ;..}...if (outbu 1e00: 66 5f 6c 65 6e 20 3d 3d 20 30 20 7c 7c 20 61 73 f_len == 0 || as 1e10: 6e 31 5f 64 65 72 5f 62 75 66 5f 6c 65 6e 20 3d n1_der_buf_len = 1e20: 3d 20 30 20 7c 7c 20 61 73 6e 31 5f 64 65 72 5f = 0 || asn1_der_ 1e30: 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 buf == NULL) {.. 1e40: 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a .return(0);..}.. 1e50: 09 72 65 61 64 5f 72 65 74 20 3d 20 61 73 6e 31 .read_ret = asn1 1e60: 5f 78 35 30 39 5f 72 65 61 64 5f 61 73 6e 31 5f _x509_read_asn1_ 1e70: 6f 62 6a 65 63 74 28 61 73 6e 31 5f 64 65 72 5f object(asn1_der_ 1e80: 62 75 66 2c 20 61 73 6e 31 5f 64 65 72 5f 62 75 buf, asn1_der_bu 1e90: 66 5f 6c 65 6e 2c 20 26 77 68 6f 6c 65 5f 74 68 f_len, &whole_th 1ea0: 69 6e 67 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 ing, NULL);..if 1eb0: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 30 29 20 (read_ret != 0) 1ec0: 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a {...return(-1);. 1ed0: 09 7d 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74 .}.../* Terminat 1ee0: 65 20 73 74 72 69 6e 67 2c 20 69 6e 20 63 61 73 e string, in cas 1ef0: 65 20 6e 6f 20 76 61 6c 69 64 20 65 6c 65 6d 65 e no valid eleme 1f00: 6e 74 73 20 61 72 65 20 66 6f 75 6e 64 20 77 65 nts are found we 1f10: 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 still return a 1f20: 76 61 6c 69 64 20 73 74 72 69 6e 67 20 2a 2f 0a valid string */. 1f30: 09 2a 6f 75 74 62 75 66 20 3d 20 27 5c 30 27 3b .*outbuf = '\0'; 1f40: 0a 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75 74 ..outbuf_s = out 1f50: 62 75 66 3b 0a 0a 09 6f 66 66 73 65 74 20 3d 20 buf;...offset = 1f60: 30 3b 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 0;..while (1) {. 1f70: 09 09 72 65 61 64 5f 72 65 74 20 3d 20 61 73 6e ..read_ret = asn 1f80: 31 5f 78 35 30 39 5f 72 65 61 64 5f 61 73 6e 31 1_x509_read_asn1 1f90: 5f 6f 62 6a 65 63 74 28 77 68 6f 6c 65 5f 74 68 _object(whole_th 1fa0: 69 6e 67 2e 63 6f 6e 74 65 6e 74 73 20 2b 20 6f ing.contents + o 1fb0: 66 66 73 65 74 2c 20 77 68 6f 6c 65 5f 74 68 69 ffset, whole_thi 1fc0: 6e 67 2e 73 69 7a 65 20 2d 20 6f 66 66 73 65 74 ng.size - offset 1fd0: 2c 20 26 63 75 72 72 65 6e 74 5f 73 65 74 2c 20 , ¤t_set, 1fe0: 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 72 65 61 NULL);...if (rea 1ff0: 64 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 d_ret != 0) {... 2000: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 6f .break;...}....o 2010: 66 66 73 65 74 20 2b 3d 20 63 75 72 72 65 6e 74 ffset += current 2020: 5f 73 65 74 2e 73 69 7a 65 20 2b 20 32 3b 0a 0a _set.size + 2;.. 2030: 09 09 72 65 61 64 5f 72 65 74 20 3d 20 61 73 6e ..read_ret = asn 2040: 31 5f 78 35 30 39 5f 72 65 61 64 5f 61 73 6e 31 1_x509_read_asn1 2050: 5f 6f 62 6a 65 63 74 28 63 75 72 72 65 6e 74 5f _object(current_ 2060: 73 65 74 2e 63 6f 6e 74 65 6e 74 73 2c 20 63 75 set.contents, cu 2070: 72 72 65 6e 74 5f 73 65 74 2e 73 69 7a 65 2c 20 rrent_set.size, 2080: 26 63 75 72 72 65 6e 74 5f 73 65 71 2c 20 4e 55 ¤t_seq, NU 2090: 4c 4c 29 3b 0a 09 09 69 66 20 28 72 65 61 64 5f LL);...if (read_ 20a0: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 62 ret != 0) {....b 20b0: 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 72 65 61 reak;...}....rea 20c0: 64 5f 72 65 74 20 3d 20 61 73 6e 31 5f 78 35 30 d_ret = asn1_x50 20d0: 39 5f 72 65 61 64 5f 61 73 6e 31 5f 6f 62 6a 65 9_read_asn1_obje 20e0: 63 74 28 63 75 72 72 65 6e 74 5f 73 65 71 2e 63 ct(current_seq.c 20f0: 6f 6e 74 65 6e 74 73 2c 20 63 75 72 72 65 6e 74 ontents, current 2100: 5f 73 65 71 2e 73 69 7a 65 2c 20 26 6c 61 62 65 _seq.size, &labe 2110: 6c 2c 20 26 76 61 6c 75 65 2c 20 4e 55 4c 4c 29 l, &value, NULL) 2120: 3b 0a 0a 09 09 6c 61 62 65 6c 5f 73 74 72 20 3d ;....label_str = 2130: 20 5f 78 35 30 39 5f 6f 62 6a 65 63 74 69 64 5f _x509_objectid_ 2140: 74 6f 5f 6c 61 62 65 6c 5f 73 74 72 69 6e 67 28 to_label_string( 2150: 6c 61 62 65 6c 2e 63 6f 6e 74 65 6e 74 73 2c 20 label.contents, 2160: 6c 61 62 65 6c 2e 73 69 7a 65 29 3b 0a 0a 09 09 label.size);.... 2170: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 72 /* If the user r 2180: 65 71 75 65 73 74 65 64 20 6f 6e 6c 79 20 63 65 equested only ce 2190: 72 74 61 69 6e 20 6c 61 62 65 6c 73 2c 20 65 78 rtain labels, ex 21a0: 63 6c 75 64 65 20 6f 74 68 65 72 73 20 2a 2f 0a clude others */. 21b0: 09 09 69 66 20 28 6d 61 74 63 68 6c 61 62 65 6c ..if (matchlabel 21c0: 29 20 7b 0a 09 09 09 69 66 20 28 73 74 72 63 6d ) {....if (strcm 21d0: 70 28 6d 61 74 63 68 6c 61 62 65 6c 2c 20 6c 61 p(matchlabel, la 21e0: 62 65 6c 5f 73 74 72 29 20 21 3d 20 30 29 20 7b bel_str) != 0) { 21f0: 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 .....continue;.. 2200: 09 09 7d 0a 09 09 7d 0a 0a 09 09 2f 2a 20 49 66 ..}...}..../* If 2210: 20 74 68 65 20 75 73 65 72 20 72 65 71 75 65 73 the user reques 2220: 74 65 64 20 6f 6e 6c 79 20 63 65 72 74 61 69 6e ted only certain 2230: 20 6c 61 62 65 6c 73 2c 20 64 6f 6e 27 74 20 69 labels, don't i 2240: 6e 63 6c 75 64 65 20 74 68 65 6d 20 69 6e 20 74 nclude them in t 2250: 68 65 20 72 65 70 6c 79 20 2a 2f 0a 09 09 69 66 he reply */...if 2260: 20 28 6d 61 74 63 68 6c 61 62 65 6c 29 20 7b 0a (matchlabel) {. 2270: 09 09 09 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 ...snprintf_ret 2280: 3d 20 73 6e 70 72 69 6e 74 66 28 6f 75 74 62 75 = snprintf(outbu 2290: 66 2c 20 6f 75 74 62 75 66 5f 6c 65 6e 2c 20 22 f, outbuf_len, " 22a0: 25 2e 2a 73 2c 20 22 2c 20 28 75 6e 73 69 67 6e %.*s, ", (unsign 22b0: 65 64 20 69 6e 74 29 20 76 61 6c 75 65 2e 73 69 ed int) value.si 22c0: 7a 65 2c 20 28 63 68 61 72 20 2a 29 20 76 61 6c ze, (char *) val 22d0: 75 65 2e 63 6f 6e 74 65 6e 74 73 29 3b 0a 09 09 ue.contents);... 22e0: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 73 6e 70 72 } else {....snpr 22f0: 69 6e 74 66 5f 72 65 74 20 3d 20 73 6e 70 72 69 intf_ret = snpri 2300: 6e 74 66 28 6f 75 74 62 75 66 2c 20 6f 75 74 62 ntf(outbuf, outb 2310: 75 66 5f 6c 65 6e 2c 20 22 25 73 3d 25 2e 2a 73 uf_len, "%s=%.*s 2320: 2c 20 22 2c 20 6c 61 62 65 6c 5f 73 74 72 2c 20 , ", label_str, 2330: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 76 (unsigned int) v 2340: 61 6c 75 65 2e 73 69 7a 65 2c 20 28 63 68 61 72 alue.size, (char 2350: 20 2a 29 20 76 61 6c 75 65 2e 63 6f 6e 74 65 6e *) value.conten 2360: 74 73 29 3b 0a 09 09 7d 0a 09 09 69 66 20 28 73 ts);...}...if (s 2370: 6e 70 72 69 6e 74 66 5f 72 65 74 20 3c 20 30 29 nprintf_ret < 0) 2380: 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d {....break;...} 2390: 0a 0a 09 09 69 66 20 28 73 6e 70 72 69 6e 74 66 ....if (snprintf 23a0: 5f 72 65 74 20 3e 20 6f 75 74 62 75 66 5f 6c 65 _ret > outbuf_le 23b0: 6e 29 20 7b 0a 09 09 09 73 6e 70 72 69 6e 74 66 n) {....snprintf 23c0: 5f 72 65 74 20 3d 20 6f 75 74 62 75 66 5f 6c 65 _ret = outbuf_le 23d0: 6e 3b 0a 09 09 7d 0a 0a 09 09 6f 75 74 62 75 66 n;...}....outbuf 23e0: 20 2b 3d 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 += snprintf_ret 23f0: 3b 0a 09 09 6f 75 74 62 75 66 5f 6c 65 6e 20 2d ;...outbuf_len - 2400: 3d 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 0a = snprintf_ret;. 2410: 0a 09 09 69 66 20 28 6f 75 74 62 75 66 5f 6c 65 ...if (outbuf_le 2420: 6e 20 3c 20 32 29 20 7b 0a 09 09 09 62 72 65 61 n < 2) {....brea 2430: 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 76 k;...}..}...retv 2440: 61 6c 20 3d 20 6f 75 74 62 75 66 20 2d 20 6f 75 al = outbuf - ou 2450: 74 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20 52 65 6d tbuf_s;.../* Rem 2460: 6f 76 65 20 74 72 61 69 6c 69 6e 67 20 22 2c 20 ove trailing ", 2470: 22 20 61 64 64 65 64 20 62 79 20 63 75 6d 75 6c " added by cumul 2480: 61 74 69 76 65 20 70 72 6f 63 65 73 73 2c 20 69 ative process, i 2490: 66 20 66 6f 75 6e 64 2e 20 2a 2f 0a 09 69 66 20 f found. */..if 24a0: 28 72 65 74 76 61 6c 20 3e 20 32 29 20 7b 0a 09 (retval > 2) {.. 24b0: 09 69 66 20 28 6f 75 74 62 75 66 5f 73 5b 72 65 .if (outbuf_s[re 24c0: 74 76 61 6c 20 2d 20 32 5d 20 3d 3d 20 27 2c 27 tval - 2] == ',' 24d0: 29 20 7b 0a 09 09 09 6f 75 74 62 75 66 5f 73 5b ) {....outbuf_s[ 24e0: 72 65 74 76 61 6c 20 2d 20 32 5d 20 3d 20 27 5c retval - 2] = '\ 24f0: 30 27 3b 0a 09 09 09 72 65 74 76 61 6c 20 2d 3d 0';....retval -= 2500: 20 32 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 2;...}..}...ret 2510: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a urn(retval);.}.