Hex Artifact Content

Artifact 0fcacfecab19b44530dc77688ce07010078bc94f:


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);.}.