Hex Artifact Content

Artifact cf76aee3de6fd243630bdfc409eda1e6d3a0519a:


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 73 74 72 75 63  subject;...struc
0350: 74 20 61 73 6e 31 5f 6f 62 6a 65 63 74 20 73 69  t asn1_object si
0360: 67 6e 61 74 75 72 65 3b 0a 7d 3b 0a 0a 73 74 61  gnature;.};..sta
0370: 74 69 63 20 69 6e 74 20 5f 61 73 6e 31 5f 78 35  tic int _asn1_x5
0380: 30 39 5f 72 65 61 64 5f 61 73 6e 31 5f 6f 62 6a  09_read_asn1_obj
0390: 65 63 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ect(unsigned cha
03a0: 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 62  r *buf, size_t b
03b0: 75 66 6c 65 6e 2c 20 76 61 5f 6c 69 73 74 20 2a  uflen, va_list *
03c0: 61 72 67 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65  args) {..unsigne
03d0: 64 20 63 68 61 72 20 73 6d 61 6c 6c 5f 6f 62 6a  d char small_obj
03e0: 65 63 74 5f 73 69 7a 65 3b 0a 09 75 6e 73 69 67  ect_size;..unsig
03f0: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 5f 70 3b  ned char *buf_p;
0400: 0a 09 73 74 72 75 63 74 20 61 73 6e 31 5f 6f 62  ..struct asn1_ob
0410: 6a 65 63 74 20 2a 6f 75 74 62 75 66 3b 0a 0a 09  ject *outbuf;...
0420: 6f 75 74 62 75 66 20 3d 20 76 61 5f 61 72 67 28  outbuf = va_arg(
0430: 2a 61 72 67 73 2c 20 73 74 72 75 63 74 20 61 73  *args, struct as
0440: 6e 31 5f 6f 62 6a 65 63 74 20 2a 29 3b 0a 0a 09  n1_object *);...
0450: 69 66 20 28 6f 75 74 62 75 66 20 3d 3d 20 4e 55  if (outbuf == NU
0460: 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30  LL) {...return(0
0470: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 62 75 66 6c  );..}...if (bufl
0480: 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74  en == 0) {...ret
0490: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 62 75  urn(-1);..}...bu
04a0: 66 5f 70 20 3d 20 62 75 66 3b 0a 0a 09 6f 75 74  f_p = buf;...out
04b0: 62 75 66 2d 3e 74 61 67 20 3d 20 2a 62 75 66 5f  buf->tag = *buf_
04c0: 70 3b 0a 09 62 75 66 5f 70 2b 2b 3b 0a 09 62 75  p;..buf_p++;..bu
04d0: 66 6c 65 6e 2d 2d 3b 0a 09 69 66 20 28 62 75 66  flen--;..if (buf
04e0: 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65  len == 0) {...re
04f0: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 73  turn(-1);..}...s
0500: 6d 61 6c 6c 5f 6f 62 6a 65 63 74 5f 73 69 7a 65  mall_object_size
0510: 20 3d 20 2a 62 75 66 5f 70 3b 0a 09 62 75 66 5f   = *buf_p;..buf_
0520: 70 2b 2b 3b 0a 09 62 75 66 6c 65 6e 2d 2d 3b 0a  p++;..buflen--;.
0530: 09 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 30  .if (buflen == 0
0540: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  ) {...return(-1)
0550: 3b 0a 09 7d 0a 0a 09 69 66 20 28 28 73 6d 61 6c  ;..}...if ((smal
0560: 6c 5f 6f 62 6a 65 63 74 5f 73 69 7a 65 20 26 20  l_object_size & 
0570: 30 78 38 30 29 20 3d 3d 20 30 78 38 30 29 20 7b  0x80) == 0x80) {
0580: 0a 09 09 6f 75 74 62 75 66 2d 3e 73 69 7a 65 20  ...outbuf->size 
0590: 3d 20 30 3b 0a 0a 09 09 66 6f 72 20 28 73 6d 61  = 0;....for (sma
05a0: 6c 6c 5f 6f 62 6a 65 63 74 5f 73 69 7a 65 20 5e  ll_object_size ^
05b0: 3d 20 30 78 38 30 3b 20 73 6d 61 6c 6c 5f 6f 62  = 0x80; small_ob
05c0: 6a 65 63 74 5f 73 69 7a 65 3b 20 73 6d 61 6c 6c  ject_size; small
05d0: 5f 6f 62 6a 65 63 74 5f 73 69 7a 65 2d 2d 29 20  _object_size--) 
05e0: 7b 0a 09 09 09 6f 75 74 62 75 66 2d 3e 73 69 7a  {....outbuf->siz
05f0: 65 20 3c 3c 3d 20 38 3b 0a 09 09 09 6f 75 74 62  e <<= 8;....outb
0600: 75 66 2d 3e 73 69 7a 65 20 2b 3d 20 2a 62 75 66  uf->size += *buf
0610: 5f 70 3b 0a 0a 09 09 09 62 75 66 5f 70 2b 2b 3b  _p;.....buf_p++;
0620: 0a 09 09 09 62 75 66 6c 65 6e 2d 2d 3b 0a 09 09  ....buflen--;...
0630: 09 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 30  .if (buflen == 0
0640: 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ) {.....break;..
0650: 09 09 7d 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  ..}...}..} else 
0660: 7b 0a 09 09 6f 75 74 62 75 66 2d 3e 73 69 7a 65  {...outbuf->size
0670: 20 3d 20 73 6d 61 6c 6c 5f 6f 62 6a 65 63 74 5f   = small_object_
0680: 73 69 7a 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f  size;..}...if (o
0690: 75 74 62 75 66 2d 3e 73 69 7a 65 20 3e 20 62 75  utbuf->size > bu
06a0: 66 6c 65 6e 29 20 7b 0a 09 09 72 65 74 75 72 6e  flen) {...return
06b0: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 6f 75 74 62 75  (-1);..}...outbu
06c0: 66 2d 3e 63 6f 6e 74 65 6e 74 73 20 3d 20 62 75  f->contents = bu
06d0: 66 5f 70 3b 0a 09 6f 75 74 62 75 66 2d 3e 61 73  f_p;..outbuf->as
06e0: 6e 31 72 65 70 5f 6c 65 6e 20 3d 20 6f 75 74 62  n1rep_len = outb
06f0: 75 66 2d 3e 73 69 7a 65 20 2b 20 28 62 75 66 5f  uf->size + (buf_
0700: 70 20 2d 20 62 75 66 29 3b 0a 09 6f 75 74 62 75  p - buf);..outbu
0710: 66 2d 3e 61 73 6e 31 72 65 70 20 3d 20 62 75 66  f->asn1rep = buf
0720: 3b 0a 0a 09 62 75 66 5f 70 20 2b 3d 20 6f 75 74  ;...buf_p += out
0730: 62 75 66 2d 3e 73 69 7a 65 3b 0a 09 62 75 66 6c  buf->size;..bufl
0740: 65 6e 20 2d 3d 20 6f 75 74 62 75 66 2d 3e 73 69  en -= outbuf->si
0750: 7a 65 3b 0a 0a 09 72 65 74 75 72 6e 28 5f 61 73  ze;...return(_as
0760: 6e 31 5f 78 35 30 39 5f 72 65 61 64 5f 61 73 6e  n1_x509_read_asn
0770: 31 5f 6f 62 6a 65 63 74 28 62 75 66 5f 70 2c 20  1_object(buf_p, 
0780: 62 75 66 6c 65 6e 2c 20 61 72 67 73 29 29 3b 0a  buflen, args));.
0790: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73  }..static int as
07a0: 6e 31 5f 78 35 30 39 5f 72 65 61 64 5f 61 73 6e  n1_x509_read_asn
07b0: 31 5f 6f 62 6a 65 63 74 28 75 6e 73 69 67 6e 65  1_object(unsigne
07c0: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a  d char *buf, siz
07d0: 65 5f 74 20 62 75 66 6c 65 6e 2c 20 2e 2e 2e 29  e_t buflen, ...)
07e0: 20 7b 0a 09 76 61 5f 6c 69 73 74 20 61 72 67 73   {..va_list args
07f0: 3b 0a 09 69 6e 74 20 72 65 74 76 61 6c 3b 0a 0a  ;..int retval;..
0800: 09 76 61 5f 73 74 61 72 74 28 61 72 67 73 2c 20  .va_start(args, 
0810: 62 75 66 6c 65 6e 29 3b 0a 0a 09 72 65 74 76 61  buflen);...retva
0820: 6c 20 3d 20 5f 61 73 6e 31 5f 78 35 30 39 5f 72  l = _asn1_x509_r
0830: 65 61 64 5f 61 73 6e 31 5f 6f 62 6a 65 63 74 28  ead_asn1_object(
0840: 62 75 66 2c 20 62 75 66 6c 65 6e 2c 20 26 61 72  buf, buflen, &ar
0850: 67 73 29 3b 0a 0a 09 76 61 5f 65 6e 64 28 61 72  gs);...va_end(ar
0860: 67 73 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  gs);...return(re
0870: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
0880: 20 69 6e 74 20 61 73 6e 31 5f 78 35 30 39 5f 72   int asn1_x509_r
0890: 65 61 64 5f 6f 62 6a 65 63 74 28 75 6e 73 69 67  ead_object(unsig
08a0: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 73  ned char *buf, s
08b0: 69 7a 65 5f 74 20 62 75 66 6c 65 6e 2c 20 73 74  ize_t buflen, st
08c0: 72 75 63 74 20 78 35 30 39 5f 6f 62 6a 65 63 74  ruct x509_object
08d0: 20 2a 6f 75 74 62 75 66 29 20 7b 0a 09 69 6e 74   *outbuf) {..int
08e0: 20 72 65 61 64 5f 72 65 74 3b 0a 0a 09 72 65 61   read_ret;...rea
08f0: 64 5f 72 65 74 20 3d 20 61 73 6e 31 5f 78 35 30  d_ret = asn1_x50
0900: 39 5f 72 65 61 64 5f 61 73 6e 31 5f 6f 62 6a 65  9_read_asn1_obje
0910: 63 74 28 62 75 66 2c 20 62 75 66 6c 65 6e 2c 20  ct(buf, buflen, 
0920: 26 6f 75 74 62 75 66 2d 3e 77 68 6f 6c 65 74 68  &outbuf->wholeth
0930: 69 6e 67 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20  ing, NULL);..if 
0940: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 30 29 20  (read_ret != 0) 
0950: 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  {...return(-1);.
0960: 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  .}...read_ret = 
0970: 61 73 6e 31 5f 78 35 30 39 5f 72 65 61 64 5f 61  asn1_x509_read_a
0980: 73 6e 31 5f 6f 62 6a 65 63 74 28 6f 75 74 62 75  sn1_object(outbu
0990: 66 2d 3e 77 68 6f 6c 65 74 68 69 6e 67 2e 63 6f  f->wholething.co
09a0: 6e 74 65 6e 74 73 2c 20 6f 75 74 62 75 66 2d 3e  ntents, outbuf->
09b0: 77 68 6f 6c 65 74 68 69 6e 67 2e 73 69 7a 65 2c  wholething.size,
09c0: 20 26 6f 75 74 62 75 66 2d 3e 63 65 72 74 69 66   &outbuf->certif
09d0: 69 63 61 74 65 2c 20 4e 55 4c 4c 29 3b 0a 09 69  icate, NULL);..i
09e0: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 30  f (read_ret != 0
09f0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  ) {...return(-1)
0a00: 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20  ;..}...read_ret 
0a10: 3d 20 61 73 6e 31 5f 78 35 30 39 5f 72 65 61 64  = asn1_x509_read
0a20: 5f 61 73 6e 31 5f 6f 62 6a 65 63 74 28 6f 75 74  _asn1_object(out
0a30: 62 75 66 2d 3e 63 65 72 74 69 66 69 63 61 74 65  buf->certificate
0a40: 2e 63 6f 6e 74 65 6e 74 73 2c 20 6f 75 74 62 75  .contents, outbu
0a50: 66 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2e 73  f->certificate.s
0a60: 69 7a 65 2c 20 26 6f 75 74 62 75 66 2d 3e 76 65  ize, &outbuf->ve
0a70: 72 73 69 6f 6e 2c 20 26 6f 75 74 62 75 66 2d 3e  rsion, &outbuf->
0a80: 73 65 72 69 61 6c 5f 6e 75 6d 62 65 72 2c 20 26  serial_number, &
0a90: 6f 75 74 62 75 66 2d 3e 73 69 67 6e 61 74 75 72  outbuf->signatur
0aa0: 65 5f 61 6c 67 6f 2c 20 26 6f 75 74 62 75 66 2d  e_algo, &outbuf-
0ab0: 3e 69 73 73 75 65 72 2c 20 26 6f 75 74 62 75 66  >issuer, &outbuf
0ac0: 2d 3e 76 61 6c 69 64 69 74 79 2c 20 26 6f 75 74  ->validity, &out
0ad0: 62 75 66 2d 3e 73 75 62 6a 65 63 74 2c 20 4e 55  buf->subject, NU
0ae0: 4c 4c 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72  LL);..if (read_r
0af0: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74  et != 0) {...ret
0b00: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 72 65  urn(-1);..}...re
0b10: 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 73 69 7a  turn(0);.}..ssiz
0b20: 65 5f 74 20 78 35 30 39 5f 74 6f 5f 69 73 73 75  e_t x509_to_issu
0b30: 65 72 28 76 6f 69 64 20 2a 78 35 30 39 5f 64 65  er(void *x509_de
0b40: 72 5f 62 75 66 2c 20 73 69 7a 65 5f 74 20 78 35  r_buf, size_t x5
0b50: 30 39 5f 64 65 72 5f 62 75 66 5f 6c 65 6e 2c 20  09_der_buf_len, 
0b60: 76 6f 69 64 20 2a 2a 6f 75 74 62 75 66 29 20 7b  void **outbuf) {
0b70: 0a 09 73 74 72 75 63 74 20 78 35 30 39 5f 6f 62  ..struct x509_ob
0b80: 6a 65 63 74 20 78 35 30 39 3b 0a 09 69 6e 74 20  ject x509;..int 
0b90: 72 65 61 64 5f 72 65 74 3b 0a 0a 09 72 65 61 64  read_ret;...read
0ba0: 5f 72 65 74 20 3d 20 61 73 6e 31 5f 78 35 30 39  _ret = asn1_x509
0bb0: 5f 72 65 61 64 5f 6f 62 6a 65 63 74 28 78 35 30  _read_object(x50
0bc0: 39 5f 64 65 72 5f 62 75 66 2c 20 78 35 30 39 5f  9_der_buf, x509_
0bd0: 64 65 72 5f 62 75 66 5f 6c 65 6e 2c 20 26 78 35  der_buf_len, &x5
0be0: 30 39 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72  09);..if (read_r
0bf0: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74  et != 0) {...ret
0c00: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66  urn(-1);..}...if
0c10: 20 28 6f 75 74 62 75 66 29 20 7b 0a 09 09 2a 6f   (outbuf) {...*o
0c20: 75 74 62 75 66 20 3d 20 78 35 30 39 2e 69 73 73  utbuf = x509.iss
0c30: 75 65 72 2e 61 73 6e 31 72 65 70 3b 0a 09 7d 0a  uer.asn1rep;..}.
0c40: 0a 09 72 65 74 75 72 6e 28 78 35 30 39 2e 69 73  ..return(x509.is
0c50: 73 75 65 72 2e 61 73 6e 31 72 65 70 5f 6c 65 6e  suer.asn1rep_len
0c60: 29 3b 0a 7d 0a 0a 73 73 69 7a 65 5f 74 20 78 35  );.}..ssize_t x5
0c70: 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 76 6f  09_to_subject(vo
0c80: 69 64 20 2a 78 35 30 39 5f 64 65 72 5f 62 75 66  id *x509_der_buf
0c90: 2c 20 73 69 7a 65 5f 74 20 78 35 30 39 5f 64 65  , size_t x509_de
0ca0: 72 5f 62 75 66 5f 6c 65 6e 2c 20 76 6f 69 64 20  r_buf_len, void 
0cb0: 2a 2a 6f 75 74 62 75 66 29 20 7b 0a 09 73 74 72  **outbuf) {..str
0cc0: 75 63 74 20 78 35 30 39 5f 6f 62 6a 65 63 74 20  uct x509_object 
0cd0: 78 35 30 39 3b 0a 09 69 6e 74 20 72 65 61 64 5f  x509;..int read_
0ce0: 72 65 74 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20  ret;...read_ret 
0cf0: 3d 20 61 73 6e 31 5f 78 35 30 39 5f 72 65 61 64  = asn1_x509_read
0d00: 5f 6f 62 6a 65 63 74 28 78 35 30 39 5f 64 65 72  _object(x509_der
0d10: 5f 62 75 66 2c 20 78 35 30 39 5f 64 65 72 5f 62  _buf, x509_der_b
0d20: 75 66 5f 6c 65 6e 2c 20 26 78 35 30 39 29 3b 0a  uf_len, &x509);.
0d30: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d  .if (read_ret !=
0d40: 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d   0) {...return(-
0d50: 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74  1);..}...if (out
0d60: 62 75 66 29 20 7b 0a 09 09 2a 6f 75 74 62 75 66  buf) {...*outbuf
0d70: 20 3d 20 78 35 30 39 2e 73 75 62 6a 65 63 74 2e   = x509.subject.
0d80: 61 73 6e 31 72 65 70 3b 0a 09 7d 0a 0a 09 72 65  asn1rep;..}...re
0d90: 74 75 72 6e 28 78 35 30 39 2e 73 75 62 6a 65 63  turn(x509.subjec
0da0: 74 2e 61 73 6e 31 72 65 70 5f 6c 65 6e 29 3b 0a  t.asn1rep_len);.
0db0: 7d 0a 0a 73 73 69 7a 65 5f 74 20 78 35 30 39 5f  }..ssize_t x509_
0dc0: 74 6f 5f 73 65 72 69 61 6c 28 76 6f 69 64 20 2a  to_serial(void *
0dd0: 78 35 30 39 5f 64 65 72 5f 62 75 66 2c 20 73 69  x509_der_buf, si
0de0: 7a 65 5f 74 20 78 35 30 39 5f 64 65 72 5f 62 75  ze_t x509_der_bu
0df0: 66 5f 6c 65 6e 2c 20 76 6f 69 64 20 2a 2a 6f 75  f_len, void **ou
0e00: 74 62 75 66 29 20 7b 0a 09 73 74 72 75 63 74 20  tbuf) {..struct 
0e10: 78 35 30 39 5f 6f 62 6a 65 63 74 20 78 35 30 39  x509_object x509
0e20: 3b 0a 09 69 6e 74 20 72 65 61 64 5f 72 65 74 3b  ;..int read_ret;
0e30: 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 61 73  ...read_ret = as
0e40: 6e 31 5f 78 35 30 39 5f 72 65 61 64 5f 6f 62 6a  n1_x509_read_obj
0e50: 65 63 74 28 78 35 30 39 5f 64 65 72 5f 62 75 66  ect(x509_der_buf
0e60: 2c 20 78 35 30 39 5f 64 65 72 5f 62 75 66 5f 6c  , x509_der_buf_l
0e70: 65 6e 2c 20 26 78 35 30 39 29 3b 0a 09 69 66 20  en, &x509);..if 
0e80: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 30 29 20  (read_ret != 0) 
0e90: 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  {...return(-1);.
0ea0: 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 29  .}...if (outbuf)
0eb0: 20 7b 0a 09 09 2a 6f 75 74 62 75 66 20 3d 20 78   {...*outbuf = x
0ec0: 35 30 39 2e 73 65 72 69 61 6c 5f 6e 75 6d 62 65  509.serial_numbe
0ed0: 72 2e 61 73 6e 31 72 65 70 3b 0a 09 7d 0a 0a 09  r.asn1rep;..}...
0ee0: 72 65 74 75 72 6e 28 78 35 30 39 2e 73 65 72 69  return(x509.seri
0ef0: 61 6c 5f 6e 75 6d 62 65 72 2e 61 73 6e 31 72 65  al_number.asn1re
0f00: 70 5f 6c 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  p_len);.}../*. *
0f10: 20 68 74 74 70 3a 2f 2f 77 77 77 2e 62 6c 61 63   http://www.blac
0f20: 6b 62 65 72 72 79 2e 63 6f 6d 2f 64 65 76 65 6c  kberry.com/devel
0f30: 6f 70 65 72 73 2f 64 6f 63 73 2f 34 2e 36 2e 30  opers/docs/4.6.0
0f40: 61 70 69 2f 6a 61 76 61 78 2f 6d 69 63 72 6f 65  api/javax/microe
0f50: 64 69 74 69 6f 6e 2f 70 6b 69 2f 43 65 72 74 69  dition/pki/Certi
0f60: 66 69 63 61 74 65 2e 68 74 6d 6c 0a 20 2a 2f 0a  ficate.html. */.
0f70: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0f80: 72 20 2a 5f 78 35 30 39 5f 6f 62 6a 65 63 74 69  r *_x509_objecti
0f90: 64 5f 74 6f 5f 6c 61 62 65 6c 5f 73 74 72 69 6e  d_to_label_strin
0fa0: 67 28 76 6f 69 64 20 2a 62 75 66 2c 20 73 69 7a  g(void *buf, siz
0fb0: 65 5f 74 20 62 75 66 6c 65 6e 29 20 7b 0a 09 73  e_t buflen) {..s
0fc0: 77 69 74 63 68 20 28 62 75 66 6c 65 6e 29 20 7b  witch (buflen) {
0fd0: 0a 09 09 63 61 73 65 20 33 3a 0a 09 09 09 69 66  ...case 3:....if
0fe0: 20 28 6d 65 6d 63 6d 70 28 62 75 66 2c 20 22 5c   (memcmp(buf, "\
0ff0: 78 35 35 5c 78 30 34 5c 78 30 33 22 2c 20 33 29  x55\x04\x03", 3)
1000: 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 72 65 74   == 0) {.....ret
1010: 75 72 6e 28 22 43 4e 22 29 3b 0a 09 09 09 7d 0a  urn("CN");....}.
1020: 09 09 09 69 66 20 28 6d 65 6d 63 6d 70 28 62 75  ...if (memcmp(bu
1030: 66 2c 20 22 5c 78 35 35 5c 78 30 34 5c 78 30 34  f, "\x55\x04\x04
1040: 22 2c 20 33 29 20 3d 3d 20 30 29 20 7b 0a 09 09  ", 3) == 0) {...
1050: 09 09 72 65 74 75 72 6e 28 22 53 4e 22 29 3b 0a  ..return("SN");.
1060: 09 09 09 7d 0a 09 09 09 69 66 20 28 6d 65 6d 63  ...}....if (memc
1070: 6d 70 28 62 75 66 2c 20 22 5c 78 35 35 5c 78 30  mp(buf, "\x55\x0
1080: 34 5c 78 30 36 22 2c 20 33 29 20 3d 3d 20 30 29  4\x06", 3) == 0)
1090: 20 7b 0a 09 09 09 09 72 65 74 75 72 6e 28 22 43   {.....return("C
10a0: 22 29 3b 0a 09 09 09 7d 0a 09 09 09 69 66 20 28  ");....}....if (
10b0: 6d 65 6d 63 6d 70 28 62 75 66 2c 20 22 5c 78 35  memcmp(buf, "\x5
10c0: 35 5c 78 30 34 5c 78 30 37 22 2c 20 33 29 20 3d  5\x04\x07", 3) =
10d0: 3d 20 30 29 20 7b 0a 09 09 09 09 72 65 74 75 72  = 0) {.....retur
10e0: 6e 28 22 4c 22 29 3b 0a 09 09 09 7d 0a 09 09 09  n("L");....}....
10f0: 69 66 20 28 6d 65 6d 63 6d 70 28 62 75 66 2c 20  if (memcmp(buf, 
1100: 22 5c 78 35 35 5c 78 30 34 5c 78 30 38 22 2c 20  "\x55\x04\x08", 
1110: 33 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 72  3) == 0) {.....r
1120: 65 74 75 72 6e 28 22 53 54 22 29 3b 0a 09 09 09  eturn("ST");....
1130: 7d 0a 09 09 09 69 66 20 28 6d 65 6d 63 6d 70 28  }....if (memcmp(
1140: 62 75 66 2c 20 22 5c 78 35 35 5c 78 30 34 5c 78  buf, "\x55\x04\x
1150: 30 39 22 2c 20 33 29 20 3d 3d 20 30 29 20 7b 0a  09", 3) == 0) {.
1160: 09 09 09 09 72 65 74 75 72 6e 28 22 53 54 52 45  ....return("STRE
1170: 45 54 22 29 3b 0a 09 09 09 7d 0a 09 09 09 69 66  ET");....}....if
1180: 20 28 6d 65 6d 63 6d 70 28 62 75 66 2c 20 22 5c   (memcmp(buf, "\
1190: 78 35 35 5c 78 30 34 5c 78 30 41 22 2c 20 33 29  x55\x04\x0A", 3)
11a0: 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 72 65 74   == 0) {.....ret
11b0: 75 72 6e 28 22 4f 22 29 3b 0a 09 09 09 7d 0a 09  urn("O");....}..
11c0: 09 09 69 66 20 28 6d 65 6d 63 6d 70 28 62 75 66  ..if (memcmp(buf
11d0: 2c 20 22 5c 78 35 35 5c 78 30 34 5c 78 30 42 22  , "\x55\x04\x0B"
11e0: 2c 20 33 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09  , 3) == 0) {....
11f0: 09 72 65 74 75 72 6e 28 22 4f 55 22 29 3b 0a 09  .return("OU");..
1200: 09 09 7d 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  ..}....break;...
1210: 63 61 73 65 20 39 3a 0a 09 09 09 69 66 20 28 6d  case 9:....if (m
1220: 65 6d 63 6d 70 28 62 75 66 2c 20 22 5c 78 32 41  emcmp(buf, "\x2A
1230: 5c 78 38 36 5c 78 34 38 5c 78 38 36 5c 78 46 37  \x86\x48\x86\xF7
1240: 5c 78 30 44 5c 78 30 31 5c 78 30 39 5c 78 30 31  \x0D\x01\x09\x01
1250: 22 2c 20 39 29 20 3d 3d 20 30 29 20 7b 0a 09 09  ", 9) == 0) {...
1260: 09 09 72 65 74 75 72 6e 28 22 45 6d 61 69 6c 41  ..return("EmailA
1270: 64 64 72 65 73 73 22 29 3b 0a 09 09 09 7d 0a 09  ddress");....}..
1280: 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65  ..break;..}...re
1290: 74 75 72 6e 28 22 3f 3f 3f 22 29 3b 0a 7d 0a 0a  turn("???");.}..
12a0: 73 73 69 7a 65 5f 74 20 78 35 30 39 5f 64 6e 5f  ssize_t x509_dn_
12b0: 74 6f 5f 73 74 72 69 6e 67 28 76 6f 69 64 20 2a  to_string(void *
12c0: 61 73 6e 31 5f 64 65 72 5f 62 75 66 2c 20 73 69  asn1_der_buf, si
12d0: 7a 65 5f 74 20 61 73 6e 31 5f 64 65 72 5f 62 75  ze_t asn1_der_bu
12e0: 66 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 6f 75 74  f_len, char *out
12f0: 62 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74 62  buf, size_t outb
1300: 75 66 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 6d 61  uf_len, char *ma
1310: 74 63 68 6c 61 62 65 6c 29 20 7b 0a 09 73 74 72  tchlabel) {..str
1320: 75 63 74 20 61 73 6e 31 5f 6f 62 6a 65 63 74 20  uct asn1_object 
1330: 77 68 6f 6c 65 5f 74 68 69 6e 67 2c 20 63 75 72  whole_thing, cur
1340: 72 65 6e 74 5f 73 65 74 2c 20 63 75 72 72 65 6e  rent_set, curren
1350: 74 5f 73 65 71 3b 0a 09 73 74 72 75 63 74 20 61  t_seq;..struct a
1360: 73 6e 31 5f 6f 62 6a 65 63 74 20 6c 61 62 65 6c  sn1_object label
1370: 2c 20 76 61 6c 75 65 3b 0a 09 63 6f 6e 73 74 20  , value;..const 
1380: 63 68 61 72 20 2a 6c 61 62 65 6c 5f 73 74 72 3b  char *label_str;
1390: 0a 09 73 73 69 7a 65 5f 74 20 73 6e 70 72 69 6e  ..ssize_t snprin
13a0: 74 66 5f 72 65 74 2c 20 72 65 74 76 61 6c 3b 0a  tf_ret, retval;.
13b0: 09 63 68 61 72 20 2a 6f 75 74 62 75 66 5f 73 3b  .char *outbuf_s;
13c0: 0a 09 69 6e 74 20 72 65 61 64 5f 72 65 74 3b 0a  ..int read_ret;.
13d0: 09 69 6e 74 20 6f 66 66 73 65 74 3b 0a 0a 09 69  .int offset;...i
13e0: 66 20 28 6f 75 74 62 75 66 20 3d 3d 20 4e 55 4c  f (outbuf == NUL
13f0: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31  L) {...return(-1
1400: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62  );..}...if (outb
1410: 75 66 5f 6c 65 6e 20 3d 3d 20 30 20 7c 7c 20 61  uf_len == 0 || a
1420: 73 6e 31 5f 64 65 72 5f 62 75 66 5f 6c 65 6e 20  sn1_der_buf_len 
1430: 3d 3d 20 30 20 7c 7c 20 61 73 6e 31 5f 64 65 72  == 0 || asn1_der
1440: 5f 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  _buf == NULL) {.
1450: 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a  ..return(0);..}.
1460: 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 61 73 6e  ..read_ret = asn
1470: 31 5f 78 35 30 39 5f 72 65 61 64 5f 61 73 6e 31  1_x509_read_asn1
1480: 5f 6f 62 6a 65 63 74 28 61 73 6e 31 5f 64 65 72  _object(asn1_der
1490: 5f 62 75 66 2c 20 61 73 6e 31 5f 64 65 72 5f 62  _buf, asn1_der_b
14a0: 75 66 5f 6c 65 6e 2c 20 26 77 68 6f 6c 65 5f 74  uf_len, &whole_t
14b0: 68 69 6e 67 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  hing, NULL);..if
14c0: 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 30 29   (read_ret != 0)
14d0: 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b   {...return(-1);
14e0: 0a 09 7d 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61  ..}.../* Termina
14f0: 74 65 20 73 74 72 69 6e 67 2c 20 69 6e 20 63 61  te string, in ca
1500: 73 65 20 6e 6f 20 76 61 6c 69 64 20 65 6c 65 6d  se no valid elem
1510: 65 6e 74 73 20 61 72 65 20 66 6f 75 6e 64 20 77  ents are found w
1520: 65 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 61  e still return a
1530: 20 76 61 6c 69 64 20 73 74 72 69 6e 67 20 2a 2f   valid string */
1540: 0a 09 2a 6f 75 74 62 75 66 20 3d 20 27 5c 30 27  ..*outbuf = '\0'
1550: 3b 0a 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75  ;..outbuf_s = ou
1560: 74 62 75 66 3b 0a 0a 09 6f 66 66 73 65 74 20 3d  tbuf;...offset =
1570: 20 30 3b 0a 09 77 68 69 6c 65 20 28 31 29 20 7b   0;..while (1) {
1580: 0a 09 09 72 65 61 64 5f 72 65 74 20 3d 20 61 73  ...read_ret = as
1590: 6e 31 5f 78 35 30 39 5f 72 65 61 64 5f 61 73 6e  n1_x509_read_asn
15a0: 31 5f 6f 62 6a 65 63 74 28 77 68 6f 6c 65 5f 74  1_object(whole_t
15b0: 68 69 6e 67 2e 63 6f 6e 74 65 6e 74 73 20 2b 20  hing.contents + 
15c0: 6f 66 66 73 65 74 2c 20 77 68 6f 6c 65 5f 74 68  offset, whole_th
15d0: 69 6e 67 2e 73 69 7a 65 20 2d 20 6f 66 66 73 65  ing.size - offse
15e0: 74 2c 20 26 63 75 72 72 65 6e 74 5f 73 65 74 2c  t, &current_set,
15f0: 20 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 72 65   NULL);...if (re
1600: 61 64 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  ad_ret != 0) {..
1610: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
1620: 6f 66 66 73 65 74 20 2b 3d 20 63 75 72 72 65 6e  offset += curren
1630: 74 5f 73 65 74 2e 73 69 7a 65 20 2b 20 32 3b 0a  t_set.size + 2;.
1640: 0a 09 09 72 65 61 64 5f 72 65 74 20 3d 20 61 73  ...read_ret = as
1650: 6e 31 5f 78 35 30 39 5f 72 65 61 64 5f 61 73 6e  n1_x509_read_asn
1660: 31 5f 6f 62 6a 65 63 74 28 63 75 72 72 65 6e 74  1_object(current
1670: 5f 73 65 74 2e 63 6f 6e 74 65 6e 74 73 2c 20 63  _set.contents, c
1680: 75 72 72 65 6e 74 5f 73 65 74 2e 73 69 7a 65 2c  urrent_set.size,
1690: 20 26 63 75 72 72 65 6e 74 5f 73 65 71 2c 20 4e   &current_seq, N
16a0: 55 4c 4c 29 3b 0a 09 09 69 66 20 28 72 65 61 64  ULL);...if (read
16b0: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  _ret != 0) {....
16c0: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 72 65  break;...}....re
16d0: 61 64 5f 72 65 74 20 3d 20 61 73 6e 31 5f 78 35  ad_ret = asn1_x5
16e0: 30 39 5f 72 65 61 64 5f 61 73 6e 31 5f 6f 62 6a  09_read_asn1_obj
16f0: 65 63 74 28 63 75 72 72 65 6e 74 5f 73 65 71 2e  ect(current_seq.
1700: 63 6f 6e 74 65 6e 74 73 2c 20 63 75 72 72 65 6e  contents, curren
1710: 74 5f 73 65 71 2e 73 69 7a 65 2c 20 26 6c 61 62  t_seq.size, &lab
1720: 65 6c 2c 20 26 76 61 6c 75 65 2c 20 4e 55 4c 4c  el, &value, NULL
1730: 29 3b 0a 0a 09 09 6c 61 62 65 6c 5f 73 74 72 20  );....label_str 
1740: 3d 20 5f 78 35 30 39 5f 6f 62 6a 65 63 74 69 64  = _x509_objectid
1750: 5f 74 6f 5f 6c 61 62 65 6c 5f 73 74 72 69 6e 67  _to_label_string
1760: 28 6c 61 62 65 6c 2e 63 6f 6e 74 65 6e 74 73 2c  (label.contents,
1770: 20 6c 61 62 65 6c 2e 73 69 7a 65 29 3b 0a 0a 09   label.size);...
1780: 09 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20  ./* If the user 
1790: 72 65 71 75 65 73 74 65 64 20 6f 6e 6c 79 20 63  requested only c
17a0: 65 72 74 61 69 6e 20 6c 61 62 65 6c 73 2c 20 65  ertain labels, e
17b0: 78 63 6c 75 64 65 20 6f 74 68 65 72 73 20 2a 2f  xclude others */
17c0: 0a 09 09 69 66 20 28 6d 61 74 63 68 6c 61 62 65  ...if (matchlabe
17d0: 6c 29 20 7b 0a 09 09 09 69 66 20 28 73 74 72 63  l) {....if (strc
17e0: 6d 70 28 6d 61 74 63 68 6c 61 62 65 6c 2c 20 6c  mp(matchlabel, l
17f0: 61 62 65 6c 5f 73 74 72 29 20 21 3d 20 30 29 20  abel_str) != 0) 
1800: 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  {.....continue;.
1810: 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 2f 2a 20 49  ...}...}..../* I
1820: 66 20 74 68 65 20 75 73 65 72 20 72 65 71 75 65  f the user reque
1830: 73 74 65 64 20 6f 6e 6c 79 20 63 65 72 74 61 69  sted only certai
1840: 6e 20 6c 61 62 65 6c 73 2c 20 64 6f 6e 27 74 20  n labels, don't 
1850: 69 6e 63 6c 75 64 65 20 74 68 65 6d 20 69 6e 20  include them in 
1860: 74 68 65 20 72 65 70 6c 79 20 2a 2f 0a 09 09 69  the reply */...i
1870: 66 20 28 6d 61 74 63 68 6c 61 62 65 6c 29 20 7b  f (matchlabel) {
1880: 0a 09 09 09 73 6e 70 72 69 6e 74 66 5f 72 65 74  ....snprintf_ret
1890: 20 3d 20 73 6e 70 72 69 6e 74 66 28 6f 75 74 62   = snprintf(outb
18a0: 75 66 2c 20 6f 75 74 62 75 66 5f 6c 65 6e 2c 20  uf, outbuf_len, 
18b0: 22 25 2e 2a 73 2c 20 22 2c 20 28 75 6e 73 69 67  "%.*s, ", (unsig
18c0: 6e 65 64 20 69 6e 74 29 20 76 61 6c 75 65 2e 73  ned int) value.s
18d0: 69 7a 65 2c 20 28 63 68 61 72 20 2a 29 20 76 61  ize, (char *) va
18e0: 6c 75 65 2e 63 6f 6e 74 65 6e 74 73 29 3b 0a 09  lue.contents);..
18f0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 73 6e 70  .} else {....snp
1900: 72 69 6e 74 66 5f 72 65 74 20 3d 20 73 6e 70 72  rintf_ret = snpr
1910: 69 6e 74 66 28 6f 75 74 62 75 66 2c 20 6f 75 74  intf(outbuf, out
1920: 62 75 66 5f 6c 65 6e 2c 20 22 25 73 3d 25 2e 2a  buf_len, "%s=%.*
1930: 73 2c 20 22 2c 20 6c 61 62 65 6c 5f 73 74 72 2c  s, ", label_str,
1940: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
1950: 76 61 6c 75 65 2e 73 69 7a 65 2c 20 28 63 68 61  value.size, (cha
1960: 72 20 2a 29 20 76 61 6c 75 65 2e 63 6f 6e 74 65  r *) value.conte
1970: 6e 74 73 29 3b 0a 09 09 7d 0a 09 09 69 66 20 28  nts);...}...if (
1980: 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3c 20 30  snprintf_ret < 0
1990: 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  ) {....break;...
19a0: 7d 0a 0a 09 09 69 66 20 28 73 6e 70 72 69 6e 74  }....if (snprint
19b0: 66 5f 72 65 74 20 3e 20 6f 75 74 62 75 66 5f 6c  f_ret > outbuf_l
19c0: 65 6e 29 20 7b 0a 09 09 09 73 6e 70 72 69 6e 74  en) {....snprint
19d0: 66 5f 72 65 74 20 3d 20 6f 75 74 62 75 66 5f 6c  f_ret = outbuf_l
19e0: 65 6e 3b 0a 09 09 7d 0a 0a 09 09 6f 75 74 62 75  en;...}....outbu
19f0: 66 20 2b 3d 20 73 6e 70 72 69 6e 74 66 5f 72 65  f += snprintf_re
1a00: 74 3b 0a 09 09 6f 75 74 62 75 66 5f 6c 65 6e 20  t;...outbuf_len 
1a10: 2d 3d 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b  -= snprintf_ret;
1a20: 0a 0a 09 09 69 66 20 28 6f 75 74 62 75 66 5f 6c  ....if (outbuf_l
1a30: 65 6e 20 3c 20 32 29 20 7b 0a 09 09 09 62 72 65  en < 2) {....bre
1a40: 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  ak;...}..}...ret
1a50: 76 61 6c 20 3d 20 6f 75 74 62 75 66 20 2d 20 6f  val = outbuf - o
1a60: 75 74 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20 52 65  utbuf_s;.../* Re
1a70: 6d 6f 76 65 20 74 72 61 69 6c 69 6e 67 20 22 2c  move trailing ",
1a80: 20 22 20 61 64 64 65 64 20 62 79 20 63 75 6d 75   " added by cumu
1a90: 6c 61 74 69 76 65 20 70 72 6f 63 65 73 73 2c 20  lative process, 
1aa0: 69 66 20 66 6f 75 6e 64 2e 20 2a 2f 0a 09 69 66  if found. */..if
1ab0: 20 28 72 65 74 76 61 6c 20 3e 20 32 29 20 7b 0a   (retval > 2) {.
1ac0: 09 09 69 66 20 28 6f 75 74 62 75 66 5f 73 5b 72  ..if (outbuf_s[r
1ad0: 65 74 76 61 6c 20 2d 20 32 5d 20 3d 3d 20 27 2c  etval - 2] == ',
1ae0: 27 29 20 7b 0a 09 09 09 6f 75 74 62 75 66 5f 73  ') {....outbuf_s
1af0: 5b 72 65 74 76 61 6c 20 2d 20 32 5d 20 3d 20 27  [retval - 2] = '
1b00: 5c 30 27 3b 0a 09 09 09 72 65 74 76 61 6c 20 2d  \0';....retval -
1b10: 3d 20 32 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65  = 2;...}..}...re
1b20: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.