Hex Artifact Content

Artifact 983e36540980ea0b79a19ab7989422a3f117bc61e260c3907da75bf08e3bd309:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 32 30 30 30 20 53 65  (C) 1997-2000 Se
0020: 6e 73 75 73 20 43 6f 6e 73 75 6c 74 69 6e 67 20  nsus Consulting 
0030: 4c 74 64 2e 0a 20 2a 20 4d 61 74 74 20 4e 65 77  Ltd.. * Matt New
0040: 6d 61 6e 20 3c 6d 61 74 74 40 73 65 6e 73 75 73  man <matt@sensus
0050: 2e 6f 72 67 3e 0a 20 2a 20 43 6f 70 79 72 69 67  .org>. * Copyrig
0060: 68 74 20 28 43 29 20 32 30 32 33 20 42 72 69 61  ht (C) 2023 Bria
0070: 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 2f 0a 23 69  n O'Hagan. */.#i
0080: 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23  nclude <tcl.h>.#
0090: 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68  include <stdio.h
00a0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  >.#include <open
00b0: 73 73 6c 2f 62 69 6f 2e 68 3e 0a 23 69 6e 63 6c  ssl/bio.h>.#incl
00c0: 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 68 61  ude <openssl/sha
00d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70  .h>.#include <op
00e0: 65 6e 73 73 6c 2f 78 35 30 39 2e 68 3e 0a 23 69  enssl/x509.h>.#i
00f0: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0100: 78 35 30 39 76 33 2e 68 3e 0a 23 69 6e 63 6c 75  x509v3.h>.#inclu
0110: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 61 73 6e 31  de <openssl/asn1
0120: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c  .h>.#include "tl
0130: 73 49 6e 74 2e 68 22 0a 0a 2f 2a 20 44 65 66 69  sInt.h"../* Defi
0140: 6e 65 20 6d 61 78 69 6d 75 6d 20 63 65 72 74 69  ne maximum certi
0150: 66 69 63 61 74 65 20 73 69 7a 65 2e 20 4d 61 78  ficate size. Max
0160: 20 50 45 4d 20 73 69 7a 65 20 31 30 30 6b 42 20   PEM size 100kB 
0170: 61 6e 64 20 44 45 52 20 73 69 7a 65 20 69 73 20  and DER size is 
0180: 32 34 6b 42 2e 20 2a 2f 0a 23 64 65 66 69 6e 65  24kB. */.#define
0190: 20 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 20 33   CERT_STR_SIZE 3
01a0: 32 37 36 38 0a 0a 2f 2a 0a 20 2a 20 20 45 6e 73  2768../*. *  Ens
01b0: 75 72 65 20 74 68 65 73 65 20 61 72 65 20 6e 6f  ure these are no
01c0: 74 20 6d 61 63 72 6f 73 20 2d 20 6b 6e 6f 77 6e  t macros - known
01d0: 20 74 6f 20 62 65 20 64 65 66 69 6e 65 64 20 6f   to be defined o
01e0: 6e 20 57 69 6e 33 32 0a 20 2a 2f 0a 23 69 66 64  n Win32. */.#ifd
01f0: 65 66 20 6d 69 6e 0a 23 75 6e 64 65 66 20 6d 69  ef min.#undef mi
0200: 6e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  n.#endif..#ifdef
0210: 20 6d 61 78 0a 23 75 6e 64 65 66 20 6d 61 78 0a   max.#undef max.
0220: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69  #endif..static i
0230: 6e 74 20 6d 69 6e 28 69 6e 74 20 61 2c 20 69 6e  nt min(int a, in
0240: 74 20 62 29 0a 7b 0a 20 20 20 20 72 65 74 75 72  t b).{.    retur
0250: 6e 20 28 61 20 3c 20 62 29 20 3f 20 61 20 3a 20  n (a < b) ? a : 
0260: 62 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  b;.}..static int
0270: 20 6d 61 78 28 69 6e 74 20 61 2c 20 69 6e 74 20   max(int a, int 
0280: 62 29 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b).{.    return 
0290: 28 61 20 3e 20 62 29 20 3f 20 61 20 3a 20 62 3b  (a > b) ? a : b;
02a0: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 42 69 6e 61 72 79  .}../*. * Binary
02b0: 20 73 74 72 69 6e 67 20 74 6f 20 68 65 78 20 73   string to hex s
02c0: 74 72 69 6e 67 0a 20 2a 2f 0a 69 6e 74 20 53 74  tring. */.int St
02d0: 72 69 6e 67 5f 74 6f 5f 48 65 78 28 63 68 61 72  ring_to_Hex(char
02e0: 2a 20 69 6e 70 75 74 2c 20 69 6e 74 20 6c 65 6e  * input, int len
02f0: 2c 20 63 68 61 72 20 2a 6f 75 74 70 75 74 2c 20  , char *output, 
0300: 69 6e 74 20 6d 61 78 29 20 7b 0a 20 20 20 20 69  int max) {.    i
0310: 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 20  nt count = 0;.. 
0320: 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20     for (int i = 
0330: 30 3b 20 69 20 3c 20 6c 65 6e 20 26 26 20 63 6f  0; i < len && co
0340: 75 6e 74 20 3c 20 6d 61 78 20 2d 20 31 3b 20 69  unt < max - 1; i
0350: 2b 2b 2c 20 63 6f 75 6e 74 20 2b 3d 20 32 29 20  ++, count += 2) 
0360: 7b 0a 09 73 70 72 69 6e 74 66 28 6f 75 74 70 75  {..sprintf(outpu
0370: 74 20 2b 20 63 6f 75 6e 74 2c 20 22 25 30 32 58  t + count, "%02X
0380: 22 2c 20 69 6e 70 75 74 5b 69 5d 20 26 20 30 78  ", input[i] & 0x
0390: 66 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  ff);.    }.    o
03a0: 75 74 70 75 74 5b 63 6f 75 6e 74 5d 20 3d 20 30  utput[count] = 0
03b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 6f 75  ;.    return cou
03c0: 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 42 49 4f  nt;.}../*. * BIO
03d0: 20 74 6f 20 42 75 66 66 65 72 0a 20 2a 2f 0a 69   to Buffer. */.i
03e0: 6e 74 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72  nt BIO_to_Buffer
03f0: 28 69 6e 74 20 72 65 73 75 6c 74 2c 20 42 49 4f  (int result, BIO
0400: 20 2a 62 69 6f 2c 20 76 6f 69 64 20 2a 62 75 66   *bio, void *buf
0410: 66 65 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 6c  fer) {.    int l
0420: 65 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20  en = 0;..    if 
0430: 28 72 65 73 75 6c 74 29 20 7b 0a 09 6c 65 6e 20  (result) {..len 
0440: 3d 20 42 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20  = BIO_read(bio, 
0450: 62 75 66 66 65 72 2c 20 6d 69 6e 28 42 49 4f 5f  buffer, min(BIO_
0460: 70 65 6e 64 69 6e 67 28 62 69 6f 29 2c 20 42 55  pending(bio), BU
0470: 46 53 49 5a 29 29 3b 0a 09 28 76 6f 69 64 29 42  FSIZ));..(void)B
0480: 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09  IO_flush(bio);..
0490: 69 66 20 28 6c 65 6e 20 3c 20 30 29 20 7b 0a 09  if (len < 0) {..
04a0: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a      len = 0;..}.
04b0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
04c0: 20 6c 65 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d   len;.}.../*. *-
04d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0500: 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73  -----*. *. *.Tls
0510: 5f 4e 65 77 58 35 30 39 4f 62 6a 20 2d 2d 0a 20  _NewX509Obj --. 
0520: 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *.-----------
0530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0550: 2d 2d 2d 2d 2d 2a 0a 20 2a 09 43 6f 6e 76 65 72  -----*. *.Conver
0560: 74 73 20 61 20 58 35 30 39 20 63 65 72 74 69 66  ts a X509 certif
0570: 69 63 61 74 65 20 69 6e 74 6f 20 61 20 54 63 6c  icate into a Tcl
0580: 5f 4f 62 6a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d  _Obj. *.--------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09  --------*. *. *.
05c0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
05d0: 09 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 09 52 65 73  ..None. *. *.Res
05e0: 75 6c 74 3a 0a 20 2a 09 09 41 20 54 63 6c 20 4c  ult:. *..A Tcl L
05f0: 69 73 74 20 4f 62 6a 65 63 74 20 72 65 70 72 65  ist Object repre
0600: 73 65 6e 74 69 6e 67 20 74 68 65 20 70 72 6f 76  senting the prov
0610: 69 64 65 64 0a 20 2a 09 09 58 35 30 39 20 63 65  ided. *..X509 ce
0620: 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 0a 20 2a  rtificate.. *. *
0630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0660: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 0a 54 63  ------*. */...Tc
0670: 6c 5f 4f 62 6a 2a 0a 54 6c 73 5f 4e 65 77 58 35  l_Obj*.Tls_NewX5
0680: 30 39 4f 62 6a 28 54 63 6c 5f 49 6e 74 65 72 70  09Obj(Tcl_Interp
0690: 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a   *interp, X509 *
06a0: 63 65 72 74 29 20 7b 0a 20 20 20 20 54 63 6c 5f  cert) {.    Tcl_
06b0: 4f 62 6a 20 2a 63 65 72 74 50 74 72 20 3d 20 54  Obj *certPtr = T
06c0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
06d0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 42 49 4f 20   NULL);.    BIO 
06e0: 2a 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42  *bio = BIO_new(B
06f0: 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 20 20 20  IO_s_mem());.   
0700: 20 69 6e 74 20 6d 64 6e 69 64 2c 20 70 6b 6e 69   int mdnid, pkni
0710: 64 2c 20 62 69 74 73 2c 20 6c 65 6e 3b 0a 20 20  d, bits, len;.  
0720: 20 20 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67    uint32_t xflag
0730: 73 2c 20 75 73 61 67 65 3b 0a 20 20 20 20 63 68  s, usage;.    ch
0740: 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a  ar buffer[BUFSIZ
0750: 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  ];.    unsigned 
0760: 63 68 61 72 20 6d 64 5b 45 56 50 5f 4d 41 58 5f  char md[EVP_MAX_
0770: 4d 44 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 53 54  MD_SIZE];.    ST
0780: 41 43 4b 5f 4f 46 28 47 45 4e 45 52 41 4c 5f 4e  ACK_OF(GENERAL_N
0790: 41 4d 45 29 20 2a 73 61 6e 3b 0a 20 20 20 20 53  AME) *san;.    S
07a0: 54 41 43 4b 5f 4f 46 28 44 49 53 54 5f 50 4f 49  TACK_OF(DIST_POI
07b0: 4e 54 29 20 2a 63 72 6c 3b 0a 20 20 20 20 53 54  NT) *crl;.    ST
07c0: 41 43 4b 5f 4f 46 28 4f 50 45 4e 53 53 4c 5f 53  ACK_OF(OPENSSL_S
07d0: 54 52 49 4e 47 29 20 2a 6f 63 73 70 3b 0a 20 20  TRING) *ocsp;.  
07e0: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
07f0: 66 6c 61 67 73 20 3d 20 58 4e 5f 46 4c 41 47 5f  flags = XN_FLAG_
0800: 52 46 43 32 32 35 33 20 7c 20 41 53 4e 31 5f 53  RFC2253 | ASN1_S
0810: 54 52 46 4c 47 53 5f 55 54 46 38 5f 43 4f 4e 56  TRFLGS_UTF8_CONV
0820: 45 52 54 3b 0a 20 20 20 20 66 6c 61 67 73 20 26  ERT;.    flags &
0830: 3d 20 7e 41 53 4e 31 5f 53 54 52 46 4c 47 53 5f  = ~ASN1_STRFLGS_
0840: 45 53 43 5f 4d 53 42 3b 0a 0a 20 20 20 20 69 66  ESC_MSB;..    if
0850: 20 28 62 69 6f 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   (bio == NULL ||
0860: 20 63 65 72 74 50 74 72 20 3d 3d 20 4e 55 4c 4c   certPtr == NULL
0870: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  ) {..return NULL
0880: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
0890: 53 69 67 6e 61 74 75 72 65 20 61 6c 67 6f 72 69  Signature algori
08a0: 74 68 6d 20 61 6e 64 20 76 61 6c 75 65 20 2d 20  thm and value - 
08b0: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e  RFC 5280 section
08c0: 20 34 2e 31 2e 31 2e 32 20 61 6e 64 20 34 2e 31   4.1.1.2 and 4.1
08d0: 2e 31 2e 33 20 2a 2f 0a 20 20 20 20 2f 2a 20 54  .1.3 */.    /* T
08e0: 68 65 20 73 69 67 6e 61 74 75 72 65 41 6c 67 6f  he signatureAlgo
08f0: 72 69 74 68 6d 20 66 69 65 6c 64 20 63 6f 6e 74  rithm field cont
0900: 61 69 6e 73 20 74 68 65 20 69 64 65 6e 74 69 66  ains the identif
0910: 69 65 72 20 66 6f 72 20 74 68 65 20 63 72 79 70  ier for the cryp
0920: 74 6f 67 72 61 70 68 69 63 20 61 6c 67 6f 72 69  tographic algori
0930: 74 68 6d 0a 09 75 73 65 64 20 62 79 20 74 68 65  thm..used by the
0940: 20 43 41 20 74 6f 20 73 69 67 6e 20 74 68 69 73   CA to sign this
0950: 20 63 65 72 74 69 66 69 63 61 74 65 2e 20 54 68   certificate. Th
0960: 65 20 73 69 67 6e 61 74 75 72 65 56 61 6c 75 65  e signatureValue
0970: 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20   field contains 
0980: 61 20 64 69 67 69 74 61 6c 0a 09 73 69 67 6e 61  a digital..signa
0990: 74 75 72 65 20 63 6f 6d 70 75 74 65 64 20 75 70  ture computed up
09a0: 6f 6e 20 74 68 65 20 41 53 4e 2e 31 20 44 45 52  on the ASN.1 DER
09b0: 20 65 6e 63 6f 64 65 64 20 74 62 73 43 65 72 74   encoded tbsCert
09c0: 69 66 69 63 61 74 65 2e 20 2a 2f 0a 20 20 20 20  ificate. */.    
09d0: 7b 0a 09 63 6f 6e 73 74 20 58 35 30 39 5f 41 4c  {..const X509_AL
09e0: 47 4f 52 20 2a 73 69 67 5f 61 6c 67 3b 0a 09 63  GOR *sig_alg;..c
09f0: 6f 6e 73 74 20 41 53 4e 31 5f 42 49 54 5f 53 54  onst ASN1_BIT_ST
0a00: 52 49 4e 47 20 2a 73 69 67 3b 0a 09 69 6e 74 20  RING *sig;..int 
0a10: 73 69 67 5f 6e 69 64 3b 0a 0a 09 58 35 30 39 5f  sig_nid;...X509_
0a20: 67 65 74 30 5f 73 69 67 6e 61 74 75 72 65 28 26  get0_signature(&
0a30: 73 69 67 2c 20 26 73 69 67 5f 61 6c 67 2c 20 63  sig, &sig_alg, c
0a40: 65 72 74 29 3b 0a 09 2f 2a 20 73 69 67 5f 6e 69  ert);../* sig_ni
0a50: 64 20 3d 20 58 35 30 39 5f 67 65 74 5f 73 69 67  d = X509_get_sig
0a60: 6e 61 74 75 72 65 5f 6e 69 64 28 63 65 72 74 29  nature_nid(cert)
0a70: 20 2a 2f 0a 09 73 69 67 5f 6e 69 64 20 3d 20 4f   */..sig_nid = O
0a80: 42 4a 5f 6f 62 6a 32 6e 69 64 28 73 69 67 5f 61  BJ_obj2nid(sig_a
0a90: 6c 67 2d 3e 61 6c 67 6f 72 69 74 68 6d 29 3b 0a  lg->algorithm);.
0aa0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
0ab0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
0ac0: 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f  p, certPtr, Tcl_
0ad0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 69  NewStringObj("si
0ae0: 67 6e 61 74 75 72 65 41 6c 67 6f 72 69 74 68 6d  gnatureAlgorithm
0af0: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
0b00: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
0b10: 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50  nt(interp, certP
0b20: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
0b30: 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e 28  gObj(OBJ_nid2ln(
0b40: 73 69 67 5f 6e 69 64 29 2c 2d 31 29 29 3b 0a 0a  sig_nid),-1));..
0b50: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
0b60: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
0b70: 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e  , certPtr, Tcl_N
0b80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 69 67  ewStringObj("sig
0b90: 6e 61 74 75 72 65 56 61 6c 75 65 22 2c 20 2d 31  natureValue", -1
0ba0: 29 29 3b 0a 09 69 66 20 28 73 69 67 5f 6e 69 64  ));..if (sig_nid
0bb0: 20 21 3d 20 4e 49 44 5f 75 6e 64 65 66 29 20 7b   != NID_undef) {
0bc0: 0a 09 20 20 20 20 6c 65 6e 20 3d 20 53 74 72 69  ..    len = Stri
0bd0: 6e 67 5f 74 6f 5f 48 65 78 28 73 69 67 2d 3e 64  ng_to_Hex(sig->d
0be0: 61 74 61 2c 20 73 69 67 2d 3e 6c 65 6e 67 74 68  ata, sig->length
0bf0: 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a  , buffer, BUFSIZ
0c00: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
0c10: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
0c20: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72  (interp, certPtr
0c30: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
0c40: 62 6a 28 62 75 66 66 65 72 2c 20 6c 65 6e 29 29  bj(buffer, len))
0c50: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
0c60: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
0c70: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
0c80: 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e  , certPtr, Tcl_N
0c90: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20  ewStringObj("", 
0ca0: 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  -1));..}.    }..
0cb0: 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 20 6f      /* Version o
0cc0: 66 20 74 68 65 20 65 6e 63 6f 64 65 64 20 63 65  f the encoded ce
0cd0: 72 74 69 66 69 63 61 74 65 20 2d 20 52 46 43 20  rtificate - RFC 
0ce0: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31  5280 section 4.1
0cf0: 2e 32 2e 31 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  .2.1 */.    Tcl_
0d00: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
0d10: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72  ment(interp, cer
0d20: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tPtr, Tcl_NewStr
0d30: 69 6e 67 4f 62 6a 28 22 76 65 72 73 69 6f 6e 22  ingObj("version"
0d40: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
0d50: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
0d60: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72  ment(interp, cer
0d70: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e  tPtr, Tcl_NewLon
0d80: 67 4f 62 6a 28 58 35 30 39 5f 67 65 74 5f 76 65  gObj(X509_get_ve
0d90: 72 73 69 6f 6e 28 63 65 72 74 29 2b 31 29 29 3b  rsion(cert)+1));
0da0: 0a 0a 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20  ..    /* Unique 
0db0: 6e 75 6d 62 65 72 20 61 73 73 69 67 6e 65 64 20  number assigned 
0dc0: 62 79 20 43 41 20 74 6f 20 63 65 72 74 69 66 69  by CA to certifi
0dd0: 63 61 74 65 20 2d 20 52 46 43 20 35 32 38 30 20  cate - RFC 5280 
0de0: 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 32 20  section 4.1.2.2 
0df0: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f  */.    len = BIO
0e00: 5f 74 6f 5f 42 75 66 66 65 72 28 69 32 61 5f 41  _to_Buffer(i2a_A
0e10: 53 4e 31 5f 49 4e 54 45 47 45 52 28 62 69 6f 2c  SN1_INTEGER(bio,
0e20: 20 58 35 30 39 5f 67 65 74 30 5f 73 65 72 69 61   X509_get0_seria
0e30: 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 29 2c 20  lNumber(cert)), 
0e40: 62 69 6f 2c 20 62 75 66 66 65 72 29 3b 0a 20 20  bio, buffer);.  
0e50: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
0e60: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
0e70: 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f  p, certPtr, Tcl_
0e80: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65  NewStringObj("se
0e90: 72 69 61 6c 4e 75 6d 62 65 72 22 2c 20 2d 31 29  rialNumber", -1)
0ea0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
0eb0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
0ec0: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c  interp, certPtr,
0ed0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
0ee0: 6a 28 62 75 66 66 65 72 2c 20 6c 65 6e 29 29 3b  j(buffer, len));
0ef0: 0a 0a 20 20 20 20 2f 2a 20 53 69 67 6e 61 74 75  ..    /* Signatu
0f00: 72 65 20 61 6c 67 6f 72 69 74 68 6d 20 75 73 65  re algorithm use
0f10: 64 20 62 79 20 74 68 65 20 43 41 20 74 6f 20 73  d by the CA to s
0f20: 69 67 6e 20 74 68 65 20 63 65 72 74 69 66 69 63  ign the certific
0f30: 61 74 65 2e 20 4d 75 73 74 20 6d 61 74 63 68 0a  ate. Must match.
0f40: 09 73 69 67 6e 61 74 75 72 65 41 6c 67 6f 72 69  .signatureAlgori
0f50: 74 68 6d 2e 20 52 46 43 20 35 32 38 30 20 73 65  thm. RFC 5280 se
0f60: 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 33 20 2a 2f  ction 4.1.2.3 */
0f70: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
0f80: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
0f90: 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54  terp, certPtr, T
0fa0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
0fb0: 22 73 69 67 6e 61 74 75 72 65 22 2c 20 2d 31 29  "signature", -1)
0fc0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
0fd0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
0fe0: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c  interp, certPtr,
0ff0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1000: 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e 28 58 35 30  j(OBJ_nid2ln(X50
1010: 39 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f  9_get_signature_
1020: 6e 69 64 28 63 65 72 74 29 29 2c 2d 31 29 29 3b  nid(cert)),-1));
1030: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 69 73 73  ..    /* The iss
1040: 75 65 72 20 69 64 65 6e 74 69 66 69 65 73 20 74  uer identifies t
1050: 68 65 20 65 6e 74 69 74 79 20 74 68 61 74 20 68  he entity that h
1060: 61 73 20 73 69 67 6e 65 64 20 61 6e 64 20 69 73  as signed and is
1070: 73 75 65 64 20 74 68 65 20 63 65 72 74 69 66 69  sued the certifi
1080: 63 61 74 65 2e 0a 09 52 46 43 20 35 32 38 30 20  cate...RFC 5280 
1090: 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 34 20  section 4.1.2.4 
10a0: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f  */.    len = BIO
10b0: 5f 74 6f 5f 42 75 66 66 65 72 28 58 35 30 39 5f  _to_Buffer(X509_
10c0: 4e 41 4d 45 5f 70 72 69 6e 74 5f 65 78 28 62 69  NAME_print_ex(bi
10d0: 6f 2c 20 58 35 30 39 5f 67 65 74 5f 69 73 73 75  o, X509_get_issu
10e0: 65 72 5f 6e 61 6d 65 28 63 65 72 74 29 2c 20 30  er_name(cert), 0
10f0: 2c 20 66 6c 61 67 73 29 2c 20 62 69 6f 2c 20 62  , flags), bio, b
1100: 75 66 66 65 72 29 3b 0a 20 20 20 20 54 63 6c 5f  uffer);.    Tcl_
1110: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1120: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72  ment(interp, cer
1130: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tPtr, Tcl_NewStr
1140: 69 6e 67 4f 62 6a 28 22 69 73 73 75 65 72 22 2c  ingObj("issuer",
1150: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
1160: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1170: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74  ent(interp, cert
1180: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
1190: 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 6c 65  ngObj(buffer, le
11a0: 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 65 72  n));..    /* Cer
11b0: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 69 74  tificate validit
11c0: 79 20 70 65 72 69 6f 64 20 69 73 20 74 68 65 20  y period is the 
11d0: 74 69 6d 65 20 69 6e 74 65 72 76 61 6c 20 64 75  time interval du
11e0: 72 69 6e 67 20 77 68 69 63 68 20 74 68 65 20 43  ring which the C
11f0: 41 0a 09 77 61 72 72 61 6e 74 73 20 74 68 61 74  A..warrants that
1200: 20 69 74 20 77 69 6c 6c 20 6d 61 69 6e 74 61 69   it will maintai
1210: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  n information ab
1220: 6f 75 74 20 74 68 65 20 73 74 61 74 75 73 20 6f  out the status o
1230: 66 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  f the certificat
1240: 65 2e 0a 09 52 46 43 20 35 32 38 30 20 73 65 63  e...RFC 5280 sec
1250: 74 69 6f 6e 20 34 2e 31 2e 32 2e 35 20 2a 2f 0a  tion 4.1.2.5 */.
1260: 20 20 20 20 2f 2a 20 47 65 74 20 56 61 6c 69 64      /* Get Valid
1270: 69 74 79 20 2d 20 4e 6f 74 20 42 65 66 6f 72 65  ity - Not Before
1280: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49   */.    len = BI
1290: 4f 5f 74 6f 5f 42 75 66 66 65 72 28 41 53 4e 31  O_to_Buffer(ASN1
12a0: 5f 54 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c  _TIME_print(bio,
12b0: 20 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74 42 65   X509_get0_notBe
12c0: 66 6f 72 65 28 63 65 72 74 29 29 2c 20 62 69 6f  fore(cert)), bio
12d0: 2c 20 62 75 66 66 65 72 29 3b 0a 20 20 20 20 54  , buffer);.    T
12e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1300: 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77  certPtr, Tcl_New
1310: 53 74 72 69 6e 67 4f 62 6a 28 22 6e 6f 74 42 65  StringObj("notBe
1320: 66 6f 72 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20  fore", -1));.   
1330: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1340: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1350: 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e  , certPtr, Tcl_N
1360: 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66  ewStringObj(buff
1370: 65 72 2c 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20  er, len));..    
1380: 2f 2a 20 47 65 74 20 56 61 6c 69 64 69 74 79 20  /* Get Validity 
1390: 2d 20 4e 6f 74 20 41 66 74 65 72 20 2a 2f 0a 20  - Not After */. 
13a0: 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f     len = BIO_to_
13b0: 42 75 66 66 65 72 28 41 53 4e 31 5f 54 49 4d 45  Buffer(ASN1_TIME
13c0: 5f 70 72 69 6e 74 28 62 69 6f 2c 20 58 35 30 39  _print(bio, X509
13d0: 5f 67 65 74 30 5f 6e 6f 74 41 66 74 65 72 28 63  _get0_notAfter(c
13e0: 65 72 74 29 29 2c 20 62 69 6f 2c 20 62 75 66 66  ert)), bio, buff
13f0: 65 72 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  er);.    Tcl_Lis
1400: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1410: 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74  t(interp, certPt
1420: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
1430: 4f 62 6a 28 22 6e 6f 74 41 66 74 65 72 22 2c 20  Obj("notAfter", 
1440: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
1450: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1460: 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50  nt(interp, certP
1470: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1480: 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 6c 65 6e  gObj(buffer, len
1490: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  ));..    /* The 
14a0: 73 75 62 6a 65 63 74 20 69 64 65 6e 74 69 66 69  subject identifi
14b0: 65 73 20 74 68 65 20 65 6e 74 69 74 79 20 61 73  es the entity as
14c0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
14d0: 65 20 70 75 62 6c 69 63 20 6b 65 79 20 73 74 6f  e public key sto
14e0: 72 65 64 0a 09 69 6e 20 74 68 65 20 73 75 62 6a  red..in the subj
14f0: 65 63 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66  ect public key f
1500: 69 65 6c 64 2e 20 52 46 43 20 35 32 38 30 20 73  ield. RFC 5280 s
1510: 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 36 20 2a  ection 4.1.2.6 *
1520: 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f  /.    len = BIO_
1530: 74 6f 5f 42 75 66 66 65 72 28 58 35 30 39 5f 4e  to_Buffer(X509_N
1540: 41 4d 45 5f 70 72 69 6e 74 5f 65 78 28 62 69 6f  AME_print_ex(bio
1550: 2c 20 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65  , X509_get_subje
1560: 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 2c 20 30  ct_name(cert), 0
1570: 2c 20 66 6c 61 67 73 29 2c 20 62 69 6f 2c 20 62  , flags), bio, b
1580: 75 66 66 65 72 29 3b 0a 20 20 20 20 54 63 6c 5f  uffer);.    Tcl_
1590: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
15a0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72  ment(interp, cer
15b0: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tPtr, Tcl_NewStr
15c0: 69 6e 67 4f 62 6a 28 22 73 75 62 6a 65 63 74 22  ingObj("subject"
15d0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
15e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
15f0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72  ment(interp, cer
1600: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tPtr, Tcl_NewStr
1610: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 6c  ingObj(buffer, l
1620: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 48  en));..    /* SH
1630: 41 31 20 46 69 6e 67 65 72 70 72 69 6e 74 20 6f  A1 Fingerprint o
1640: 66 20 63 65 72 74 20 2d 20 44 45 52 20 72 65 70  f cert - DER rep
1650: 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  resentation */. 
1660: 20 20 20 69 66 20 28 58 35 30 39 5f 64 69 67 65     if (X509_dige
1670: 73 74 28 63 65 72 74 2c 20 45 56 50 5f 73 68 61  st(cert, EVP_sha
1680: 31 28 29 2c 20 6d 64 2c 20 26 6c 65 6e 29 29 20  1(), md, &len)) 
1690: 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 53 74 72 69  {.    len = Stri
16a0: 6e 67 5f 74 6f 5f 48 65 78 28 6d 64 2c 20 6c 65  ng_to_Hex(md, le
16b0: 6e 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49  n, buffer, BUFSI
16c0: 5a 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  Z);.    Tcl_List
16d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
16e0: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72  (interp, certPtr
16f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1700: 62 6a 28 22 73 68 61 31 5f 68 61 73 68 22 2c 20  bj("sha1_hash", 
1710: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
1720: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1730: 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50  nt(interp, certP
1740: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1750: 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 6c 65 6e  gObj(buffer, len
1760: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1770: 2a 20 53 48 41 32 35 36 20 46 69 6e 67 65 72 70  * SHA256 Fingerp
1780: 72 69 6e 74 20 6f 66 20 63 65 72 74 20 2d 20 44  rint of cert - D
1790: 45 52 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ER representatio
17a0: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35 30  n */.    if (X50
17b0: 39 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 45  9_digest(cert, E
17c0: 56 50 5f 73 68 61 32 35 36 28 29 2c 20 6d 64 2c  VP_sha256(), md,
17d0: 20 26 6c 65 6e 29 29 20 7b 0a 20 20 20 20 6c 65   &len)) {.    le
17e0: 6e 20 3d 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65  n = String_to_He
17f0: 78 28 6d 64 2c 20 6c 65 6e 2c 20 62 75 66 66 65  x(md, len, buffe
1800: 72 2c 20 42 55 46 53 49 5a 29 3b 0a 20 20 20 20  r, BUFSIZ);.    
1810: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1820: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1830: 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65   certPtr, Tcl_Ne
1840: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 68 61 32  wStringObj("sha2
1850: 35 36 5f 68 61 73 68 22 2c 20 2d 31 29 29 3b 0a  56_hash", -1));.
1860: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1870: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1880: 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63  erp, certPtr, Tc
1890: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62  l_NewStringObj(b
18a0: 75 66 66 65 72 2c 20 6c 65 6e 29 29 3b 0a 20 20  uffer, len));.  
18b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a    }..    /* Subj
18c0: 65 63 74 20 50 75 62 6c 69 63 20 4b 65 79 20 49  ect Public Key I
18d0: 6e 66 6f 20 73 70 65 63 69 66 69 65 73 20 74 68  nfo specifies th
18e0: 65 20 70 75 62 6c 69 63 20 6b 65 79 20 61 6e 64  e public key and
18f0: 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 0a   identifies the.
1900: 09 61 6c 67 6f 72 69 74 68 6d 20 77 69 74 68 20  .algorithm with 
1910: 77 68 69 63 68 20 74 68 65 20 6b 65 79 20 69 73  which the key is
1920: 20 75 73 65 64 2e 20 52 46 43 20 35 32 38 30 20   used. RFC 5280 
1930: 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 37 20  section 4.1.2.7 
1940: 2a 2f 0a 20 20 20 20 69 66 20 28 58 35 30 39 5f  */.    if (X509_
1950: 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 69 6e  get_signature_in
1960: 66 6f 28 63 65 72 74 2c 20 26 6d 64 6e 69 64 2c  fo(cert, &mdnid,
1970: 20 26 70 6b 6e 69 64 2c 20 26 62 69 74 73 2c 20   &pknid, &bits, 
1980: 26 78 66 6c 61 67 73 29 20 3d 3d 20 31 29 20 7b  &xflags) == 1) {
1990: 0a 09 41 53 4e 31 5f 42 49 54 5f 53 54 52 49 4e  ..ASN1_BIT_STRIN
19a0: 47 20 2a 6b 65 79 3b 0a 09 75 6e 73 69 67 6e 65  G *key;..unsigne
19b0: 64 20 69 6e 74 20 6e 3b 0a 0a 09 54 63 6c 5f 4c  d int n;...Tcl_L
19c0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
19d0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74  ent(interp, cert
19e0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
19f0: 6e 67 4f 62 6a 28 22 73 69 67 6e 69 6e 67 44 69  ngObj("signingDi
1a00: 67 65 73 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63  gest", -1));..Tc
1a10: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1a20: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
1a30: 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  ertPtr, Tcl_NewS
1a40: 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64  tringObj(OBJ_nid
1a50: 32 6c 6e 28 6d 64 6e 69 64 29 2c 2d 31 29 29 3b  2ln(mdnid),-1));
1a60: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
1a70: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1a80: 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f  p, certPtr, Tcl_
1a90: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 75  NewStringObj("pu
1aa0: 62 6c 69 63 4b 65 79 41 6c 67 6f 72 69 74 68 6d  blicKeyAlgorithm
1ab0: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
1ac0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1ad0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50  nt(interp, certP
1ae0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1af0: 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e 28  gObj(OBJ_nid2ln(
1b00: 70 6b 6e 69 64 29 2c 2d 31 29 29 3b 0a 09 2f 2a  pknid),-1));../*
1b10: 20 45 66 66 65 63 74 69 76 65 20 73 65 63 75 72   Effective secur
1b20: 69 74 79 20 62 69 74 73 20 2a 2f 0a 09 54 63 6c  ity bits */..Tcl
1b30: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1b40: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65  ement(interp, ce
1b50: 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  rtPtr, Tcl_NewSt
1b60: 72 69 6e 67 4f 62 6a 28 22 62 69 74 73 22 2c 20  ringObj("bits", 
1b70: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
1b80: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1b90: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c  interp, certPtr,
1ba0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 62   Tcl_NewIntObj(b
1bb0: 69 74 73 29 29 3b 0a 0a 09 6b 65 79 20 3d 20 58  its));...key = X
1bc0: 35 30 39 5f 67 65 74 30 5f 70 75 62 6b 65 79 5f  509_get0_pubkey_
1bd0: 62 69 74 73 74 72 28 63 65 72 74 29 3b 0a 09 6c  bitstr(cert);..l
1be0: 65 6e 20 3d 20 53 74 72 69 6e 67 5f 74 6f 5f 48  en = String_to_H
1bf0: 65 78 28 6b 65 79 2d 3e 64 61 74 61 2c 20 6b 65  ex(key->data, ke
1c00: 79 2d 3e 6c 65 6e 67 74 68 2c 20 62 75 66 66 65  y->length, buffe
1c10: 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 54 63 6c  r, BUFSIZ);..Tcl
1c20: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1c30: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65  ement(interp, ce
1c40: 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  rtPtr, Tcl_NewSt
1c50: 72 69 6e 67 4f 62 6a 28 22 70 75 62 6c 69 63 4b  ringObj("publicK
1c60: 65 79 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  ey", -1));..Tcl_
1c70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1c80: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72  ment(interp, cer
1c90: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tPtr, Tcl_NewStr
1ca0: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 6c  ingObj(buffer, l
1cb0: 65 6e 29 29 3b 0a 0a 09 2f 2a 20 43 68 65 63 6b  en));.../* Check
1cc0: 20 69 66 20 63 65 72 74 20 77 61 73 20 69 73 73   if cert was iss
1cd0: 75 65 64 20 62 79 20 43 41 20 63 65 72 74 20 69  ued by CA cert i
1ce0: 73 73 75 65 72 20 6f 72 20 73 65 6c 66 20 73 69  ssuer or self si
1cf0: 67 6e 65 64 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73  gned */..Tcl_Lis
1d00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1d10: 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74  t(interp, certPt
1d20: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
1d30: 4f 62 6a 28 22 73 65 6c 66 5f 73 69 67 6e 65 64  Obj("self_signed
1d40: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
1d50: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1d60: 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50  nt(interp, certP
1d70: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  tr, Tcl_NewBoole
1d80: 61 6e 4f 62 6a 28 58 35 30 39 5f 63 68 65 63 6b  anObj(X509_check
1d90: 5f 69 73 73 75 65 64 28 63 65 72 74 2c 20 63 65  _issued(cert, ce
1da0: 72 74 29 20 3d 3d 20 58 35 30 39 5f 56 5f 4f 4b  rt) == X509_V_OK
1db0: 29 29 3b 0a 0a 09 69 66 20 28 58 35 30 39 5f 64  ));...if (X509_d
1dc0: 69 67 65 73 74 28 63 65 72 74 2c 20 45 56 50 5f  igest(cert, EVP_
1dd0: 67 65 74 5f 64 69 67 65 73 74 62 79 6e 69 64 28  get_digestbynid(
1de0: 6d 64 6e 69 64 29 2c 20 6d 64 2c 20 26 6e 29 29  mdnid), md, &n))
1df0: 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 53 74   {..    len = St
1e00: 72 69 6e 67 5f 74 6f 5f 48 65 78 28 6d 64 2c 20  ring_to_Hex(md, 
1e10: 28 69 6e 74 29 6e 2c 20 62 75 66 66 65 72 2c 20  (int)n, buffer, 
1e20: 42 55 46 53 49 5a 29 3b 0a 09 7d 20 65 6c 73 65  BUFSIZ);..} else
1e30: 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 30 3b   {..    len = 0;
1e40: 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ..}..Tcl_ListObj
1e50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1e60: 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54  terp, certPtr, T
1e70: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1e80: 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 22 2c  "signatureHash",
1e90: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
1ea0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1eb0: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72  (interp, certPtr
1ec0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1ed0: 62 6a 28 62 75 66 66 65 72 2c 20 6c 65 6e 29 29  bj(buffer, len))
1ee0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 78 66 6c  ;.    }..    xfl
1ef0: 61 67 73 20 3d 20 58 35 30 39 5f 67 65 74 5f 65  ags = X509_get_e
1f00: 78 74 65 6e 73 69 6f 6e 5f 66 6c 61 67 73 28 63  xtension_flags(c
1f10: 65 72 74 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  ert);..Tcl_ListO
1f20: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1f30: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c  interp, certPtr,
1f40: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1f50: 6a 28 22 65 78 74 65 6e 73 69 6f 6e 5f 66 6c 61  j("extension_fla
1f60: 67 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  gs", -1));..Tcl_
1f70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1f80: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72  ment(interp, cer
1f90: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  tPtr, Tcl_NewInt
1fa0: 4f 62 6a 28 78 66 6c 61 67 73 29 29 3b 0a 0a 09  Obj(xflags));...
1fb0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 63 65 72 74  /* Check if cert
1fc0: 20 77 61 73 20 69 73 73 75 65 64 20 62 79 20 43   was issued by C
1fd0: 41 20 63 65 72 74 20 69 73 73 75 65 72 20 6f 72  A cert issuer or
1fe0: 20 73 65 6c 66 20 73 69 67 6e 65 64 20 2a 2f 0a   self signed */.
1ff0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
2000: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2010: 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e  , certPtr, Tcl_N
2020: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 6c  ewStringObj("sel
2030: 66 49 73 73 75 65 64 22 2c 20 2d 31 29 29 3b 0a  fIssued", -1));.
2040: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
2050: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2060: 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e  , certPtr, Tcl_N
2070: 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 78 66 6c  ewBooleanObj(xfl
2080: 61 67 73 20 26 20 45 58 46 4c 41 47 5f 53 49 29  ags & EXFLAG_SI)
2090: 29 3b 0a 0a 09 2f 2a 20 43 68 65 63 6b 20 69 66  );.../* Check if
20a0: 20 63 65 72 74 20 77 61 73 20 69 73 73 75 65 64   cert was issued
20b0: 20 62 79 20 43 41 20 63 65 72 74 20 69 73 73 75   by CA cert issu
20c0: 65 72 20 6f 72 20 73 65 6c 66 20 73 69 67 6e 65  er or self signe
20d0: 64 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  d */..Tcl_ListOb
20e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
20f0: 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20  nterp, certPtr, 
2100: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2110: 28 22 73 65 6c 66 53 69 67 6e 65 64 22 2c 20 2d  ("selfSigned", -
2120: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
2130: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2140: 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20  nterp, certPtr, 
2150: 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
2160: 6a 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41  j(xflags & EXFLA
2170: 47 5f 53 53 29 29 3b 0a 0a 0a 20 20 20 20 2f 2a  G_SS));...    /*
2180: 20 55 6e 69 71 75 65 20 49 64 73 20 2d 20 20 54   Unique Ids -  T
2190: 68 65 20 75 6e 69 71 75 65 20 69 64 65 6e 74 69  he unique identi
21a0: 66 69 65 72 73 20 61 72 65 20 70 72 65 73 65 6e  fiers are presen
21b0: 74 20 69 6e 20 74 68 65 20 63 65 72 74 69 66 69  t in the certifi
21c0: 63 61 74 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  cate to handle t
21d0: 68 65 0a 09 70 6f 73 73 69 62 69 6c 69 74 79 20  he..possibility 
21e0: 6f 66 20 72 65 75 73 65 20 6f 66 20 73 75 62 6a  of reuse of subj
21f0: 65 63 74 20 61 6e 64 2f 6f 72 20 69 73 73 75 65  ect and/or issue
2200: 72 20 6e 61 6d 65 73 20 6f 76 65 72 20 74 69 6d  r names over tim
2210: 65 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74  e. RFC 5280 sect
2220: 69 6f 6e 20 34 2e 31 2e 32 2e 38 20 2a 2f 0a 20  ion 4.1.2.8 */. 
2230: 20 20 20 7b 0a 09 63 6f 6e 73 74 20 41 53 4e 31     {..const ASN1
2240: 5f 42 49 54 5f 53 54 52 49 4e 47 20 2a 69 75 69  _BIT_STRING *iui
2250: 64 2c 20 2a 73 75 69 64 3b 0a 20 20 20 20 20 20  d, *suid;.      
2260: 20 20 58 35 30 39 5f 67 65 74 30 5f 75 69 64 73    X509_get0_uids
2270: 28 63 65 72 74 2c 20 26 69 75 69 64 2c 20 26 73  (cert, &iuid, &s
2280: 75 69 64 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  uid);..Tcl_ListO
2290: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
22a0: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c  interp, certPtr,
22b0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
22c0: 6a 28 22 69 73 73 75 65 72 55 6e 69 71 75 65 49  j("issuerUniqueI
22d0: 64 22 2c 20 2d 31 29 29 3b 0a 09 69 66 20 28 69  d", -1));..if (i
22e0: 75 69 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  uid != NULL) {..
22f0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2300: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2310: 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63  erp, certPtr, Tc
2320: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
2330: 6a 28 28 63 68 61 72 20 2a 29 69 75 69 64 2d 3e  j((char *)iuid->
2340: 64 61 74 61 2c 20 69 75 69 64 2d 3e 6c 65 6e 67  data, iuid->leng
2350: 74 68 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  th));..} else {.
2360: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2370: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2380: 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54  terp, certPtr, T
2390: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
23a0: 22 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 0a 09 54  "", -1));..}...T
23b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
23c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
23d0: 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77  certPtr, Tcl_New
23e0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 75 62 6a 65  StringObj("subje
23f0: 63 74 55 6e 69 71 75 65 49 64 22 2c 20 2d 31 29  ctUniqueId", -1)
2400: 29 3b 0a 09 69 66 20 28 73 75 69 64 20 21 3d 20  );..if (suid != 
2410: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c  NULL) {..    Tcl
2420: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2430: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65  ement(interp, ce
2440: 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79  rtPtr, Tcl_NewBy
2450: 74 65 41 72 72 61 79 4f 62 6a 28 28 63 68 61 72  teArrayObj((char
2460: 20 2a 29 73 75 69 64 2d 3e 64 61 74 61 2c 20 73   *)suid->data, s
2470: 75 69 64 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a 09  uid->length));..
2480: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63  } else {..    Tc
2490: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
24a0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
24b0: 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  ertPtr, Tcl_NewS
24c0: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29  tringObj("", -1)
24d0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
24e0: 20 2f 2a 20 58 35 30 39 20 76 33 20 45 78 74 65   /* X509 v3 Exte
24f0: 6e 73 69 6f 6e 73 20 2d 20 52 46 43 20 35 32 38  nsions - RFC 528
2500: 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e  0 section 4.1.2.
2510: 39 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 58  9 */.    len = X
2520: 35 30 39 5f 67 65 74 5f 65 78 74 5f 63 6f 75 6e  509_get_ext_coun
2530: 74 28 63 65 72 74 29 3b 0a 20 20 20 20 54 63 6c  t(cert);.    Tcl
2540: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2550: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65  ement(interp, ce
2560: 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  rtPtr, Tcl_NewSt
2570: 72 69 6e 67 4f 62 6a 28 22 6e 75 6d 5f 65 78 74  ringObj("num_ext
2580: 65 6e 73 69 6f 6e 73 22 2c 20 2d 31 29 29 3b 0a  ensions", -1));.
2590: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
25a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
25b0: 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63  erp, certPtr, Tc
25c0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6c 65 6e 29  l_NewIntObj(len)
25d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
25e0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
25f0: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c  interp, certPtr,
2600: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2610: 6a 28 22 65 78 74 65 6e 73 69 6f 6e 73 22 2c 20  j("extensions", 
2620: 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6c 65  -1));.    if (le
2630: 6e 20 3e 20 30 29 20 7b 0a 09 54 63 6c 5f 4f 62  n > 0) {..Tcl_Ob
2640: 6a 20 2a 65 78 74 73 50 74 72 20 3d 20 54 63 6c  j *extsPtr = Tcl
2650: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
2660: 55 4c 4c 29 3b 0a 09 63 6f 6e 73 74 20 53 54 41  ULL);..const STA
2670: 43 4b 5f 4f 46 28 58 35 30 39 5f 45 58 54 45 4e  CK_OF(X509_EXTEN
2680: 53 49 4f 4e 29 20 2a 65 78 74 73 3b 0a 09 65 78  SION) *exts;..ex
2690: 74 73 20 3d 20 58 35 30 39 5f 67 65 74 30 5f 65  ts = X509_get0_e
26a0: 78 74 65 6e 73 69 6f 6e 73 28 63 65 72 74 29 3b  xtensions(cert);
26b0: 0a 0a 09 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b  ...for (int i=0;
26c0: 20 69 20 3c 20 6c 65 6e 3b 20 69 2b 2b 29 20 7b   i < len; i++) {
26d0: 0a 09 20 20 20 20 58 35 30 39 5f 45 58 54 45 4e  ..    X509_EXTEN
26e0: 53 49 4f 4e 20 2a 65 78 20 3d 20 73 6b 5f 58 35  SION *ex = sk_X5
26f0: 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 76 61 6c  09_EXTENSION_val
2700: 75 65 28 65 78 74 73 2c 20 69 29 3b 0a 09 20 20  ue(exts, i);..  
2710: 20 20 41 53 4e 31 5f 4f 42 4a 45 43 54 20 2a 6f    ASN1_OBJECT *o
2720: 62 6a 20 3d 20 58 35 30 39 5f 45 58 54 45 4e 53  bj = X509_EXTENS
2730: 49 4f 4e 5f 67 65 74 5f 6f 62 6a 65 63 74 28 65  ION_get_object(e
2740: 78 29 3b 0a 09 20 20 20 20 75 6e 73 69 67 6e 65  x);..    unsigne
2750: 64 20 6e 69 64 32 20 3d 20 4f 42 4a 5f 6f 62 6a  d nid2 = OBJ_obj
2760: 32 6e 69 64 28 6f 62 6a 29 3b 0a 09 20 20 20 20  2nid(obj);..    
2770: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2780: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2790: 20 65 78 74 73 50 74 72 2c 20 54 63 6c 5f 4e 65   extsPtr, Tcl_Ne
27a0: 77 53 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e  wStringObj(OBJ_n
27b0: 69 64 32 6c 6e 28 6e 69 64 32 29 2c 20 2d 31 29  id2ln(nid2), -1)
27c0: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f  );..}..Tcl_ListO
27d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
27e0: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c  interp, certPtr,
27f0: 20 65 78 74 73 50 74 72 29 3b 0a 20 20 20 20 7d   extsPtr);.    }
2800: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73   else {..Tcl_Lis
2810: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2820: 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74  t(interp, certPt
2830: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2840: 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 20 20  Obj("", -1));.  
2850: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 75 74 68    }..    /* Auth
2860: 6f 72 69 74 79 20 4b 65 79 20 49 64 65 6e 74 69  ority Key Identi
2870: 66 69 65 72 20 28 41 4b 49 29 20 6f 66 20 61 20  fier (AKI) of a 
2880: 63 65 72 74 69 66 69 63 61 74 65 20 73 68 6f 75  certificate shou
2890: 6c 64 20 62 65 20 74 68 65 20 53 75 62 6a 65 63  ld be the Subjec
28a0: 74 20 4b 65 79 0a 09 49 64 65 6e 74 69 66 69 65  t Key..Identifie
28b0: 72 20 28 53 4b 49 29 20 6f 66 20 69 74 73 20 73  r (SKI) of its s
28c0: 69 67 6e 65 72 20 28 74 68 65 20 43 41 29 2e 20  igner (the CA). 
28d0: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e  RFC 5280 section
28e0: 20 34 2e 32 2e 31 2e 31 2c 20 4e 49 44 5f 61 75   4.2.1.1, NID_au
28f0: 74 68 6f 72 69 74 79 5f 6b 65 79 5f 69 64 65 6e  thority_key_iden
2900: 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 7b 0a  tifier */.    {.
2910: 09 41 53 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49  .ASN1_OCTET_STRI
2920: 4e 47 20 2a 61 73 74 72 69 6e 67 20 3d 20 58 35  NG *astring = X5
2930: 30 39 5f 67 65 74 30 5f 61 75 74 68 6f 72 69 74  09_get0_authorit
2940: 79 5f 6b 65 79 5f 69 64 28 63 65 72 74 29 3b 0a  y_key_id(cert);.
2950: 09 69 66 20 28 61 73 74 72 69 6e 67 20 21 3d 20  .if (astring != 
2960: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6c 65 6e  NULL) {..    len
2970: 20 3d 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78   = String_to_Hex
2980: 28 28 63 68 61 72 20 2a 29 41 53 4e 31 5f 53 54  ((char *)ASN1_ST
2990: 52 49 4e 47 5f 67 65 74 30 5f 64 61 74 61 28 61  RING_get0_data(a
29a0: 73 74 72 69 6e 67 29 2c 20 41 53 4e 31 5f 53 54  string), ASN1_ST
29b0: 52 49 4e 47 5f 6c 65 6e 67 74 68 28 61 73 74 72  RING_length(astr
29c0: 69 6e 67 29 2c 20 62 75 66 66 65 72 2c 20 42 55  ing), buffer, BU
29d0: 46 53 49 5a 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  FSIZ);..} else {
29e0: 0a 09 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 09  ..    len = 0;..
29f0: 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  }..Tcl_ListObjAp
2a00: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2a10: 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c  rp, certPtr, Tcl
2a20: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61  _NewStringObj("a
2a30: 75 74 68 6f 72 69 74 79 4b 65 79 49 64 65 6e 74  uthorityKeyIdent
2a40: 69 66 69 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54  ifier", -1));..T
2a50: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2a60: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2a70: 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77  certPtr, Tcl_New
2a80: 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72  StringObj(buffer
2a90: 2c 20 6c 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 0a  , len));.    }..
2aa0: 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 4b      /* Subject K
2ab0: 65 79 20 49 64 65 6e 74 69 66 69 65 72 20 28 53  ey Identifier (S
2ac0: 4b 49 29 20 70 72 6f 76 69 64 65 73 20 61 20 6d  KI) provides a m
2ad0: 65 61 6e 73 20 6f 66 20 69 64 65 6e 74 69 66 79  eans of identify
2ae0: 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 73  ing certificates
2af0: 0a 09 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 61  ..that contain a
2b00: 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 62 6c   particular publ
2b10: 69 63 20 6b 65 79 2e 20 52 46 43 20 35 32 38 30  ic key. RFC 5280
2b20: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 32   section 4.2.1.2
2b30: 2c 20 4e 49 44 5f 73 75 62 6a 65 63 74 5f 6b 65  , NID_subject_ke
2b40: 79 5f 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a  y_identifier */.
2b50: 20 20 20 20 7b 0a 09 41 53 4e 31 5f 4f 43 54 45      {..ASN1_OCTE
2b60: 54 5f 53 54 52 49 4e 47 20 2a 61 73 74 72 69 6e  T_STRING *astrin
2b70: 67 20 3d 20 58 35 30 39 5f 67 65 74 30 5f 73 75  g = X509_get0_su
2b80: 62 6a 65 63 74 5f 6b 65 79 5f 69 64 28 63 65 72  bject_key_id(cer
2b90: 74 29 3b 0a 09 69 66 20 28 61 73 74 72 69 6e 67  t);..if (astring
2ba0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
2bb0: 20 6c 65 6e 20 3d 20 53 74 72 69 6e 67 5f 74 6f   len = String_to
2bc0: 5f 48 65 78 28 28 63 68 61 72 20 2a 29 41 53 4e  _Hex((char *)ASN
2bd0: 31 5f 53 54 52 49 4e 47 5f 67 65 74 30 5f 64 61  1_STRING_get0_da
2be0: 74 61 28 61 73 74 72 69 6e 67 29 2c 20 41 53 4e  ta(astring), ASN
2bf0: 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28  1_STRING_length(
2c00: 61 73 74 72 69 6e 67 29 2c 20 62 75 66 66 65 72  astring), buffer
2c10: 2c 20 42 55 46 53 49 5a 29 3b 0a 09 7d 20 65 6c  , BUFSIZ);..} el
2c20: 73 65 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20  se {..    len = 
2c30: 30 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f  0;..}..Tcl_ListO
2c40: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2c50: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c  interp, certPtr,
2c60: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2c70: 6a 28 22 73 75 62 6a 65 63 74 4b 65 79 49 64 65  j("subjectKeyIde
2c80: 6e 74 69 66 69 65 72 22 2c 20 2d 31 29 29 3b 0a  ntifier", -1));.
2c90: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
2ca0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2cb0: 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e  , certPtr, Tcl_N
2cc0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66  ewStringObj(buff
2cd0: 65 72 2c 20 6c 65 6e 29 29 3b 0a 20 20 20 20 7d  er, len));.    }
2ce0: 0a 0a 20 20 20 20 2f 2a 20 4b 65 79 20 75 73 61  ..    /* Key usa
2cf0: 67 65 20 65 78 74 65 6e 73 69 6f 6e 20 64 65 66  ge extension def
2d00: 69 6e 65 73 20 74 68 65 20 70 75 72 70 6f 73 65  ines the purpose
2d10: 20 28 65 2e 67 2e 2c 20 65 6e 63 69 70 68 65 72   (e.g., encipher
2d20: 6d 65 6e 74 2c 20 73 69 67 6e 61 74 75 72 65 2c  ment, signature,
2d30: 20 63 65 72 74 69 66 69 63 61 74 65 0a 09 73 69   certificate..si
2d40: 67 6e 69 6e 67 29 20 6f 66 20 74 68 65 20 6b 65  gning) of the ke
2d50: 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  y contained in t
2d60: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 2e 20  he certificate. 
2d70: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e  RFC 5280 section
2d80: 20 34 2e 32 2e 31 2e 33 2c 20 4e 49 44 5f 6b 65   4.2.1.3, NID_ke
2d90: 79 5f 75 73 61 67 65 20 2a 2f 0a 20 20 20 20 54  y_usage */.    T
2da0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2db0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2dc0: 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77  certPtr, Tcl_New
2dd0: 53 74 72 69 6e 67 4f 62 6a 28 22 6b 65 79 55 73  StringObj("keyUs
2de0: 61 67 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  age", -1));.    
2df0: 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 74  usage = X509_get
2e00: 5f 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74 29  _key_usage(cert)
2e10: 3b 0a 20 20 20 20 69 66 20 28 78 66 6c 61 67 73  ;.    if (xflags
2e20: 20 26 20 45 58 46 4c 41 47 5f 4b 55 53 41 47 45   & EXFLAG_KUSAGE
2e30: 20 26 26 20 75 73 61 67 65 20 3c 20 30 78 66 66   && usage < 0xff
2e40: 66 66 66 66 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a  ffff) {..Tcl_Obj
2e50: 20 2a 74 6d 70 50 74 72 20 3d 20 54 63 6c 5f 4e   *tmpPtr = Tcl_N
2e60: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
2e70: 4c 29 3b 0a 09 69 66 20 28 75 73 61 67 65 20 26  L);..if (usage &
2e80: 20 4b 55 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e   KU_DIGITAL_SIGN
2e90: 41 54 55 52 45 29 20 7b 0a 09 20 20 20 20 54 63  ATURE) {..    Tc
2ea0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2eb0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 74  lement(interp, t
2ec0: 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mpPtr, Tcl_NewSt
2ed0: 72 69 6e 67 4f 62 6a 28 22 44 69 67 69 74 61 6c  ringObj("Digital
2ee0: 20 53 69 67 6e 61 74 75 72 65 22 2c 20 2d 31 29   Signature", -1)
2ef0: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65  );..}..if (usage
2f00: 20 26 20 4b 55 5f 4e 4f 4e 5f 52 45 50 55 44 49   & KU_NON_REPUDI
2f10: 41 54 49 4f 4e 29 20 7b 0a 09 20 20 20 20 54 63  ATION) {..    Tc
2f20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2f30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 74  lement(interp, t
2f40: 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mpPtr, Tcl_NewSt
2f50: 72 69 6e 67 4f 62 6a 28 22 4e 6f 6e 2d 52 65 70  ringObj("Non-Rep
2f60: 75 64 69 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b  udiation", -1));
2f70: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26  ..}..if (usage &
2f80: 20 4b 55 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52   KU_KEY_ENCIPHER
2f90: 4d 45 4e 54 29 20 7b 0a 09 20 20 20 20 54 63 6c  MENT) {..    Tcl
2fa0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2fb0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 74 6d  ement(interp, tm
2fc0: 70 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pPtr, Tcl_NewStr
2fd0: 69 6e 67 4f 62 6a 28 22 4b 65 79 20 45 6e 63 69  ingObj("Key Enci
2fe0: 70 68 65 72 6d 65 6e 74 22 2c 20 2d 31 29 29 3b  pherment", -1));
2ff0: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26  ..}..if (usage &
3000: 20 4b 55 5f 44 41 54 41 5f 45 4e 43 49 50 48 45   KU_DATA_ENCIPHE
3010: 52 4d 45 4e 54 29 20 7b 0a 09 20 20 20 20 54 63  RMENT) {..    Tc
3020: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3030: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 74  lement(interp, t
3040: 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mpPtr, Tcl_NewSt
3050: 72 69 6e 67 4f 62 6a 28 22 44 61 74 61 20 45 6e  ringObj("Data En
3060: 63 69 70 68 65 72 6d 65 6e 74 22 2c 20 2d 31 29  cipherment", -1)
3070: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65  );..}..if (usage
3080: 20 26 20 4b 55 5f 4b 45 59 5f 41 47 52 45 45 4d   & KU_KEY_AGREEM
3090: 45 4e 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ENT) {..    Tcl_
30a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
30b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 74 6d 70  ment(interp, tmp
30c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
30d0: 6e 67 4f 62 6a 28 22 4b 65 79 20 41 67 72 65 65  ngObj("Key Agree
30e0: 6d 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  ment", -1));..}.
30f0: 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f  .if (usage & KU_
3100: 4b 45 59 5f 43 45 52 54 5f 53 49 47 4e 29 20 7b  KEY_CERT_SIGN) {
3110: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
3120: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3130: 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 2c 20 54  nterp, tmpPtr, T
3140: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3150: 22 43 65 72 74 69 66 69 63 61 74 65 20 53 69 67  "Certificate Sig
3160: 6e 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  ning", -1));..}.
3170: 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f  .if (usage & KU_
3180: 43 52 4c 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20  CRL_SIGN) {..   
3190: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
31a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
31b0: 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65  , tmpPtr, Tcl_Ne
31c0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 43 52 4c 20  wStringObj("CRL 
31d0: 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 3b 0a  Signing", -1));.
31e0: 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20  .}..if (usage & 
31f0: 4b 55 5f 45 4e 43 49 50 48 45 52 5f 4f 4e 4c 59  KU_ENCIPHER_ONLY
3200: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
3210: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3220: 74 28 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 72  t(interp, tmpPtr
3230: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
3240: 62 6a 28 22 45 6e 63 69 70 68 65 72 20 4f 6e 6c  bj("Encipher Onl
3250: 79 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66  y", -1));..}..if
3260: 20 28 75 73 61 67 65 20 26 20 4b 55 5f 44 45 43   (usage & KU_DEC
3270: 49 50 48 45 52 5f 4f 4e 4c 59 29 20 7b 0a 09 20  IPHER_ONLY) {.. 
3280: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3290: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
32a0: 72 70 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c 5f  rp, tmpPtr, Tcl_
32b0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 44 65  NewStringObj("De
32c0: 63 69 70 68 65 72 20 4f 6e 6c 79 22 2c 20 2d 31  cipher Only", -1
32d0: 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74  ));..}..Tcl_List
32e0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
32f0: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72  (interp, certPtr
3300: 2c 20 74 6d 70 50 74 72 29 3b 0a 20 20 20 20 7d  , tmpPtr);.    }
3310: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73   else {..Tcl_Lis
3320: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3330: 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74  t(interp, certPt
3340: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
3350: 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 20 20  Obj("", -1));.  
3360: 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 50 75 72    }...    /* Pur
3370: 70 6f 73 65 20 2a 2f 0a 20 20 20 20 7b 0a 09 63  pose */.    {..c
3380: 68 61 72 20 2a 70 75 72 70 6f 73 65 20 3d 20 4e  har *purpose = N
3390: 55 4c 4c 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f  ULL;...Tcl_ListO
33a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
33b0: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c  interp, certPtr,
33c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
33d0: 6a 28 22 70 75 72 70 6f 73 65 22 2c 20 2d 31 29  j("purpose", -1)
33e0: 29 3b 0a 09 69 66 20 28 58 35 30 39 5f 63 68 65  );..if (X509_che
33f0: 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c  ck_purpose(cert,
3400: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 53 53   X509_PURPOSE_SS
3410: 4c 5f 43 4c 49 45 4e 54 2c 20 30 29 20 3e 20 30  L_CLIENT, 0) > 0
3420: 29 20 7b 0a 09 20 20 20 20 70 75 72 70 6f 73 65  ) {..    purpose
3430: 20 3d 20 22 53 53 4c 20 43 6c 69 65 6e 74 22 3b   = "SSL Client";
3440: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30  ..} else if (X50
3450: 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28  9_check_purpose(
3460: 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f  cert, X509_PURPO
3470: 53 45 5f 53 53 4c 5f 53 45 52 56 45 52 2c 20 30  SE_SSL_SERVER, 0
3480: 29 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 70 75  ) > 0) {..    pu
3490: 72 70 6f 73 65 20 3d 20 22 53 53 4c 20 53 65 72  rpose = "SSL Ser
34a0: 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66  ver";..} else if
34b0: 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72   (X509_check_pur
34c0: 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f  pose(cert, X509_
34d0: 50 55 52 50 4f 53 45 5f 4e 53 5f 53 53 4c 5f 53  PURPOSE_NS_SSL_S
34e0: 45 52 56 45 52 2c 20 30 29 20 3e 20 30 29 20 7b  ERVER, 0) > 0) {
34f0: 0a 09 20 20 20 20 70 75 72 70 6f 73 65 20 3d 20  ..    purpose = 
3500: 22 4d 53 53 20 53 53 4c 20 53 65 72 76 65 72 22  "MSS SSL Server"
3510: 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 58 35  ;..} else if (X5
3520: 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65  09_check_purpose
3530: 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50  (cert, X509_PURP
3540: 4f 53 45 5f 53 4d 49 4d 45 5f 53 49 47 4e 2c 20  OSE_SMIME_SIGN, 
3550: 30 29 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 70  0) > 0) {..    p
3560: 75 72 70 6f 73 65 20 3d 20 22 53 4d 49 4d 45 20  urpose = "SMIME 
3570: 53 69 67 6e 69 6e 67 22 3b 0a 09 7d 20 65 6c 73  Signing";..} els
3580: 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b  e if (X509_check
3590: 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58  _purpose(cert, X
35a0: 35 30 39 5f 50 55 52 50 4f 53 45 5f 53 4d 49 4d  509_PURPOSE_SMIM
35b0: 45 5f 45 4e 43 52 59 50 54 2c 20 30 29 20 3e 20  E_ENCRYPT, 0) > 
35c0: 30 29 20 7b 0a 09 20 20 20 20 70 75 72 70 6f 73  0) {..    purpos
35d0: 65 20 3d 20 22 53 4d 49 4d 45 20 45 6e 63 72 79  e = "SMIME Encry
35e0: 70 74 69 6f 6e 22 3b 0a 09 7d 20 65 6c 73 65 20  ption";..} else 
35f0: 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70  if (X509_check_p
3600: 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30  urpose(cert, X50
3610: 39 5f 50 55 52 50 4f 53 45 5f 43 52 4c 5f 53 49  9_PURPOSE_CRL_SI
3620: 47 4e 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 20  GN, 0) > 0) {.. 
3630: 20 20 20 70 75 72 70 6f 73 65 20 3d 20 22 43 52     purpose = "CR
3640: 4c 20 53 69 67 6e 69 6e 67 22 3b 0a 09 7d 20 65  L Signing";..} e
3650: 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65  lse if (X509_che
3660: 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c  ck_purpose(cert,
3670: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 41 4e   X509_PURPOSE_AN
3680: 59 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 20 20  Y, 0) > 0) {..  
3690: 20 20 70 75 72 70 6f 73 65 20 3d 20 22 41 6e 79    purpose = "Any
36a0: 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 58  ";..} else if (X
36b0: 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73  509_check_purpos
36c0: 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52  e(cert, X509_PUR
36d0: 50 4f 53 45 5f 4f 43 53 50 5f 48 45 4c 50 45 52  POSE_OCSP_HELPER
36e0: 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 20 20 20  , 0) > 0) {..   
36f0: 20 70 75 72 70 6f 73 65 20 3d 20 22 4f 43 53 50   purpose = "OCSP
3700: 20 48 65 6c 70 65 72 22 3b 0a 09 7d 20 65 6c 73   Helper";..} els
3710: 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b  e if (X509_check
3720: 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58  _purpose(cert, X
3730: 35 30 39 5f 50 55 52 50 4f 53 45 5f 54 49 4d 45  509_PURPOSE_TIME
3740: 53 54 41 4d 50 5f 53 49 47 4e 2c 20 30 29 20 3e  STAMP_SIGN, 0) >
3750: 20 30 29 20 7b 0a 09 20 20 20 20 70 75 72 70 6f   0) {..    purpo
3760: 73 65 20 3d 20 22 54 69 6d 65 73 74 61 6d 70 20  se = "Timestamp 
3770: 53 69 67 6e 69 6e 67 22 3b 0a 09 7d 20 65 6c 73  Signing";..} els
3780: 65 20 7b 0a 09 20 20 20 20 70 75 72 70 6f 73 65  e {..    purpose
3790: 20 3d 20 22 22 3b 0a 09 7d 0a 09 54 63 6c 5f 4c   = "";..}..Tcl_L
37a0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
37b0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74  ent(interp, cert
37c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
37d0: 6e 67 4f 62 6a 28 70 75 72 70 6f 73 65 2c 20 2d  ngObj(purpose, -
37e0: 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  1));.    }..    
37f0: 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 70 75 72 70  {..Tcl_Obj *purp
3800: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
3810: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09  tObj(0, NULL);..
3820: 66 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20  for (int j = 0; 
3830: 6a 20 3c 20 58 35 30 39 5f 50 55 52 50 4f 53 45  j < X509_PURPOSE
3840: 5f 67 65 74 5f 63 6f 75 6e 74 28 29 3b 20 6a 2b  _get_count(); j+
3850: 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 50  +) {..    X509_P
3860: 55 52 50 4f 53 45 20 2a 70 74 6d 70 20 3d 20 58  URPOSE *ptmp = X
3870: 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 30  509_PURPOSE_get0
3880: 28 6a 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62  (j);..    Tcl_Ob
3890: 6a 20 2a 74 6d 70 50 74 72 20 3d 20 54 63 6c 5f  j *tmpPtr = Tcl_
38a0: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
38b0: 4c 4c 29 3b 0a 0a 09 20 20 20 20 66 6f 72 20 28  LL);...    for (
38c0: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 32  int i = 0; i < 2
38d0: 3b 20 69 2b 2b 29 20 7b 0a 09 09 69 6e 74 20 69  ; i++) {...int i
38e0: 64 72 65 74 20 3d 20 58 35 30 39 5f 63 68 65 63  dret = X509_chec
38f0: 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20  k_purpose(cert, 
3900: 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74  X509_PURPOSE_get
3910: 5f 69 64 28 70 74 6d 70 29 2c 20 69 29 3b 0a 09  _id(ptmp), i);..
3920: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
3930: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3940: 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65  , tmpPtr, Tcl_Ne
3950: 77 53 74 72 69 6e 67 4f 62 6a 28 69 20 3f 20 22  wStringObj(i ? "
3960: 43 41 22 20 3a 20 22 6e 6f 6e 43 41 22 2c 20 2d  CA" : "nonCA", -
3970: 31 29 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f  1));...Tcl_ListO
3980: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3990: 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 2c 20  interp, tmpPtr, 
39a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
39b0: 28 69 64 72 65 74 20 3d 3d 20 31 20 3f 20 22 59  (idret == 1 ? "Y
39c0: 65 73 22 20 3a 20 22 4e 6f 22 2c 20 2d 31 29 29  es" : "No", -1))
39d0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
39e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
39f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
3a00: 75 72 70 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  urpPtr, Tcl_NewS
3a10: 74 72 69 6e 67 4f 62 6a 28 58 35 30 39 5f 50 55  tringObj(X509_PU
3a20: 52 50 4f 53 45 5f 67 65 74 30 5f 6e 61 6d 65 28  RPOSE_get0_name(
3a30: 70 74 6d 70 29 2c 20 2d 31 29 29 3b 0a 09 20 20  ptmp), -1));..  
3a40: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3a50: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3a60: 70 2c 20 70 75 72 70 50 74 72 2c 20 74 6d 70 50  p, purpPtr, tmpP
3a70: 74 72 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73  tr);..}..Tcl_Lis
3a80: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3a90: 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74  t(interp, certPt
3aa0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
3ab0: 4f 62 6a 28 22 63 65 72 74 69 66 69 63 61 74 65  Obj("certificate
3ac0: 50 75 72 70 6f 73 65 22 2c 20 2d 31 29 29 3b 0a  Purpose", -1));.
3ad0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
3ae0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3af0: 2c 20 63 65 72 74 50 74 72 2c 20 70 75 72 70 50  , certPtr, purpP
3b00: 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  tr);.    }..    
3b10: 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65 20 50  /* Certificate P
3b20: 6f 6c 69 63 69 65 73 20 2d 20 69 6e 64 69 63 61  olicies - indica
3b30: 74 65 73 20 74 68 65 20 69 73 73 75 69 6e 67 20  tes the issuing 
3b40: 43 41 20 63 6f 6e 73 69 64 65 72 73 20 69 74 73  CA considers its
3b50: 20 69 73 73 75 65 72 44 6f 6d 61 69 6e 50 6f 6c   issuerDomainPol
3b60: 69 63 79 0a 09 65 71 75 69 76 61 6c 65 6e 74 20  icy..equivalent 
3b70: 74 6f 20 74 68 65 20 73 75 62 6a 65 63 74 20 43  to the subject C
3b80: 41 27 73 20 73 75 62 6a 65 63 74 44 6f 6d 61 69  A's subjectDomai
3b90: 6e 50 6f 6c 69 63 79 2e 20 52 46 43 20 35 32 38  nPolicy. RFC 528
3ba0: 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e  0 section 4.2.1.
3bb0: 34 2c 20 4e 49 44 5f 63 65 72 74 69 66 69 63 61  4, NID_certifica
3bc0: 74 65 5f 70 6f 6c 69 63 69 65 73 20 2a 2f 0a 20  te_policies */. 
3bd0: 20 20 20 69 66 20 28 78 66 6c 61 67 73 20 26 20     if (xflags & 
3be0: 45 58 46 4c 41 47 5f 49 4e 56 41 4c 49 44 5f 50  EXFLAG_INVALID_P
3bf0: 4f 4c 49 43 59 29 20 7b 0a 09 2f 2a 20 52 65 6a  OLICY) {../* Rej
3c00: 65 63 74 20 63 65 72 74 20 2a 2f 0a 20 20 20 20  ect cert */.    
3c10: 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 6c 69 63 79  }..    /* Policy
3c20: 20 4d 61 70 70 69 6e 67 73 20 2d 20 52 46 43 20   Mappings - RFC 
3c30: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32  5280 section 4.2
3c40: 2e 31 2e 35 2c 20 4e 49 44 5f 70 6f 6c 69 63 79  .1.5, NID_policy
3c50: 5f 6d 61 70 70 69 6e 67 73 20 2a 2f 0a 0a 20 20  _mappings */..  
3c60: 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 41 6c 74    /* Subject Alt
3c70: 65 72 6e 61 74 69 76 65 20 4e 61 6d 65 20 28 53  ernative Name (S
3c80: 41 4e 29 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  AN) contains add
3c90: 69 74 69 6f 6e 61 6c 20 55 52 4c 73 2c 20 44 4e  itional URLs, DN
3ca0: 53 20 6e 61 6d 65 2c 20 6f 72 20 49 50 0a 09 61  S name, or IP..a
3cb0: 64 64 72 65 73 73 65 73 20 62 6f 75 6e 64 20 74  ddresses bound t
3cc0: 6f 20 63 65 72 74 69 66 69 63 61 74 65 2e 20 52  o certificate. R
3cd0: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20  FC 5280 section 
3ce0: 34 2e 32 2e 31 2e 36 2c 20 4e 49 44 5f 73 75 62  4.2.1.6, NID_sub
3cf0: 6a 65 63 74 5f 61 6c 74 5f 6e 61 6d 65 20 2a 2f  ject_alt_name */
3d00: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3d10: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3d20: 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54  terp, certPtr, T
3d30: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3d40: 22 73 75 62 6a 65 63 74 41 6c 74 4e 61 6d 65 22  "subjectAltName"
3d50: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 73 61 6e 20  , -1));.    san 
3d60: 3d 20 58 35 30 39 5f 67 65 74 5f 65 78 74 5f 64  = X509_get_ext_d
3d70: 32 69 28 63 65 72 74 2c 20 4e 49 44 5f 73 75 62  2i(cert, NID_sub
3d80: 6a 65 63 74 5f 61 6c 74 5f 6e 61 6d 65 2c 20 4e  ject_alt_name, N
3d90: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  ULL, NULL);.    
3da0: 69 66 20 28 73 61 6e 29 20 7b 0a 09 54 63 6c 5f  if (san) {..Tcl_
3db0: 4f 62 6a 20 2a 6e 61 6d 65 73 50 74 72 20 3d 20  Obj *namesPtr = 
3dc0: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
3dd0: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 66 6f 72 20 28  , NULL);...for (
3de0: 69 6e 74 20 69 3d 30 3b 20 69 20 3c 20 73 6b 5f  int i=0; i < sk_
3df0: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 6e 75 6d  GENERAL_NAME_num
3e00: 28 73 61 6e 29 3b 20 69 2b 2b 29 20 7b 0a 09 20  (san); i++) {.. 
3e10: 20 20 20 63 6f 6e 73 74 20 47 45 4e 45 52 41 4c     const GENERAL
3e20: 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b  _NAME *name = sk
3e30: 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 76 61  _GENERAL_NAME_va
3e40: 6c 75 65 28 73 61 6e 2c 20 69 29 3b 0a 0a 09 20  lue(san, i);... 
3e50: 20 20 20 69 66 20 28 6e 61 6d 65 20 26 26 20 62     if (name && b
3e60: 69 6f 29 20 7b 0a 09 09 69 66 20 28 47 45 4e 45  io) {...if (GENE
3e70: 52 41 4c 5f 4e 41 4d 45 5f 70 72 69 6e 74 28 62  RAL_NAME_print(b
3e80: 69 6f 2c 20 6e 61 6d 65 29 29 20 7b 0a 09 09 20  io, name)) {... 
3e90: 20 20 20 69 6e 74 20 6e 20 3d 20 42 49 4f 5f 72     int n = BIO_r
3ea0: 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c  ead(bio, buffer,
3eb0: 20 6d 69 6e 28 42 49 4f 5f 70 65 6e 64 69 6e 67   min(BIO_pending
3ec0: 28 62 69 6f 29 2c 20 42 55 46 53 49 5a 29 29 3b  (bio), BUFSIZ));
3ed0: 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 6d 61  ...    buffer[ma
3ee0: 78 28 6e 2c 20 30 29 5d 20 3d 20 30 3b 0a 09 09  x(n, 0)] = 0;...
3ef0: 20 20 20 20 28 76 6f 69 64 29 42 49 4f 5f 66 6c      (void)BIO_fl
3f00: 75 73 68 28 62 69 6f 29 3b 0a 09 09 20 20 20 20  ush(bio);...    
3f10: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3f20: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3f30: 20 6e 61 6d 65 73 50 74 72 2c 20 54 63 6c 5f 4e   namesPtr, Tcl_N
3f40: 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66  ewStringObj(buff
3f50: 65 72 2c 20 6e 29 29 3b 0a 09 09 7d 0a 09 20 20  er, n));...}..  
3f60: 20 20 7d 0a 09 7d 0a 09 73 6b 5f 47 45 4e 45 52    }..}..sk_GENER
3f70: 41 4c 5f 4e 41 4d 45 5f 70 6f 70 5f 66 72 65 65  AL_NAME_pop_free
3f80: 28 73 61 6e 2c 20 47 45 4e 45 52 41 4c 5f 4e 41  (san, GENERAL_NA
3f90: 4d 45 5f 66 72 65 65 29 3b 0a 09 54 63 6c 5f 4c  ME_free);..Tcl_L
3fa0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3fb0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74  ent(interp, cert
3fc0: 50 74 72 2c 20 6e 61 6d 65 73 50 74 72 29 3b 0a  Ptr, namesPtr);.
3fd0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63      } else {..Tc
3fe0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3ff0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
4000: 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  ertPtr, Tcl_NewS
4010: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29  tringObj("", -1)
4020: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
4030: 20 49 73 73 75 65 72 20 41 6c 74 65 72 6e 61 74   Issuer Alternat
4040: 69 76 65 20 4e 61 6d 65 20 28 69 73 73 75 65 72  ive Name (issuer
4050: 41 6c 74 4e 61 6d 65 29 20 69 73 20 75 73 65 64  AltName) is used
4060: 20 74 6f 20 61 73 73 6f 63 69 61 74 65 20 49 6e   to associate In
4070: 74 65 72 6e 65 74 0a 09 73 74 79 6c 65 20 69 64  ternet..style id
4080: 65 6e 74 69 74 69 65 73 20 77 69 74 68 20 74 68  entities with th
4090: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73  e certificate is
40a0: 73 75 65 72 2e 20 52 46 43 20 35 32 38 30 20 73  suer. RFC 5280 s
40b0: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 37 2c 20  ection 4.2.1.7, 
40c0: 4e 49 44 5f 69 73 73 75 65 72 5f 61 6c 74 5f 6e  NID_issuer_alt_n
40d0: 61 6d 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c  ame */.    Tcl_L
40e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
40f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74  ent(interp, cert
4100: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
4110: 6e 67 4f 62 6a 28 22 69 73 73 75 65 72 41 6c 74  ngObj("issuerAlt
4120: 4e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20  Name", -1));.   
4130: 20 73 61 6e 20 3d 20 58 35 30 39 5f 67 65 74 5f   san = X509_get_
4140: 65 78 74 5f 64 32 69 28 63 65 72 74 2c 20 4e 49  ext_d2i(cert, NI
4150: 44 5f 69 73 73 75 65 72 5f 61 6c 74 5f 6e 61 6d  D_issuer_alt_nam
4160: 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  e, NULL, NULL);.
4170: 20 20 20 20 69 66 20 28 73 61 6e 29 20 7b 0a 09      if (san) {..
4180: 54 63 6c 5f 4f 62 6a 20 2a 6e 61 6d 65 73 50 74  Tcl_Obj *namesPt
4190: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
41a0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 66  bj(0, NULL);...f
41b0: 6f 72 20 28 69 6e 74 20 69 3d 30 3b 20 69 20 3c  or (int i=0; i <
41c0: 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45   sk_GENERAL_NAME
41d0: 5f 6e 75 6d 28 73 61 6e 29 3b 20 69 2b 2b 29 20  _num(san); i++) 
41e0: 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20 47 45 4e  {..    const GEN
41f0: 45 52 41 4c 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20  ERAL_NAME *name 
4200: 3d 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d  = sk_GENERAL_NAM
4210: 45 5f 76 61 6c 75 65 28 73 61 6e 2c 20 69 29 3b  E_value(san, i);
4220: 0a 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 20  ...    if (name 
4230: 26 26 20 62 69 6f 29 20 7b 0a 09 09 69 66 20 28  && bio) {...if (
4240: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70 72 69  GENERAL_NAME_pri
4250: 6e 74 28 62 69 6f 2c 20 6e 61 6d 65 29 29 20 7b  nt(bio, name)) {
4260: 0a 09 09 20 20 20 20 69 6e 74 20 6e 20 3d 20 42  ...    int n = B
4270: 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 62 75 66  IO_read(bio, buf
4280: 66 65 72 2c 20 6d 69 6e 28 42 49 4f 5f 70 65 6e  fer, min(BIO_pen
4290: 64 69 6e 67 28 62 69 6f 29 2c 20 42 55 46 53 49  ding(bio), BUFSI
42a0: 5a 29 29 3b 0a 09 09 20 20 20 20 62 75 66 66 65  Z));...    buffe
42b0: 72 5b 6d 61 78 28 6e 2c 20 30 29 5d 20 3d 20 30  r[max(n, 0)] = 0
42c0: 3b 0a 09 09 20 20 20 20 28 76 6f 69 64 29 42 49  ;...    (void)BI
42d0: 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09 09  O_flush(bio);...
42e0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
42f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4300: 65 72 70 2c 20 6e 61 6d 65 73 50 74 72 2c 20 54  erp, namesPtr, T
4310: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4320: 62 75 66 66 65 72 2c 20 6e 29 29 3b 0a 09 09 7d  buffer, n));...}
4330: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 73 6b 5f 47  ..    }..}..sk_G
4340: 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70 6f 70 5f  ENERAL_NAME_pop_
4350: 66 72 65 65 28 73 61 6e 2c 20 47 45 4e 45 52 41  free(san, GENERA
4360: 4c 5f 4e 41 4d 45 5f 66 72 65 65 29 3b 0a 09 54  L_NAME_free);..T
4370: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4380: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4390: 63 65 72 74 50 74 72 2c 20 6e 61 6d 65 73 50 74  certPtr, namesPt
43a0: 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  r);.    } else {
43b0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
43c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
43d0: 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f  p, certPtr, Tcl_
43e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c  NewStringObj("",
43f0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   -1));.    }..  
4400: 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 44 69 72    /* Subject Dir
4410: 65 63 74 6f 72 79 20 41 74 74 72 69 62 75 74 65  ectory Attribute
4420: 73 20 70 72 6f 76 69 64 65 73 20 69 64 65 6e 74  s provides ident
4430: 69 66 69 63 61 74 69 6f 6e 20 61 74 74 72 69 62  ification attrib
4440: 75 74 65 73 20 28 65 2e 67 2e 2c 20 6e 61 74 69  utes (e.g., nati
4450: 6f 6e 61 6c 69 74 79 29 0a 09 6f 66 20 74 68 65  onality)..of the
4460: 20 73 75 62 6a 65 63 74 2e 20 52 46 43 20 35 32   subject. RFC 52
4470: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31  80 section 4.2.1
4480: 2e 38 20 28 73 75 62 6a 65 63 74 44 69 72 65 63  .8 (subjectDirec
4490: 74 6f 72 79 41 74 74 72 69 62 75 74 65 73 29 20  toryAttributes) 
44a0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 42 61 73 69 63  */..    /* Basic
44b0: 20 43 6f 6e 73 74 72 61 69 6e 74 73 20 69 64 65   Constraints ide
44c0: 6e 74 69 66 69 65 73 20 77 68 65 74 68 65 72 20  ntifies whether 
44d0: 74 68 65 20 73 75 62 6a 65 63 74 20 6f 66 20 74  the subject of t
44e0: 68 65 20 63 65 72 74 20 69 73 20 61 20 43 41 20  he cert is a CA 
44f0: 61 6e 64 0a 09 74 68 65 20 6d 61 78 20 64 65 70  and..the max dep
4500: 74 68 20 6f 66 20 76 61 6c 69 64 20 63 65 72 74  th of valid cert
4510: 20 70 61 74 68 73 20 74 68 61 74 20 69 6e 63 6c   paths that incl
4520: 75 64 65 20 74 68 69 73 20 63 65 72 74 2e 0a 09  ude this cert...
4530: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e  RFC 5280 section
4540: 20 34 2e 32 2e 31 2e 39 20 28 62 61 73 69 63 43   4.2.1.9 (basicC
4550: 6f 6e 73 74 72 61 69 6e 74 73 2c 20 4e 49 44 5f  onstraints, NID_
4560: 62 61 73 69 63 5f 63 6f 6e 73 74 72 61 69 6e 74  basic_constraint
4570: 73 29 20 2a 2f 0a 20 20 20 20 69 66 20 28 78 66  s) */.    if (xf
4580: 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 42 43  lags & EXFLAG_BC
4590: 4f 4e 53 20 7c 7c 20 78 66 6c 61 67 73 20 26 20  ONS || xflags & 
45a0: 45 58 46 4c 41 47 5f 43 41 29 20 7b 0a 20 20 20  EXFLAG_CA) {.   
45b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 20   }..    /* Name 
45c0: 43 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20 6f  Constraints is o
45d0: 6e 6c 79 20 75 73 65 64 20 69 6e 20 43 41 20 63  nly used in CA c
45e0: 65 72 74 73 20 74 6f 20 69 6e 64 69 63 61 74 65  erts to indicate
45f0: 20 61 20 6e 61 6d 65 20 73 70 61 63 65 20 77 69   a name space wi
4600: 74 68 69 6e 0a 09 77 68 69 63 68 20 61 6c 6c 20  thin..which all 
4610: 73 75 62 6a 65 63 74 20 6e 61 6d 65 73 20 69 6e  subject names in
4620: 20 73 75 62 73 65 71 75 65 6e 74 20 63 65 72 74   subsequent cert
4630: 69 66 69 63 61 74 65 73 20 69 6e 20 61 20 63 65  ificates in a ce
4640: 72 74 69 66 69 63 61 74 69 6f 6e 20 70 61 74 68  rtification path
4650: 0a 09 4d 55 53 54 20 62 65 20 6c 6f 63 61 74 65  ..MUST be locate
4660: 64 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74  d. RFC 5280 sect
4670: 69 6f 6e 20 34 2e 32 2e 31 2e 31 30 2c 20 4e 49  ion 4.2.1.10, NI
4680: 44 5f 6e 61 6d 65 5f 63 6f 6e 73 74 72 61 69 6e  D_name_constrain
4690: 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 50 6f  ts */..    /* Po
46a0: 6c 69 63 79 20 43 6f 6e 73 74 72 61 69 6e 74 73  licy Constraints
46b0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e   is only used in
46c0: 20 43 41 20 63 65 72 74 73 20 74 6f 20 6c 69 6d   CA certs to lim
46d0: 69 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  it the length of
46e0: 20 61 0a 09 63 65 72 74 20 63 68 61 69 6e 20 74   a..cert chain t
46f0: 68 61 74 20 6d 61 79 20 62 65 20 69 73 73 75 65  hat may be issue
4700: 64 20 66 72 6f 6d 20 74 68 61 74 20 43 41 2e 20  d from that CA. 
4710: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e  RFC 5280 section
4720: 20 34 2e 32 2e 31 2e 31 31 2c 20 4e 49 44 5f 70   4.2.1.11, NID_p
4730: 6f 6c 69 63 79 5f 63 6f 6e 73 74 72 61 69 6e 74  olicy_constraint
4740: 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 78 74  s */..    /* Ext
4750: 65 6e 64 65 64 20 4b 65 79 20 55 73 61 67 65 20  ended Key Usage 
4760: 69 6e 64 69 63 61 74 65 73 20 6f 6e 65 20 6f 72  indicates one or
4770: 20 6d 6f 72 65 20 70 75 72 70 6f 73 65 73 20 66   more purposes f
4780: 6f 72 20 77 68 69 63 68 20 74 68 65 20 63 65 72  or which the cer
4790: 74 69 66 69 65 64 0a 09 70 75 62 6c 69 63 20 6b  tified..public k
47a0: 65 79 20 6d 61 79 20 62 65 20 75 73 65 64 2c 20  ey may be used, 
47b0: 69 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 6f  in addition to o
47c0: 72 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  r in place of th
47d0: 65 20 62 61 73 69 63 20 70 75 72 70 6f 73 65 73  e basic purposes
47e0: 2e 0a 09 52 46 43 20 35 32 38 30 20 73 65 63 74  ...RFC 5280 sect
47f0: 69 6f 6e 20 34 2e 32 2e 31 2e 31 32 2c 20 4e 49  ion 4.2.1.12, NI
4800: 44 5f 65 78 74 5f 6b 65 79 5f 75 73 61 67 65 20  D_ext_key_usage 
4810: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  */.    Tcl_ListO
4820: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4830: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c  interp, certPtr,
4840: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4850: 6a 28 22 65 78 74 65 6e 64 65 64 4b 65 79 55 73  j("extendedKeyUs
4860: 61 67 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  age", -1));.    
4870: 69 66 20 28 78 66 6c 61 67 73 20 26 20 45 58 46  if (xflags & EXF
4880: 4c 41 47 5f 58 4b 55 53 41 47 45 29 20 7b 0a 20  LAG_XKUSAGE) {. 
4890: 20 20 20 75 73 61 67 65 20 3d 20 58 35 30 39 5f     usage = X509_
48a0: 67 65 74 5f 65 78 74 65 6e 64 65 64 5f 6b 65 79  get_extended_key
48b0: 5f 75 73 61 67 65 28 63 65 72 74 29 3b 0a 09 54  _usage(cert);..T
48c0: 63 6c 5f 4f 62 6a 20 2a 74 6d 70 50 74 72 20 3d  cl_Obj *tmpPtr =
48d0: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
48e0: 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 75  0, NULL);..if (u
48f0: 73 61 67 65 20 26 20 58 4b 55 5f 53 53 4c 5f 53  sage & XKU_SSL_S
4900: 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 54 63  ERVER) {..    Tc
4910: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4920: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 74  lement(interp, t
4930: 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mpPtr, Tcl_NewSt
4940: 72 69 6e 67 4f 62 6a 28 22 54 4c 53 20 57 65 62  ringObj("TLS Web
4950: 20 53 65 72 76 65 72 20 41 75 74 68 65 6e 74 69   Server Authenti
4960: 63 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09  cation", -1));..
4970: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58  }..if (usage & X
4980: 4b 55 5f 53 53 4c 5f 43 4c 49 45 4e 54 29 20 7b  KU_SSL_CLIENT) {
4990: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
49a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
49b0: 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 2c 20 54  nterp, tmpPtr, T
49c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
49d0: 22 54 4c 53 20 57 65 62 20 43 6c 69 65 6e 74 20  "TLS Web Client 
49e0: 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 22 2c  Authentication",
49f0: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75   -1));..}..if (u
4a00: 73 61 67 65 20 26 20 58 4b 55 5f 53 4d 49 4d 45  sage & XKU_SMIME
4a10: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
4a20: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4a30: 74 28 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 72  t(interp, tmpPtr
4a40: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
4a50: 62 6a 28 22 45 2d 6d 61 69 6c 20 50 72 6f 74 65  bj("E-mail Prote
4a60: 63 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d  ction", -1));..}
4a70: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b  ..if (usage & XK
4a80: 55 5f 43 4f 44 45 5f 53 49 47 4e 29 20 7b 0a 09  U_CODE_SIGN) {..
4a90: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4aa0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4ab0: 65 72 70 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c  erp, tmpPtr, Tcl
4ac0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 43  _NewStringObj("C
4ad0: 6f 64 65 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31  ode Signing", -1
4ae0: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67  ));..}..if (usag
4af0: 65 20 26 20 58 4b 55 5f 53 47 43 29 20 7b 0a 09  e & XKU_SGC) {..
4b00: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4b10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4b20: 65 72 70 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c  erp, tmpPtr, Tcl
4b30: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 53  _NewStringObj("S
4b40: 47 43 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  GC", -1));..}..i
4b50: 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f 4f  f (usage & XKU_O
4b60: 43 53 50 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20  CSP_SIGN) {..   
4b70: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4b80: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4b90: 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65  , tmpPtr, Tcl_Ne
4ba0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 4f 43 53 50  wStringObj("OCSP
4bb0: 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 3b   Signing", -1));
4bc0: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26  ..}..if (usage &
4bd0: 20 58 4b 55 5f 54 49 4d 45 53 54 41 4d 50 29 20   XKU_TIMESTAMP) 
4be0: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
4bf0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4c00: 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 2c 20  interp, tmpPtr, 
4c10: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4c20: 28 22 54 69 6d 65 20 53 74 61 6d 70 69 6e 67 22  ("Time Stamping"
4c30: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
4c40: 75 73 61 67 65 20 26 20 58 4b 55 5f 44 56 43 53  usage & XKU_DVCS
4c50: 20 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69   ) {..    Tcl_Li
4c60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4c70: 6e 74 28 69 6e 74 65 72 70 2c 20 74 6d 70 50 74  nt(interp, tmpPt
4c80: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
4c90: 4f 62 6a 28 22 44 56 43 53 22 2c 20 2d 31 29 29  Obj("DVCS", -1))
4ca0: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20  ;..}..if (usage 
4cb0: 26 20 58 4b 55 5f 41 4e 59 45 4b 55 29 20 7b 0a  & XKU_ANYEKU) {.
4cc0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4cd0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4ce0: 74 65 72 70 2c 20 74 6d 70 50 74 72 2c 20 54 63  terp, tmpPtr, Tc
4cf0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
4d00: 41 6e 79 20 45 78 74 65 6e 64 65 64 20 4b 65 79  Any Extended Key
4d10: 20 55 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 09   Usage", -1));..
4d20: 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  }..Tcl_ListObjAp
4d30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4d40: 72 70 2c 20 63 65 72 74 50 74 72 2c 20 74 6d 70  rp, certPtr, tmp
4d50: 50 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  Ptr);.    } else
4d60: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
4d70: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4d80: 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63  erp, certPtr, Tc
4d90: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
4da0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a  ", -1));.    }..
4db0: 20 20 20 20 2f 2a 20 43 52 4c 20 44 69 73 74 72      /* CRL Distr
4dc0: 69 62 75 74 69 6f 6e 20 50 6f 69 6e 74 73 20 65  ibution Points e
4dd0: 78 74 65 6e 73 69 6f 6e 20 69 64 65 6e 74 69 66  xtension identif
4de0: 69 65 73 20 68 6f 77 20 43 52 4c 20 69 6e 66 6f  ies how CRL info
4df0: 72 6d 61 74 69 6f 6e 20 69 73 0a 09 6f 62 74 61  rmation is..obta
4e00: 69 6e 65 64 2e 20 52 46 43 20 35 32 38 30 20 73  ined. RFC 5280 s
4e10: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 33 2a  ection 4.2.1.13*
4e20: 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  /.    Tcl_ListOb
4e30: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4e40: 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20  nterp, certPtr, 
4e50: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4e60: 28 22 63 72 6c 44 69 73 74 72 69 62 75 74 69 6f  ("crlDistributio
4e70: 6e 50 6f 69 6e 74 73 22 2c 20 2d 31 29 29 3b 0a  nPoints", -1));.
4e80: 20 20 20 20 63 72 6c 20 3d 20 58 35 30 39 5f 67      crl = X509_g
4e90: 65 74 5f 65 78 74 5f 64 32 69 28 63 65 72 74 2c  et_ext_d2i(cert,
4ea0: 20 4e 49 44 5f 63 72 6c 5f 64 69 73 74 72 69 62   NID_crl_distrib
4eb0: 75 74 69 6f 6e 5f 70 6f 69 6e 74 73 2c 20 4e 55  ution_points, NU
4ec0: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  LL, NULL);.    i
4ed0: 66 20 28 63 72 6c 29 20 7b 0a 09 54 63 6c 5f 4f  f (crl) {..Tcl_O
4ee0: 62 6a 20 2a 6e 61 6d 65 73 50 74 72 20 3d 20 54  bj *namesPtr = T
4ef0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
4f00: 20 4e 55 4c 4c 29 3b 0a 0a 09 66 6f 72 20 28 69   NULL);...for (i
4f10: 6e 74 20 69 3d 30 3b 20 69 20 3c 20 73 6b 5f 44  nt i=0; i < sk_D
4f20: 49 53 54 5f 50 4f 49 4e 54 5f 6e 75 6d 28 63 72  IST_POINT_num(cr
4f30: 6c 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  l); i++) {..    
4f40: 44 49 53 54 5f 50 4f 49 4e 54 20 2a 64 70 20 3d  DIST_POINT *dp =
4f50: 20 73 6b 5f 44 49 53 54 5f 50 4f 49 4e 54 5f 76   sk_DIST_POINT_v
4f60: 61 6c 75 65 28 63 72 6c 2c 20 69 29 3b 0a 09 20  alue(crl, i);.. 
4f70: 20 20 20 44 49 53 54 5f 50 4f 49 4e 54 5f 4e 41     DIST_POINT_NA
4f80: 4d 45 20 2a 64 69 73 74 70 6f 69 6e 74 20 3d 20  ME *distpoint = 
4f90: 64 70 2d 3e 64 69 73 74 70 6f 69 6e 74 3b 0a 0a  dp->distpoint;..
4fa0: 09 20 20 20 20 69 66 20 28 64 69 73 74 70 6f 69  .    if (distpoi
4fb0: 6e 74 2d 3e 74 79 70 65 20 3d 3d 20 30 29 20 7b  nt->type == 0) {
4fc0: 0a 09 09 2f 2a 20 66 75 6c 6c 6e 61 6d 65 20 47  .../* fullname G
4fd0: 45 4e 45 52 41 4c 49 5a 45 44 4e 41 4d 45 20 2a  ENERALIZEDNAME *
4fe0: 2f 0a 09 09 66 6f 72 20 28 69 6e 74 20 6a 20 3d  /...for (int j =
4ff0: 20 30 3b 20 6a 20 3c 20 73 6b 5f 47 45 4e 45 52   0; j < sk_GENER
5000: 41 4c 5f 4e 41 4d 45 5f 6e 75 6d 28 64 69 73 74  AL_NAME_num(dist
5010: 70 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c  point->name.full
5020: 6e 61 6d 65 29 3b 20 6a 2b 2b 29 20 7b 0a 09 09  name); j++) {...
5030: 20 20 20 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45      GENERAL_NAME
5040: 20 2a 67 65 6e 20 3d 20 73 6b 5f 47 45 4e 45 52   *gen = sk_GENER
5050: 41 4c 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 64 69  AL_NAME_value(di
5060: 73 74 70 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 66 75  stpoint->name.fu
5070: 6c 6c 6e 61 6d 65 2c 20 6a 29 3b 0a 09 09 20 20  llname, j);...  
5080: 20 20 69 6e 74 20 74 79 70 65 3b 0a 09 09 20 20    int type;...  
5090: 20 20 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 75    ASN1_STRING *u
50a0: 72 69 20 3d 20 47 45 4e 45 52 41 4c 5f 4e 41 4d  ri = GENERAL_NAM
50b0: 45 5f 67 65 74 30 5f 76 61 6c 75 65 28 67 65 6e  E_get0_value(gen
50c0: 2c 20 26 74 79 70 65 29 3b 0a 09 09 20 20 20 20  , &type);...    
50d0: 69 66 20 28 74 79 70 65 20 3d 3d 20 47 45 4e 5f  if (type == GEN_
50e0: 55 52 49 29 20 7b 0a 09 09 09 54 63 6c 5f 4c 69  URI) {....Tcl_Li
50f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5100: 6e 74 28 69 6e 74 65 72 70 2c 20 6e 61 6d 65 73  nt(interp, names
5110: 50 74 72 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f  Ptr,....    Tcl_
5120: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
5130: 61 72 2a 29 41 53 4e 31 5f 53 54 52 49 4e 47 5f  ar*)ASN1_STRING_
5140: 67 65 74 30 5f 64 61 74 61 28 75 72 69 29 2c 20  get0_data(uri), 
5150: 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67  ASN1_STRING_leng
5160: 74 68 28 75 72 69 29 29 29 3b 0a 09 09 20 20 20  th(uri)));...   
5170: 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c   }...}..    } el
5180: 73 65 20 69 66 20 28 64 69 73 74 70 6f 69 6e 74  se if (distpoint
5190: 2d 3e 74 79 70 65 20 3d 3d 20 31 29 20 7b 0a 09  ->type == 1) {..
51a0: 09 2f 2a 20 72 65 6c 61 74 69 76 65 6e 61 6d 65  ./* relativename
51b0: 20 58 35 30 39 4e 41 4d 45 20 2a 2f 0a 09 09 53   X509NAME */...S
51c0: 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d  TACK_OF(X509_NAM
51d0: 45 5f 45 4e 54 52 59 29 20 2a 73 6b 5f 72 65 6c  E_ENTRY) *sk_rel
51e0: 6e 61 6d 65 20 3d 20 64 69 73 74 70 6f 69 6e 74  name = distpoint
51f0: 2d 3e 6e 61 6d 65 2e 72 65 6c 61 74 69 76 65 6e  ->name.relativen
5200: 61 6d 65 3b 0a 09 09 66 6f 72 20 28 69 6e 74 20  ame;...for (int 
5210: 6a 20 3d 20 30 3b 20 6a 20 3c 20 73 6b 5f 58 35  j = 0; j < sk_X5
5220: 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 5f 6e 75  09_NAME_ENTRY_nu
5230: 6d 28 73 6b 5f 72 65 6c 6e 61 6d 65 29 3b 20 6a  m(sk_relname); j
5240: 2b 2b 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39  ++) {...    X509
5250: 5f 4e 41 4d 45 5f 45 4e 54 52 59 20 2a 65 20 3d  _NAME_ENTRY *e =
5260: 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 45 4e   sk_X509_NAME_EN
5270: 54 52 59 5f 76 61 6c 75 65 28 73 6b 5f 72 65 6c  TRY_value(sk_rel
5280: 6e 61 6d 65 2c 20 6a 29 3b 0a 09 09 20 20 20 20  name, j);...    
5290: 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 64 20 3d  ASN1_STRING *d =
52a0: 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59   X509_NAME_ENTRY
52b0: 5f 67 65 74 5f 64 61 74 61 28 65 29 3b 0a 09 09  _get_data(e);...
52c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
52d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
52e0: 65 72 70 2c 20 6e 61 6d 65 73 50 74 72 2c 20 54  erp, namesPtr, T
52f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5300: 28 63 68 61 72 2a 29 41 53 4e 31 5f 53 54 52 49  (char*)ASN1_STRI
5310: 4e 47 5f 64 61 74 61 28 64 29 2c 20 41 53 4e 31  NG_data(d), ASN1
5320: 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 64  _STRING_length(d
5330: 29 29 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a  )));...}..    }.
5340: 09 7d 0a 09 43 52 4c 5f 44 49 53 54 5f 50 4f 49  .}..CRL_DIST_POI
5350: 4e 54 53 5f 66 72 65 65 28 63 72 6c 29 3b 0a 09  NTS_free(crl);..
5360: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5370: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
5380: 20 63 65 72 74 50 74 72 2c 20 6e 61 6d 65 73 50   certPtr, namesP
5390: 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  tr);.    } else 
53a0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
53b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
53c0: 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c  rp, certPtr, Tcl
53d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22  _NewStringObj(""
53e0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  , -1));.    }.. 
53f0: 20 20 20 2f 2a 20 46 72 65 73 68 65 73 74 20 43     /* Freshest C
5400: 52 4c 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a  RL extension */.
5410: 20 20 20 20 69 66 20 28 78 66 6c 61 67 73 20 26      if (xflags &
5420: 20 45 58 46 4c 41 47 5f 46 52 45 53 48 45 53 54   EXFLAG_FRESHEST
5430: 29 20 7b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ) {.    }..    /
5440: 2a 20 41 75 74 68 6f 72 69 74 79 20 49 6e 66 6f  * Authority Info
5450: 72 6d 61 74 69 6f 6e 20 41 63 63 65 73 73 20 69  rmation Access i
5460: 6e 64 69 63 61 74 65 73 20 68 6f 77 20 74 6f 20  ndicates how to 
5470: 61 63 63 65 73 73 20 69 6e 66 6f 20 61 6e 64 20  access info and 
5480: 73 65 72 76 69 63 65 73 0a 09 66 6f 72 20 74 68  services..for th
5490: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73  e certificate is
54a0: 73 75 65 72 2e 20 54 48 69 73 20 69 6e 63 6c 75  suer. THis inclu
54b0: 64 65 73 20 6f 6e 2d 6c 69 6e 65 20 76 61 6c 69  des on-line vali
54c0: 64 61 74 69 6f 6e 20 73 65 72 76 69 63 65 73 0a  dation services.
54d0: 09 61 6e 64 20 43 41 20 70 6f 6c 69 63 79 20 64  .and CA policy d
54e0: 61 74 61 2e 20 52 46 43 20 35 32 38 30 20 73 65  ata. RFC 5280 se
54f0: 63 74 69 6f 6e 20 34 2e 32 2e 32 2e 31 2c 20 4e  ction 4.2.2.1, N
5500: 49 44 5f 69 6e 66 6f 5f 61 63 63 65 73 73 20 2a  ID_info_access *
5510: 2f 0a 20 20 20 20 2f 2a 20 47 65 74 20 4f 6e 2d  /.    /* Get On-
5520: 6c 69 6e 65 20 43 65 72 74 69 66 69 63 61 74 65  line Certificate
5530: 20 53 74 61 74 75 73 20 50 72 6f 74 6f 63 6f 6c   Status Protocol
5540: 20 28 4f 53 43 50 29 20 55 52 4c 20 2a 2f 0a 20   (OSCP) URL */. 
5550: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
5560: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5570: 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c  rp, certPtr, Tcl
5580: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6f  _NewStringObj("o
5590: 63 73 70 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  csp", -1));.    
55a0: 6f 63 73 70 20 3d 20 58 35 30 39 5f 67 65 74 31  ocsp = X509_get1
55b0: 5f 6f 63 73 70 28 63 65 72 74 29 3b 0a 20 20 20  _ocsp(cert);.   
55c0: 20 69 66 20 28 6f 63 73 70 29 20 7b 0a 09 54 63   if (ocsp) {..Tc
55d0: 6c 5f 4f 62 6a 20 2a 75 72 6c 73 50 74 72 20 3d  l_Obj *urlsPtr =
55e0: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
55f0: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 66 6f 72 20  0, NULL);...for 
5600: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (int i = 0; i < 
5610: 73 6b 5f 4f 50 45 4e 53 53 4c 5f 53 54 52 49 4e  sk_OPENSSL_STRIN
5620: 47 5f 6e 75 6d 28 6f 63 73 70 29 3b 20 69 2b 2b  G_num(ocsp); i++
5630: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
5640: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5650: 74 28 69 6e 74 65 72 70 2c 20 75 72 6c 73 50 74  t(interp, urlsPt
5660: 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72 69  r,...Tcl_NewStri
5670: 6e 67 4f 62 6a 28 73 6b 5f 4f 50 45 4e 53 53 4c  ngObj(sk_OPENSSL
5680: 5f 53 54 52 49 4e 47 5f 76 61 6c 75 65 28 6f 63  _STRING_value(oc
5690: 73 70 2c 20 69 29 2c 20 2d 31 29 29 3b 0a 09 7d  sp, i), -1));..}
56a0: 0a 0a 09 58 35 30 39 5f 65 6d 61 69 6c 5f 66 72  ...X509_email_fr
56b0: 65 65 28 6f 63 73 70 29 3b 0a 09 2f 2a 20 73 6b  ee(ocsp);../* sk
56c0: 5f 4f 50 45 4e 53 53 4c 5f 53 54 52 49 4e 47 5f  _OPENSSL_STRING_
56d0: 66 72 65 65 28 6f 63 73 70 29 3b 20 2a 2f 0a 09  free(ocsp); */..
56e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
56f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
5700: 20 63 65 72 74 50 74 72 2c 20 75 72 6c 73 50 74   certPtr, urlsPt
5710: 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  r);.    } else {
5720: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
5730: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5740: 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f  p, certPtr, Tcl_
5750: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c  NewStringObj("",
5760: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   -1));.    }..  
5770: 20 20 2f 2a 20 43 41 20 49 73 73 75 65 72 73 20    /* CA Issuers 
5780: 55 52 4c 20 63 61 49 73 73 75 65 72 73 20 2a 2f  URL caIssuers */
5790: 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74  ..    /* Subject
57a0: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 41 63 63   Information Acc
57b0: 65 73 73 20 2d 20 52 46 43 20 35 32 38 30 20 73  ess - RFC 5280 s
57c0: 65 63 74 69 6f 6e 20 34 2e 32 2e 32 2e 32 2c 20  ection 4.2.2.2, 
57d0: 4e 49 44 5f 73 69 6e 66 6f 5f 61 63 63 65 73 73  NID_sinfo_access
57e0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74   */..    /* Cert
57f0: 69 66 69 63 61 74 65 20 41 6c 69 61 73 20 61 73  ificate Alias as
5800: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e 20 49   UTF-8 string. I
5810: 66 20 75 73 65 73 20 61 20 50 4b 43 53 23 31 32  f uses a PKCS#12
5820: 20 73 74 72 75 63 74 75 72 65 2c 20 61 6c 69 61   structure, alia
5830: 73 0a 09 77 69 6c 6c 20 72 65 66 6c 65 63 74 20  s..will reflect 
5840: 74 68 65 20 66 72 69 65 6e 64 6c 79 4e 61 6d 65  the friendlyName
5850: 20 61 74 74 72 69 62 75 74 65 20 28 52 46 43 20   attribute (RFC 
5860: 32 39 38 35 29 2e 20 2a 2f 0a 20 20 20 20 7b 0a  2985). */.    {.
5870: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
5880: 62 73 74 72 69 6e 67 3b 0a 09 6c 65 6e 20 3d 20  bstring;..len = 
5890: 30 3b 0a 09 62 73 74 72 69 6e 67 20 3d 20 58 35  0;..bstring = X5
58a0: 30 39 5f 61 6c 69 61 73 5f 67 65 74 30 28 63 65  09_alias_get0(ce
58b0: 72 74 2c 20 26 6c 65 6e 29 3b 0a 09 54 63 6c 5f  rt, &len);..Tcl_
58c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
58d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72  ment(interp, cer
58e0: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tPtr, Tcl_NewStr
58f0: 69 6e 67 4f 62 6a 28 22 61 6c 69 61 73 22 2c 20  ingObj("alias", 
5900: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
5910: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5920: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c  interp, certPtr,
5930: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5940: 6a 28 28 63 68 61 72 20 2a 29 62 73 74 72 69 6e  j((char *)bstrin
5950: 67 2c 20 6c 65 6e 29 29 3b 0a 20 20 20 20 7d 0a  g, len));.    }.
5960: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61  .    /* All data
5970: 20 2a 2f 0a 20 20 20 20 7b 0a 09 63 68 61 72 20   */.    {..char 
5980: 63 65 72 74 53 74 72 5b 43 45 52 54 5f 53 54 52  certStr[CERT_STR
5990: 5f 53 49 5a 45 5d 3b 0a 09 6c 65 6e 20 3d 20 30  _SIZE];..len = 0
59a0: 3b 0a 0a 09 2f 2a 20 47 65 74 20 63 65 72 74 69  ;.../* Get certi
59b0: 66 69 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 50  ficate */..if (P
59c0: 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30  EM_write_bio_X50
59d0: 39 28 62 69 6f 2c 20 63 65 72 74 29 29 20 7b 0a  9(bio, cert)) {.
59e0: 09 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 72  .    len = BIO_r
59f0: 65 61 64 28 62 69 6f 2c 20 63 65 72 74 53 74 72  ead(bio, certStr
5a00: 2c 20 6d 69 6e 28 42 49 4f 5f 70 65 6e 64 69 6e  , min(BIO_pendin
5a10: 67 28 62 69 6f 29 2c 20 43 45 52 54 5f 53 54 52  g(bio), CERT_STR
5a20: 5f 53 49 5a 45 29 29 3b 0a 09 20 20 20 20 28 76  _SIZE));..    (v
5a30: 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28 62 69  oid)BIO_flush(bi
5a40: 6f 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e  o);..    if (len
5a50: 20 3c 20 30 29 20 7b 6c 65 6e 20 3d 20 30 3b 7d   < 0) {len = 0;}
5a60: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
5a70: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
5a80: 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20  nterp, certPtr, 
5a90: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5aa0: 28 22 63 65 72 74 69 66 69 63 61 74 65 22 2c 20  ("certificate", 
5ab0: 2d 31 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c  -1));..    Tcl_L
5ac0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5ad0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74  ent(interp, cert
5ae0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
5af0: 6e 67 4f 62 6a 28 63 65 72 74 53 74 72 2c 20 6c  ngObj(certStr, l
5b00: 65 6e 29 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65  en));..}.../* Ge
5b10: 74 20 61 6c 6c 20 63 65 72 74 20 69 6e 66 6f 20  t all cert info 
5b20: 2a 2f 0a 09 69 66 20 28 58 35 30 39 5f 70 72 69  */..if (X509_pri
5b30: 6e 74 5f 65 78 28 62 69 6f 2c 20 63 65 72 74 2c  nt_ex(bio, cert,
5b40: 20 66 6c 61 67 73 2c 20 30 29 29 20 7b 0a 09 20   flags, 0)) {.. 
5b50: 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 72 65 61     len = BIO_rea
5b60: 64 28 62 69 6f 2c 20 63 65 72 74 53 74 72 2c 20  d(bio, certStr, 
5b70: 6d 69 6e 28 42 49 4f 5f 70 65 6e 64 69 6e 67 28  min(BIO_pending(
5b80: 62 69 6f 29 2c 20 43 45 52 54 5f 53 54 52 5f 53  bio), CERT_STR_S
5b90: 49 5a 45 29 29 3b 0a 09 20 20 20 20 28 76 6f 69  IZE));..    (voi
5ba0: 64 29 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29  d)BIO_flush(bio)
5bb0: 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3c  ;..    if (len <
5bc0: 20 30 29 20 7b 6c 65 6e 20 3d 20 30 3b 7d 0a 09   0) {len = 0;}..
5bd0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
5be0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
5bf0: 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63  erp, certPtr, Tc
5c00: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
5c10: 61 6c 6c 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20  all", -1));..   
5c20: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5c30: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5c40: 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e  , certPtr, Tcl_N
5c50: 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 65 72 74  ewStringObj(cert
5c60: 53 74 72 2c 20 6c 65 6e 29 29 3b 0a 09 7d 0a 20  Str, len));..}. 
5c70: 20 20 20 7d 0a 0a 20 20 20 20 42 49 4f 5f 66 72     }..    BIO_fr
5c80: 65 65 28 62 69 6f 29 3b 0a 20 20 20 20 72 65 74  ee(bio);.    ret
5c90: 75 72 6e 20 63 65 72 74 50 74 72 3b 0a 7d 0a     urn certPtr;.}.