Hex Artifact Content

Artifact 2dcf9a15dcd1a822eb9fd7d1a0e03ecc8b56ab8f631e45630651c8d3c276b4f2:


0000: 2f 2a 0a 20 2a 20 50 61 72 73 65 20 58 2e 35 30  /*. * Parse X.50
0010: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61 6e  9 certificate an
0020: 64 20 72 65 74 75 72 6e 20 63 6f 6e 74 65 6e 74  d return content
0030: 73 20 61 73 20 61 20 54 43 4c 20 6b 65 79 2d 76  s as a TCL key-v
0040: 61 6c 75 65 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a  alue list.. *. *
0050: 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31   Copyright (C) 1
0060: 39 39 37 2d 32 30 30 30 20 53 65 6e 73 75 73 20  997-2000 Sensus 
0070: 43 6f 6e 73 75 6c 74 69 6e 67 20 4c 74 64 2e 0a  Consulting Ltd..
0080: 20 2a 20 4d 61 74 74 20 4e 65 77 6d 61 6e 20 3c   * Matt Newman <
0090: 6d 61 74 74 40 73 65 6e 73 75 73 2e 6f 72 67 3e  matt@sensus.org>
00a0: 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 43  . * Copyright (C
00b0: 29 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48  ) 2023 Brian O'H
00c0: 61 67 61 6e 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64  agan. */.#includ
00d0: 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e 63 6c 75  e <tcl.h>.#inclu
00e0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
00f0: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 62  clude <openssl/b
0100: 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  io.h>.#include <
0110: 6f 70 65 6e 73 73 6c 2f 73 68 61 2e 68 3e 0a 23  openssl/sha.h>.#
0120: 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c  include <openssl
0130: 2f 78 35 30 39 2e 68 3e 0a 23 69 6e 63 6c 75 64  /x509.h>.#includ
0140: 65 20 3c 6f 70 65 6e 73 73 6c 2f 78 35 30 39 76  e <openssl/x509v
0150: 33 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f  3.h>.#include <o
0160: 70 65 6e 73 73 6c 2f 78 35 30 39 5f 76 66 79 2e  penssl/x509_vfy.
0170: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
0180: 6e 73 73 6c 2f 61 73 6e 31 2e 68 3e 0a 23 69 6e  nssl/asn1.h>.#in
0190: 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 22  clude "tlsInt.h"
01a0: 0a 0a 2f 2a 20 44 65 66 69 6e 65 20 6d 61 78 69  ../* Define maxi
01b0: 6d 75 6d 20 63 65 72 74 69 66 69 63 61 74 65 20  mum certificate 
01c0: 73 69 7a 65 2e 20 4d 61 78 20 50 45 4d 20 73 69  size. Max PEM si
01d0: 7a 65 20 31 30 30 6b 42 20 61 6e 64 20 44 45 52  ze 100kB and DER
01e0: 20 73 69 7a 65 20 69 73 20 32 34 6b 42 2e 20 2a   size is 24kB. *
01f0: 2f 0a 23 64 65 66 69 6e 65 20 43 45 52 54 5f 53  /.#define CERT_S
0200: 54 52 5f 53 49 5a 45 20 33 32 37 36 38 0a 0a 0c  TR_SIZE 32768...
0210: 0a 2f 2a 0a 20 2a 20 53 74 72 69 6e 67 5f 74 6f  ./*. * String_to
0220: 5f 48 65 78 20 2d 2d 0a 20 2a 09 46 6f 72 6d 61  _Hex --. *.Forma
0230: 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  t contents of a 
0240: 62 69 6e 61 72 79 20 73 74 72 69 6e 67 20 61 73  binary string as
0250: 20 61 20 68 65 78 20 73 74 72 69 6e 67 0a 20 2a   a hex string. *
0260: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
0270: 52 65 74 75 72 6e 73 20 73 69 7a 65 20 6f 66 20  Returns size of 
0280: 6f 75 74 70 75 74 20 68 65 78 20 73 74 72 69 6e  output hex strin
0290: 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 45 66 66  g. *. * Side Eff
02a0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ects:. *.None. *
02b0: 0a 20 2a 2f 0a 54 63 6c 5f 53 69 7a 65 20 53 74  . */.Tcl_Size St
02c0: 72 69 6e 67 5f 74 6f 5f 48 65 78 28 75 6e 73 69  ring_to_Hex(unsi
02d0: 67 6e 65 64 20 63 68 61 72 2a 20 69 6e 70 75 74  gned char* input
02e0: 2c 20 69 6e 74 20 69 6c 65 6e 2c 20 75 6e 73 69  , int ilen, unsi
02f0: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
0300: 72 2c 20 54 63 6c 5f 53 69 7a 65 20 62 6c 65 6e  r, Tcl_Size blen
0310: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65  ) {.    Tcl_Size
0320: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 75 6e   len = 0;.    un
0330: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 70 74  signed char *ipt
0340: 72 20 3d 20 69 6e 70 75 74 3b 0a 20 20 20 20 75  r = input;.    u
0350: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 70  nsigned char *op
0360: 74 72 20 3d 20 26 62 75 66 66 65 72 5b 30 5d 3b  tr = &buffer[0];
0370: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
0380: 2a 68 65 78 20 3d 20 22 30 31 32 33 34 35 36 37  *hex = "01234567
0390: 38 39 61 62 63 64 65 66 22 3b 0a 0a 20 20 20 20  89abcdef";..    
03a0: 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20  for (int i = 0; 
03b0: 69 20 3c 20 69 6c 65 6e 20 26 26 20 6c 65 6e 20  i < ilen && len 
03c0: 3c 20 62 6c 65 6e 20 2d 20 31 3b 20 69 2b 2b 2c  < blen - 1; i++,
03d0: 20 6c 65 6e 20 2b 3d 20 32 29 20 7b 0a 20 20 20   len += 2) {.   
03e0: 20 20 20 20 20 2a 6f 70 74 72 2b 2b 20 3d 20 68       *optr++ = h
03f0: 65 78 5b 28 2a 69 70 74 72 3e 3e 34 29 26 30 78  ex[(*iptr>>4)&0x
0400: 46 5d 3b 0a 20 20 20 20 20 20 20 20 2a 6f 70 74  F];.        *opt
0410: 72 2b 2b 20 3d 20 68 65 78 5b 28 2a 69 70 74 72  r++ = hex[(*iptr
0420: 2b 2b 29 26 30 78 46 5d 3b 0a 20 20 20 20 7d 0a  ++)&0xF];.    }.
0430: 20 20 20 20 2a 6f 70 74 72 20 3d 20 30 3b 0a 20      *optr = 0;. 
0440: 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 7d     return len;.}
0450: 0a 0a 2f 2a 0a 20 2a 20 42 49 4f 5f 74 6f 5f 42  ../*. * BIO_to_B
0460: 75 66 66 65 72 20 2d 2d 0a 20 2a 09 4f 75 74 70  uffer --. *.Outp
0470: 75 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  ut contents of a
0480: 20 42 49 4f 20 74 6f 20 61 20 62 75 66 66 65 72   BIO to a buffer
0490: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
04a0: 20 2a 09 52 65 74 75 72 6e 73 20 6c 65 6e 67 74   *.Returns lengt
04b0: 68 20 6f 66 20 73 74 72 69 6e 67 20 69 6e 20 62  h of string in b
04c0: 75 66 66 65 72 0a 20 2a 0a 20 2a 20 53 69 64 65  uffer. *. * Side
04d0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
04e0: 65 0a 20 2a 0a 20 2a 2f 0a 54 63 6c 5f 53 69 7a  e. *. */.Tcl_Siz
04f0: 65 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28  e BIO_to_Buffer(
0500: 69 6e 74 20 72 65 73 75 6c 74 2c 20 42 49 4f 20  int result, BIO 
0510: 2a 62 69 6f 2c 20 76 6f 69 64 20 2a 62 75 66 66  *bio, void *buff
0520: 65 72 2c 20 69 6e 74 20 62 6c 65 6e 29 20 7b 0a  er, int blen) {.
0530: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e      Tcl_Size len
0540: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 70 65   = 0;.    int pe
0550: 6e 64 69 6e 67 20 3d 20 42 49 4f 5f 70 65 6e 64  nding = BIO_pend
0560: 69 6e 67 28 62 69 6f 29 3b 0a 0a 20 20 20 20 69  ing(bio);..    i
0570: 66 20 28 72 65 73 75 6c 74 29 20 7b 0a 09 6c 65  f (result) {..le
0580: 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 42  n = (Tcl_Size) B
0590: 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 62 75 66  IO_read(bio, buf
05a0: 66 65 72 2c 20 28 70 65 6e 64 69 6e 67 20 3c 20  fer, (pending < 
05b0: 62 6c 65 6e 29 20 3f 20 70 65 6e 64 69 6e 67 20  blen) ? pending 
05c0: 3a 20 62 6c 65 6e 29 3b 0a 09 28 76 6f 69 64 29  : blen);..(void)
05d0: 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a  BIO_flush(bio);.
05e0: 09 69 66 20 28 6c 65 6e 20 3c 20 30 29 20 7b 0a  .if (len < 0) {.
05f0: 09 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 09 7d  .    len = 0;..}
0600: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
0610: 6e 20 6c 65 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  n len;.}.../*. *
0620: 20 54 6c 73 5f 78 35 30 39 45 78 74 65 6e 73 69   Tls_x509Extensi
0630: 6f 6e 73 20 2d 2d 0a 20 2a 09 47 65 74 20 6c 69  ons --. *.Get li
0640: 73 74 20 6f 66 20 58 2e 35 30 39 20 43 65 72 74  st of X.509 Cert
0650: 69 66 69 63 61 74 65 20 45 78 74 65 6e 73 69 6f  ificate Extensio
0660: 6e 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  ns. *. * Results
0670: 3a 0a 20 2a 09 54 43 4c 20 6c 69 73 74 20 6f 66  :. *.TCL list of
0680: 20 65 78 74 65 6e 73 69 6f 6e 73 20 61 6e 64 20   extensions and 
0690: 62 6f 6f 6c 65 61 6e 20 63 72 69 74 69 63 61 6c  boolean critical
06a0: 20 73 74 61 74 75 73 0a 20 2a 0a 20 2a 20 53 69   status. *. * Si
06b0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
06c0: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 54 63 6c 5f 4f  one. *. */.Tcl_O
06d0: 62 6a 20 2a 54 6c 73 5f 78 35 30 39 45 78 74 65  bj *Tls_x509Exte
06e0: 6e 73 69 6f 6e 73 28 54 63 6c 5f 49 6e 74 65 72  nsions(Tcl_Inter
06f0: 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20  p *interp, X509 
0700: 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 63 6f 6e  *cert) {.    con
0710: 73 74 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39  st STACK_OF(X509
0720: 5f 45 58 54 45 4e 53 49 4f 4e 29 20 2a 65 78 74  _EXTENSION) *ext
0730: 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  s;.    Tcl_Obj *
0740: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f  resultObj = Tcl_
0750: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
0760: 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65  LL);..    if (re
0770: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29  sultObj == NULL)
0780: 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b   {..return NULL;
0790: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
07a0: 28 65 78 74 73 20 3d 20 58 35 30 39 5f 67 65 74  (exts = X509_get
07b0: 30 5f 65 78 74 65 6e 73 69 6f 6e 73 28 63 65 72  0_extensions(cer
07c0: 74 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  t)) != NULL) {..
07d0: 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b 20 69 20  for (int i=0; i 
07e0: 3c 20 58 35 30 39 5f 67 65 74 5f 65 78 74 5f 63  < X509_get_ext_c
07f0: 6f 75 6e 74 28 63 65 72 74 29 3b 20 69 2b 2b 29  ount(cert); i++)
0800: 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 45 58 54   {..    X509_EXT
0810: 45 4e 53 49 4f 4e 20 2a 65 78 20 3d 20 73 6b 5f  ENSION *ex = sk_
0820: 58 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 76  X509_EXTENSION_v
0830: 61 6c 75 65 28 65 78 74 73 2c 20 69 29 3b 0a 09  alue(exts, i);..
0840: 20 20 20 20 41 53 4e 31 5f 4f 42 4a 45 43 54 20      ASN1_OBJECT 
0850: 2a 6f 62 6a 20 3d 20 58 35 30 39 5f 45 58 54 45  *obj = X509_EXTE
0860: 4e 53 49 4f 4e 5f 67 65 74 5f 6f 62 6a 65 63 74  NSION_get_object
0870: 28 65 78 29 3b 0a 09 20 20 20 20 2f 2a 20 41 53  (ex);..    /* AS
0880: 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49 4e 47 20  N1_OCTET_STRING 
0890: 2a 64 61 74 61 20 3d 20 58 35 30 39 5f 45 58 54  *data = X509_EXT
08a0: 45 4e 53 49 4f 4e 5f 67 65 74 5f 64 61 74 61 28  ENSION_get_data(
08b0: 65 78 29 3b 20 2a 2f 0a 09 20 20 20 20 69 6e 74  ex); */..    int
08c0: 20 63 72 69 74 69 63 61 6c 20 3d 20 58 35 30 39   critical = X509
08d0: 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74 5f 63  _EXTENSION_get_c
08e0: 72 69 74 69 63 61 6c 28 65 78 29 3b 0a 09 20 20  ritical(ex);..  
08f0: 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69    LAPPEND_BOOL(i
0900: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
0910: 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 4f 42 4a  , OBJ_nid2ln(OBJ
0920: 5f 6f 62 6a 32 6e 69 64 28 6f 62 6a 29 29 2c 20  _obj2nid(obj)), 
0930: 63 72 69 74 69 63 61 6c 29 3b 0a 09 7d 0a 20 20  critical);..}.  
0940: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
0950: 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a  esultObj;.}../*.
0960: 20 2a 20 54 6c 73 5f 78 35 30 39 49 64 65 6e 74   * Tls_x509Ident
0970: 69 66 69 65 72 20 2d 2d 0a 20 2a 09 47 65 74 20  ifier --. *.Get 
0980: 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74  X.509 certificat
0990: 65 20 41 75 74 68 6f 72 69 74 79 20 6f 72 20 53  e Authority or S
09a0: 75 62 6a 65 63 74 20 4b 65 79 20 49 64 65 6e 74  ubject Key Ident
09b0: 69 66 69 65 72 73 0a 20 2a 0a 20 2a 20 52 65 73  ifiers. *. * Res
09c0: 75 6c 74 73 3a 0a 20 2a 09 54 43 4c 20 73 74 72  ults:. *.TCL str
09d0: 69 6e 67 20 6f 62 6a 65 63 74 20 77 69 74 68 20  ing object with 
09e0: 78 35 30 39 20 69 64 65 6e 74 69 66 69 65 72 20  x509 identifier 
09f0: 61 73 20 61 20 68 65 78 20 73 74 72 69 6e 67 0a  as a hex string.
0a00: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
0a10: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
0a20: 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f  */.Tcl_Obj *Tls_
0a30: 78 35 30 39 49 64 65 6e 74 69 66 69 65 72 28 63  x509Identifier(c
0a40: 6f 6e 73 74 20 41 53 4e 31 5f 4f 43 54 45 54 5f  onst ASN1_OCTET_
0a50: 53 54 52 49 4e 47 20 2a 61 73 74 72 69 6e 67 29  STRING *astring)
0a60: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
0a70: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 4e 55 4c 4c  resultObj = NULL
0a80: 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c  ;.    Tcl_Size l
0a90: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69  en = 0;.    unsi
0aa0: 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 65 72  gned char buffer
0ab0: 5b 31 30 32 34 5d 3b 0a 0a 20 20 20 20 69 66 20  [1024];..    if 
0ac0: 28 61 73 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c  (astring != NULL
0ad0: 29 20 7b 0a 09 6c 65 6e 20 3d 20 53 74 72 69 6e  ) {..len = Strin
0ae0: 67 5f 74 6f 5f 48 65 78 28 28 75 6e 73 69 67 6e  g_to_Hex((unsign
0af0: 65 64 20 63 68 61 72 20 2a 29 41 53 4e 31 5f 53  ed char *)ASN1_S
0b00: 54 52 49 4e 47 5f 67 65 74 30 5f 64 61 74 61 28  TRING_get0_data(
0b10: 61 73 74 72 69 6e 67 29 2c 0a 09 20 20 20 20 41  astring),..    A
0b20: 53 4e 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74  SN1_STRING_lengt
0b30: 68 28 61 73 74 72 69 6e 67 29 2c 20 62 75 66 66  h(astring), buff
0b40: 65 72 2c 20 31 30 32 34 29 3b 0a 20 20 20 20 7d  er, 1024);.    }
0b50: 0a 20 20 20 20 72 65 73 75 6c 74 4f 62 6a 20 3d  .    resultObj =
0b60: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
0b70: 6a 28 28 63 68 61 72 20 2a 29 20 26 62 75 66 66  j((char *) &buff
0b80: 65 72 5b 30 5d 2c 20 6c 65 6e 29 3b 0a 20 20 20  er[0], len);.   
0b90: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62   return resultOb
0ba0: 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 54 6c 73 5f  j;.}../*. * Tls_
0bb0: 78 35 30 39 4b 65 79 55 73 61 67 65 20 2d 2d 0a  x509KeyUsage --.
0bc0: 20 2a 09 47 65 74 20 58 2e 35 30 39 20 63 65 72   *.Get X.509 cer
0bd0: 74 69 66 69 63 61 74 65 20 6b 65 79 20 75 73 61  tificate key usa
0be0: 67 65 20 74 79 70 65 73 0a 20 2a 0a 20 2a 20 52  ge types. *. * R
0bf0: 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 6c 20 6c  esults:. *.Tcl l
0c00: 69 73 74 20 6f 66 20 74 79 70 65 73 0a 20 2a 0a  ist of types. *.
0c10: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
0c20: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a  . *.None. *. */.
0c30: 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30  Tcl_Obj *Tls_x50
0c40: 39 4b 65 79 55 73 61 67 65 28 54 63 6c 5f 49 6e  9KeyUsage(Tcl_In
0c50: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35  terp *interp, X5
0c60: 30 39 20 2a 63 65 72 74 2c 20 75 69 6e 74 33 32  09 *cert, uint32
0c70: 5f 74 20 78 66 6c 61 67 73 29 20 7b 0a 20 20 20  _t xflags) {.   
0c80: 20 75 69 6e 74 33 32 5f 74 20 75 73 61 67 65 20   uint32_t usage 
0c90: 3d 20 58 35 30 39 5f 67 65 74 5f 6b 65 79 5f 75  = X509_get_key_u
0ca0: 73 61 67 65 28 63 65 72 74 29 3b 0a 20 20 20 20  sage(cert);.    
0cb0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f  Tcl_Obj *resultO
0cc0: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  bj = Tcl_NewList
0cd0: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20  Obj(0, NULL);.. 
0ce0: 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a     if (resultObj
0cf0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
0d00: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
0d10: 0a 20 20 20 20 69 66 20 28 28 78 66 6c 61 67 73  .    if ((xflags
0d20: 20 26 20 45 58 46 4c 41 47 5f 4b 55 53 41 47 45   & EXFLAG_KUSAGE
0d30: 29 20 26 26 20 75 73 61 67 65 20 3c 20 55 49 4e  ) && usage < UIN
0d40: 54 33 32 5f 4d 41 58 29 20 7b 0a 09 69 66 20 28  T32_MAX) {..if (
0d50: 75 73 61 67 65 20 26 20 4b 55 5f 44 49 47 49 54  usage & KU_DIGIT
0d60: 41 4c 5f 53 49 47 4e 41 54 55 52 45 29 20 7b 0a  AL_SIGNATURE) {.
0d70: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
0d80: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
0d90: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
0da0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
0db0: 6a 28 22 44 69 67 69 74 61 6c 20 53 69 67 6e 61  j("Digital Signa
0dc0: 74 75 72 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  ture", -1));..}.
0dd0: 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f  .if (usage & KU_
0de0: 4e 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e 29  NON_REPUDIATION)
0df0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
0e00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
0e10: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
0e20: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  bj, Tcl_NewStrin
0e30: 67 4f 62 6a 28 22 4e 6f 6e 2d 52 65 70 75 64 69  gObj("Non-Repudi
0e40: 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d  ation", -1));..}
0e50: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55  ..if (usage & KU
0e60: 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52 4d 45 4e  _KEY_ENCIPHERMEN
0e70: 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  T) {..    Tcl_Li
0e80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
0e90: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  nt(interp, resul
0ea0: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tObj, Tcl_NewStr
0eb0: 69 6e 67 4f 62 6a 28 22 4b 65 79 20 45 6e 63 69  ingObj("Key Enci
0ec0: 70 68 65 72 6d 65 6e 74 22 2c 20 2d 31 29 29 3b  pherment", -1));
0ed0: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26  ..}..if (usage &
0ee0: 20 4b 55 5f 44 41 54 41 5f 45 4e 43 49 50 48 45   KU_DATA_ENCIPHE
0ef0: 52 4d 45 4e 54 29 20 7b 0a 09 20 20 20 20 54 63  RMENT) {..    Tc
0f00: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
0f10: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
0f20: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
0f30: 77 53 74 72 69 6e 67 4f 62 6a 28 22 44 61 74 61  wStringObj("Data
0f40: 20 45 6e 63 69 70 68 65 72 6d 65 6e 74 22 2c 20   Encipherment", 
0f50: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73  -1));..}..if (us
0f60: 61 67 65 20 26 20 4b 55 5f 4b 45 59 5f 41 47 52  age & KU_KEY_AGR
0f70: 45 45 4d 45 4e 54 29 20 7b 0a 09 20 20 20 20 54  EEMENT) {..    T
0f80: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
0f90: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
0fa0: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e  resultObj, Tcl_N
0fb0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4b 65 79  ewStringObj("Key
0fc0: 20 41 67 72 65 65 6d 65 6e 74 22 2c 20 2d 31 29   Agreement", -1)
0fd0: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65  );..}..if (usage
0fe0: 20 26 20 4b 55 5f 4b 45 59 5f 43 45 52 54 5f 53   & KU_KEY_CERT_S
0ff0: 49 47 4e 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  IGN) {..    Tcl_
1000: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1010: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73  ment(interp, res
1020: 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53  ultObj, Tcl_NewS
1030: 74 72 69 6e 67 4f 62 6a 28 22 43 65 72 74 69 66  tringObj("Certif
1040: 69 63 61 74 65 20 53 69 67 6e 69 6e 67 22 2c 20  icate Signing", 
1050: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73  -1));..}..if (us
1060: 61 67 65 20 26 20 4b 55 5f 43 52 4c 5f 53 49 47  age & KU_CRL_SIG
1070: 4e 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  N) {..    Tcl_Li
1080: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1090: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  nt(interp, resul
10a0: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tObj, Tcl_NewStr
10b0: 69 6e 67 4f 62 6a 28 22 43 52 4c 20 53 69 67 6e  ingObj("CRL Sign
10c0: 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  ing", -1));..}..
10d0: 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f 45  if (usage & KU_E
10e0: 4e 43 49 50 48 45 52 5f 4f 4e 4c 59 29 20 7b 0a  NCIPHER_ONLY) {.
10f0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1100: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1110: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
1120: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1130: 6a 28 22 45 6e 63 69 70 68 65 72 20 4f 6e 6c 79  j("Encipher Only
1140: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
1150: 28 75 73 61 67 65 20 26 20 4b 55 5f 44 45 43 49  (usage & KU_DECI
1160: 50 48 45 52 5f 4f 4e 4c 59 29 20 7b 0a 09 20 20  PHER_ONLY) {..  
1170: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1180: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1190: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
11a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
11b0: 44 65 63 69 70 68 65 72 20 4f 6e 6c 79 22 2c 20  Decipher Only", 
11c0: 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 20 65  -1));..}.    } e
11d0: 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  lse {..    Tcl_L
11e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
11f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ent(interp, resu
1200: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74  ltObj, Tcl_NewSt
1210: 72 69 6e 67 4f 62 6a 28 22 75 6e 72 65 73 74 72  ringObj("unrestr
1220: 69 63 74 65 64 22 2c 20 2d 31 29 29 3b 0a 20 20  icted", -1));.  
1230: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
1240: 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a  esultObj;.}../*.
1250: 20 2a 20 54 6c 73 5f 78 35 30 39 50 75 72 70 6f   * Tls_x509Purpo
1260: 73 65 20 2d 2d 0a 20 2a 09 47 65 74 20 58 2e 35  se --. *.Get X.5
1270: 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70  09 certificate p
1280: 75 72 70 6f 73 65 0a 20 2a 0a 20 2a 20 52 65 73  urpose. *. * Res
1290: 75 6c 74 73 3a 0a 20 2a 09 50 75 72 70 6f 73 65  ults:. *.Purpose
12a0: 20 73 74 72 69 6e 67 0a 20 2a 0a 20 2a 20 53 69   string. *. * Si
12b0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
12c0: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 63 68 61 72 20  one. *. */.char 
12d0: 2a 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 65  *Tls_x509Purpose
12e0: 28 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20  (X509 *cert) {. 
12f0: 20 20 20 63 68 61 72 20 2a 70 75 72 70 6f 73 65     char *purpose
1300: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66   = NULL;..    if
1310: 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72   (X509_check_pur
1320: 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f  pose(cert, X509_
1330: 50 55 52 50 4f 53 45 5f 53 53 4c 5f 43 4c 49 45  PURPOSE_SSL_CLIE
1340: 4e 54 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70  NT, 0) > 0) {..p
1350: 75 72 70 6f 73 65 20 3d 20 22 53 53 4c 20 43 6c  urpose = "SSL Cl
1360: 69 65 6e 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73  ient";.    } els
1370: 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b  e if (X509_check
1380: 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58  _purpose(cert, X
1390: 35 30 39 5f 50 55 52 50 4f 53 45 5f 53 53 4c 5f  509_PURPOSE_SSL_
13a0: 53 45 52 56 45 52 2c 20 30 29 20 3e 20 30 29 20  SERVER, 0) > 0) 
13b0: 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 53 53  {..purpose = "SS
13c0: 4c 20 53 65 72 76 65 72 22 3b 0a 20 20 20 20 7d  L Server";.    }
13d0: 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63   else if (X509_c
13e0: 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72  heck_purpose(cer
13f0: 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f  t, X509_PURPOSE_
1400: 4e 53 5f 53 53 4c 5f 53 45 52 56 45 52 2c 20 30  NS_SSL_SERVER, 0
1410: 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73  ) > 0) {..purpos
1420: 65 20 3d 20 22 4d 53 53 20 53 53 4c 20 53 65 72  e = "MSS SSL Ser
1430: 76 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ver";.    } else
1440: 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f   if (X509_check_
1450: 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35  purpose(cert, X5
1460: 30 39 5f 50 55 52 50 4f 53 45 5f 53 4d 49 4d 45  09_PURPOSE_SMIME
1470: 5f 53 49 47 4e 2c 20 30 29 20 3e 20 30 29 20 7b  _SIGN, 0) > 0) {
1480: 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 53 4d 49  ..purpose = "SMI
1490: 4d 45 20 53 69 67 6e 69 6e 67 22 3b 0a 20 20 20  ME Signing";.   
14a0: 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39   } else if (X509
14b0: 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63  _check_purpose(c
14c0: 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53  ert, X509_PURPOS
14d0: 45 5f 53 4d 49 4d 45 5f 45 4e 43 52 59 50 54 2c  E_SMIME_ENCRYPT,
14e0: 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70   0) > 0) {..purp
14f0: 6f 73 65 20 3d 20 22 53 4d 49 4d 45 20 45 6e 63  ose = "SMIME Enc
1500: 72 79 70 74 69 6f 6e 22 3b 0a 20 20 20 20 7d 20  ryption";.    } 
1510: 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68  else if (X509_ch
1520: 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74  eck_purpose(cert
1530: 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 43  , X509_PURPOSE_C
1540: 52 4c 5f 53 49 47 4e 2c 20 30 29 20 3e 20 30 29  RL_SIGN, 0) > 0)
1550: 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 43   {..purpose = "C
1560: 52 4c 20 53 69 67 6e 69 6e 67 22 3b 0a 20 20 20  RL Signing";.   
1570: 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39   } else if (X509
1580: 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63  _check_purpose(c
1590: 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53  ert, X509_PURPOS
15a0: 45 5f 41 4e 59 2c 20 30 29 20 3e 20 30 29 20 7b  E_ANY, 0) > 0) {
15b0: 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 41 6e 79  ..purpose = "Any
15c0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ";.    } else if
15d0: 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72   (X509_check_pur
15e0: 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f  pose(cert, X509_
15f0: 50 55 52 50 4f 53 45 5f 4f 43 53 50 5f 48 45 4c  PURPOSE_OCSP_HEL
1600: 50 45 52 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09  PER, 0) > 0) {..
1610: 70 75 72 70 6f 73 65 20 3d 20 22 4f 43 53 50 20  purpose = "OCSP 
1620: 48 65 6c 70 65 72 22 3b 0a 20 20 20 20 7d 20 65  Helper";.    } e
1630: 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65  lse if (X509_che
1640: 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c  ck_purpose(cert,
1650: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 54 49   X509_PURPOSE_TI
1660: 4d 45 53 54 41 4d 50 5f 53 49 47 4e 2c 20 30 29  MESTAMP_SIGN, 0)
1670: 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65   > 0) {..purpose
1680: 20 3d 20 22 54 69 6d 65 73 74 61 6d 70 20 53 69   = "Timestamp Si
1690: 67 6e 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 6c  gning";.    } el
16a0: 73 65 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20  se {..purpose = 
16b0: 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  "";.    }.    re
16c0: 74 75 72 6e 20 70 75 72 70 6f 73 65 3b 0a 7d 0a  turn purpose;.}.
16d0: 0a 2f 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39 50  ./*. * Tls_x509P
16e0: 75 72 70 6f 73 65 73 20 2d 2d 0a 20 2a 09 47 65  urposes --. *.Ge
16f0: 74 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63  t X.509 certific
1700: 61 74 65 20 70 75 72 70 6f 73 65 20 74 79 70 65  ate purpose type
1710: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  s. *. * Results:
1720: 0a 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20  . *.Tcl list of 
1730: 65 61 63 68 20 70 75 72 70 6f 73 65 20 61 6e 64  each purpose and
1740: 20 77 68 65 74 68 65 72 20 69 74 20 69 73 20 43   whether it is C
1750: 41 20 6f 72 20 6e 6f 6e 2d 43 41 0a 20 2a 0a 20  A or non-CA. *. 
1760: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
1770: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 54   *.None. *. */.T
1780: 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39  cl_Obj *Tls_x509
1790: 50 75 72 70 6f 73 65 73 28 54 63 6c 5f 49 6e 74  Purposes(Tcl_Int
17a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30  erp *interp, X50
17b0: 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 54  9 *cert) {.    T
17c0: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62  cl_Obj *resultOb
17d0: 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  j = Tcl_NewListO
17e0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  bj(0, NULL);.   
17f0: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 20 2a 70   X509_PURPOSE *p
1800: 74 6d 70 3b 0a 0a 20 20 20 20 69 66 20 28 72 65  tmp;..    if (re
1810: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29  sultObj == NULL)
1820: 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b   {..return NULL;
1830: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20  .    }..    for 
1840: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (int i = 0; i < 
1850: 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74  X509_PURPOSE_get
1860: 5f 63 6f 75 6e 74 28 29 3b 20 69 2b 2b 29 20 7b  _count(); i++) {
1870: 0a 09 70 74 6d 70 20 3d 20 58 35 30 39 5f 50 55  ..ptmp = X509_PU
1880: 52 50 4f 53 45 5f 67 65 74 30 28 69 29 3b 0a 09  RPOSE_get0(i);..
1890: 54 63 6c 5f 4f 62 6a 20 2a 74 6d 70 50 74 72 20  Tcl_Obj *tmpPtr 
18a0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
18b0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 66 6f 72  (0, NULL);...for
18c0: 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 3c   (int j = 0; j <
18d0: 20 32 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20   2; j++) {..    
18e0: 69 6e 74 20 69 64 72 65 74 20 3d 20 58 35 30 39  int idret = X509
18f0: 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63  _check_purpose(c
1900: 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53  ert, X509_PURPOS
1910: 45 5f 67 65 74 5f 69 64 28 70 74 6d 70 29 2c 20  E_get_id(ptmp), 
1920: 6a 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  j);..    Tcl_Lis
1930: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1940: 74 28 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 72  t(interp, tmpPtr
1950: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1960: 62 6a 28 6a 20 3f 20 22 43 41 22 20 3a 20 22 6e  bj(j ? "CA" : "n
1970: 6f 6e 43 41 22 2c 20 2d 31 29 29 3b 0a 09 20 20  onCA", -1));..  
1980: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1990: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
19a0: 70 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c 5f 4e  p, tmpPtr, Tcl_N
19b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 69 64 72 65  ewStringObj(idre
19c0: 74 20 3d 3d 20 31 20 3f 20 22 59 65 73 22 20 3a  t == 1 ? "Yes" :
19d0: 20 22 4e 6f 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a   "No", -1));..}.
19e0: 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74  .LAPPEND_OBJ(int
19f0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
1a00: 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74  X509_PURPOSE_get
1a10: 30 5f 6e 61 6d 65 28 70 74 6d 70 29 2c 20 74 6d  0_name(ptmp), tm
1a20: 70 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pPtr);.    }.   
1a30: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62   return resultOb
1a40: 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 54 6c 73 5f  j;.}../*. * Tls_
1a50: 78 35 30 39 4e 61 6d 65 73 20 2d 2d 0a 20 2a 09  x509Names --. *.
1a60: 47 65 74 20 61 20 6c 69 73 74 20 6f 66 20 53 75  Get a list of Su
1a70: 62 6a 65 63 74 20 41 6c 74 65 72 6e 61 74 65 20  bject Alternate 
1a80: 4e 61 6d 65 73 20 28 53 41 4e 29 20 6f 72 20 49  Names (SAN) or I
1a90: 73 73 75 65 72 20 41 6c 74 65 72 6e 61 74 65 20  ssuer Alternate 
1aa0: 4e 61 6d 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75  Names. *. * Resu
1ab0: 6c 74 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 74  lts:. *.Tcl list
1ac0: 20 6f 66 20 61 6c 74 65 72 6e 61 74 65 20 6e 61   of alternate na
1ad0: 6d 65 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  mes. *. * Side e
1ae0: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  ffects:. *.None.
1af0: 20 2a 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a   *. */.Tcl_Obj *
1b00: 54 6c 73 5f 78 35 30 39 4e 61 6d 65 73 28 54 63  Tls_x509Names(Tc
1b10: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1b20: 2c 20 58 35 30 39 20 2a 63 65 72 74 2c 20 69 6e  , X509 *cert, in
1b30: 74 20 6e 69 64 2c 20 42 49 4f 20 2a 62 69 6f 29  t nid, BIO *bio)
1b40: 20 7b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28   {.    STACK_OF(
1b50: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 29 20 2a 6e  GENERAL_NAME) *n
1b60: 61 6d 65 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  ames;.    Tcl_Ob
1b70: 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54  j *resultObj = T
1b80: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
1b90: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
1ba0: 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 63 68  Size len;.    ch
1bb0: 61 72 20 62 75 66 66 65 72 5b 31 30 32 34 5d 3b  ar buffer[1024];
1bc0: 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74  ..    if (result
1bd0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Obj == NULL) {..
1be0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
1bf0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 6e 61 6d   }..    if ((nam
1c00: 65 73 20 3d 20 58 35 30 39 5f 67 65 74 5f 65 78  es = X509_get_ex
1c10: 74 5f 64 32 69 28 63 65 72 74 2c 20 6e 69 64 2c  t_d2i(cert, nid,
1c20: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d   NULL, NULL)) !=
1c30: 20 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69   NULL) {..for (i
1c40: 6e 74 20 69 3d 30 3b 20 69 20 3c 20 73 6b 5f 47  nt i=0; i < sk_G
1c50: 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 6e 75 6d 28  ENERAL_NAME_num(
1c60: 6e 61 6d 65 73 29 3b 20 69 2b 2b 29 20 7b 0a 09  names); i++) {..
1c70: 20 20 20 20 63 6f 6e 73 74 20 47 45 4e 45 52 41      const GENERA
1c80: 4c 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73  L_NAME *name = s
1c90: 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 76  k_GENERAL_NAME_v
1ca0: 61 6c 75 65 28 6e 61 6d 65 73 2c 20 69 29 3b 0a  alue(names, i);.
1cb0: 0a 09 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f  ..    len = BIO_
1cc0: 74 6f 5f 42 75 66 66 65 72 28 6e 61 6d 65 20 26  to_Buffer(name &
1cd0: 26 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70  & GENERAL_NAME_p
1ce0: 72 69 6e 74 28 62 69 6f 2c 20 28 47 45 4e 45 52  rint(bio, (GENER
1cf0: 41 4c 5f 4e 41 4d 45 20 2a 29 20 6e 61 6d 65 29  AL_NAME *) name)
1d00: 2c 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 31  , bio, buffer, 1
1d10: 30 32 34 29 3b 0a 09 20 20 20 20 4c 41 50 50 45  024);..    LAPPE
1d20: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72  ND_STR(interp, r
1d30: 65 73 75 6c 74 4f 62 6a 2c 20 4e 55 4c 4c 2c 20  esultObj, NULL, 
1d40: 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 09 7d  buffer, len);..}
1d50: 0a 09 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d  ..sk_GENERAL_NAM
1d60: 45 5f 70 6f 70 5f 66 72 65 65 28 6e 61 6d 65 73  E_pop_free(names
1d70: 2c 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 66  , GENERAL_NAME_f
1d80: 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ree);.    }.    
1d90: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a  return resultObj
1da0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 54 6c 73 5f 78  ;.}../*. * Tls_x
1db0: 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 20 2d  509ExtKeyUsage -
1dc0: 2d 0a 20 2a 09 47 65 74 20 61 20 6c 69 73 74 20  -. *.Get a list 
1dd0: 6f 66 20 45 78 74 65 6e 64 65 64 20 4b 65 79 20  of Extended Key 
1de0: 55 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52 65 74  Usages. *. * Ret
1df0: 75 72 6e 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73  urns:. *.Tcl lis
1e00: 74 20 6f 66 20 75 73 61 67 65 73 0a 20 2a 0a 20  t of usages. *. 
1e10: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
1e20: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 54   *.None. *. */.T
1e30: 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39  cl_Obj *Tls_x509
1e40: 45 78 74 4b 65 79 55 73 61 67 65 28 54 63 6c 5f  ExtKeyUsage(Tcl_
1e50: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1e60: 58 35 30 39 20 2a 63 65 72 74 2c 20 75 69 6e 74  X509 *cert, uint
1e70: 33 32 5f 74 20 78 66 6c 61 67 73 29 20 7b 0a 20  32_t xflags) {. 
1e80: 20 20 20 75 69 6e 74 33 32 5f 74 20 75 73 61 67     uint32_t usag
1e90: 65 20 3d 20 58 35 30 39 5f 67 65 74 5f 6b 65 79  e = X509_get_key
1ea0: 5f 75 73 61 67 65 28 63 65 72 74 29 3b 0a 20 20  _usage(cert);.  
1eb0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c    Tcl_Obj *resul
1ec0: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  tObj = Tcl_NewLi
1ed0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
1ee0: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f  .    if (resultO
1ef0: 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  bj == NULL) {..r
1f00: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
1f10: 7d 0a 0a 20 20 20 20 69 66 20 28 28 78 66 6c 61  }..    if ((xfla
1f20: 67 73 20 26 20 45 58 46 4c 41 47 5f 58 4b 55 53  gs & EXFLAG_XKUS
1f30: 41 47 45 29 20 26 26 20 75 73 61 67 65 20 3c 20  AGE) && usage < 
1f40: 55 49 4e 54 33 32 5f 4d 41 58 29 20 7b 0a 09 75  UINT32_MAX) {..u
1f50: 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 74 5f  sage = X509_get_
1f60: 65 78 74 65 6e 64 65 64 5f 6b 65 79 5f 75 73 61  extended_key_usa
1f70: 67 65 28 63 65 72 74 29 3b 0a 0a 09 69 66 20 28  ge(cert);...if (
1f80: 75 73 61 67 65 20 26 20 58 4b 55 5f 53 53 4c 5f  usage & XKU_SSL_
1f90: 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 54  SERVER) {..    T
1fa0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1fb0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1fc0: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e  resultObj, Tcl_N
1fd0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 4c 53  ewStringObj("TLS
1fe0: 20 57 65 62 20 53 65 72 76 65 72 20 41 75 74 68   Web Server Auth
1ff0: 65 6e 74 69 63 61 74 69 6f 6e 22 2c 20 2d 31 29  entication", -1)
2000: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65  );..}..if (usage
2010: 20 26 20 58 4b 55 5f 53 53 4c 5f 43 4c 49 45 4e   & XKU_SSL_CLIEN
2020: 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  T) {..    Tcl_Li
2030: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2040: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  nt(interp, resul
2050: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tObj, Tcl_NewStr
2060: 69 6e 67 4f 62 6a 28 22 54 4c 53 20 57 65 62 20  ingObj("TLS Web 
2070: 43 6c 69 65 6e 74 20 41 75 74 68 65 6e 74 69 63  Client Authentic
2080: 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d  ation", -1));..}
2090: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b  ..if (usage & XK
20a0: 55 5f 53 4d 49 4d 45 29 20 7b 0a 09 20 20 20 20  U_SMIME) {..    
20b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
20c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
20d0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f   resultObj, Tcl_
20e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 45 2d  NewStringObj("E-
20f0: 6d 61 69 6c 20 50 72 6f 74 65 63 74 69 6f 6e 22  mail Protection"
2100: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
2110: 75 73 61 67 65 20 26 20 58 4b 55 5f 43 4f 44 45  usage & XKU_CODE
2120: 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 20 54 63  _SIGN) {..    Tc
2130: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2140: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
2150: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
2160: 77 53 74 72 69 6e 67 4f 62 6a 28 22 43 6f 64 65  wStringObj("Code
2170: 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 3b   Signing", -1));
2180: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26  ..}..if (usage &
2190: 20 58 4b 55 5f 53 47 43 29 20 7b 0a 09 20 20 20   XKU_SGC) {..   
21a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
21b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
21c0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c  , resultObj, Tcl
21d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 53  _NewStringObj("S
21e0: 47 43 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  GC", -1));..}..i
21f0: 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f 4f  f (usage & XKU_O
2200: 43 53 50 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20  CSP_SIGN) {..   
2210: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2220: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2230: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c  , resultObj, Tcl
2240: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4f  _NewStringObj("O
2250: 43 53 50 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31  CSP Signing", -1
2260: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67  ));..}..if (usag
2270: 65 20 26 20 58 4b 55 5f 54 49 4d 45 53 54 41 4d  e & XKU_TIMESTAM
2280: 50 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  P) {..    Tcl_Li
2290: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
22a0: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  nt(interp, resul
22b0: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tObj, Tcl_NewStr
22c0: 69 6e 67 4f 62 6a 28 22 54 69 6d 65 20 53 74 61  ingObj("Time Sta
22d0: 6d 70 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d  mping", -1));..}
22e0: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b  ..if (usage & XK
22f0: 55 5f 44 56 43 53 20 29 20 7b 0a 09 20 20 20 20  U_DVCS ) {..    
2300: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2310: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2320: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f   resultObj, Tcl_
2330: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 44 56  NewStringObj("DV
2340: 43 53 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  CS", -1));..}..i
2350: 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f 41  f (usage & XKU_A
2360: 4e 59 45 4b 55 29 20 7b 0a 09 20 20 20 20 54 63  NYEKU) {..    Tc
2370: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2380: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
2390: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
23a0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 41 6e 79 20  wStringObj("Any 
23b0: 45 78 74 65 6e 64 65 64 20 4b 65 79 20 55 73 61  Extended Key Usa
23c0: 67 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 20  ge", -1));..}.  
23d0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20    } else {..    
23e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
23f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2400: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f   resultObj, Tcl_
2410: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e  NewStringObj("un
2420: 72 65 73 74 72 69 63 74 65 64 22 2c 20 2d 31 29  restricted", -1)
2430: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
2440: 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d  urn resultObj;.}
2450: 0a 0a 2f 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39  ../*. * Tls_x509
2460: 43 72 6c 44 70 20 2d 2d 0a 20 2a 09 47 65 74 20  CrlDp --. *.Get 
2470: 6c 69 73 74 20 6f 66 20 43 52 4c 20 44 69 73 74  list of CRL Dist
2480: 72 69 62 75 74 69 6f 6e 20 50 6f 69 6e 74 73 0a  ribution Points.
2490: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
24a0: 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 55 52  *.Tcl list of UR
24b0: 49 73 20 61 6e 64 20 72 65 6c 61 74 69 76 65 2d  Is and relative-
24c0: 6e 61 6d 65 73 0a 20 2a 0a 20 2a 20 53 69 64 65  names. *. * Side
24d0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
24e0: 65 0a 20 2a 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a  e. *. */.Tcl_Obj
24f0: 20 2a 54 6c 73 5f 78 35 30 39 43 72 6c 44 70 28   *Tls_x509CrlDp(
2500: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2510: 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 29 20  rp, X509 *cert) 
2520: 7b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 44  {.    STACK_OF(D
2530: 49 53 54 5f 50 4f 49 4e 54 29 20 2a 63 72 6c 3b  IST_POINT) *crl;
2540: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65  .    Tcl_Obj *re
2550: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  sultObj = Tcl_Ne
2560: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
2570: 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75  );..    if (resu
2580: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ltObj == NULL) {
2590: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
25a0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 63     }..    if ((c
25b0: 72 6c 20 3d 20 58 35 30 39 5f 67 65 74 5f 65 78  rl = X509_get_ex
25c0: 74 5f 64 32 69 28 63 65 72 74 2c 20 4e 49 44 5f  t_d2i(cert, NID_
25d0: 63 72 6c 5f 64 69 73 74 72 69 62 75 74 69 6f 6e  crl_distribution
25e0: 5f 70 6f 69 6e 74 73 2c 20 4e 55 4c 4c 2c 20 4e  _points, NULL, N
25f0: 55 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  ULL)) != NULL) {
2600: 0a 09 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b 20  ..for (int i=0; 
2610: 69 20 3c 20 73 6b 5f 44 49 53 54 5f 50 4f 49 4e  i < sk_DIST_POIN
2620: 54 5f 6e 75 6d 28 63 72 6c 29 3b 20 69 2b 2b 29  T_num(crl); i++)
2630: 20 7b 0a 09 20 20 20 20 44 49 53 54 5f 50 4f 49   {..    DIST_POI
2640: 4e 54 20 2a 64 70 20 3d 20 73 6b 5f 44 49 53 54  NT *dp = sk_DIST
2650: 5f 50 4f 49 4e 54 5f 76 61 6c 75 65 28 63 72 6c  _POINT_value(crl
2660: 2c 20 69 29 3b 0a 09 20 20 20 20 44 49 53 54 5f  , i);..    DIST_
2670: 50 4f 49 4e 54 5f 4e 41 4d 45 20 2a 64 69 73 74  POINT_NAME *dist
2680: 70 6f 69 6e 74 20 3d 20 64 70 2d 3e 64 69 73 74  point = dp->dist
2690: 70 6f 69 6e 74 3b 0a 0a 09 20 20 20 20 69 66 20  point;...    if 
26a0: 28 64 69 73 74 70 6f 69 6e 74 2d 3e 74 79 70 65  (distpoint->type
26b0: 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 66 75   == 0) {.../* fu
26c0: 6c 6c 2d 6e 61 6d 65 20 47 45 4e 45 52 41 4c 49  ll-name GENERALI
26d0: 5a 45 44 4e 41 4d 45 20 2a 2f 0a 09 09 66 6f 72  ZEDNAME */...for
26e0: 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 3c   (int j = 0; j <
26f0: 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45   sk_GENERAL_NAME
2700: 5f 6e 75 6d 28 64 69 73 74 70 6f 69 6e 74 2d 3e  _num(distpoint->
2710: 6e 61 6d 65 2e 66 75 6c 6c 6e 61 6d 65 29 3b 20  name.fullname); 
2720: 6a 2b 2b 29 20 7b 0a 09 09 20 20 20 20 47 45 4e  j++) {...    GEN
2730: 45 52 41 4c 5f 4e 41 4d 45 20 2a 67 65 6e 20 3d  ERAL_NAME *gen =
2740: 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45   sk_GENERAL_NAME
2750: 5f 76 61 6c 75 65 28 64 69 73 74 70 6f 69 6e 74  _value(distpoint
2760: 2d 3e 6e 61 6d 65 2e 66 75 6c 6c 6e 61 6d 65 2c  ->name.fullname,
2770: 20 6a 29 3b 0a 09 09 20 20 20 20 69 6e 74 20 74   j);...    int t
2780: 79 70 65 3b 0a 09 09 20 20 20 20 41 53 4e 31 5f  ype;...    ASN1_
2790: 53 54 52 49 4e 47 20 2a 75 72 69 20 3d 20 47 45  STRING *uri = GE
27a0: 4e 45 52 41 4c 5f 4e 41 4d 45 5f 67 65 74 30 5f  NERAL_NAME_get0_
27b0: 76 61 6c 75 65 28 67 65 6e 2c 20 26 74 79 70 65  value(gen, &type
27c0: 29 3b 0a 09 09 20 20 20 20 69 66 20 28 74 79 70  );...    if (typ
27d0: 65 20 3d 3d 20 47 45 4e 5f 55 52 49 29 20 7b 0a  e == GEN_URI) {.
27e0: 09 09 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ...LAPPEND_STR(i
27f0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
2800: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c  , (char *) NULL,
2810: 20 28 63 68 61 72 20 2a 29 20 41 53 4e 31 5f 53   (char *) ASN1_S
2820: 54 52 49 4e 47 5f 67 65 74 30 5f 64 61 74 61 28  TRING_get0_data(
2830: 75 72 69 29 2c 20 28 54 63 6c 5f 53 69 7a 65 29  uri), (Tcl_Size)
2840: 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c 65 6e   ASN1_STRING_len
2850: 67 74 68 28 75 72 69 29 29 3b 0a 09 09 20 20 20  gth(uri));...   
2860: 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c   }...}..    } el
2870: 73 65 20 69 66 20 28 64 69 73 74 70 6f 69 6e 74  se if (distpoint
2880: 2d 3e 74 79 70 65 20 3d 3d 20 31 29 20 7b 0a 09  ->type == 1) {..
2890: 09 2f 2a 20 72 65 6c 61 74 69 76 65 2d 6e 61 6d  ./* relative-nam
28a0: 65 20 58 35 30 39 4e 41 4d 45 20 2a 2f 0a 09 09  e X509NAME */...
28b0: 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41  STACK_OF(X509_NA
28c0: 4d 45 5f 45 4e 54 52 59 29 20 2a 73 6b 5f 72 65  ME_ENTRY) *sk_re
28d0: 6c 6e 61 6d 65 20 3d 20 64 69 73 74 70 6f 69 6e  lname = distpoin
28e0: 74 2d 3e 6e 61 6d 65 2e 72 65 6c 61 74 69 76 65  t->name.relative
28f0: 6e 61 6d 65 3b 0a 09 09 66 6f 72 20 28 69 6e 74  name;...for (int
2900: 20 6a 20 3d 20 30 3b 20 6a 20 3c 20 73 6b 5f 58   j = 0; j < sk_X
2910: 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 5f 6e  509_NAME_ENTRY_n
2920: 75 6d 28 73 6b 5f 72 65 6c 6e 61 6d 65 29 3b 20  um(sk_relname); 
2930: 6a 2b 2b 29 20 7b 0a 09 09 20 20 20 20 58 35 30  j++) {...    X50
2940: 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 20 2a 65 20  9_NAME_ENTRY *e 
2950: 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 45  = sk_X509_NAME_E
2960: 4e 54 52 59 5f 76 61 6c 75 65 28 73 6b 5f 72 65  NTRY_value(sk_re
2970: 6c 6e 61 6d 65 2c 20 6a 29 3b 0a 09 09 20 20 20  lname, j);...   
2980: 20 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 64 20   ASN1_STRING *d 
2990: 3d 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52  = X509_NAME_ENTR
29a0: 59 5f 67 65 74 5f 64 61 74 61 28 65 29 3b 0a 09  Y_get_data(e);..
29b0: 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
29c0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
29d0: 62 6a 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  bj, (char *) NUL
29e0: 4c 2c 20 28 63 68 61 72 20 2a 29 20 41 53 4e 31  L, (char *) ASN1
29f0: 5f 53 54 52 49 4e 47 5f 64 61 74 61 28 64 29 2c  _STRING_data(d),
2a00: 20 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31   (Tcl_Size) ASN1
2a10: 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 64  _STRING_length(d
2a20: 29 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09  ));...}..    }..
2a30: 7d 0a 09 43 52 4c 5f 44 49 53 54 5f 50 4f 49 4e  }..CRL_DIST_POIN
2a40: 54 53 5f 66 72 65 65 28 63 72 6c 29 3b 0a 20 20  TS_free(crl);.  
2a50: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
2a60: 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a  esultObj;.}../*.
2a70: 20 2a 20 54 6c 73 5f 78 35 30 39 4f 73 63 70 0a   * Tls_x509Oscp.
2a80: 20 2a 09 47 65 74 20 6c 69 73 74 20 6f 66 20 4f   *.Get list of O
2a90: 6e 2d 6c 69 6e 65 20 43 65 72 74 69 66 69 63 61  n-line Certifica
2aa0: 74 65 20 53 74 61 74 75 73 20 50 72 6f 74 6f 63  te Status Protoc
2ab0: 6f 6c 20 28 4f 53 43 50 29 20 55 52 49 73 0a 20  ol (OSCP) URIs. 
2ac0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
2ad0: 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 55 52 49  .Tcl list of URI
2ae0: 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  s. *. * Side eff
2af0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ects:. *.None. *
2b00: 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c  . */.Tcl_Obj *Tl
2b10: 73 5f 78 35 30 39 4f 73 63 70 28 54 63 6c 5f 49  s_x509Oscp(Tcl_I
2b20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58  nterp *interp, X
2b30: 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20  509 *cert) {.   
2b40: 20 53 54 41 43 4b 5f 4f 46 28 4f 50 45 4e 53 53   STACK_OF(OPENSS
2b50: 4c 5f 53 54 52 49 4e 47 29 20 2a 6f 63 73 70 3b  L_STRING) *ocsp;
2b60: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65  .    Tcl_Obj *re
2b70: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  sultObj = Tcl_Ne
2b80: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
2b90: 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75  );..    if (resu
2ba0: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ltObj == NULL) {
2bb0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
2bc0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 6f     }..    if ((o
2bd0: 63 73 70 20 3d 20 58 35 30 39 5f 67 65 74 31 5f  csp = X509_get1_
2be0: 6f 63 73 70 28 63 65 72 74 29 29 20 21 3d 20 4e  ocsp(cert)) != N
2bf0: 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74  ULL) {..for (int
2c00: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 4f   i = 0; i < sk_O
2c10: 50 45 4e 53 53 4c 5f 53 54 52 49 4e 47 5f 6e 75  PENSSL_STRING_nu
2c20: 6d 28 6f 63 73 70 29 3b 20 69 2b 2b 29 20 7b 0a  m(ocsp); i++) {.
2c30: 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
2c40: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
2c50: 62 6a 2c 20 4e 55 4c 4c 2c 20 73 6b 5f 4f 50 45  bj, NULL, sk_OPE
2c60: 4e 53 53 4c 5f 53 54 52 49 4e 47 5f 76 61 6c 75  NSSL_STRING_valu
2c70: 65 28 6f 63 73 70 2c 20 69 29 2c 20 2d 31 29 3b  e(ocsp, i), -1);
2c80: 0a 09 7d 0a 09 58 35 30 39 5f 65 6d 61 69 6c 5f  ..}..X509_email_
2c90: 66 72 65 65 28 6f 63 73 70 29 3b 0a 20 20 20 20  free(ocsp);.    
2ca0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  }.    return res
2cb0: 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  ultObj;.}../*. *
2cc0: 20 54 6c 73 5f 78 35 30 39 43 61 49 73 73 75 65   Tls_x509CaIssue
2cd0: 72 73 20 2d 2d 0a 20 2a 09 47 65 74 20 6c 69 73  rs --. *.Get lis
2ce0: 74 20 6f 66 20 43 65 72 74 69 66 69 63 61 74 65  t of Certificate
2cf0: 20 41 75 74 68 6f 72 69 74 79 20 28 43 41 29 20   Authority (CA) 
2d00: 49 73 73 75 65 72 20 55 52 49 73 0a 20 2a 0a 20  Issuer URIs. *. 
2d10: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63  * Results:. *.Tc
2d20: 6c 20 6c 69 73 74 20 6f 66 20 43 41 20 69 73 73  l list of CA iss
2d30: 75 65 72 20 55 52 49 73 0a 20 2a 0a 20 2a 20 53  uer URIs. *. * S
2d40: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
2d50: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 54 63 6c 5f  None. *. */.Tcl_
2d60: 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 43 61 49  Obj *Tls_x509CaI
2d70: 73 73 75 65 72 73 28 54 63 6c 5f 49 6e 74 65 72  ssuers(Tcl_Inter
2d80: 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20  p *interp, X509 
2d90: 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 53 54 41  *cert) {.    STA
2da0: 43 4b 5f 4f 46 28 41 43 43 45 53 53 5f 44 45 53  CK_OF(ACCESS_DES
2db0: 43 52 49 50 54 49 4f 4e 29 20 2a 61 64 73 3b 0a  CRIPTION) *ads;.
2dc0: 20 20 20 20 41 43 43 45 53 53 5f 44 45 53 43 52      ACCESS_DESCR
2dd0: 49 50 54 49 4f 4e 20 2a 61 64 3b 0a 20 20 20 20  IPTION *ad;.    
2de0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f  Tcl_Obj *resultO
2df0: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  bj = Tcl_NewList
2e00: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20  Obj(0, NULL);.  
2e10: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2e20: 2a 62 75 66 3b 0a 0a 20 20 20 20 69 66 20 28 72  *buf;..    if (r
2e30: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c  esultObj == NULL
2e40: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  ) {..return NULL
2e50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
2e60: 28 28 61 64 73 20 3d 20 58 35 30 39 5f 67 65 74  ((ads = X509_get
2e70: 5f 65 78 74 5f 64 32 69 28 63 65 72 74 2c 20 4e  _ext_d2i(cert, N
2e80: 49 44 5f 69 6e 66 6f 5f 61 63 63 65 73 73 2c 20  ID_info_access, 
2e90: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20  NULL, NULL)) != 
2ea0: 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e  NULL) {..for (in
2eb0: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f  t i = 0; i < sk_
2ec0: 41 43 43 45 53 53 5f 44 45 53 43 52 49 50 54 49  ACCESS_DESCRIPTI
2ed0: 4f 4e 5f 6e 75 6d 28 61 64 73 29 3b 20 69 2b 2b  ON_num(ads); i++
2ee0: 29 20 7b 0a 09 20 20 20 20 61 64 20 3d 20 73 6b  ) {..    ad = sk
2ef0: 5f 41 43 43 45 53 53 5f 44 45 53 43 52 49 50 54  _ACCESS_DESCRIPT
2f00: 49 4f 4e 5f 76 61 6c 75 65 28 61 64 73 2c 20 69  ION_value(ads, i
2f10: 29 3b 0a 09 20 20 20 20 69 66 20 28 4f 42 4a 5f  );..    if (OBJ_
2f20: 6f 62 6a 32 6e 69 64 28 61 64 2d 3e 6d 65 74 68  obj2nid(ad->meth
2f30: 6f 64 29 20 3d 3d 20 4e 49 44 5f 61 64 5f 63 61  od) == NID_ad_ca
2f40: 5f 69 73 73 75 65 72 73 20 26 26 20 61 64 2d 3e  _issuers && ad->
2f50: 6c 6f 63 61 74 69 6f 6e 29 20 7b 0a 09 09 69 66  location) {...if
2f60: 20 28 61 64 2d 3e 6c 6f 63 61 74 69 6f 6e 2d 3e   (ad->location->
2f70: 74 79 70 65 20 3d 3d 20 47 45 4e 5f 55 52 49 29  type == GEN_URI)
2f80: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 69 7a   {...    Tcl_Siz
2f90: 65 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a  e len = (Tcl_Siz
2fa0: 65 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 74  e) ASN1_STRING_t
2fb0: 6f 5f 55 54 46 38 28 26 62 75 66 2c 20 61 64 2d  o_UTF8(&buf, ad-
2fc0: 3e 6c 6f 63 61 74 69 6f 6e 2d 3e 64 2e 75 6e 69  >location->d.uni
2fd0: 66 6f 72 6d 52 65 73 6f 75 72 63 65 49 64 65 6e  formResourceIden
2fe0: 74 69 66 69 65 72 29 3b 0a 09 09 20 20 20 20 54  tifier);...    T
2ff0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3000: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3010: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e  resultObj, Tcl_N
3020: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
3030: 72 20 2a 29 20 62 75 66 2c 20 6c 65 6e 29 29 3b  r *) buf, len));
3040: 0a 09 09 20 20 20 20 4f 50 45 4e 53 53 4c 5f 66  ...    OPENSSL_f
3050: 72 65 65 28 62 75 66 29 3b 0a 09 09 20 20 20 20  ree(buf);...    
3060: 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 20 20 20 20  break;...}..    
3070: 7d 0a 09 7d 0a 09 2f 2a 20 73 6b 5f 41 43 43 45  }..}../* sk_ACCE
3080: 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 5f 70  SS_DESCRIPTION_p
3090: 6f 70 5f 66 72 65 65 28 61 64 73 2c 20 41 43 43  op_free(ads, ACC
30a0: 45 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 5f  ESS_DESCRIPTION_
30b0: 66 72 65 65 29 3b 20 2a 2f 0a 09 41 55 54 48 4f  free); */..AUTHO
30c0: 52 49 54 59 5f 49 4e 46 4f 5f 41 43 43 45 53 53  RITY_INFO_ACCESS
30d0: 5f 66 72 65 65 28 61 64 73 29 3b 0a 20 20 20 20  _free(ads);.    
30e0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  }.    return res
30f0: 75 6c 74 4f 62 6a 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ultObj;.}.../*. 
3100: 2a 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a  * Tls_NewX509Obj
3110: 20 2d 2d 0a 20 2a 09 50 61 72 73 65 73 20 61 20   --. *.Parses a 
3120: 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  X509 certificate
3130: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 63 6f 6e   and returns con
3140: 74 65 6e 74 73 20 61 73 20 61 20 6b 65 79 2d 76  tents as a key-v
3150: 61 6c 75 65 20 54 63 6c 20 6c 69 73 74 2e 0a 20  alue Tcl list.. 
3160: 2a 0a 20 2a 20 52 65 73 75 6c 74 3a 0a 20 2a 09  *. * Result:. *.
3170: 41 20 54 63 6c 20 4c 69 73 74 20 77 69 74 68 20  A Tcl List with 
3180: 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66 69  the X509 certifi
3190: 63 61 74 65 20 69 6e 66 6f 20 61 73 20 61 20 6b  cate info as a k
31a0: 65 79 2d 76 61 6c 75 65 20 6c 69 73 74 0a 20 2a  ey-value list. *
31b0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
31c0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f  :. *.None. *. */
31d0: 0a 0a 54 63 6c 5f 4f 62 6a 2a 0a 54 6c 73 5f 4e  ..Tcl_Obj*.Tls_N
31e0: 65 77 58 35 30 39 4f 62 6a 28 54 63 6c 5f 49 6e  ewX509Obj(Tcl_In
31f0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35  terp *interp, X5
3200: 30 39 20 2a 63 65 72 74 2c 20 69 6e 74 20 61 6c  09 *cert, int al
3210: 6c 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  l) {.    Tcl_Obj
3220: 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63   *resultObj = Tc
3230: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
3240: 4e 55 4c 4c 29 3b 0a 20 20 20 20 42 49 4f 20 2a  NULL);.    BIO *
3250: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49  bio = BIO_new(BI
3260: 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 20 20 20 20  O_s_mem());.    
3270: 69 6e 74 20 6d 64 6e 69 64 2c 20 70 6b 6e 69 64  int mdnid, pknid
3280: 2c 20 62 69 74 73 3b 0a 20 20 20 20 54 63 6c 5f  , bits;.    Tcl_
3290: 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 75 6e  Size len;.    un
32a0: 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b  signed int ulen;
32b0: 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 78 66  .    uint32_t xf
32c0: 6c 61 67 73 3b 0a 20 20 20 20 63 68 61 72 20 62  lags;.    char b
32d0: 75 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 20  uffer[BUFSIZ];. 
32e0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
32f0: 20 6d 64 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53   md[EVP_MAX_MD_S
3300: 49 5a 45 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e  IZE];.    unsign
3310: 65 64 20 6c 6f 6e 67 20 66 6c 61 67 73 20 3d 20  ed long flags = 
3320: 58 4e 5f 46 4c 41 47 5f 52 46 43 32 32 35 33 20  XN_FLAG_RFC2253 
3330: 7c 20 41 53 4e 31 5f 53 54 52 46 4c 47 53 5f 55  | ASN1_STRFLGS_U
3340: 54 46 38 5f 43 4f 4e 56 45 52 54 3b 0a 20 20 20  TF8_CONVERT;.   
3350: 20 66 6c 61 67 73 20 26 3d 20 7e 41 53 4e 31 5f   flags &= ~ASN1_
3360: 53 54 52 46 4c 47 53 5f 45 53 43 5f 4d 53 42 3b  STRFLGS_ESC_MSB;
3370: 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70  ..    if (interp
3380: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 65 72 74   == NULL || cert
3390: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62 69 6f 20   == NULL || bio 
33a0: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 65 73 75 6c  == NULL || resul
33b0: 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tObj == NULL) {.
33c0: 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e  .Tcl_DecrRefCoun
33d0: 74 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 09 42  t(resultObj);..B
33e0: 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 72  IO_free(bio);..r
33f0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
3400: 7d 0a 0a 20 20 20 20 2f 2a 20 53 69 67 6e 61 74  }..    /* Signat
3410: 75 72 65 20 61 6c 67 6f 72 69 74 68 6d 20 61 6e  ure algorithm an
3420: 64 20 76 61 6c 75 65 20 2d 20 52 46 43 20 35 32  d value - RFC 52
3430: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 31  80 section 4.1.1
3440: 2e 32 20 61 6e 64 20 34 2e 31 2e 31 2e 33 20 2a  .2 and 4.1.1.3 *
3450: 2f 0a 20 20 20 20 2f 2a 20 73 69 67 6e 61 74 75  /.    /* signatu
3460: 72 65 41 6c 67 6f 72 69 74 68 6d 20 69 73 20 74  reAlgorithm is t
3470: 68 65 20 69 64 20 6f 66 20 74 68 65 20 63 72 79  he id of the cry
3480: 70 74 6f 67 72 61 70 68 69 63 20 61 6c 67 6f 72  ptographic algor
3490: 69 74 68 6d 20 75 73 65 64 20 62 79 20 74 68 65  ithm used by the
34a0: 0a 09 43 41 20 74 6f 20 73 69 67 6e 20 74 68 69  ..CA to sign thi
34b0: 73 20 63 65 72 74 2e 20 73 69 67 6e 61 74 75 72  s cert. signatur
34c0: 65 56 61 6c 75 65 20 69 73 20 74 68 65 20 64 69  eValue is the di
34d0: 67 69 74 61 6c 20 73 69 67 6e 61 74 75 72 65 20  gital signature 
34e0: 63 6f 6d 70 75 74 65 64 0a 09 75 70 6f 6e 20 74  computed..upon t
34f0: 68 65 20 41 53 4e 2e 31 20 44 45 52 20 65 6e 63  he ASN.1 DER enc
3500: 6f 64 65 64 20 74 62 73 43 65 72 74 69 66 69 63  oded tbsCertific
3510: 61 74 65 2e 20 2a 2f 0a 20 20 20 20 7b 0a 09 63  ate. */.    {..c
3520: 6f 6e 73 74 20 58 35 30 39 5f 41 4c 47 4f 52 20  onst X509_ALGOR 
3530: 2a 73 69 67 5f 61 6c 67 3b 0a 09 63 6f 6e 73 74  *sig_alg;..const
3540: 20 41 53 4e 31 5f 42 49 54 5f 53 54 52 49 4e 47   ASN1_BIT_STRING
3550: 20 2a 73 69 67 3b 0a 09 69 6e 74 20 73 69 67 5f   *sig;..int sig_
3560: 6e 69 64 3b 0a 0a 09 58 35 30 39 5f 67 65 74 30  nid;...X509_get0
3570: 5f 73 69 67 6e 61 74 75 72 65 28 26 73 69 67 2c  _signature(&sig,
3580: 20 26 73 69 67 5f 61 6c 67 2c 20 63 65 72 74 29   &sig_alg, cert)
3590: 3b 0a 09 2f 2a 20 73 69 67 5f 6e 69 64 20 3d 20  ;../* sig_nid = 
35a0: 58 35 30 39 5f 67 65 74 5f 73 69 67 6e 61 74 75  X509_get_signatu
35b0: 72 65 5f 6e 69 64 28 63 65 72 74 29 20 2a 2f 0a  re_nid(cert) */.
35c0: 09 73 69 67 5f 6e 69 64 20 3d 20 4f 42 4a 5f 6f  .sig_nid = OBJ_o
35d0: 62 6a 32 6e 69 64 28 73 69 67 5f 61 6c 67 2d 3e  bj2nid(sig_alg->
35e0: 61 6c 67 6f 72 69 74 68 6d 29 3b 0a 09 4c 41 50  algorithm);..LAP
35f0: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
3600: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67   resultObj, "sig
3610: 6e 61 74 75 72 65 41 6c 67 6f 72 69 74 68 6d 22  natureAlgorithm"
3620: 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 73 69 67  , OBJ_nid2ln(sig
3630: 5f 6e 69 64 29 2c 20 2d 31 29 3b 0a 09 6c 65 6e  _nid), -1);..len
3640: 20 3d 20 28 73 69 67 5f 6e 69 64 20 21 3d 20 4e   = (sig_nid != N
3650: 49 44 5f 75 6e 64 65 66 29 20 3f 20 53 74 72 69  ID_undef) ? Stri
3660: 6e 67 5f 74 6f 5f 48 65 78 28 73 69 67 2d 3e 64  ng_to_Hex(sig->d
3670: 61 74 61 2c 20 73 69 67 2d 3e 6c 65 6e 67 74 68  ata, sig->length
3680: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
3690: 20 2a 29 20 62 75 66 66 65 72 2c 20 42 55 46 53   *) buffer, BUFS
36a0: 49 5a 29 20 3a 20 30 3b 0a 09 4c 41 50 50 45 4e  IZ) : 0;..LAPPEN
36b0: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65  D_STR(interp, re
36c0: 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74  sultObj, "signat
36d0: 75 72 65 56 61 6c 75 65 22 2c 20 62 75 66 66 65  ureValue", buffe
36e0: 72 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a  r, len);.    }..
36f0: 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 20 6f      /* Version o
3700: 66 20 74 68 65 20 65 6e 63 6f 64 65 64 20 63 65  f the encoded ce
3710: 72 74 69 66 69 63 61 74 65 20 2d 20 52 46 43 20  rtificate - RFC 
3720: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31  5280 section 4.1
3730: 2e 32 2e 31 20 2a 2f 0a 20 20 20 20 4c 41 50 50  .2.1 */.    LAPP
3740: 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c  END_LONG(interp,
3750: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 76 65 72   resultObj, "ver
3760: 73 69 6f 6e 22 2c 20 58 35 30 39 5f 67 65 74 5f  sion", X509_get_
3770: 76 65 72 73 69 6f 6e 28 63 65 72 74 29 2b 31 29  version(cert)+1)
3780: 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 69 71 75 65  ;..    /* Unique
3790: 20 6e 75 6d 62 65 72 20 61 73 73 69 67 6e 65 64   number assigned
37a0: 20 62 79 20 43 41 20 74 6f 20 63 65 72 74 69 66   by CA to certif
37b0: 69 63 61 74 65 20 2d 20 52 46 43 20 35 32 38 30  icate - RFC 5280
37c0: 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 32   section 4.1.2.2
37d0: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49   */.    len = BI
37e0: 4f 5f 74 6f 5f 42 75 66 66 65 72 28 69 32 61 5f  O_to_Buffer(i2a_
37f0: 41 53 4e 31 5f 49 4e 54 45 47 45 52 28 62 69 6f  ASN1_INTEGER(bio
3800: 2c 20 58 35 30 39 5f 67 65 74 30 5f 73 65 72 69  , X509_get0_seri
3810: 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 29 2c  alNumber(cert)),
3820: 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55   bio, buffer, BU
3830: 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45  FSIZ);.    LAPPE
3840: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72  ND_STR(interp, r
3850: 65 73 75 6c 74 4f 62 6a 2c 20 22 73 65 72 69 61  esultObj, "seria
3860: 6c 4e 75 6d 62 65 72 22 2c 20 62 75 66 66 65 72  lNumber", buffer
3870: 2c 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  , len);..    /* 
3880: 53 69 67 6e 61 74 75 72 65 20 61 6c 67 6f 72 69  Signature algori
3890: 74 68 6d 20 75 73 65 64 20 62 79 20 74 68 65 20  thm used by the 
38a0: 43 41 20 74 6f 20 73 69 67 6e 20 74 68 65 20 63  CA to sign the c
38b0: 65 72 74 69 66 69 63 61 74 65 2e 20 4d 75 73 74  ertificate. Must
38c0: 20 6d 61 74 63 68 0a 09 73 69 67 6e 61 74 75 72   match..signatur
38d0: 65 41 6c 67 6f 72 69 74 68 6d 2e 20 52 46 43 20  eAlgorithm. RFC 
38e0: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31  5280 section 4.1
38f0: 2e 32 2e 33 20 2a 2f 0a 20 20 20 20 4c 41 50 50  .2.3 */.    LAPP
3900: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
3910: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e  resultObj, "sign
3920: 61 74 75 72 65 22 2c 20 4f 42 4a 5f 6e 69 64 32  ature", OBJ_nid2
3930: 6c 6e 28 58 35 30 39 5f 67 65 74 5f 73 69 67 6e  ln(X509_get_sign
3940: 61 74 75 72 65 5f 6e 69 64 28 63 65 72 74 29 29  ature_nid(cert))
3950: 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  , -1);..    /* I
3960: 73 73 75 65 72 20 69 64 65 6e 74 69 66 69 65 73  ssuer identifies
3970: 20 74 68 65 20 65 6e 74 69 74 79 20 74 68 61 74   the entity that
3980: 20 73 69 67 6e 65 64 20 61 6e 64 20 69 73 73 75   signed and issu
3990: 65 64 20 74 68 65 20 63 65 72 74 2e 20 52 46 43  ed the cert. RFC
39a0: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
39b0: 31 2e 32 2e 34 20 2a 2f 0a 20 20 20 20 6c 65 6e  1.2.4 */.    len
39c0: 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72   = BIO_to_Buffer
39d0: 28 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e 74  (X509_NAME_print
39e0: 5f 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67 65  _ex(bio, X509_ge
39f0: 74 5f 69 73 73 75 65 72 5f 6e 61 6d 65 28 63 65  t_issuer_name(ce
3a00: 72 74 29 2c 20 30 2c 20 66 6c 61 67 73 29 2c 20  rt), 0, flags), 
3a10: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46  bio, buffer, BUF
3a20: 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  SIZ);.    LAPPEN
3a30: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65  D_STR(interp, re
3a40: 73 75 6c 74 4f 62 6a 2c 20 22 69 73 73 75 65 72  sultObj, "issuer
3a50: 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b  ", buffer, len);
3a60: 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69  ..    /* Certifi
3a70: 63 61 74 65 20 76 61 6c 69 64 69 74 79 20 70 65  cate validity pe
3a80: 72 69 6f 64 20 69 73 20 74 68 65 20 69 6e 74 65  riod is the inte
3a90: 72 76 61 6c 20 74 68 65 20 43 41 20 77 61 72 72  rval the CA warr
3aa0: 61 6e 74 73 20 74 68 61 74 20 69 74 20 77 69 6c  ants that it wil
3ab0: 6c 0a 09 6d 61 69 6e 74 61 69 6e 20 69 6e 66 6f  l..maintain info
3ac0: 20 6f 6e 20 74 68 65 20 73 74 61 74 75 73 20 6f   on the status o
3ad0: 66 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  f the certificat
3ae0: 65 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74  e. RFC 5280 sect
3af0: 69 6f 6e 20 34 2e 31 2e 32 2e 35 20 2a 2f 0a 20  ion 4.1.2.5 */. 
3b00: 20 20 20 2f 2a 20 47 65 74 20 56 61 6c 69 64 69     /* Get Validi
3b10: 74 79 20 2d 20 4e 6f 74 20 42 65 66 6f 72 65 20  ty - Not Before 
3b20: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f  */.    len = BIO
3b30: 5f 74 6f 5f 42 75 66 66 65 72 28 41 53 4e 31 5f  _to_Buffer(ASN1_
3b40: 54 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c 20  TIME_print(bio, 
3b50: 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74 42 65 66  X509_get0_notBef
3b60: 6f 72 65 28 63 65 72 74 29 29 2c 20 62 69 6f 2c  ore(cert)), bio,
3b70: 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29   buffer, BUFSIZ)
3b80: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  ;.    LAPPEND_ST
3b90: 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  R(interp, result
3ba0: 4f 62 6a 2c 20 22 6e 6f 74 42 65 66 6f 72 65 22  Obj, "notBefore"
3bb0: 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a  , buffer, len);.
3bc0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 56 61 6c 69  .    /* Get Vali
3bd0: 64 69 74 79 20 2d 20 4e 6f 74 20 41 66 74 65 72  dity - Not After
3be0: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49   */.    len = BI
3bf0: 4f 5f 74 6f 5f 42 75 66 66 65 72 28 41 53 4e 31  O_to_Buffer(ASN1
3c00: 5f 54 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c  _TIME_print(bio,
3c10: 20 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74 41 66   X509_get0_notAf
3c20: 74 65 72 28 63 65 72 74 29 29 2c 20 62 69 6f 2c  ter(cert)), bio,
3c30: 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29   buffer, BUFSIZ)
3c40: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  ;.    LAPPEND_ST
3c50: 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  R(interp, result
3c60: 4f 62 6a 2c 20 22 6e 6f 74 41 66 74 65 72 22 2c  Obj, "notAfter",
3c70: 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a   buffer, len);..
3c80: 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 69      /* Subject i
3c90: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 65 6e  dentifies the en
3ca0: 74 69 74 79 20 61 73 73 6f 63 69 61 74 65 64 20  tity associated 
3cb0: 77 69 74 68 20 74 68 65 20 70 75 62 6c 69 63 20  with the public 
3cc0: 6b 65 79 20 73 74 6f 72 65 64 20 69 6e 0a 09 74  key stored in..t
3cd0: 68 65 20 73 75 62 6a 65 63 74 20 70 75 62 6c 69  he subject publi
3ce0: 63 20 6b 65 79 20 66 69 65 6c 64 2e 20 52 46 43  c key field. RFC
3cf0: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
3d00: 31 2e 32 2e 36 20 2a 2f 0a 20 20 20 20 6c 65 6e  1.2.6 */.    len
3d10: 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72   = BIO_to_Buffer
3d20: 28 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e 74  (X509_NAME_print
3d30: 5f 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67 65  _ex(bio, X509_ge
3d40: 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63  t_subject_name(c
3d50: 65 72 74 29 2c 20 30 2c 20 66 6c 61 67 73 29 2c  ert), 0, flags),
3d60: 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55   bio, buffer, BU
3d70: 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45  FSIZ);.    LAPPE
3d80: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72  ND_STR(interp, r
3d90: 65 73 75 6c 74 4f 62 6a 2c 20 22 73 75 62 6a 65  esultObj, "subje
3da0: 63 74 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e  ct", buffer, len
3db0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 48 41 31 20  );..    /* SHA1 
3dc0: 44 69 67 65 73 74 20 28 46 69 6e 67 65 72 70 72  Digest (Fingerpr
3dd0: 69 6e 74 29 20 6f 66 20 63 65 72 74 20 2d 20 44  int) of cert - D
3de0: 45 52 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ER representatio
3df0: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35 30  n */.    if (X50
3e00: 39 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 45  9_digest(cert, E
3e10: 56 50 5f 73 68 61 31 28 29 2c 20 6d 64 2c 20 26  VP_sha1(), md, &
3e20: 75 6c 65 6e 29 29 20 7b 0a 09 6c 65 6e 20 3d 20  ulen)) {..len = 
3e30: 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 6d 64  String_to_Hex(md
3e40: 2c 20 28 69 6e 74 29 20 75 6c 65 6e 2c 20 28 75  , (int) ulen, (u
3e50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
3e60: 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b  buffer, BUFSIZ);
3e70: 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
3e80: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
3e90: 20 22 73 68 61 31 5f 68 61 73 68 22 2c 20 62 75   "sha1_hash", bu
3ea0: 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  ffer, len);.    
3eb0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 48 41 32 35 36  }..    /* SHA256
3ec0: 20 44 69 67 65 73 74 20 28 46 69 6e 67 65 72 70   Digest (Fingerp
3ed0: 72 69 6e 74 29 20 6f 66 20 63 65 72 74 20 2d 20  rint) of cert - 
3ee0: 44 45 52 20 72 65 70 72 65 73 65 6e 74 61 74 69  DER representati
3ef0: 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35  on */.    if (X5
3f00: 30 39 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20  09_digest(cert, 
3f10: 45 56 50 5f 73 68 61 32 35 36 28 29 2c 20 6d 64  EVP_sha256(), md
3f20: 2c 20 26 75 6c 65 6e 29 29 20 7b 0a 09 6c 65 6e  , &ulen)) {..len
3f30: 20 3d 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78   = String_to_Hex
3f40: 28 6d 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e 2c  (md, (int) ulen,
3f50: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
3f60: 2a 29 20 62 75 66 66 65 72 2c 20 42 55 46 53 49  *) buffer, BUFSI
3f70: 5a 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  Z);..LAPPEND_STR
3f80: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
3f90: 62 6a 2c 20 22 73 68 61 32 35 36 5f 68 61 73 68  bj, "sha256_hash
3fa0: 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b  ", buffer, len);
3fb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
3fc0: 75 62 6a 65 63 74 20 50 75 62 6c 69 63 20 4b 65  ubject Public Ke
3fd0: 79 20 49 6e 66 6f 20 73 70 65 63 69 66 69 65 73  y Info specifies
3fe0: 20 74 68 65 20 70 75 62 6c 69 63 20 6b 65 79 20   the public key 
3ff0: 61 6e 64 20 69 64 65 6e 74 69 66 69 65 73 20 74  and identifies t
4000: 68 65 0a 09 61 6c 67 6f 72 69 74 68 6d 20 77 69  he..algorithm wi
4010: 74 68 20 77 68 69 63 68 20 74 68 65 20 6b 65 79  th which the key
4020: 20 69 73 20 75 73 65 64 2e 20 52 46 43 20 35 32   is used. RFC 52
4030: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32  80 section 4.1.2
4040: 2e 37 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35  .7 */.    if (X5
4050: 30 39 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65  09_get_signature
4060: 5f 69 6e 66 6f 28 63 65 72 74 2c 20 26 6d 64 6e  _info(cert, &mdn
4070: 69 64 2c 20 26 70 6b 6e 69 64 2c 20 26 62 69 74  id, &pknid, &bit
4080: 73 2c 20 26 78 66 6c 61 67 73 29 29 20 7b 0a 09  s, &xflags)) {..
4090: 41 53 4e 31 5f 42 49 54 5f 53 54 52 49 4e 47 20  ASN1_BIT_STRING 
40a0: 2a 6b 65 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20  *key;..unsigned 
40b0: 69 6e 74 20 6e 3b 0a 0a 09 4c 41 50 50 45 4e 44  int n;...LAPPEND
40c0: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73  _STR(interp, res
40d0: 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 69 6e 67  ultObj, "signing
40e0: 44 69 67 65 73 74 22 2c 20 4f 42 4a 5f 6e 69 64  Digest", OBJ_nid
40f0: 32 6c 6e 28 6d 64 6e 69 64 29 2c 20 2d 31 29 3b  2ln(mdnid), -1);
4100: 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
4110: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
4120: 20 22 70 75 62 6c 69 63 4b 65 79 41 6c 67 6f 72   "publicKeyAlgor
4130: 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c  ithm", OBJ_nid2l
4140: 6e 28 70 6b 6e 69 64 29 2c 20 2d 31 29 3b 0a 09  n(pknid), -1);..
4150: 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
4160: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
4170: 62 69 74 73 22 2c 20 62 69 74 73 29 3b 20 2f 2a  bits", bits); /*
4180: 20 45 66 66 65 63 74 69 76 65 20 73 65 63 75 72   Effective secur
4190: 69 74 79 20 62 69 74 73 20 2a 2f 0a 0a 09 6b 65  ity bits */...ke
41a0: 79 20 3d 20 58 35 30 39 5f 67 65 74 30 5f 70 75  y = X509_get0_pu
41b0: 62 6b 65 79 5f 62 69 74 73 74 72 28 63 65 72 74  bkey_bitstr(cert
41c0: 29 3b 0a 09 6c 65 6e 20 3d 20 53 74 72 69 6e 67  );..len = String
41d0: 5f 74 6f 5f 48 65 78 28 6b 65 79 2d 3e 64 61 74  _to_Hex(key->dat
41e0: 61 2c 20 6b 65 79 2d 3e 6c 65 6e 67 74 68 2c 20  a, key->length, 
41f0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
4200: 29 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a  ) buffer, BUFSIZ
4210: 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
4220: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
4230: 6a 2c 20 22 70 75 62 6c 69 63 4b 65 79 22 2c 20  j, "publicKey", 
4240: 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a 09  buffer, len);...
4250: 6c 65 6e 20 3d 20 30 3b 0a 09 69 66 20 28 58 35  len = 0;..if (X5
4260: 30 39 5f 70 75 62 6b 65 79 5f 64 69 67 65 73 74  09_pubkey_digest
4270: 28 63 65 72 74 2c 20 45 56 50 5f 67 65 74 5f 64  (cert, EVP_get_d
4280: 69 67 65 73 74 62 79 6e 69 64 28 70 6b 6e 69 64  igestbynid(pknid
4290: 29 2c 20 6d 64 2c 20 26 6e 29 29 20 7b 0a 09 20  ), md, &n)) {.. 
42a0: 20 20 20 6c 65 6e 20 3d 20 53 74 72 69 6e 67 5f     len = String_
42b0: 74 6f 5f 48 65 78 28 6d 64 2c 20 28 69 6e 74 29  to_Hex(md, (int)
42c0: 20 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68   n, (unsigned ch
42d0: 61 72 20 2a 29 20 62 75 66 66 65 72 2c 20 42 55  ar *) buffer, BU
42e0: 46 53 49 5a 29 3b 0a 09 7d 0a 09 4c 41 50 50 45  FSIZ);..}..LAPPE
42f0: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72  ND_STR(interp, r
4300: 65 73 75 6c 74 4f 62 6a 2c 20 22 70 75 62 6c 69  esultObj, "publi
4310: 63 4b 65 79 48 61 73 68 22 2c 20 62 75 66 66 65  cKeyHash", buffe
4320: 72 2c 20 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 64 69  r, len);.../* di
4330: 67 65 73 74 20 6f 66 20 74 68 65 20 44 45 52 20  gest of the DER 
4340: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
4350: 66 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  f the certificat
4360: 65 20 2a 2f 0a 09 6c 65 6e 20 3d 20 30 3b 0a 09  e */..len = 0;..
4370: 69 66 20 28 58 35 30 39 5f 64 69 67 65 73 74 28  if (X509_digest(
4380: 63 65 72 74 2c 20 45 56 50 5f 67 65 74 5f 64 69  cert, EVP_get_di
4390: 67 65 73 74 62 79 6e 69 64 28 6d 64 6e 69 64 29  gestbynid(mdnid)
43a0: 2c 20 6d 64 2c 20 26 6e 29 29 20 7b 0a 09 20 20  , md, &n)) {..  
43b0: 20 20 6c 65 6e 20 3d 20 53 74 72 69 6e 67 5f 74    len = String_t
43c0: 6f 5f 48 65 78 28 6d 64 2c 20 28 69 6e 74 29 20  o_Hex(md, (int) 
43d0: 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  n, (unsigned cha
43e0: 72 20 2a 29 20 62 75 66 66 65 72 2c 20 42 55 46  r *) buffer, BUF
43f0: 53 49 5a 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e  SIZ);..}..LAPPEN
4400: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65  D_STR(interp, re
4410: 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74  sultObj, "signat
4420: 75 72 65 48 61 73 68 22 2c 20 62 75 66 66 65 72  ureHash", buffer
4430: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20  , len);.    }.. 
4440: 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63 61 74     /* Certificat
4450: 65 20 50 75 72 70 6f 73 65 2e 20 43 61 6c 6c 20  e Purpose. Call 
4460: 62 65 66 6f 72 65 20 63 68 65 63 6b 69 6e 67 20  before checking 
4470: 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20  for extensions. 
4480: 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  */.    LAPPEND_S
4490: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  TR(interp, resul
44a0: 74 4f 62 6a 2c 20 22 70 75 72 70 6f 73 65 22 2c  tObj, "purpose",
44b0: 20 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 65   Tls_x509Purpose
44c0: 28 63 65 72 74 29 2c 20 2d 31 29 3b 0a 20 20 20  (cert), -1);.   
44d0: 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74   LAPPEND_OBJ(int
44e0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
44f0: 22 63 65 72 74 69 66 69 63 61 74 65 50 75 72 70  "certificatePurp
4500: 6f 73 65 22 2c 20 54 6c 73 5f 78 35 30 39 50 75  ose", Tls_x509Pu
4510: 72 70 6f 73 65 73 28 69 6e 74 65 72 70 2c 20 63  rposes(interp, c
4520: 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  ert));..    /* G
4530: 65 74 20 65 78 74 65 6e 73 69 6f 6e 73 20 66 6c  et extensions fl
4540: 61 67 73 20 2a 2f 0a 20 20 20 20 78 66 6c 61 67  ags */.    xflag
4550: 73 20 3d 20 58 35 30 39 5f 67 65 74 5f 65 78 74  s = X509_get_ext
4560: 65 6e 73 69 6f 6e 5f 66 6c 61 67 73 28 63 65 72  ension_flags(cer
4570: 74 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  t);.    LAPPEND_
4580: 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 73 75  INT(interp, resu
4590: 6c 74 4f 62 6a 2c 20 22 65 78 74 46 6c 61 67 73  ltObj, "extFlags
45a0: 22 2c 20 78 66 6c 61 67 73 29 3b 0a 0a 09 2f 2a  ", xflags);.../*
45b0: 20 43 68 65 63 6b 20 69 66 20 63 65 72 74 20 77   Check if cert w
45c0: 61 73 20 69 73 73 75 65 64 20 62 79 20 43 41 20  as issued by CA 
45d0: 63 65 72 74 20 69 73 73 75 65 72 20 6f 72 20 73  cert issuer or s
45e0: 65 6c 66 20 73 69 67 6e 65 64 20 2a 2f 0a 20 20  elf signed */.  
45f0: 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69    LAPPEND_BOOL(i
4600: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
4610: 2c 20 22 73 65 6c 66 49 73 73 75 65 64 22 2c 20  , "selfIssued", 
4620: 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f  xflags & EXFLAG_
4630: 53 49 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  SI);.    LAPPEND
4640: 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65  _BOOL(interp, re
4650: 73 75 6c 74 4f 62 6a 2c 20 22 73 65 6c 66 53 69  sultObj, "selfSi
4660: 67 6e 65 64 22 2c 20 78 66 6c 61 67 73 20 26 20  gned", xflags & 
4670: 45 58 46 4c 41 47 5f 53 53 29 3b 0a 20 20 20 20  EXFLAG_SS);.    
4680: 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
4690: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
46a0: 22 69 73 50 72 6f 78 79 43 65 72 74 22 2c 20 78  "isProxyCert", x
46b0: 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 50  flags & EXFLAG_P
46c0: 52 4f 58 59 29 3b 0a 20 20 20 20 4c 41 50 50 45  ROXY);.    LAPPE
46d0: 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
46e0: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74 49  resultObj, "extI
46f0: 6e 76 61 6c 69 64 22 2c 20 78 66 6c 61 67 73 20  nvalid", xflags 
4700: 26 20 45 58 46 4c 41 47 5f 49 4e 56 41 4c 49 44  & EXFLAG_INVALID
4710: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42  );.    LAPPEND_B
4720: 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 75  OOL(interp, resu
4730: 6c 74 4f 62 6a 2c 20 22 69 73 43 41 43 65 72 74  ltObj, "isCACert
4740: 22 2c 20 58 35 30 39 5f 63 68 65 63 6b 5f 63 61  ", X509_check_ca
4750: 28 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a  (cert));..    /*
4760: 20 54 68 65 20 55 6e 69 71 75 65 20 49 64 73 20   The Unique Ids 
4770: 61 72 65 20 75 73 65 64 20 74 6f 20 68 61 6e 64  are used to hand
4780: 6c 65 20 74 68 65 20 70 6f 73 73 69 62 69 6c 69  le the possibili
4790: 74 79 20 6f 66 20 72 65 75 73 65 20 6f 66 20 73  ty of reuse of s
47a0: 75 62 6a 65 63 74 0a 09 61 6e 64 2f 6f 72 20 69  ubject..and/or i
47b0: 73 73 75 65 72 20 6e 61 6d 65 73 20 6f 76 65 72  ssuer names over
47c0: 20 74 69 6d 65 2e 20 52 46 43 20 35 32 38 30 20   time. RFC 5280 
47d0: 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 38 20  section 4.1.2.8 
47e0: 2a 2f 0a 20 20 20 20 7b 0a 09 63 6f 6e 73 74 20  */.    {..const 
47f0: 41 53 4e 31 5f 42 49 54 5f 53 54 52 49 4e 47 20  ASN1_BIT_STRING 
4800: 2a 69 75 69 64 2c 20 2a 73 75 69 64 3b 0a 20 20  *iuid, *suid;.  
4810: 20 20 20 20 20 20 58 35 30 39 5f 67 65 74 30 5f        X509_get0_
4820: 75 69 64 73 28 63 65 72 74 2c 20 26 69 75 69 64  uids(cert, &iuid
4830: 2c 20 26 73 75 69 64 29 3b 0a 0a 09 54 63 6c 5f  , &suid);...Tcl_
4840: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4850: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73  ment(interp, res
4860: 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53  ultObj, Tcl_NewS
4870: 74 72 69 6e 67 4f 62 6a 28 22 69 73 73 75 65 72  tringObj("issuer
4880: 55 6e 69 71 75 65 49 64 22 2c 20 2d 31 29 29 3b  UniqueId", -1));
4890: 0a 09 69 66 20 28 69 75 69 64 20 21 3d 20 4e 55  ..if (iuid != NU
48a0: 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  LL) {..    Tcl_L
48b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
48c0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ent(interp, resu
48d0: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 42 79  ltObj, Tcl_NewBy
48e0: 74 65 41 72 72 61 79 4f 62 6a 28 28 63 6f 6e 73  teArrayObj((cons
48f0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4900: 2a 29 69 75 69 64 2d 3e 64 61 74 61 2c 20 28 54  *)iuid->data, (T
4910: 63 6c 5f 53 69 7a 65 29 20 69 75 69 64 2d 3e 6c  cl_Size) iuid->l
4920: 65 6e 67 74 68 29 29 3b 0a 09 7d 20 65 6c 73 65  ength));..} else
4930: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
4940: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4950: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
4960: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  bj, Tcl_NewStrin
4970: 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 09  gObj("", -1));..
4980: 7d 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  }...Tcl_ListObjA
4990: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
49a0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
49b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
49c0: 28 22 73 75 62 6a 65 63 74 55 6e 69 71 75 65 49  ("subjectUniqueI
49d0: 64 22 2c 20 2d 31 29 29 3b 0a 09 69 66 20 28 73  d", -1));..if (s
49e0: 75 69 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  uid != NULL) {..
49f0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4a00: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4a10: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
4a20: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
4a30: 4f 62 6a 28 28 63 6f 6e 73 74 20 75 6e 73 69 67  Obj((const unsig
4a40: 6e 65 64 20 63 68 61 72 20 2a 29 73 75 69 64 2d  ned char *)suid-
4a50: 3e 64 61 74 61 2c 20 28 54 63 6c 5f 53 69 7a 65  >data, (Tcl_Size
4a60: 29 20 73 75 69 64 2d 3e 6c 65 6e 67 74 68 29 29  ) suid->length))
4a70: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
4a80: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4a90: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4aa0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c  , resultObj, Tcl
4ab0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22  _NewStringObj(""
4ac0: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d  , -1));..}.    }
4ad0: 0a 0a 20 20 20 20 2f 2a 20 58 35 30 39 20 76 33  ..    /* X509 v3
4ae0: 20 45 78 74 65 6e 73 69 6f 6e 73 20 2d 20 52 46   Extensions - RF
4af0: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34  C 5280 section 4
4b00: 2e 31 2e 32 2e 39 20 2a 2f 0a 20 20 20 20 4c 41  .1.2.9 */.    LA
4b10: 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
4b20: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78  , resultObj, "ex
4b30: 74 43 6f 75 6e 74 22 2c 20 58 35 30 39 5f 67 65  tCount", X509_ge
4b40: 74 5f 65 78 74 5f 63 6f 75 6e 74 28 63 65 72 74  t_ext_count(cert
4b50: 29 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  ));.    LAPPEND_
4b60: 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75  OBJ(interp, resu
4b70: 6c 74 4f 62 6a 2c 20 22 65 78 74 65 6e 73 69 6f  ltObj, "extensio
4b80: 6e 73 22 2c 20 54 6c 73 5f 78 35 30 39 45 78 74  ns", Tls_x509Ext
4b90: 65 6e 73 69 6f 6e 73 28 69 6e 74 65 72 70 2c 20  ensions(interp, 
4ba0: 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  cert));..    /* 
4bb0: 41 75 74 68 6f 72 69 74 79 20 4b 65 79 20 49 64  Authority Key Id
4bc0: 65 6e 74 69 66 69 65 72 20 28 41 4b 49 29 20 69  entifier (AKI) i
4bd0: 73 20 74 68 65 20 53 75 62 6a 65 63 74 20 4b 65  s the Subject Ke
4be0: 79 20 49 64 65 6e 74 69 66 69 65 72 20 28 53 4b  y Identifier (SK
4bf0: 49 29 20 6f 66 0a 09 69 74 73 20 73 69 67 6e 65  I) of..its signe
4c00: 72 20 28 74 68 65 20 43 41 29 2e 20 52 46 43 20  r (the CA). RFC 
4c10: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32  5280 section 4.2
4c20: 2e 31 2e 31 2c 20 4e 49 44 5f 61 75 74 68 6f 72  .1.1, NID_author
4c30: 69 74 79 5f 6b 65 79 5f 69 64 65 6e 74 69 66 69  ity_key_identifi
4c40: 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  er */.    LAPPEN
4c50: 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65  D_OBJ(interp, re
4c60: 73 75 6c 74 4f 62 6a 2c 20 22 61 75 74 68 6f 72  sultObj, "author
4c70: 69 74 79 4b 65 79 49 64 65 6e 74 69 66 69 65 72  ityKeyIdentifier
4c80: 22 2c 0a 09 54 6c 73 5f 78 35 30 39 49 64 65 6e  ",..Tls_x509Iden
4c90: 74 69 66 69 65 72 28 58 35 30 39 5f 67 65 74 30  tifier(X509_get0
4ca0: 5f 61 75 74 68 6f 72 69 74 79 5f 6b 65 79 5f 69  _authority_key_i
4cb0: 64 28 63 65 72 74 29 29 29 3b 0a 0a 20 20 20 20  d(cert)));..    
4cc0: 2f 2a 20 53 75 62 6a 65 63 74 20 4b 65 79 20 49  /* Subject Key I
4cd0: 64 65 6e 74 69 66 69 65 72 20 28 53 4b 49 29 20  dentifier (SKI) 
4ce0: 69 73 20 75 73 65 64 20 74 6f 20 69 64 65 6e 74  is used to ident
4cf0: 69 66 79 20 63 65 72 74 69 66 69 63 61 74 65 73  ify certificates
4d00: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 0a 09 61   that contain..a
4d10: 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 62 6c   particular publ
4d20: 69 63 20 6b 65 79 2e 20 52 46 43 20 35 32 38 30  ic key. RFC 5280
4d30: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 32   section 4.2.1.2
4d40: 2c 20 4e 49 44 5f 73 75 62 6a 65 63 74 5f 6b 65  , NID_subject_ke
4d50: 79 5f 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a  y_identifier */.
4d60: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28      LAPPEND_OBJ(
4d70: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
4d80: 6a 2c 20 22 73 75 62 6a 65 63 74 4b 65 79 49 64  j, "subjectKeyId
4d90: 65 6e 74 69 66 69 65 72 22 2c 0a 09 54 6c 73 5f  entifier",..Tls_
4da0: 78 35 30 39 49 64 65 6e 74 69 66 69 65 72 28 58  x509Identifier(X
4db0: 35 30 39 5f 67 65 74 30 5f 73 75 62 6a 65 63 74  509_get0_subject
4dc0: 5f 6b 65 79 5f 69 64 28 63 65 72 74 29 29 29 3b  _key_id(cert)));
4dd0: 0a 0a 20 20 20 20 2f 2a 20 4b 65 79 20 75 73 61  ..    /* Key usa
4de0: 67 65 20 65 78 74 65 6e 73 69 6f 6e 20 64 65 66  ge extension def
4df0: 69 6e 65 73 20 74 68 65 20 70 75 72 70 6f 73 65  ines the purpose
4e00: 20 28 65 2e 67 2e 2c 20 65 6e 63 69 70 68 65 72   (e.g., encipher
4e10: 6d 65 6e 74 2c 20 73 69 67 6e 61 74 75 72 65 2c  ment, signature,
4e20: 20 63 65 72 74 69 66 69 63 61 74 65 0a 09 73 69   certificate..si
4e30: 67 6e 69 6e 67 29 20 6f 66 20 74 68 65 20 6b 65  gning) of the ke
4e40: 79 20 69 6e 20 74 68 65 20 63 65 72 74 69 66 69  y in the certifi
4e50: 63 61 74 65 2e 20 52 46 43 20 35 32 38 30 20 73  cate. RFC 5280 s
4e60: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 33 2c 20  ection 4.2.1.3, 
4e70: 4e 49 44 5f 6b 65 79 5f 75 73 61 67 65 20 2a 2f  NID_key_usage */
4e80: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a  .    LAPPEND_OBJ
4e90: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
4ea0: 62 6a 2c 20 22 6b 65 79 55 73 61 67 65 22 2c 20  bj, "keyUsage", 
4eb0: 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65  Tls_x509KeyUsage
4ec0: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 78  (interp, cert, x
4ed0: 66 6c 61 67 73 29 29 3b 0a 0a 20 20 20 20 2f 2a  flags));..    /*
4ee0: 20 43 65 72 74 69 66 69 63 61 74 65 20 50 6f 6c   Certificate Pol
4ef0: 69 63 69 65 73 20 2d 20 69 6e 64 69 63 61 74 65  icies - indicate
4f00: 73 20 74 68 65 20 69 73 73 75 69 6e 67 20 43 41  s the issuing CA
4f10: 20 63 6f 6e 73 69 64 65 72 73 20 69 74 73 20 69   considers its i
4f20: 73 73 75 65 72 44 6f 6d 61 69 6e 50 6f 6c 69 63  ssuerDomainPolic
4f30: 79 0a 09 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  y..equivalent to
4f40: 20 74 68 65 20 73 75 62 6a 65 63 74 20 43 41 27   the subject CA'
4f50: 73 20 73 75 62 6a 65 63 74 44 6f 6d 61 69 6e 50  s subjectDomainP
4f60: 6f 6c 69 63 79 2e 20 52 46 43 20 35 32 38 30 20  olicy. RFC 5280 
4f70: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 34 2c  section 4.2.1.4,
4f80: 20 4e 49 44 5f 63 65 72 74 69 66 69 63 61 74 65   NID_certificate
4f90: 5f 70 6f 6c 69 63 69 65 73 20 2a 2f 0a 20 20 20  _policies */.   
4fa0: 20 69 66 20 28 78 66 6c 61 67 73 20 26 20 45 58   if (xflags & EX
4fb0: 46 4c 41 47 5f 49 4e 56 41 4c 49 44 5f 50 4f 4c  FLAG_INVALID_POL
4fc0: 49 43 59 29 20 7b 0a 09 2f 2a 20 52 65 6a 65 63  ICY) {../* Rejec
4fd0: 74 20 63 65 72 74 20 2a 2f 0a 20 20 20 20 7d 0a  t cert */.    }.
4fe0: 0a 20 20 20 20 2f 2a 20 50 6f 6c 69 63 79 20 4d  .    /* Policy M
4ff0: 61 70 70 69 6e 67 73 20 2d 20 52 46 43 20 35 32  appings - RFC 52
5000: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31  80 section 4.2.1
5010: 2e 35 2c 20 4e 49 44 5f 70 6f 6c 69 63 79 5f 6d  .5, NID_policy_m
5020: 61 70 70 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20  appings */..    
5030: 2f 2a 20 53 75 62 6a 65 63 74 20 41 6c 74 65 72  /* Subject Alter
5040: 6e 61 74 69 76 65 20 4e 61 6d 65 20 28 53 41 4e  native Name (SAN
5050: 29 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  ) contains addit
5060: 69 6f 6e 61 6c 20 55 52 4c 73 2c 20 44 4e 53 20  ional URLs, DNS 
5070: 6e 61 6d 65 73 2c 20 6f 72 20 49 50 0a 09 61 64  names, or IP..ad
5080: 64 72 65 73 73 65 73 20 62 6f 75 6e 64 20 74 6f  dresses bound to
5090: 20 63 65 72 74 69 66 69 63 61 74 65 2e 20 52 46   certificate. RF
50a0: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34  C 5280 section 4
50b0: 2e 32 2e 31 2e 36 2c 20 4e 49 44 5f 73 75 62 6a  .2.1.6, NID_subj
50c0: 65 63 74 5f 61 6c 74 5f 6e 61 6d 65 20 2a 2f 0a  ect_alt_name */.
50d0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28      LAPPEND_OBJ(
50e0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
50f0: 6a 2c 20 22 73 75 62 6a 65 63 74 41 6c 74 4e 61  j, "subjectAltNa
5100: 6d 65 22 2c 20 54 6c 73 5f 78 35 30 39 4e 61 6d  me", Tls_x509Nam
5110: 65 73 28 69 6e 74 65 72 70 2c 20 63 65 72 74 2c  es(interp, cert,
5120: 20 4e 49 44 5f 73 75 62 6a 65 63 74 5f 61 6c 74   NID_subject_alt
5130: 5f 6e 61 6d 65 2c 20 62 69 6f 29 29 3b 0a 0a 20  _name, bio));.. 
5140: 20 20 20 2f 2a 20 49 73 73 75 65 72 20 41 6c 74     /* Issuer Alt
5150: 65 72 6e 61 74 69 76 65 20 4e 61 6d 65 20 69 73  ernative Name is
5160: 20 75 73 65 64 20 74 6f 20 61 73 73 6f 63 69 61   used to associa
5170: 74 65 20 49 6e 74 65 72 6e 65 74 20 73 74 79 6c  te Internet styl
5180: 65 20 69 64 65 6e 74 69 74 69 65 73 0a 09 77 69  e identities..wi
5190: 74 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61  th the certifica
51a0: 74 65 20 69 73 73 75 65 72 2e 20 52 46 43 20 35  te issuer. RFC 5
51b0: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e  280 section 4.2.
51c0: 31 2e 37 2c 20 4e 49 44 5f 69 73 73 75 65 72 5f  1.7, NID_issuer_
51d0: 61 6c 74 5f 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  alt_name */.    
51e0: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65  LAPPEND_OBJ(inte
51f0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
5200: 69 73 73 75 65 72 41 6c 74 4e 61 6d 65 22 2c 20  issuerAltName", 
5210: 54 6c 73 5f 78 35 30 39 4e 61 6d 65 73 28 69 6e  Tls_x509Names(in
5220: 74 65 72 70 2c 20 63 65 72 74 2c 20 4e 49 44 5f  terp, cert, NID_
5230: 69 73 73 75 65 72 5f 61 6c 74 5f 6e 61 6d 65 2c  issuer_alt_name,
5240: 20 62 69 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20   bio));..    /* 
5250: 53 75 62 6a 65 63 74 20 44 69 72 65 63 74 6f 72  Subject Director
5260: 79 20 41 74 74 72 69 62 75 74 65 73 20 70 72 6f  y Attributes pro
5270: 76 69 64 65 73 20 69 64 65 6e 74 69 66 69 63 61  vides identifica
5280: 74 69 6f 6e 20 61 74 74 72 69 62 75 74 65 73 20  tion attributes 
5290: 28 65 2e 67 2e 2c 20 6e 61 74 69 6f 6e 61 6c 69  (e.g., nationali
52a0: 74 79 29 0a 09 6f 66 20 74 68 65 20 73 75 62 6a  ty)..of the subj
52b0: 65 63 74 2e 20 52 46 43 20 35 32 38 30 20 73 65  ect. RFC 5280 se
52c0: 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 38 20 28 73  ction 4.2.1.8 (s
52d0: 75 62 6a 65 63 74 44 69 72 65 63 74 6f 72 79 41  ubjectDirectoryA
52e0: 74 74 72 69 62 75 74 65 73 29 20 2a 2f 0a 0a 20  ttributes) */.. 
52f0: 20 20 20 2f 2a 20 42 61 73 69 63 20 43 6f 6e 73     /* Basic Cons
5300: 74 72 61 69 6e 74 73 20 69 64 65 6e 74 69 66 69  traints identifi
5310: 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20 73  es whether the s
5320: 75 62 6a 65 63 74 20 6f 66 20 74 68 65 20 63 65  ubject of the ce
5330: 72 74 20 69 73 20 61 20 43 41 20 61 6e 64 0a 09  rt is a CA and..
5340: 74 68 65 20 6d 61 78 20 64 65 70 74 68 20 6f 66  the max depth of
5350: 20 76 61 6c 69 64 20 63 65 72 74 20 70 61 74 68   valid cert path
5360: 73 20 66 6f 72 20 74 68 69 73 20 63 65 72 74 2e  s for this cert.
5370: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f   RFC 5280 sectio
5380: 6e 20 34 2e 32 2e 31 2e 39 2c 20 4e 49 44 5f 62  n 4.2.1.9, NID_b
5390: 61 73 69 63 5f 63 6f 6e 73 74 72 61 69 6e 74 73  asic_constraints
53a0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 28 78 66   */.    if (!(xf
53b0: 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 50 52  lags & EXFLAG_PR
53c0: 4f 58 59 29 29 20 7b 0a 09 4c 41 50 50 45 4e 44  OXY)) {..LAPPEND
53d0: 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 72 65  _LONG(interp, re
53e0: 73 75 6c 74 4f 62 6a 2c 20 22 70 61 74 68 4c 65  sultObj, "pathLe
53f0: 6e 22 2c 20 58 35 30 39 5f 67 65 74 5f 70 61 74  n", X509_get_pat
5400: 68 6c 65 6e 28 63 65 72 74 29 29 3b 0a 20 20 20  hlen(cert));.   
5410: 20 7d 20 65 6c 73 65 20 7b 0a 09 4c 41 50 50 45   } else {..LAPPE
5420: 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20  ND_LONG(interp, 
5430: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 61 74 68  resultObj, "path
5440: 4c 65 6e 22 2c 20 58 35 30 39 5f 67 65 74 5f 70  Len", X509_get_p
5450: 72 6f 78 79 5f 70 61 74 68 6c 65 6e 28 63 65 72  roxy_pathlen(cer
5460: 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4c  t));.    }.    L
5470: 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
5480: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
5490: 62 61 73 69 63 43 6f 6e 73 74 72 61 69 6e 74 73  basicConstraints
54a0: 43 41 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58  CA", xflags & EX
54b0: 46 4c 41 47 5f 43 41 29 3b 0a 0a 20 20 20 20 2f  FLAG_CA);..    /
54c0: 2a 20 4e 61 6d 65 20 43 6f 6e 73 74 72 61 69 6e  * Name Constrain
54d0: 74 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  ts is only used 
54e0: 69 6e 20 43 41 20 63 65 72 74 73 20 74 6f 20 69  in CA certs to i
54f0: 6e 64 69 63 61 74 65 20 74 68 65 20 6e 61 6d 65  ndicate the name
5500: 20 73 70 61 63 65 20 66 6f 72 0a 09 61 6c 6c 20   space for..all 
5510: 73 75 62 6a 65 63 74 20 6e 61 6d 65 73 20 69 6e  subject names in
5520: 20 73 75 62 73 65 71 75 65 6e 74 20 63 65 72 74   subsequent cert
5530: 69 66 69 63 61 74 65 73 20 69 6e 20 61 20 63 65  ificates in a ce
5540: 72 74 69 66 69 63 61 74 69 6f 6e 20 70 61 74 68  rtification path
5550: 0a 09 4d 55 53 54 20 62 65 20 6c 6f 63 61 74 65  ..MUST be locate
5560: 64 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74  d. RFC 5280 sect
5570: 69 6f 6e 20 34 2e 32 2e 31 2e 31 30 2c 20 4e 49  ion 4.2.1.10, NI
5580: 44 5f 6e 61 6d 65 5f 63 6f 6e 73 74 72 61 69 6e  D_name_constrain
5590: 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 50 6f  ts */..    /* Po
55a0: 6c 69 63 79 20 43 6f 6e 73 74 72 61 69 6e 74 73  licy Constraints
55b0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e   is only used in
55c0: 20 43 41 20 63 65 72 74 73 20 74 6f 20 6c 69 6d   CA certs to lim
55d0: 69 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  it the length of
55e0: 20 61 0a 09 63 65 72 74 20 63 68 61 69 6e 20 66   a..cert chain f
55f0: 6f 72 20 74 68 61 74 20 43 41 2e 20 52 46 43 20  or that CA. RFC 
5600: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32  5280 section 4.2
5610: 2e 31 2e 31 31 2c 20 4e 49 44 5f 70 6f 6c 69 63  .1.11, NID_polic
5620: 79 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  y_constraints */
5630: 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e 64 65  ..    /* Extende
5640: 64 20 4b 65 79 20 55 73 61 67 65 20 69 6e 64 69  d Key Usage indi
5650: 63 61 74 65 73 20 74 68 65 20 70 75 72 70 6f 73  cates the purpos
5660: 65 73 20 74 68 65 20 63 65 72 74 69 66 69 65 64  es the certified
5670: 20 70 75 62 6c 69 63 20 6b 65 79 20 6d 61 79 20   public key may 
5680: 62 65 0a 09 75 73 65 64 2c 20 62 65 79 6f 6e 64  be..used, beyond
5690: 20 74 68 65 20 62 61 73 69 63 20 70 75 72 70 6f   the basic purpo
56a0: 73 65 73 2e 20 52 46 43 20 35 32 38 30 20 73 65  ses. RFC 5280 se
56b0: 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 32 2c 20  ction 4.2.1.12, 
56c0: 4e 49 44 5f 65 78 74 5f 6b 65 79 5f 75 73 61 67  NID_ext_key_usag
56d0: 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44  e */.    LAPPEND
56e0: 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73  _OBJ(interp, res
56f0: 75 6c 74 4f 62 6a 2c 20 22 65 78 74 65 6e 64 65  ultObj, "extende
5700: 64 4b 65 79 55 73 61 67 65 22 2c 20 54 6c 73 5f  dKeyUsage", Tls_
5710: 78 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 28  x509ExtKeyUsage(
5720: 69 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 78 66  interp, cert, xf
5730: 6c 61 67 73 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  lags));..    /* 
5740: 43 52 4c 20 44 69 73 74 72 69 62 75 74 69 6f 6e  CRL Distribution
5750: 20 50 6f 69 6e 74 73 20 69 64 65 6e 74 69 66 69   Points identifi
5760: 65 73 20 77 68 65 72 65 20 43 52 4c 20 69 6e 66  es where CRL inf
5770: 6f 72 6d 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  ormation can be 
5780: 6f 62 74 61 69 6e 65 64 2e 0a 09 52 46 43 20 35  obtained...RFC 5
5790: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e  280 section 4.2.
57a0: 31 2e 31 33 2a 2f 0a 20 20 20 20 4c 41 50 50 45  1.13*/.    LAPPE
57b0: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72  ND_OBJ(interp, r
57c0: 65 73 75 6c 74 4f 62 6a 2c 20 22 63 72 6c 44 69  esultObj, "crlDi
57d0: 73 74 72 69 62 75 74 69 6f 6e 50 6f 69 6e 74 73  stributionPoints
57e0: 22 2c 20 54 6c 73 5f 78 35 30 39 43 72 6c 44 70  ", Tls_x509CrlDp
57f0: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b  (interp, cert));
5800: 0a 0a 20 20 20 20 2f 2a 20 46 72 65 73 68 65 73  ..    /* Freshes
5810: 74 20 43 52 4c 20 65 78 74 65 6e 73 69 6f 6e 20  t CRL extension 
5820: 2a 2f 0a 20 20 20 20 69 66 20 28 78 66 6c 61 67  */.    if (xflag
5830: 73 20 26 20 45 58 46 4c 41 47 5f 46 52 45 53 48  s & EXFLAG_FRESH
5840: 45 53 54 29 20 7b 0a 20 20 20 20 7d 0a 0a 20 20  EST) {.    }..  
5850: 20 20 2f 2a 20 41 75 74 68 6f 72 69 74 79 20 49    /* Authority I
5860: 6e 66 6f 72 6d 61 74 69 6f 6e 20 41 63 63 65 73  nformation Acces
5870: 73 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20  s indicates how 
5880: 74 6f 20 61 63 63 65 73 73 20 69 6e 66 6f 20 61  to access info a
5890: 6e 64 20 73 65 72 76 69 63 65 73 0a 09 66 6f 72  nd services..for
58a0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
58b0: 20 69 73 73 75 65 72 2e 20 52 46 43 20 35 32 38   issuer. RFC 528
58c0: 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 32 2e  0 section 4.2.2.
58d0: 31 2c 20 4e 49 44 5f 69 6e 66 6f 5f 61 63 63 65  1, NID_info_acce
58e0: 73 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4f 6e  ss */..    /* On
58f0: 2d 6c 69 6e 65 20 43 65 72 74 69 66 69 63 61 74  -line Certificat
5900: 65 20 53 74 61 74 75 73 20 50 72 6f 74 6f 63 6f  e Status Protoco
5910: 6c 20 28 4f 53 43 50 29 20 52 65 73 70 6f 6e 64  l (OSCP) Respond
5920: 65 72 73 20 55 52 4c 20 2a 2f 0a 20 20 20 20 4c  ers URL */.    L
5930: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72  APPEND_OBJ(inter
5940: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6f  p, resultObj, "o
5950: 63 73 70 52 65 73 70 6f 6e 64 65 72 73 22 2c 20  cspResponders", 
5960: 54 6c 73 5f 78 35 30 39 4f 73 63 70 28 69 6e 74  Tls_x509Oscp(int
5970: 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20  erp, cert));..  
5980: 20 20 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65    /* Certificate
5990: 20 41 75 74 68 6f 72 69 74 79 20 28 43 41 29 20   Authority (CA) 
59a0: 49 73 73 75 65 72 73 20 55 52 4c 20 2a 2f 0a 20  Issuers URL */. 
59b0: 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69     LAPPEND_OBJ(i
59c0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
59d0: 2c 20 22 63 61 49 73 73 75 65 72 73 22 2c 20 54  , "caIssuers", T
59e0: 6c 73 5f 78 35 30 39 43 61 49 73 73 75 65 72 73  ls_x509CaIssuers
59f0: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b  (interp, cert));
5a00: 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74  ..    /* Subject
5a10: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 41 63 63   Information Acc
5a20: 65 73 73 20 2d 20 52 46 43 20 35 32 38 30 20 73  ess - RFC 5280 s
5a30: 65 63 74 69 6f 6e 20 34 2e 32 2e 32 2e 32 2c 20  ection 4.2.2.2, 
5a40: 4e 49 44 5f 73 69 6e 66 6f 5f 61 63 63 65 73 73  NID_sinfo_access
5a50: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74   */..    /* Cert
5a60: 69 66 69 63 61 74 65 20 41 6c 69 61 73 2e 20 49  ificate Alias. I
5a70: 66 20 75 73 65 73 20 61 20 50 4b 43 53 23 31 32  f uses a PKCS#12
5a80: 20 73 74 72 75 63 74 75 72 65 2c 20 61 6c 69 61   structure, alia
5a90: 73 20 77 69 6c 6c 20 72 65 66 6c 65 63 74 20 74  s will reflect t
5aa0: 68 65 0a 09 66 72 69 65 6e 64 6c 79 4e 61 6d 65  he..friendlyName
5ab0: 20 61 74 74 72 69 62 75 74 65 20 28 52 46 43 20   attribute (RFC 
5ac0: 32 39 38 35 29 2e 20 2a 2f 0a 20 20 20 20 7b 0a  2985). */.    {.
5ad0: 09 69 6e 74 20 69 6c 65 6e 20 3d 20 30 3b 0a 20  .int ilen = 0;. 
5ae0: 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
5af0: 63 68 61 72 20 2a 73 74 72 69 6e 67 20 3d 20 58  char *string = X
5b00: 35 30 39 5f 61 6c 69 61 73 5f 67 65 74 30 28 63  509_alias_get0(c
5b10: 65 72 74 2c 20 26 69 6c 65 6e 29 3b 0a 09 4c 41  ert, &ilen);..LA
5b20: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
5b30: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 61 6c  , resultObj, "al
5b40: 69 61 73 22 2c 20 28 63 68 61 72 20 2a 29 20 73  ias", (char *) s
5b50: 74 72 69 6e 67 2c 20 28 54 63 6c 5f 53 69 7a 65  tring, (Tcl_Size
5b60: 29 20 69 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20  ) ilen);.       
5b70: 20 73 74 72 69 6e 67 20 3d 20 58 35 30 39 5f 6b   string = X509_k
5b80: 65 79 69 64 5f 67 65 74 30 28 63 65 72 74 2c 20  eyid_get0(cert, 
5b90: 26 69 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44  &ilen);..LAPPEND
5ba0: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73  _STR(interp, res
5bb0: 75 6c 74 4f 62 6a 2c 20 22 6b 65 79 49 64 22 2c  ultObj, "keyId",
5bc0: 20 28 63 68 61 72 20 2a 29 20 73 74 72 69 6e 67   (char *) string
5bd0: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 69 6c 65  , (Tcl_Size) ile
5be0: 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  n);.    }..    /
5bf0: 2a 20 43 65 72 74 69 66 69 63 61 74 65 20 61 6e  * Certificate an
5c00: 64 20 64 75 6d 70 20 61 6c 6c 20 64 61 74 61 20  d dump all data 
5c10: 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 6c 29 20  */.    if (all) 
5c20: 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 61 6c 6c 4f  {..Tcl_Obj *allO
5c30: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  bj = Tcl_NewByte
5c40: 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c 2c 20 30  ArrayObj(NULL, 0
5c50: 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 65 72  );..Tcl_Obj *cer
5c60: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79  tObj = Tcl_NewBy
5c70: 74 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c 2c  teArrayObj(NULL,
5c80: 20 30 29 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63   0);..unsigned c
5c90: 68 61 72 20 2a 61 6c 6c 53 74 72 2c 20 2a 63 65  har *allStr, *ce
5ca0: 72 74 53 74 72 3b 0a 0a 09 69 66 20 28 61 6c 6c  rtStr;...if (all
5cb0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63  Obj == NULL || c
5cc0: 65 72 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20  ertObj == NULL) 
5cd0: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72 52  {..    Tcl_DecrR
5ce0: 65 66 43 6f 75 6e 74 28 61 6c 6c 4f 62 6a 29 3b  efCount(allObj);
5cf0: 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62  ..    BIO_free(b
5d00: 69 6f 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  io);..    return
5d10: 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 09 7d 0a 0a   resultObj;..}..
5d20: 09 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63  ./* Get certific
5d30: 61 74 65 20 2a 2f 0a 09 63 65 72 74 53 74 72 20  ate */..certStr 
5d40: 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72  = Tcl_SetByteArr
5d50: 61 79 4c 65 6e 67 74 68 28 63 65 72 74 4f 62 6a  ayLength(certObj
5d60: 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 29  , CERT_STR_SIZE)
5d70: 3b 0a 09 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f  ;..len = BIO_to_
5d80: 42 75 66 66 65 72 28 50 45 4d 5f 77 72 69 74 65  Buffer(PEM_write
5d90: 5f 62 69 6f 5f 58 35 30 39 28 62 69 6f 2c 20 63  _bio_X509(bio, c
5da0: 65 72 74 29 2c 20 62 69 6f 2c 20 63 65 72 74 53  ert), bio, certS
5db0: 74 72 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 5a  tr, CERT_STR_SIZ
5dc0: 45 29 3b 0a 09 54 63 6c 5f 53 65 74 42 79 74 65  E);..Tcl_SetByte
5dd0: 41 72 72 61 79 4c 65 6e 67 74 68 28 63 65 72 74  ArrayLength(cert
5de0: 4f 62 6a 2c 20 6c 65 6e 29 3b 0a 09 4c 41 50 50  Obj, len);..LAPP
5df0: 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20  END_OBJ(interp, 
5e00: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 63 65 72 74  resultObj, "cert
5e10: 69 66 69 63 61 74 65 22 2c 20 63 65 72 74 4f 62  ificate", certOb
5e20: 6a 29 0a 0a 09 2f 2a 20 47 65 74 20 61 6c 6c 20  j).../* Get all 
5e30: 69 6e 66 6f 20 6f 6e 20 63 65 72 74 69 66 69 63  info on certific
5e40: 61 74 65 20 2a 2f 0a 09 61 6c 6c 53 74 72 20 3d  ate */..allStr =
5e50: 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61   Tcl_SetByteArra
5e60: 79 4c 65 6e 67 74 68 28 61 6c 6c 4f 62 6a 2c 20  yLength(allObj, 
5e70: 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 20 2a 20  CERT_STR_SIZE * 
5e80: 32 29 3b 0a 09 6c 65 6e 20 3d 20 42 49 4f 5f 74  2);..len = BIO_t
5e90: 6f 5f 42 75 66 66 65 72 28 58 35 30 39 5f 70 72  o_Buffer(X509_pr
5ea0: 69 6e 74 5f 65 78 28 62 69 6f 2c 20 63 65 72 74  int_ex(bio, cert
5eb0: 2c 20 66 6c 61 67 73 2c 20 30 29 2c 20 62 69 6f  , flags, 0), bio
5ec0: 2c 20 61 6c 6c 53 74 72 2c 20 43 45 52 54 5f 53  , allStr, CERT_S
5ed0: 54 52 5f 53 49 5a 45 20 2a 20 32 29 3b 0a 09 54  TR_SIZE * 2);..T
5ee0: 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c  cl_SetByteArrayL
5ef0: 65 6e 67 74 68 28 61 6c 6c 4f 62 6a 2c 20 6c 65  ength(allObj, le
5f00: 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a  n);..LAPPEND_OBJ
5f10: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
5f20: 62 6a 2c 20 22 61 6c 6c 22 2c 20 61 6c 6c 4f 62  bj, "all", allOb
5f30: 6a 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 42 49  j).    }..    BI
5f40: 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20  O_free(bio);.   
5f50: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62   return resultOb
5f60: 6a 3b 0a 7d 0a                                   j;.}.