Hex Artifact Content

Artifact ca399c3d00ca59907bfd84b34cb252c11c0a01b9b2cec43f60e9d2431da8664b:


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 73 20 61  9 certificates a
0020: 6e 64 20 72 65 74 75 72 6e 20 63 6f 6e 74 65 6e  nd return conten
0030: 74 73 20 61 73 20 61 20 54 43 4c 20 6b 65 79 2d  ts as a TCL key-
0040: 76 61 6c 75 65 20 6c 69 73 74 2e 0a 20 2a 0a 20  value list.. *. 
0050: 2a 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20  * Copyright (C) 
0060: 31 39 39 37 2d 32 30 30 30 20 53 65 6e 73 75 73  1997-2000 Sensus
0070: 20 43 6f 6e 73 75 6c 74 69 6e 67 20 4c 74 64 2e   Consulting Ltd.
0080: 0a 20 2a 20 4d 61 74 74 20 4e 65 77 6d 61 6e 20  . * Matt Newman 
0090: 3c 6d 61 74 74 40 73 65 6e 73 75 73 2e 6f 72 67  <matt@sensus.org
00a0: 3e 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28  >. * Copyright (
00b0: 43 29 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27  C) 2023 Brian O'
00c0: 48 61 67 61 6e 0a 20 2a 2f 0a 23 69 6e 63 6c 75  Hagan. */.#inclu
00d0: 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e 63 6c  de <tcl.h>.#incl
00e0: 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69  ude <stdio.h>.#i
00f0: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0100: 62 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  bio.h>.#include 
0110: 3c 6f 70 65 6e 73 73 6c 2f 73 68 61 2e 68 3e 0a  <openssl/sha.h>.
0120: 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73  #include <openss
0130: 6c 2f 78 35 30 39 2e 68 3e 0a 23 69 6e 63 6c 75  l/x509.h>.#inclu
0140: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 78 35 30 39  de <openssl/x509
0150: 76 33 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  v3.h>.#include <
0160: 6f 70 65 6e 73 73 6c 2f 78 35 30 39 5f 76 66 79  openssl/x509_vfy
0170: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70  .h>.#include <op
0180: 65 6e 73 73 6c 2f 61 73 6e 31 2e 68 3e 0a 23 69  enssl/asn1.h>.#i
0190: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
01a0: 22 0a 0a 2f 2a 20 44 65 66 69 6e 65 20 6d 61 78  "../* Define max
01b0: 69 6d 75 6d 20 63 65 72 74 69 66 69 63 61 74 65  imum certificate
01c0: 20 73 69 7a 65 2e 20 4d 61 78 20 50 45 4d 20 73   size. Max PEM s
01d0: 69 7a 65 20 31 30 30 6b 42 20 61 6e 64 20 44 45  ize 100kB and DE
01e0: 52 20 73 69 7a 65 20 69 73 20 32 34 6b 42 2e 20  R size is 24kB. 
01f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 45 52 54 5f  */.#define CERT_
0200: 53 54 52 5f 53 49 5a 45 20 32 34 35 37 36 0a 0a  STR_SIZE 24576..
0210: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
0220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0260: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 72 69 6e  ----. *. * Strin
0270: 67 5f 74 6f 5f 48 65 78 20 2d 2d 0a 20 2a 0a 20  g_to_Hex --. *. 
0280: 2a 09 46 6f 72 6d 61 74 20 63 6f 6e 74 65 6e 74  *.Format content
0290: 73 20 6f 66 20 61 20 62 69 6e 61 72 79 20 73 74  s of a binary st
02a0: 72 69 6e 67 20 61 73 20 61 20 68 65 78 20 73 74  ring as a hex st
02b0: 72 69 6e 67 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ring. *. * Resul
02c0: 74 73 3a 0a 20 2a 09 54 43 4c 20 62 79 74 65 20  ts:. *.TCL byte 
02d0: 61 72 72 61 79 20 6f 62 6a 65 63 74 20 77 69 74  array object wit
02e0: 68 20 78 35 30 39 20 69 64 65 6e 74 69 66 69 65  h x509 identifie
02f0: 72 20 61 73 20 61 20 68 65 78 20 73 74 72 69 6e  r as a hex strin
0300: 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 45 66 66  g. *. * Side Eff
0310: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ects:. *.None. *
0320: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
0330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0370: 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 53 74  . */.Tcl_Obj *St
0380: 72 69 6e 67 5f 74 6f 5f 48 65 78 28 75 6e 73 69  ring_to_Hex(unsi
0390: 67 6e 65 64 20 63 68 61 72 2a 20 69 6e 70 75 74  gned char* input
03a0: 2c 20 69 6e 74 20 69 6c 65 6e 29 20 7b 0a 20 20  , int ilen) {.  
03b0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
03c0: 2a 69 70 74 72 20 3d 20 69 6e 70 75 74 3b 0a 20  *iptr = input;. 
03d0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75     Tcl_Obj *resu
03e0: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42  ltObj = Tcl_NewB
03f0: 79 74 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c  yteArrayObj(NULL
0400: 2c 20 30 29 3b 0a 20 20 20 20 75 6e 73 69 67 6e  , 0);.    unsign
0410: 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20  ed char *data = 
0420: 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79  Tcl_SetByteArray
0430: 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a  Length(resultObj
0440: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 69 6c 65 6e  , (Tcl_Size)ilen
0450: 2a 32 29 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  *2);.    unsigne
0460: 64 20 63 68 61 72 20 2a 64 70 74 72 20 3d 20 26  d char *dptr = &
0470: 64 61 74 61 5b 30 5d 3b 0a 20 20 20 20 63 6f 6e  data[0];.    con
0480: 73 74 20 63 68 61 72 20 2a 68 65 78 20 3d 20 22  st char *hex = "
0490: 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66  0123456789abcdef
04a0: 22 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75  ";..    if (resu
04b0: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ltObj == NULL) {
04c0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
04d0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 69     }..    for (i
04e0: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 69 6c  nt i = 0; i < il
04f0: 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 2a 64 70 74  en; i++) {..*dpt
0500: 72 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  r++ = (unsigned 
0510: 63 68 61 72 29 68 65 78 5b 28 2a 69 70 74 72 3e  char)hex[(*iptr>
0520: 3e 34 29 26 30 78 46 5d 3b 0a 09 2a 64 70 74 72  >4)&0xF];..*dptr
0530: 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ++ = (unsigned c
0540: 68 61 72 29 68 65 78 5b 28 2a 69 70 74 72 2b 2b  har)hex[(*iptr++
0550: 29 26 30 78 46 5d 3b 0a 20 20 20 20 7d 0a 20 20  )&0xF];.    }.  
0560: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f    return resultO
0570: 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  bj;.}../*. *----
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
05d0: 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 20 2d 2d  BIO_to_Buffer --
05e0: 0a 20 2a 0a 20 2a 09 4f 75 74 70 75 74 20 63 6f  . *. *.Output co
05f0: 6e 74 65 6e 74 73 20 6f 66 20 61 20 42 49 4f 20  ntents of a BIO 
0600: 74 6f 20 61 20 62 75 66 66 65 72 0a 20 2a 0a 20  to a buffer. *. 
0610: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65  * Results:. *.Re
0620: 74 75 72 6e 73 20 6c 65 6e 67 74 68 20 6f 66 20  turns length of 
0630: 73 74 72 69 6e 67 20 69 6e 20 62 75 66 66 65 72  string in buffer
0640: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
0650: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  cts:. *.None. *.
0660: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
06b0: 20 2a 2f 0a 54 63 6c 5f 53 69 7a 65 20 42 49 4f   */.Tcl_Size BIO
06c0: 5f 74 6f 5f 42 75 66 66 65 72 28 69 6e 74 20 72  _to_Buffer(int r
06d0: 65 73 75 6c 74 2c 20 42 49 4f 20 2a 62 69 6f 2c  esult, BIO *bio,
06e0: 20 76 6f 69 64 20 2a 6f 75 74 70 75 74 2c 20 69   void *output, i
06f0: 6e 74 20 6f 6c 65 6e 29 20 7b 0a 20 20 20 20 54  nt olen) {.    T
0700: 63 6c 5f 53 69 7a 65 20 6c 65 6e 20 3d 20 30 3b  cl_Size len = 0;
0710: 0a 20 20 20 20 69 6e 74 20 70 65 6e 64 69 6e 67  .    int pending
0720: 20 3d 20 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62   = BIO_pending(b
0730: 69 6f 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65  io);..    if (re
0740: 73 75 6c 74 29 20 7b 0a 09 6c 65 6e 20 3d 20 28  sult) {..len = (
0750: 54 63 6c 5f 53 69 7a 65 29 20 42 49 4f 5f 72 65  Tcl_Size) BIO_re
0760: 61 64 28 62 69 6f 2c 20 6f 75 74 70 75 74 2c 20  ad(bio, output, 
0770: 28 70 65 6e 64 69 6e 67 20 3c 20 6f 6c 65 6e 29  (pending < olen)
0780: 20 3f 20 70 65 6e 64 69 6e 67 20 3a 20 6f 6c 65   ? pending : ole
0790: 6e 29 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f 66  n);..(void)BIO_f
07a0: 6c 75 73 68 28 62 69 6f 29 3b 0a 09 69 66 20 28  lush(bio);..if (
07b0: 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 20 20 20 20  len < 0) {..    
07c0: 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 20 20 20 20  len = 0;..}.    
07d0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
07e0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0830: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
0840: 6c 73 5f 78 35 30 39 45 78 74 65 6e 73 69 6f 6e  ls_x509Extension
0850: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 6c  s --. *. *.Get l
0860: 69 73 74 20 6f 66 20 58 2e 35 30 39 20 43 65 72  ist of X.509 Cer
0870: 74 69 66 69 63 61 74 65 20 45 78 74 65 6e 73 69  tificate Extensi
0880: 6f 6e 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ons. *. * Result
0890: 73 3a 0a 20 2a 09 54 43 4c 20 6c 69 73 74 20 6f  s:. *.TCL list o
08a0: 66 20 65 78 74 65 6e 73 69 6f 6e 73 20 61 6e 64  f extensions and
08b0: 20 62 6f 6f 6c 65 61 6e 20 63 72 69 74 69 63 61   boolean critica
08c0: 6c 20 73 74 61 74 75 73 0a 20 2a 0a 20 2a 20 53  l status. *. * S
08d0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
08e0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  None. *. *------
08f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f  -------. */.Tcl_
0940: 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 45 78 74  Obj *Tls_x509Ext
0950: 65 6e 73 69 6f 6e 73 28 54 63 6c 5f 49 6e 74 65  ensions(Tcl_Inte
0960: 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39  rp *interp, X509
0970: 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 63 6f   *cert) {.    co
0980: 6e 73 74 20 53 54 41 43 4b 5f 4f 46 28 58 35 30  nst STACK_OF(X50
0990: 39 5f 45 58 54 45 4e 53 49 4f 4e 29 20 2a 65 78  9_EXTENSION) *ex
09a0: 74 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ts;.    Tcl_Obj 
09b0: 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c  *resultObj = Tcl
09c0: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
09d0: 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72  ULL);..    if (r
09e0: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c  esultObj == NULL
09f0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  ) {..return NULL
0a00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
0a10: 28 28 65 78 74 73 20 3d 20 58 35 30 39 5f 67 65  ((exts = X509_ge
0a20: 74 30 5f 65 78 74 65 6e 73 69 6f 6e 73 28 63 65  t0_extensions(ce
0a30: 72 74 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  rt)) != NULL) {.
0a40: 09 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b 20 69  .for (int i=0; i
0a50: 20 3c 20 58 35 30 39 5f 67 65 74 5f 65 78 74 5f   < X509_get_ext_
0a60: 63 6f 75 6e 74 28 63 65 72 74 29 3b 20 69 2b 2b  count(cert); i++
0a70: 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 45 58  ) {..    X509_EX
0a80: 54 45 4e 53 49 4f 4e 20 2a 65 78 20 3d 20 73 6b  TENSION *ex = sk
0a90: 5f 58 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f  _X509_EXTENSION_
0aa0: 76 61 6c 75 65 28 65 78 74 73 2c 20 69 29 3b 0a  value(exts, i);.
0ab0: 09 20 20 20 20 41 53 4e 31 5f 4f 42 4a 45 43 54  .    ASN1_OBJECT
0ac0: 20 2a 6f 62 6a 20 3d 20 58 35 30 39 5f 45 58 54   *obj = X509_EXT
0ad0: 45 4e 53 49 4f 4e 5f 67 65 74 5f 6f 62 6a 65 63  ENSION_get_objec
0ae0: 74 28 65 78 29 3b 0a 09 20 20 20 20 2f 2a 20 41  t(ex);..    /* A
0af0: 53 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49 4e 47  SN1_OCTET_STRING
0b00: 20 2a 64 61 74 61 20 3d 20 58 35 30 39 5f 45 58   *data = X509_EX
0b10: 54 45 4e 53 49 4f 4e 5f 67 65 74 5f 64 61 74 61  TENSION_get_data
0b20: 28 65 78 29 3b 20 2a 2f 0a 09 20 20 20 20 69 6e  (ex); */..    in
0b30: 74 20 63 72 69 74 69 63 61 6c 20 3d 20 58 35 30  t critical = X50
0b40: 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74 5f  9_EXTENSION_get_
0b50: 63 72 69 74 69 63 61 6c 28 65 78 29 3b 0a 09 20  critical(ex);.. 
0b60: 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28     LAPPEND_BOOL(
0b70: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
0b80: 6a 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 4f 42  j, OBJ_nid2ln(OB
0b90: 4a 5f 6f 62 6a 32 6e 69 64 28 6f 62 6a 29 29 2c  J_obj2nid(obj)),
0ba0: 20 63 72 69 74 69 63 61 6c 29 3b 0a 09 7d 0a 20   critical);..}. 
0bb0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
0bc0: 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a  resultObj;.}../*
0bd0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c20: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39 49  . *. * Tls_x509I
0c30: 64 65 6e 74 69 66 69 65 72 20 2d 2d 0a 20 2a 0a  dentifier --. *.
0c40: 20 2a 09 47 65 74 20 58 2e 35 30 39 20 63 65 72   *.Get X.509 cer
0c50: 74 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 69  tificate Authori
0c60: 74 79 20 6f 72 20 53 75 62 6a 65 63 74 20 4b 65  ty or Subject Ke
0c70: 79 20 49 64 65 6e 74 69 66 69 65 72 73 0a 20 2a  y Identifiers. *
0c80: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
0c90: 54 43 4c 20 62 79 74 65 20 61 72 72 61 79 20 6f  TCL byte array o
0ca0: 62 6a 65 63 74 20 77 69 74 68 20 78 35 30 39 20  bject with x509 
0cb0: 69 64 65 6e 74 69 66 69 65 72 20 61 73 20 61 20  identifier as a 
0cc0: 68 65 78 20 73 74 72 69 6e 67 0a 20 2a 0a 20 2a  hex string. *. *
0cd0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
0ce0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d  *.None. *. *----
0cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63  ---------. */.Tc
0d40: 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 49  l_Obj *Tls_x509I
0d50: 64 65 6e 74 69 66 69 65 72 28 63 6f 6e 73 74 20  dentifier(const 
0d60: 41 53 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49 4e  ASN1_OCTET_STRIN
0d70: 47 20 2a 61 73 74 72 69 6e 67 29 20 7b 0a 20 20  G *astring) {.  
0d80: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c    Tcl_Obj *resul
0d90: 74 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  tObj = NULL;..  
0da0: 20 20 69 66 20 28 61 73 74 72 69 6e 67 20 21 3d    if (astring !=
0db0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 75 6c 74   NULL) {..result
0dc0: 4f 62 6a 20 3d 20 53 74 72 69 6e 67 5f 74 6f 5f  Obj = String_to_
0dd0: 48 65 78 28 28 75 6e 73 69 67 6e 65 64 20 63 68  Hex((unsigned ch
0de0: 61 72 20 2a 29 41 53 4e 31 5f 53 54 52 49 4e 47  ar *)ASN1_STRING
0df0: 5f 67 65 74 30 5f 64 61 74 61 28 61 73 74 72 69  _get0_data(astri
0e00: 6e 67 29 2c 0a 09 20 20 20 20 41 53 4e 31 5f 53  ng),..    ASN1_S
0e10: 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 61 73 74  TRING_length(ast
0e20: 72 69 6e 67 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ring));.    }.  
0e30: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f    return resultO
0e40: 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  bj;.}../*. *----
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
0ea0: 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65  Tls_x509KeyUsage
0eb0: 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 58 2e   --. *. *.Get X.
0ec0: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
0ed0: 6b 65 79 20 75 73 61 67 65 20 74 79 70 65 73 0a  key usage types.
0ee0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
0ef0: 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 74 79  *.Tcl list of ty
0f00: 70 65 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  pes. *. * Side e
0f10: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  ffects:. *.None.
0f20: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f70: 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a  --. */.Tcl_Obj *
0f80: 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65  Tls_x509KeyUsage
0f90: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
0fa0: 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c  erp, X509 *cert,
0fb0: 20 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 73   uint32_t xflags
0fc0: 29 20 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74  ) {.    uint32_t
0fd0: 20 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65   usage = X509_ge
0fe0: 74 5f 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74  t_key_usage(cert
0ff0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  );.    Tcl_Obj *
1000: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f  resultObj = Tcl_
1010: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
1020: 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65  LL);..    if (re
1030: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29  sultObj == NULL)
1040: 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b   {..return NULL;
1050: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
1060: 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47  (xflags & EXFLAG
1070: 5f 4b 55 53 41 47 45 29 20 26 26 20 75 73 61 67  _KUSAGE) && usag
1080: 65 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58 29 20  e < UINT32_MAX) 
1090: 7b 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b  {..if (usage & K
10a0: 55 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 54  U_DIGITAL_SIGNAT
10b0: 55 52 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  URE) {..    Tcl_
10c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73  ment(interp, res
10e0: 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53  ultObj, Tcl_NewS
10f0: 74 72 69 6e 67 4f 62 6a 28 22 44 69 67 69 74 61  tringObj("Digita
1100: 6c 20 53 69 67 6e 61 74 75 72 65 22 2c 20 2d 31  l Signature", -1
1110: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67  ));..}..if (usag
1120: 65 20 26 20 4b 55 5f 4e 4f 4e 5f 52 45 50 55 44  e & KU_NON_REPUD
1130: 49 41 54 49 4f 4e 29 20 7b 0a 09 20 20 20 20 54  IATION) {..    T
1140: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1150: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1160: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e  resultObj, Tcl_N
1170: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 6f 6e  ewStringObj("Non
1180: 2d 52 65 70 75 64 69 61 74 69 6f 6e 22 2c 20 2d  -Repudiation", -
1190: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61  1));..}..if (usa
11a0: 67 65 20 26 20 4b 55 5f 4b 45 59 5f 45 4e 43 49  ge & KU_KEY_ENCI
11b0: 50 48 45 52 4d 45 4e 54 29 20 7b 0a 09 20 20 20  PHERMENT) {..   
11c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
11d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11e0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c  , resultObj, Tcl
11f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4b  _NewStringObj("K
1200: 65 79 20 45 6e 63 69 70 68 65 72 6d 65 6e 74 22  ey Encipherment"
1210: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
1220: 75 73 61 67 65 20 26 20 4b 55 5f 44 41 54 41 5f  usage & KU_DATA_
1230: 45 4e 43 49 50 48 45 52 4d 45 4e 54 29 20 7b 0a  ENCIPHERMENT) {.
1240: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1250: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1260: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
1270: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1280: 6a 28 22 44 61 74 61 20 45 6e 63 69 70 68 65 72  j("Data Encipher
1290: 6d 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  ment", -1));..}.
12a0: 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f  .if (usage & KU_
12b0: 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 29 20 7b  KEY_AGREEMENT) {
12c0: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
12d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
12e0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
12f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1300: 62 6a 28 22 4b 65 79 20 41 67 72 65 65 6d 65 6e  bj("Key Agreemen
1310: 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66  t", -1));..}..if
1320: 20 28 75 73 61 67 65 20 26 20 4b 55 5f 4b 45 59   (usage & KU_KEY
1330: 5f 43 45 52 54 5f 53 49 47 4e 29 20 7b 0a 09 20  _CERT_SIGN) {.. 
1340: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1350: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1360: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54  rp, resultObj, T
1370: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1380: 22 43 65 72 74 69 66 69 63 61 74 65 20 53 69 67  "Certificate Sig
1390: 6e 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  ning", -1));..}.
13a0: 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f  .if (usage & KU_
13b0: 43 52 4c 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20  CRL_SIGN) {..   
13c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
13d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
13e0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c  , resultObj, Tcl
13f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 43  _NewStringObj("C
1400: 52 4c 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29  RL Signing", -1)
1410: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65  );..}..if (usage
1420: 20 26 20 4b 55 5f 45 4e 43 49 50 48 45 52 5f 4f   & KU_ENCIPHER_O
1430: 4e 4c 59 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  NLY) {..    Tcl_
1440: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1450: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73  ment(interp, res
1460: 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53  ultObj, Tcl_NewS
1470: 74 72 69 6e 67 4f 62 6a 28 22 45 6e 63 69 70 68  tringObj("Enciph
1480: 65 72 20 4f 6e 6c 79 22 2c 20 2d 31 29 29 3b 0a  er Only", -1));.
1490: 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20  .}..if (usage & 
14a0: 4b 55 5f 44 45 43 49 50 48 45 52 5f 4f 4e 4c 59  KU_DECIPHER_ONLY
14b0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
14c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14d0: 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  t(interp, result
14e0: 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Obj, Tcl_NewStri
14f0: 6e 67 4f 62 6a 28 22 44 65 63 69 70 68 65 72 20  ngObj("Decipher 
1500: 4f 6e 6c 79 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  Only", -1));..}.
1510: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20      } else {..  
1520: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1530: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1540: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
1550: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
1560: 75 6e 72 65 73 74 72 69 63 74 65 64 22 2c 20 2d  unrestricted", -
1570: 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  1));.    }.    r
1580: 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b  eturn resultObj;
1590: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
15a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
15f0: 5f 78 35 30 39 50 75 72 70 6f 73 65 20 2d 2d 0a  _x509Purpose --.
1600: 20 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30 39 20   *. *.Get X.509 
1610: 63 65 72 74 69 66 69 63 61 74 65 20 70 75 72 70  certificate purp
1620: 6f 73 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ose. *. * Result
1630: 73 3a 0a 20 2a 09 50 75 72 70 6f 73 65 20 73 74  s:. *.Purpose st
1640: 72 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ring. *. * Side 
1650: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
1660: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
1670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b0: 2d 2d 2d 0a 20 2a 2f 0a 63 6f 6e 73 74 20 63 68  ---. */.const ch
16c0: 61 72 20 2a 54 6c 73 5f 78 35 30 39 50 75 72 70  ar *Tls_x509Purp
16d0: 6f 73 65 28 58 35 30 39 20 2a 63 65 72 74 29 20  ose(X509 *cert) 
16e0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
16f0: 20 2a 70 75 72 70 6f 73 65 20 3d 20 4e 55 4c 4c   *purpose = NULL
1700: 3b 0a 0a 20 20 20 20 69 66 20 28 58 35 30 39 5f  ;..    if (X509_
1710: 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65  check_purpose(ce
1720: 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45  rt, X509_PURPOSE
1730: 5f 53 53 4c 5f 43 4c 49 45 4e 54 2c 20 30 29 20  _SSL_CLIENT, 0) 
1740: 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20  > 0) {..purpose 
1750: 3d 20 22 53 53 4c 20 43 6c 69 65 6e 74 22 3b 0a  = "SSL Client";.
1760: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 58      } else if (X
1770: 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73  509_check_purpos
1780: 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52  e(cert, X509_PUR
1790: 50 4f 53 45 5f 53 53 4c 5f 53 45 52 56 45 52 2c  POSE_SSL_SERVER,
17a0: 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70   0) > 0) {..purp
17b0: 6f 73 65 20 3d 20 22 53 53 4c 20 53 65 72 76 65  ose = "SSL Serve
17c0: 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  r";.    } else i
17d0: 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75  f (X509_check_pu
17e0: 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39  rpose(cert, X509
17f0: 5f 50 55 52 50 4f 53 45 5f 4e 53 5f 53 53 4c 5f  _PURPOSE_NS_SSL_
1800: 53 45 52 56 45 52 2c 20 30 29 20 3e 20 30 29 20  SERVER, 0) > 0) 
1810: 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 4d 53  {..purpose = "MS
1820: 53 20 53 53 4c 20 53 65 72 76 65 72 22 3b 0a 20  S SSL Server";. 
1830: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35     } else if (X5
1840: 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65  09_check_purpose
1850: 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50  (cert, X509_PURP
1860: 4f 53 45 5f 53 4d 49 4d 45 5f 53 49 47 4e 2c 20  OSE_SMIME_SIGN, 
1870: 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f  0) > 0) {..purpo
1880: 73 65 20 3d 20 22 53 4d 49 4d 45 20 53 69 67 6e  se = "SMIME Sign
1890: 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ing";.    } else
18a0: 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f   if (X509_check_
18b0: 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35  purpose(cert, X5
18c0: 30 39 5f 50 55 52 50 4f 53 45 5f 53 4d 49 4d 45  09_PURPOSE_SMIME
18d0: 5f 45 4e 43 52 59 50 54 2c 20 30 29 20 3e 20 30  _ENCRYPT, 0) > 0
18e0: 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22  ) {..purpose = "
18f0: 53 4d 49 4d 45 20 45 6e 63 72 79 70 74 69 6f 6e  SMIME Encryption
1900: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ";.    } else if
1910: 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72   (X509_check_pur
1920: 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f  pose(cert, X509_
1930: 50 55 52 50 4f 53 45 5f 43 52 4c 5f 53 49 47 4e  PURPOSE_CRL_SIGN
1940: 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72  , 0) > 0) {..pur
1950: 70 6f 73 65 20 3d 20 22 43 52 4c 20 53 69 67 6e  pose = "CRL Sign
1960: 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ing";.    } else
1970: 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f   if (X509_check_
1980: 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35  purpose(cert, X5
1990: 30 39 5f 50 55 52 50 4f 53 45 5f 41 4e 59 2c 20  09_PURPOSE_ANY, 
19a0: 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f  0) > 0) {..purpo
19b0: 73 65 20 3d 20 22 41 6e 79 22 3b 0a 20 20 20 20  se = "Any";.    
19c0: 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f  } else if (X509_
19d0: 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65  check_purpose(ce
19e0: 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45  rt, X509_PURPOSE
19f0: 5f 4f 43 53 50 5f 48 45 4c 50 45 52 2c 20 30 29  _OCSP_HELPER, 0)
1a00: 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65   > 0) {..purpose
1a10: 20 3d 20 22 4f 43 53 50 20 48 65 6c 70 65 72 22   = "OCSP Helper"
1a20: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
1a30: 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70  (X509_check_purp
1a40: 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50  ose(cert, X509_P
1a50: 55 52 50 4f 53 45 5f 54 49 4d 45 53 54 41 4d 50  URPOSE_TIMESTAMP
1a60: 5f 53 49 47 4e 2c 20 30 29 20 3e 20 30 29 20 7b  _SIGN, 0) > 0) {
1a70: 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 54 69 6d  ..purpose = "Tim
1a80: 65 73 74 61 6d 70 20 53 69 67 6e 69 6e 67 22 3b  estamp Signing";
1a90: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70  .    } else {..p
1aa0: 75 72 70 6f 73 65 20 3d 20 22 22 3b 0a 20 20 20  urpose = "";.   
1ab0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 75   }.    return pu
1ac0: 72 70 6f 73 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  rpose;.}../*. *-
1ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
1b20: 20 2a 20 54 6c 73 5f 78 35 30 39 50 75 72 70 6f   * Tls_x509Purpo
1b30: 73 65 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74  ses --. *. *.Get
1b40: 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61   X.509 certifica
1b50: 74 65 20 70 75 72 70 6f 73 65 20 74 79 70 65 73  te purpose types
1b60: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
1b70: 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 65   *.Tcl list of e
1b80: 61 63 68 20 70 75 72 70 6f 73 65 20 61 6e 64 20  ach purpose and 
1b90: 77 68 65 74 68 65 72 20 69 74 20 69 73 20 43 41  whether it is CA
1ba0: 20 6f 72 20 6e 6f 6e 2d 43 41 0a 20 2a 0a 20 2a   or non-CA. *. *
1bb0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
1bc0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d  *.None. *. *----
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63  ---------. */.Tc
1c20: 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 50  l_Obj *Tls_x509P
1c30: 75 72 70 6f 73 65 73 28 54 63 6c 5f 49 6e 74 65  urposes(Tcl_Inte
1c40: 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39  rp *interp, X509
1c50: 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 54 63   *cert) {.    Tc
1c60: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a  l_Obj *resultObj
1c70: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
1c80: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  j(0, NULL);.    
1c90: 58 35 30 39 5f 50 55 52 50 4f 53 45 20 2a 70 74  X509_PURPOSE *pt
1ca0: 6d 70 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73  mp;..    if (res
1cb0: 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20  ultObj == NULL) 
1cc0: 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  {..return NULL;.
1cd0: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28      }..    for (
1ce0: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 58  int i = 0; i < X
1cf0: 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 5f  509_PURPOSE_get_
1d00: 63 6f 75 6e 74 28 29 3b 20 69 2b 2b 29 20 7b 0a  count(); i++) {.
1d10: 09 70 74 6d 70 20 3d 20 58 35 30 39 5f 50 55 52  .ptmp = X509_PUR
1d20: 50 4f 53 45 5f 67 65 74 30 28 69 29 3b 0a 09 54  POSE_get0(i);..T
1d30: 63 6c 5f 4f 62 6a 20 2a 74 6d 70 50 74 72 20 3d  cl_Obj *tmpPtr =
1d40: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
1d50: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 66 6f 72 20  0, NULL);...for 
1d60: 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 3c 20  (int j = 0; j < 
1d70: 32 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 69  2; j++) {..    i
1d80: 6e 74 20 69 64 72 65 74 20 3d 20 58 35 30 39 5f  nt idret = X509_
1d90: 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65  check_purpose(ce
1da0: 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45  rt, X509_PURPOSE
1db0: 5f 67 65 74 5f 69 64 28 70 74 6d 70 29 2c 20 6a  _get_id(ptmp), j
1dc0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
1dd0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1de0: 28 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 2c  (interp, tmpPtr,
1df0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1e00: 6a 28 6a 20 3f 20 22 43 41 22 20 3a 20 22 6e 6f  j(j ? "CA" : "no
1e10: 6e 43 41 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20  nCA", -1));..   
1e20: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1e30: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1e40: 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65  , tmpPtr, Tcl_Ne
1e50: 77 53 74 72 69 6e 67 4f 62 6a 28 69 64 72 65 74  wStringObj(idret
1e60: 20 3d 3d 20 31 20 3f 20 22 59 65 73 22 20 3a 20   == 1 ? "Yes" : 
1e70: 22 4e 6f 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  "No", -1));..}..
1e80: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65  LAPPEND_OBJ(inte
1e90: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 58  rp, resultObj, X
1ea0: 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 30  509_PURPOSE_get0
1eb0: 5f 6e 61 6d 65 28 70 74 6d 70 29 2c 20 74 6d 70  _name(ptmp), tmp
1ec0: 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Ptr);.    }.    
1ed0: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a  return resultObj
1ee0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
1ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
1f40: 73 5f 78 35 30 39 4e 61 6d 65 73 20 2d 2d 0a 20  s_x509Names --. 
1f50: 2a 0a 20 2a 09 47 65 74 20 61 20 6c 69 73 74 20  *. *.Get a list 
1f60: 6f 66 20 53 75 62 6a 65 63 74 20 41 6c 74 65 72  of Subject Alter
1f70: 6e 61 74 65 20 4e 61 6d 65 73 20 28 53 41 4e 29  nate Names (SAN)
1f80: 20 6f 72 20 49 73 73 75 65 72 20 41 6c 74 65 72   or Issuer Alter
1f90: 6e 61 74 65 20 4e 61 6d 65 73 0a 20 2a 0a 20 2a  nate Names. *. *
1fa0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 6c   Results:. *.Tcl
1fb0: 20 6c 69 73 74 20 6f 66 20 61 6c 74 65 72 6e 61   list of alterna
1fc0: 74 65 20 6e 61 6d 65 73 0a 20 2a 0a 20 2a 20 53  te names. *. * S
1fd0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
1fe0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  None. *. *------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2030: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f  -------. */.Tcl_
2040: 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 4e 61 6d  Obj *Tls_x509Nam
2050: 65 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  es(Tcl_Interp *i
2060: 6e 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72  nterp, X509 *cer
2070: 74 2c 20 69 6e 74 20 6e 69 64 2c 20 42 49 4f 20  t, int nid, BIO 
2080: 2a 62 69 6f 29 20 7b 0a 20 20 20 20 53 54 41 43  *bio) {.    STAC
2090: 4b 5f 4f 46 28 47 45 4e 45 52 41 4c 5f 4e 41 4d  K_OF(GENERAL_NAM
20a0: 45 29 20 2a 6e 61 6d 65 73 3b 0a 20 20 20 20 54  E) *names;.    T
20b0: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62  cl_Obj *resultOb
20c0: 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  j = Tcl_NewListO
20d0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  bj(0, NULL);.   
20e0: 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20   Tcl_Size len;. 
20f0: 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31     char buffer[1
2100: 30 32 34 5d 3b 0a 0a 20 20 20 20 69 66 20 28 72  024];..    if (r
2110: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c  esultObj == NULL
2120: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  ) {..return NULL
2130: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
2140: 28 28 6e 61 6d 65 73 20 3d 20 28 53 54 41 43 4b  ((names = (STACK
2150: 5f 4f 46 28 47 45 4e 45 52 41 4c 5f 4e 41 4d 45  _OF(GENERAL_NAME
2160: 29 20 2a 29 58 35 30 39 5f 67 65 74 5f 65 78 74  ) *)X509_get_ext
2170: 5f 64 32 69 28 63 65 72 74 2c 20 6e 69 64 2c 20  _d2i(cert, nid, 
2180: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20  NULL, NULL)) != 
2190: 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e  NULL) {..for (in
21a0: 74 20 69 3d 30 3b 20 69 20 3c 20 73 6b 5f 47 45  t i=0; i < sk_GE
21b0: 4e 45 52 41 4c 5f 4e 41 4d 45 5f 6e 75 6d 28 6e  NERAL_NAME_num(n
21c0: 61 6d 65 73 29 3b 20 69 2b 2b 29 20 7b 0a 09 20  ames); i++) {.. 
21d0: 20 20 20 63 6f 6e 73 74 20 47 45 4e 45 52 41 4c     const GENERAL
21e0: 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b  _NAME *name = sk
21f0: 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 76 61  _GENERAL_NAME_va
2200: 6c 75 65 28 6e 61 6d 65 73 2c 20 69 29 3b 0a 0a  lue(names, i);..
2210: 09 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74  .    len = BIO_t
2220: 6f 5f 42 75 66 66 65 72 28 6e 61 6d 65 20 26 26  o_Buffer(name &&
2230: 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70 72   GENERAL_NAME_pr
2240: 69 6e 74 28 62 69 6f 2c 20 28 47 45 4e 45 52 41  int(bio, (GENERA
2250: 4c 5f 4e 41 4d 45 20 2a 29 20 6e 61 6d 65 29 2c  L_NAME *) name),
2260: 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 31 30   bio, buffer, 10
2270: 32 34 29 3b 0a 09 20 20 20 20 4c 41 50 50 45 4e  24);..    LAPPEN
2280: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65  D_STR(interp, re
2290: 73 75 6c 74 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 62  sultObj, NULL, b
22a0: 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 09 7d 0a  uffer, len);..}.
22b0: 09 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45  .sk_GENERAL_NAME
22c0: 5f 70 6f 70 5f 66 72 65 65 28 6e 61 6d 65 73 2c  _pop_free(names,
22d0: 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 66 72   GENERAL_NAME_fr
22e0: 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ee);.    }.    r
22f0: 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b  eturn resultObj;
2300: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
2310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2350: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
2360: 5f 78 35 30 39 45 78 74 4b 65 79 55 73 61 67 65  _x509ExtKeyUsage
2370: 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 61 20   --. *. *.Get a 
2380: 6c 69 73 74 20 6f 66 20 45 78 74 65 6e 64 65 64  list of Extended
2390: 20 4b 65 79 20 55 73 61 67 65 73 0a 20 2a 0a 20   Key Usages. *. 
23a0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 63  * Returns:. *.Tc
23b0: 6c 20 6c 69 73 74 20 6f 66 20 75 73 61 67 65 73  l list of usages
23c0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
23d0: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  cts:. *.None. *.
23e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
23f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2430: 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73   */.Tcl_Obj *Tls
2440: 5f 78 35 30 39 45 78 74 4b 65 79 55 73 61 67 65  _x509ExtKeyUsage
2450: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
2460: 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c  erp, X509 *cert,
2470: 20 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 73   uint32_t xflags
2480: 29 20 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74  ) {.    uint32_t
2490: 20 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65   usage = X509_ge
24a0: 74 5f 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74  t_key_usage(cert
24b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  );.    Tcl_Obj *
24c0: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f  resultObj = Tcl_
24d0: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
24e0: 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65  LL);..    if (re
24f0: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29  sultObj == NULL)
2500: 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b   {..return NULL;
2510: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
2520: 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47  (xflags & EXFLAG
2530: 5f 58 4b 55 53 41 47 45 29 20 26 26 20 75 73 61  _XKUSAGE) && usa
2540: 67 65 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58 29  ge < UINT32_MAX)
2550: 20 7b 0a 09 75 73 61 67 65 20 3d 20 58 35 30 39   {..usage = X509
2560: 5f 67 65 74 5f 65 78 74 65 6e 64 65 64 5f 6b 65  _get_extended_ke
2570: 79 5f 75 73 61 67 65 28 63 65 72 74 29 3b 0a 0a  y_usage(cert);..
2580: 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55  .if (usage & XKU
2590: 5f 53 53 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09  _SSL_SERVER) {..
25a0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
25b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
25c0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
25d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
25e0: 28 22 54 4c 53 20 57 65 62 20 53 65 72 76 65 72  ("TLS Web Server
25f0: 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 22   Authentication"
2600: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
2610: 75 73 61 67 65 20 26 20 58 4b 55 5f 53 53 4c 5f  usage & XKU_SSL_
2620: 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 54  CLIENT) {..    T
2630: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2640: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2650: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e  resultObj, Tcl_N
2660: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 4c 53  ewStringObj("TLS
2670: 20 57 65 62 20 43 6c 69 65 6e 74 20 41 75 74 68   Web Client Auth
2680: 65 6e 74 69 63 61 74 69 6f 6e 22 2c 20 2d 31 29  entication", -1)
2690: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65  );..}..if (usage
26a0: 20 26 20 58 4b 55 5f 53 4d 49 4d 45 29 20 7b 0a   & XKU_SMIME) {.
26b0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
26c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
26d0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
26e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
26f0: 6a 28 22 45 2d 6d 61 69 6c 20 50 72 6f 74 65 63  j("E-mail Protec
2700: 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  tion", -1));..}.
2710: 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55  .if (usage & XKU
2720: 5f 43 4f 44 45 5f 53 49 47 4e 29 20 7b 0a 09 20  _CODE_SIGN) {.. 
2730: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2740: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2750: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54  rp, resultObj, T
2760: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2770: 22 43 6f 64 65 20 53 69 67 6e 69 6e 67 22 2c 20  "Code Signing", 
2780: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73  -1));..}..if (us
2790: 61 67 65 20 26 20 58 4b 55 5f 53 47 43 29 20 7b  age & XKU_SGC) {
27a0: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
27b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
27c0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
27d0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
27e0: 62 6a 28 22 53 47 43 22 2c 20 2d 31 29 29 3b 0a  bj("SGC", -1));.
27f0: 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20  .}..if (usage & 
2800: 58 4b 55 5f 4f 43 53 50 5f 53 49 47 4e 29 20 7b  XKU_OCSP_SIGN) {
2810: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
2820: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2830: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
2840: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2850: 62 6a 28 22 4f 43 53 50 20 53 69 67 6e 69 6e 67  bj("OCSP Signing
2860: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
2870: 28 75 73 61 67 65 20 26 20 58 4b 55 5f 54 49 4d  (usage & XKU_TIM
2880: 45 53 54 41 4d 50 29 20 7b 0a 09 20 20 20 20 54  ESTAMP) {..    T
2890: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
28a0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
28b0: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e  resultObj, Tcl_N
28c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 69 6d  ewStringObj("Tim
28d0: 65 20 53 74 61 6d 70 69 6e 67 22 2c 20 2d 31 29  e Stamping", -1)
28e0: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65  );..}..if (usage
28f0: 20 26 20 58 4b 55 5f 44 56 43 53 20 29 20 7b 0a   & XKU_DVCS ) {.
2900: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2910: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2920: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
2930: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2940: 6a 28 22 44 56 43 53 22 2c 20 2d 31 29 29 3b 0a  j("DVCS", -1));.
2950: 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20  .}..if (usage & 
2960: 58 4b 55 5f 41 4e 59 45 4b 55 29 20 7b 0a 09 20  XKU_ANYEKU) {.. 
2970: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2980: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2990: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54  rp, resultObj, T
29a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
29b0: 22 41 6e 79 20 45 78 74 65 6e 64 65 64 20 4b 65  "Any Extended Ke
29c0: 79 20 55 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a  y Usage", -1));.
29d0: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .}.    } else {.
29e0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
29f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2a00: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
2a10: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2a20: 6a 28 22 75 6e 72 65 73 74 72 69 63 74 65 64 22  j("unrestricted"
2a30: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20  , -1));.    }.  
2a40: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f    return resultO
2a50: 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  bj;.}../*. *----
2a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
2ab0: 54 6c 73 5f 78 35 30 39 43 72 6c 44 70 20 2d 2d  Tls_x509CrlDp --
2ac0: 0a 20 2a 0a 20 2a 09 47 65 74 20 6c 69 73 74 20  . *. *.Get list 
2ad0: 6f 66 20 43 52 4c 20 44 69 73 74 72 69 62 75 74  of CRL Distribut
2ae0: 69 6f 6e 20 50 6f 69 6e 74 73 0a 20 2a 0a 20 2a  ion Points. *. *
2af0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 63 6c   Returns:. *.Tcl
2b00: 20 6c 69 73 74 20 6f 66 20 55 52 49 73 20 61 6e   list of URIs an
2b10: 64 20 72 65 6c 61 74 69 76 65 2d 6e 61 6d 65 73  d relative-names
2b20: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
2b30: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  cts:. *.None. *.
2b40: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
2b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2b90: 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73   */.Tcl_Obj *Tls
2ba0: 5f 78 35 30 39 43 72 6c 44 70 28 54 63 6c 5f 49  _x509CrlDp(Tcl_I
2bb0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58  nterp *interp, X
2bc0: 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20  509 *cert) {.   
2bd0: 20 53 54 41 43 4b 5f 4f 46 28 44 49 53 54 5f 50   STACK_OF(DIST_P
2be0: 4f 49 4e 54 29 20 2a 63 72 6c 3b 0a 20 20 20 20  OINT) *crl;.    
2bf0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f  Tcl_Obj *resultO
2c00: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  bj = Tcl_NewList
2c10: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20  Obj(0, NULL);.. 
2c20: 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a     if (resultObj
2c30: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
2c40: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
2c50: 0a 20 20 20 20 69 66 20 28 28 63 72 6c 20 3d 20  .    if ((crl = 
2c60: 28 53 54 41 43 4b 5f 4f 46 28 44 49 53 54 5f 50  (STACK_OF(DIST_P
2c70: 4f 49 4e 54 29 20 2a 29 58 35 30 39 5f 67 65 74  OINT) *)X509_get
2c80: 5f 65 78 74 5f 64 32 69 28 63 65 72 74 2c 20 4e  _ext_d2i(cert, N
2c90: 49 44 5f 63 72 6c 5f 64 69 73 74 72 69 62 75 74  ID_crl_distribut
2ca0: 69 6f 6e 5f 70 6f 69 6e 74 73 2c 20 4e 55 4c 4c  ion_points, NULL
2cb0: 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c  , NULL)) != NULL
2cc0: 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69 3d  ) {..for (int i=
2cd0: 30 3b 20 69 20 3c 20 73 6b 5f 44 49 53 54 5f 50  0; i < sk_DIST_P
2ce0: 4f 49 4e 54 5f 6e 75 6d 28 63 72 6c 29 3b 20 69  OINT_num(crl); i
2cf0: 2b 2b 29 20 7b 0a 09 20 20 20 20 44 49 53 54 5f  ++) {..    DIST_
2d00: 50 4f 49 4e 54 20 2a 64 70 20 3d 20 73 6b 5f 44  POINT *dp = sk_D
2d10: 49 53 54 5f 50 4f 49 4e 54 5f 76 61 6c 75 65 28  IST_POINT_value(
2d20: 63 72 6c 2c 20 69 29 3b 0a 09 20 20 20 20 44 49  crl, i);..    DI
2d30: 53 54 5f 50 4f 49 4e 54 5f 4e 41 4d 45 20 2a 64  ST_POINT_NAME *d
2d40: 69 73 74 70 6f 69 6e 74 20 3d 20 64 70 2d 3e 64  istpoint = dp->d
2d50: 69 73 74 70 6f 69 6e 74 3b 0a 0a 09 20 20 20 20  istpoint;...    
2d60: 69 66 20 28 64 69 73 74 70 6f 69 6e 74 2d 3e 74  if (distpoint->t
2d70: 79 70 65 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a  ype == 0) {.../*
2d80: 20 66 75 6c 6c 2d 6e 61 6d 65 20 47 45 4e 45 52   full-name GENER
2d90: 41 4c 49 5a 45 44 4e 41 4d 45 20 2a 2f 0a 09 09  ALIZEDNAME */...
2da0: 66 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20  for (int j = 0; 
2db0: 6a 20 3c 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e  j < sk_GENERAL_N
2dc0: 41 4d 45 5f 6e 75 6d 28 64 69 73 74 70 6f 69 6e  AME_num(distpoin
2dd0: 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c 6e 61 6d 65  t->name.fullname
2de0: 29 3b 20 6a 2b 2b 29 20 7b 0a 09 09 20 20 20 20  ); j++) {...    
2df0: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 20 2a 67 65  GENERAL_NAME *ge
2e00: 6e 20 3d 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e  n = sk_GENERAL_N
2e10: 41 4d 45 5f 76 61 6c 75 65 28 64 69 73 74 70 6f  AME_value(distpo
2e20: 69 6e 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c 6e 61  int->name.fullna
2e30: 6d 65 2c 20 6a 29 3b 0a 09 09 20 20 20 20 69 6e  me, j);...    in
2e40: 74 20 74 79 70 65 3b 0a 09 09 20 20 20 20 41 53  t type;...    AS
2e50: 4e 31 5f 53 54 52 49 4e 47 20 2a 75 72 69 20 3d  N1_STRING *uri =
2e60: 20 28 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 29   (ASN1_STRING *)
2e70: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 67 65 74  GENERAL_NAME_get
2e80: 30 5f 76 61 6c 75 65 28 67 65 6e 2c 20 26 74 79  0_value(gen, &ty
2e90: 70 65 29 3b 0a 09 09 20 20 20 20 69 66 20 28 74  pe);...    if (t
2ea0: 79 70 65 20 3d 3d 20 47 45 4e 5f 55 52 49 29 20  ype == GEN_URI) 
2eb0: 7b 0a 09 09 09 4c 41 50 50 45 4e 44 5f 53 54 52  {....LAPPEND_STR
2ec0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
2ed0: 62 6a 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  bj, (char *) NUL
2ee0: 4c 2c 20 28 63 68 61 72 20 2a 29 20 41 53 4e 31  L, (char *) ASN1
2ef0: 5f 53 54 52 49 4e 47 5f 67 65 74 30 5f 64 61 74  _STRING_get0_dat
2f00: 61 28 75 72 69 29 2c 20 28 54 63 6c 5f 53 69 7a  a(uri), (Tcl_Siz
2f10: 65 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c  e) ASN1_STRING_l
2f20: 65 6e 67 74 68 28 75 72 69 29 29 3b 0a 09 09 20  ength(uri));... 
2f30: 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 20     }...}..    } 
2f40: 65 6c 73 65 20 69 66 20 28 64 69 73 74 70 6f 69  else if (distpoi
2f50: 6e 74 2d 3e 74 79 70 65 20 3d 3d 20 31 29 20 7b  nt->type == 1) {
2f60: 0a 09 09 2f 2a 20 72 65 6c 61 74 69 76 65 2d 6e  .../* relative-n
2f70: 61 6d 65 20 58 35 30 39 4e 41 4d 45 20 2a 2f 0a  ame X509NAME */.
2f80: 09 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f  ..STACK_OF(X509_
2f90: 4e 41 4d 45 5f 45 4e 54 52 59 29 20 2a 73 6b 5f  NAME_ENTRY) *sk_
2fa0: 72 65 6c 6e 61 6d 65 20 3d 20 64 69 73 74 70 6f  relname = distpo
2fb0: 69 6e 74 2d 3e 6e 61 6d 65 2e 72 65 6c 61 74 69  int->name.relati
2fc0: 76 65 6e 61 6d 65 3b 0a 09 09 66 6f 72 20 28 69  vename;...for (i
2fd0: 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 3c 20 73 6b  nt j = 0; j < sk
2fe0: 5f 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59  _X509_NAME_ENTRY
2ff0: 5f 6e 75 6d 28 73 6b 5f 72 65 6c 6e 61 6d 65 29  _num(sk_relname)
3000: 3b 20 6a 2b 2b 29 20 7b 0a 09 09 20 20 20 20 58  ; j++) {...    X
3010: 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 20 2a  509_NAME_ENTRY *
3020: 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45  e = sk_X509_NAME
3030: 5f 45 4e 54 52 59 5f 76 61 6c 75 65 28 73 6b 5f  _ENTRY_value(sk_
3040: 72 65 6c 6e 61 6d 65 2c 20 6a 29 3b 0a 09 09 20  relname, j);... 
3050: 20 20 20 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a     ASN1_STRING *
3060: 64 20 3d 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e  d = X509_NAME_EN
3070: 54 52 59 5f 67 65 74 5f 64 61 74 61 28 65 29 3b  TRY_get_data(e);
3080: 0a 09 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  ...    LAPPEND_S
3090: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  TR(interp, resul
30a0: 74 4f 62 6a 2c 20 28 63 68 61 72 20 2a 29 20 4e  tObj, (char *) N
30b0: 55 4c 4c 2c 20 28 63 68 61 72 20 2a 29 20 41 53  ULL, (char *) AS
30c0: 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74 30 5f 64  N1_STRING_get0_d
30d0: 61 74 61 28 64 29 2c 20 28 54 63 6c 5f 53 69 7a  ata(d), (Tcl_Siz
30e0: 65 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c  e) ASN1_STRING_l
30f0: 65 6e 67 74 68 28 64 29 29 3b 0a 09 09 7d 0a 09  ength(d));...}..
3100: 20 20 20 20 7d 0a 09 7d 0a 09 43 52 4c 5f 44 49      }..}..CRL_DI
3110: 53 54 5f 50 4f 49 4e 54 53 5f 66 72 65 65 28 63  ST_POINTS_free(c
3120: 72 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rl);.    }.    r
3130: 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b  eturn resultObj;
3140: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3190: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
31a0: 5f 78 35 30 39 4f 73 63 70 0a 20 2a 0a 20 2a 09  _x509Oscp. *. *.
31b0: 47 65 74 20 6c 69 73 74 20 6f 66 20 4f 6e 2d 6c  Get list of On-l
31c0: 69 6e 65 20 43 65 72 74 69 66 69 63 61 74 65 20  ine Certificate 
31d0: 53 74 61 74 75 73 20 50 72 6f 74 6f 63 6f 6c 20  Status Protocol 
31e0: 28 4f 53 43 50 29 20 55 52 49 73 0a 20 2a 0a 20  (OSCP) URIs. *. 
31f0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63  * Results:. *.Tc
3200: 6c 20 6c 69 73 74 20 6f 66 20 55 52 49 73 0a 20  l list of URIs. 
3210: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
3220: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
3230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
3280: 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78  /.Tcl_Obj *Tls_x
3290: 35 30 39 4f 73 63 70 28 54 63 6c 5f 49 6e 74 65  509Oscp(Tcl_Inte
32a0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39  rp *interp, X509
32b0: 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 53 54   *cert) {.    ST
32c0: 41 43 4b 5f 4f 46 28 4f 50 45 4e 53 53 4c 5f 53  ACK_OF(OPENSSL_S
32d0: 54 52 49 4e 47 29 20 2a 6f 63 73 70 3b 0a 20 20  TRING) *ocsp;.  
32e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c    Tcl_Obj *resul
32f0: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  tObj = Tcl_NewLi
3300: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
3310: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f  .    if (resultO
3320: 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  bj == NULL) {..r
3330: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
3340: 7d 0a 0a 20 20 20 20 69 66 20 28 28 6f 63 73 70  }..    if ((ocsp
3350: 20 3d 20 58 35 30 39 5f 67 65 74 31 5f 6f 63 73   = X509_get1_ocs
3360: 70 28 63 65 72 74 29 29 20 21 3d 20 4e 55 4c 4c  p(cert)) != NULL
3370: 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20  ) {..for (int i 
3380: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 4f 50 45 4e  = 0; i < sk_OPEN
3390: 53 53 4c 5f 53 54 52 49 4e 47 5f 6e 75 6d 28 6f  SSL_STRING_num(o
33a0: 63 73 70 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20  csp); i++) {..  
33b0: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
33c0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
33d0: 20 4e 55 4c 4c 2c 20 73 6b 5f 4f 50 45 4e 53 53   NULL, sk_OPENSS
33e0: 4c 5f 53 54 52 49 4e 47 5f 76 61 6c 75 65 28 6f  L_STRING_value(o
33f0: 63 73 70 2c 20 69 29 2c 20 2d 31 29 3b 0a 09 7d  csp, i), -1);..}
3400: 0a 09 58 35 30 39 5f 65 6d 61 69 6c 5f 66 72 65  ..X509_email_fre
3410: 65 28 6f 63 73 70 29 3b 0a 20 20 20 20 7d 0a 20  e(ocsp);.    }. 
3420: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74     return result
3430: 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  Obj;.}../*. *---
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
3490: 20 54 6c 73 5f 78 35 30 39 43 61 49 73 73 75 65   Tls_x509CaIssue
34a0: 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20  rs --. *. *.Get 
34b0: 6c 69 73 74 20 6f 66 20 43 65 72 74 69 66 69 63  list of Certific
34c0: 61 74 65 20 41 75 74 68 6f 72 69 74 79 20 28 43  ate Authority (C
34d0: 41 29 20 49 73 73 75 65 72 20 55 52 49 73 0a 20  A) Issuer URIs. 
34e0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
34f0: 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 43 41 20  .Tcl list of CA 
3500: 69 73 73 75 65 72 20 55 52 49 73 0a 20 2a 0a 20  issuer URIs. *. 
3510: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
3520: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.None. *. *---
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54  ----------. */.T
3580: 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39  cl_Obj *Tls_x509
3590: 43 61 49 73 73 75 65 72 73 28 54 63 6c 5f 49 6e  CaIssuers(Tcl_In
35a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35  terp *interp, X5
35b0: 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20  09 *cert) {.    
35c0: 53 54 41 43 4b 5f 4f 46 28 41 43 43 45 53 53 5f  STACK_OF(ACCESS_
35d0: 44 45 53 43 52 49 50 54 49 4f 4e 29 20 2a 61 64  DESCRIPTION) *ad
35e0: 73 3b 0a 20 20 20 20 41 43 43 45 53 53 5f 44 45  s;.    ACCESS_DE
35f0: 53 43 52 49 50 54 49 4f 4e 20 2a 61 64 3b 0a 20  SCRIPTION *ad;. 
3600: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75     Tcl_Obj *resu
3610: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c  ltObj = Tcl_NewL
3620: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
3630: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
3640: 61 72 20 2a 62 75 66 3b 0a 0a 20 20 20 20 69 66  ar *buf;..    if
3650: 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e   (resultObj == N
3660: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e  ULL) {..return N
3670: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
3680: 69 66 20 28 28 61 64 73 20 3d 20 28 53 54 41 43  if ((ads = (STAC
3690: 4b 5f 4f 46 28 41 43 43 45 53 53 5f 44 45 53 43  K_OF(ACCESS_DESC
36a0: 52 49 50 54 49 4f 4e 29 20 2a 29 58 35 30 39 5f  RIPTION) *)X509_
36b0: 67 65 74 5f 65 78 74 5f 64 32 69 28 63 65 72 74  get_ext_d2i(cert
36c0: 2c 20 4e 49 44 5f 69 6e 66 6f 5f 61 63 63 65 73  , NID_info_acces
36d0: 73 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20  s, NULL, NULL)) 
36e0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20  != NULL) {..for 
36f0: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (int i = 0; i < 
3700: 73 6b 5f 41 43 43 45 53 53 5f 44 45 53 43 52 49  sk_ACCESS_DESCRI
3710: 50 54 49 4f 4e 5f 6e 75 6d 28 61 64 73 29 3b 20  PTION_num(ads); 
3720: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 61 64 20 3d  i++) {..    ad =
3730: 20 28 41 43 43 45 53 53 5f 44 45 53 43 52 49 50   (ACCESS_DESCRIP
3740: 54 49 4f 4e 20 2a 29 73 6b 5f 41 43 43 45 53 53  TION *)sk_ACCESS
3750: 5f 44 45 53 43 52 49 50 54 49 4f 4e 5f 76 61 6c  _DESCRIPTION_val
3760: 75 65 28 61 64 73 2c 20 69 29 3b 0a 09 20 20 20  ue(ads, i);..   
3770: 20 69 66 20 28 4f 42 4a 5f 6f 62 6a 32 6e 69 64   if (OBJ_obj2nid
3780: 28 61 64 2d 3e 6d 65 74 68 6f 64 29 20 3d 3d 20  (ad->method) == 
3790: 4e 49 44 5f 61 64 5f 63 61 5f 69 73 73 75 65 72  NID_ad_ca_issuer
37a0: 73 20 26 26 20 61 64 2d 3e 6c 6f 63 61 74 69 6f  s && ad->locatio
37b0: 6e 29 20 7b 0a 09 09 69 66 20 28 61 64 2d 3e 6c  n) {...if (ad->l
37c0: 6f 63 61 74 69 6f 6e 2d 3e 74 79 70 65 20 3d 3d  ocation->type ==
37d0: 20 47 45 4e 5f 55 52 49 29 20 7b 0a 09 09 20 20   GEN_URI) {...  
37e0: 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 20 3d    Tcl_Size len =
37f0: 20 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31   (Tcl_Size) ASN1
3800: 5f 53 54 52 49 4e 47 5f 74 6f 5f 55 54 46 38 28  _STRING_to_UTF8(
3810: 26 62 75 66 2c 20 61 64 2d 3e 6c 6f 63 61 74 69  &buf, ad->locati
3820: 6f 6e 2d 3e 64 2e 75 6e 69 66 6f 72 6d 52 65 73  on->d.uniformRes
3830: 6f 75 72 63 65 49 64 65 6e 74 69 66 69 65 72 29  ourceIdentifier)
3840: 3b 0a 09 09 20 20 20 20 54 63 6c 5f 4c 69 73 74  ;...    Tcl_List
3850: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3860: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
3870: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  bj, Tcl_NewStrin
3880: 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 20 62 75  gObj((char *) bu
3890: 66 2c 20 6c 65 6e 29 29 3b 0a 09 09 20 20 20 20  f, len));...    
38a0: 4f 50 45 4e 53 53 4c 5f 66 72 65 65 28 62 75 66  OPENSSL_free(buf
38b0: 29 3b 0a 09 09 20 20 20 20 62 72 65 61 6b 3b 0a  );...    break;.
38c0: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f  ..}..    }..}../
38d0: 2a 20 73 6b 5f 41 43 43 45 53 53 5f 44 45 53 43  * sk_ACCESS_DESC
38e0: 52 49 50 54 49 4f 4e 5f 70 6f 70 5f 66 72 65 65  RIPTION_pop_free
38f0: 28 61 64 73 2c 20 41 43 43 45 53 53 5f 44 45 53  (ads, ACCESS_DES
3900: 43 52 49 50 54 49 4f 4e 5f 66 72 65 65 29 3b 20  CRIPTION_free); 
3910: 2a 2f 0a 09 41 55 54 48 4f 52 49 54 59 5f 49 4e  */..AUTHORITY_IN
3920: 46 4f 5f 41 43 43 45 53 53 5f 66 72 65 65 28 61  FO_ACCESS_free(a
3930: 64 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ds);.    }.    r
3940: 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b  eturn resultObj;
3950: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
39b0: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 20 2d 2d 0a  s_NewX509Obj --.
39c0: 20 2a 0a 20 2a 09 50 61 72 73 65 73 20 61 20 58   *. *.Parses a X
39d0: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
39e0: 61 6e 64 20 72 65 74 75 72 6e 73 20 63 6f 6e 74  and returns cont
39f0: 65 6e 74 73 20 61 73 20 61 20 6b 65 79 2d 76 61  ents as a key-va
3a00: 6c 75 65 20 54 63 6c 20 6c 69 73 74 2e 0a 20 2a  lue Tcl list.. *
3a10: 0a 20 2a 20 52 65 73 75 6c 74 3a 0a 20 2a 09 41  . * Result:. *.A
3a20: 20 54 63 6c 20 4c 69 73 74 20 77 69 74 68 20 74   Tcl List with t
3a30: 68 65 20 58 35 30 39 20 63 65 72 74 69 66 69 63  he X509 certific
3a40: 61 74 65 20 69 6e 66 6f 20 61 73 20 61 20 6b 65  ate info as a ke
3a50: 79 2d 76 61 6c 75 65 20 6c 69 73 74 0a 20 2a 0a  y-value list. *.
3a60: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
3a70: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d  . *.None. *. *--
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
3ad0: 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 4e 65 77  Tcl_Obj *Tls_New
3ae0: 58 35 30 39 4f 62 6a 28 54 63 6c 5f 49 6e 74 65  X509Obj(Tcl_Inte
3af0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39  rp *interp, X509
3b00: 20 2a 63 65 72 74 2c 20 69 6e 74 20 61 6c 6c 29   *cert, int all)
3b10: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
3b20: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f  resultObj = Tcl_
3b30: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
3b40: 4c 4c 29 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69  LL);.    BIO *bi
3b50: 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  o = BIO_new(BIO_
3b60: 73 5f 6d 65 6d 28 29 29 3b 0a 20 20 20 20 69 6e  s_mem());.    in
3b70: 74 20 6d 64 6e 69 64 2c 20 70 6b 6e 69 64 2c 20  t mdnid, pknid, 
3b80: 62 69 74 73 3b 0a 20 20 20 20 54 63 6c 5f 53 69  bits;.    Tcl_Si
3b90: 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69  ze len;.    unsi
3ba0: 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 20  gned int ulen;. 
3bb0: 20 20 20 75 69 6e 74 33 32 5f 74 20 78 66 6c 61     uint32_t xfla
3bc0: 67 73 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  gs;.    unsigned
3bd0: 20 6c 6f 6e 67 20 66 6c 61 67 73 20 3d 20 58 4e   long flags = XN
3be0: 5f 46 4c 41 47 5f 52 46 43 32 32 35 33 20 7c 20  _FLAG_RFC2253 | 
3bf0: 41 53 4e 31 5f 53 54 52 46 4c 47 53 5f 55 54 46  ASN1_STRFLGS_UTF
3c00: 38 5f 43 4f 4e 56 45 52 54 3b 0a 20 20 20 20 66  8_CONVERT;.    f
3c10: 6c 61 67 73 20 26 3d 20 7e 28 75 6e 73 69 67 6e  lags &= ~(unsign
3c20: 65 64 20 6c 6f 6e 67 29 41 53 4e 31 5f 53 54 52  ed long)ASN1_STR
3c30: 46 4c 47 53 5f 45 53 43 5f 4d 53 42 3b 0a 0a 20  FLGS_ESC_MSB;.. 
3c40: 20 20 20 63 68 61 72 20 2a 62 75 66 66 65 72 20     char *buffer 
3c50: 3d 20 28 63 68 61 72 20 2a 29 63 6b 61 6c 6c 6f  = (char *)ckallo
3c60: 63 28 42 55 46 53 49 5a 20 3e 20 45 56 50 5f 4d  c(BUFSIZ > EVP_M
3c70: 41 58 5f 4d 44 5f 53 49 5a 45 20 3f 20 42 55 46  AX_MD_SIZE ? BUF
3c80: 53 49 5a 20 3a 20 45 56 50 5f 4d 41 58 5f 4d 44  SIZ : EVP_MAX_MD
3c90: 5f 53 49 5a 45 29 3b 0a 0a 20 20 20 20 64 70 72  _SIZE);..    dpr
3ca0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
3cb0: 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 20  .    if (interp 
3cc0: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 65 72 74 20  == NULL || cert 
3cd0: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62 69 6f 20 3d  == NULL || bio =
3ce0: 3d 20 4e 55 4c 4c 20 7c 7c 20 72 65 73 75 6c 74  = NULL || result
3cf0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62  Obj == NULL || b
3d00: 75 66 66 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b  uffer == NULL) {
3d10: 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
3d20: 6e 74 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 09  nt(resultObj);..
3d30: 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09  BIO_free(bio);..
3d40: 69 66 20 28 62 75 66 66 65 72 20 21 3d 20 4e 55  if (buffer != NU
3d50: 4c 4c 29 20 63 6b 66 72 65 65 28 62 75 66 66 65  LL) ckfree(buffe
3d60: 72 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  r);..return NULL
3d70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
3d80: 53 69 67 6e 61 74 75 72 65 20 61 6c 67 6f 72 69  Signature algori
3d90: 74 68 6d 20 61 6e 64 20 76 61 6c 75 65 20 2d 20  thm and value - 
3da0: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e  RFC 5280 section
3db0: 20 34 2e 31 2e 31 2e 32 20 61 6e 64 20 34 2e 31   4.1.1.2 and 4.1
3dc0: 2e 31 2e 33 20 2a 2f 0a 20 20 20 20 2f 2a 20 73  .1.3 */.    /* s
3dd0: 69 67 6e 61 74 75 72 65 41 6c 67 6f 72 69 74 68  ignatureAlgorith
3de0: 6d 20 69 73 20 74 68 65 20 69 64 20 6f 66 20 74  m is the id of t
3df0: 68 65 20 63 72 79 70 74 6f 67 72 61 70 68 69 63  he cryptographic
3e00: 20 61 6c 67 6f 72 69 74 68 6d 20 75 73 65 64 20   algorithm used 
3e10: 62 79 20 74 68 65 0a 09 43 41 20 74 6f 20 73 69  by the..CA to si
3e20: 67 6e 20 74 68 69 73 20 63 65 72 74 2e 20 73 69  gn this cert. si
3e30: 67 6e 61 74 75 72 65 56 61 6c 75 65 20 69 73 20  gnatureValue is 
3e40: 74 68 65 20 64 69 67 69 74 61 6c 20 73 69 67 6e  the digital sign
3e50: 61 74 75 72 65 20 63 6f 6d 70 75 74 65 64 0a 09  ature computed..
3e60: 75 70 6f 6e 20 74 68 65 20 41 53 4e 2e 31 20 44  upon the ASN.1 D
3e70: 45 52 20 65 6e 63 6f 64 65 64 20 74 62 73 43 65  ER encoded tbsCe
3e80: 72 74 69 66 69 63 61 74 65 2e 20 2a 2f 0a 20 20  rtificate. */.  
3e90: 20 20 7b 0a 09 63 6f 6e 73 74 20 58 35 30 39 5f    {..const X509_
3ea0: 41 4c 47 4f 52 20 2a 73 69 67 5f 61 6c 67 3b 0a  ALGOR *sig_alg;.
3eb0: 09 63 6f 6e 73 74 20 41 53 4e 31 5f 42 49 54 5f  .const ASN1_BIT_
3ec0: 53 54 52 49 4e 47 20 2a 73 69 67 3b 0a 09 69 6e  STRING *sig;..in
3ed0: 74 20 73 69 67 5f 6e 69 64 3b 0a 0a 09 58 35 30  t sig_nid;...X50
3ee0: 39 5f 67 65 74 30 5f 73 69 67 6e 61 74 75 72 65  9_get0_signature
3ef0: 28 26 73 69 67 2c 20 26 73 69 67 5f 61 6c 67 2c  (&sig, &sig_alg,
3f00: 20 63 65 72 74 29 3b 0a 09 2f 2a 20 73 69 67 5f   cert);../* sig_
3f10: 6e 69 64 20 3d 20 58 35 30 39 5f 67 65 74 5f 73  nid = X509_get_s
3f20: 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 63 65 72  ignature_nid(cer
3f30: 74 29 20 2a 2f 0a 09 73 69 67 5f 6e 69 64 20 3d  t) */..sig_nid =
3f40: 20 4f 42 4a 5f 6f 62 6a 32 6e 69 64 28 73 69 67   OBJ_obj2nid(sig
3f50: 5f 61 6c 67 2d 3e 61 6c 67 6f 72 69 74 68 6d 29  _alg->algorithm)
3f60: 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
3f70: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
3f80: 2c 20 22 73 69 67 6e 61 74 75 72 65 41 6c 67 6f  , "signatureAlgo
3f90: 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32  rithm", OBJ_nid2
3fa0: 6c 6e 28 73 69 67 5f 6e 69 64 29 2c 20 2d 31 29  ln(sig_nid), -1)
3fb0: 3b 0a 09 69 66 20 28 73 69 67 5f 6e 69 64 20 21  ;..if (sig_nid !
3fc0: 3d 20 4e 49 44 5f 75 6e 64 65 66 29 20 7b 0a 09  = NID_undef) {..
3fd0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28      LAPPEND_OBJ(
3fe0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
3ff0: 6a 2c 20 22 73 69 67 6e 61 74 75 72 65 56 61 6c  j, "signatureVal
4000: 75 65 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f 48  ue", String_to_H
4010: 65 78 28 73 69 67 2d 3e 64 61 74 61 2c 20 73 69  ex(sig->data, si
4020: 67 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a 09 7d 20  g->length));..} 
4030: 65 6c 73 65 20 7b 0a 09 20 20 20 20 4c 41 50 50  else {..    LAPP
4040: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
4050: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e  resultObj, "sign
4060: 61 74 75 72 65 56 61 6c 75 65 22 2c 20 22 22 2c  atureValue", "",
4070: 20 30 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20   0);..}.    }.. 
4080: 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 20 6f 66     /* Version of
4090: 20 74 68 65 20 65 6e 63 6f 64 65 64 20 63 65 72   the encoded cer
40a0: 74 69 66 69 63 61 74 65 20 2d 20 52 46 43 20 35  tificate - RFC 5
40b0: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e  280 section 4.1.
40c0: 32 2e 31 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45  2.1 */.    LAPPE
40d0: 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20  ND_LONG(interp, 
40e0: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 76 65 72 73  resultObj, "vers
40f0: 69 6f 6e 22 2c 20 58 35 30 39 5f 67 65 74 5f 76  ion", X509_get_v
4100: 65 72 73 69 6f 6e 28 63 65 72 74 29 2b 31 29 3b  ersion(cert)+1);
4110: 0a 0a 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20  ..    /* Unique 
4120: 6e 75 6d 62 65 72 20 61 73 73 69 67 6e 65 64 20  number assigned 
4130: 62 79 20 43 41 20 74 6f 20 63 65 72 74 69 66 69  by CA to certifi
4140: 63 61 74 65 20 2d 20 52 46 43 20 35 32 38 30 20  cate - RFC 5280 
4150: 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 32 20  section 4.1.2.2 
4160: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f  */.    len = BIO
4170: 5f 74 6f 5f 42 75 66 66 65 72 28 69 32 61 5f 41  _to_Buffer(i2a_A
4180: 53 4e 31 5f 49 4e 54 45 47 45 52 28 62 69 6f 2c  SN1_INTEGER(bio,
4190: 20 58 35 30 39 5f 67 65 74 30 5f 73 65 72 69 61   X509_get0_seria
41a0: 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 29 2c 20  lNumber(cert)), 
41b0: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46  bio, buffer, BUF
41c0: 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  SIZ);.    LAPPEN
41d0: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65  D_STR(interp, re
41e0: 73 75 6c 74 4f 62 6a 2c 20 22 73 65 72 69 61 6c  sultObj, "serial
41f0: 4e 75 6d 62 65 72 22 2c 20 62 75 66 66 65 72 2c  Number", buffer,
4200: 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 53   len);..    /* S
4210: 69 67 6e 61 74 75 72 65 20 61 6c 67 6f 72 69 74  ignature algorit
4220: 68 6d 20 75 73 65 64 20 62 79 20 74 68 65 20 43  hm used by the C
4230: 41 20 74 6f 20 73 69 67 6e 20 74 68 65 20 63 65  A to sign the ce
4240: 72 74 69 66 69 63 61 74 65 2e 20 4d 75 73 74 20  rtificate. Must 
4250: 6d 61 74 63 68 0a 09 73 69 67 6e 61 74 75 72 65  match..signature
4260: 41 6c 67 6f 72 69 74 68 6d 2e 20 52 46 43 20 35  Algorithm. RFC 5
4270: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e  280 section 4.1.
4280: 32 2e 33 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45  2.3 */.    LAPPE
4290: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72  ND_STR(interp, r
42a0: 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61  esultObj, "signa
42b0: 74 75 72 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c  ture", OBJ_nid2l
42c0: 6e 28 58 35 30 39 5f 67 65 74 5f 73 69 67 6e 61  n(X509_get_signa
42d0: 74 75 72 65 5f 6e 69 64 28 63 65 72 74 29 29 2c  ture_nid(cert)),
42e0: 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 73   -1);..    /* Is
42f0: 73 75 65 72 20 69 64 65 6e 74 69 66 69 65 73 20  suer identifies 
4300: 74 68 65 20 65 6e 74 69 74 79 20 74 68 61 74 20  the entity that 
4310: 73 69 67 6e 65 64 20 61 6e 64 20 69 73 73 75 65  signed and issue
4320: 64 20 74 68 65 20 63 65 72 74 2e 20 52 46 43 20  d the cert. RFC 
4330: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31  5280 section 4.1
4340: 2e 32 2e 34 20 2a 2f 0a 20 20 20 20 6c 65 6e 20  .2.4 */.    len 
4350: 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28  = BIO_to_Buffer(
4360: 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e 74 5f  X509_NAME_print_
4370: 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 74  ex(bio, X509_get
4380: 5f 69 73 73 75 65 72 5f 6e 61 6d 65 28 63 65 72  _issuer_name(cer
4390: 74 29 2c 20 30 2c 20 66 6c 61 67 73 29 2c 20 62  t), 0, flags), b
43a0: 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53  io, buffer, BUFS
43b0: 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  IZ);.    LAPPEND
43c0: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73  _STR(interp, res
43d0: 75 6c 74 4f 62 6a 2c 20 22 69 73 73 75 65 72 22  ultObj, "issuer"
43e0: 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a  , buffer, len);.
43f0: 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63  .    /* Certific
4400: 61 74 65 20 76 61 6c 69 64 69 74 79 20 70 65 72  ate validity per
4410: 69 6f 64 20 69 73 20 74 68 65 20 69 6e 74 65 72  iod is the inter
4420: 76 61 6c 20 74 68 65 20 43 41 20 77 61 72 72 61  val the CA warra
4430: 6e 74 73 20 74 68 61 74 20 69 74 20 77 69 6c 6c  nts that it will
4440: 0a 09 6d 61 69 6e 74 61 69 6e 20 69 6e 66 6f 20  ..maintain info 
4450: 6f 6e 20 74 68 65 20 73 74 61 74 75 73 20 6f 66  on the status of
4460: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
4470: 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69  . RFC 5280 secti
4480: 6f 6e 20 34 2e 31 2e 32 2e 35 20 2a 2f 0a 20 20  on 4.1.2.5 */.  
4490: 20 20 2f 2a 20 47 65 74 20 56 61 6c 69 64 69 74    /* Get Validit
44a0: 79 20 2d 20 4e 6f 74 20 42 65 66 6f 72 65 20 2a  y - Not Before *
44b0: 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f  /.    len = BIO_
44c0: 74 6f 5f 42 75 66 66 65 72 28 41 53 4e 31 5f 54  to_Buffer(ASN1_T
44d0: 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c 20 58  IME_print(bio, X
44e0: 35 30 39 5f 67 65 74 30 5f 6e 6f 74 42 65 66 6f  509_get0_notBefo
44f0: 72 65 28 63 65 72 74 29 29 2c 20 62 69 6f 2c 20  re(cert)), bio, 
4500: 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b  buffer, BUFSIZ);
4510: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
4520: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
4530: 62 6a 2c 20 22 6e 6f 74 42 65 66 6f 72 65 22 2c  bj, "notBefore",
4540: 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a   buffer, len);..
4550: 20 20 20 20 2f 2a 20 47 65 74 20 56 61 6c 69 64      /* Get Valid
4560: 69 74 79 20 2d 20 4e 6f 74 20 41 66 74 65 72 20  ity - Not After 
4570: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f  */.    len = BIO
4580: 5f 74 6f 5f 42 75 66 66 65 72 28 41 53 4e 31 5f  _to_Buffer(ASN1_
4590: 54 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c 20  TIME_print(bio, 
45a0: 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74 41 66 74  X509_get0_notAft
45b0: 65 72 28 63 65 72 74 29 29 2c 20 62 69 6f 2c 20  er(cert)), bio, 
45c0: 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b  buffer, BUFSIZ);
45d0: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
45e0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
45f0: 62 6a 2c 20 22 6e 6f 74 41 66 74 65 72 22 2c 20  bj, "notAfter", 
4600: 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a 20  buffer, len);.. 
4610: 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 69 64     /* Subject id
4620: 65 6e 74 69 66 69 65 73 20 74 68 65 20 65 6e 74  entifies the ent
4630: 69 74 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ity associated w
4640: 69 74 68 20 74 68 65 20 70 75 62 6c 69 63 20 6b  ith the public k
4650: 65 79 20 73 74 6f 72 65 64 20 69 6e 0a 09 74 68  ey stored in..th
4660: 65 20 73 75 62 6a 65 63 74 20 70 75 62 6c 69 63  e subject public
4670: 20 6b 65 79 20 66 69 65 6c 64 2e 20 52 46 43 20   key field. RFC 
4680: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31  5280 section 4.1
4690: 2e 32 2e 36 20 2a 2f 0a 20 20 20 20 6c 65 6e 20  .2.6 */.    len 
46a0: 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28  = BIO_to_Buffer(
46b0: 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e 74 5f  X509_NAME_print_
46c0: 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 74  ex(bio, X509_get
46d0: 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65  _subject_name(ce
46e0: 72 74 29 2c 20 30 2c 20 66 6c 61 67 73 29 2c 20  rt), 0, flags), 
46f0: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46  bio, buffer, BUF
4700: 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  SIZ);.    LAPPEN
4710: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65  D_STR(interp, re
4720: 73 75 6c 74 4f 62 6a 2c 20 22 73 75 62 6a 65 63  sultObj, "subjec
4730: 74 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29  t", buffer, len)
4740: 3b 0a 0a 20 20 20 20 2f 2a 20 53 48 41 31 20 44  ;..    /* SHA1 D
4750: 69 67 65 73 74 20 28 46 69 6e 67 65 72 70 72 69  igest (Fingerpri
4760: 6e 74 29 20 6f 66 20 63 65 72 74 20 2d 20 44 45  nt) of cert - DE
4770: 52 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  R representation
4780: 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35 30 39   */.    if (X509
4790: 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 45 56  _digest(cert, EV
47a0: 50 5f 73 68 61 31 28 29 2c 20 28 75 6e 73 69 67  P_sha1(), (unsig
47b0: 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 65  ned char *)buffe
47c0: 72 2c 20 26 75 6c 65 6e 29 29 20 7b 0a 09 4c 41  r, &ulen)) {..LA
47d0: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70  PPEND_OBJ(interp
47e0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 68  , resultObj, "sh
47f0: 61 31 5f 68 61 73 68 22 2c 20 53 74 72 69 6e 67  a1_hash", String
4800: 5f 74 6f 5f 48 65 78 28 28 75 6e 73 69 67 6e 65  _to_Hex((unsigne
4810: 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 72 2c  d char *)buffer,
4820: 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 20   (int) ulen));. 
4830: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 48 41     }..    /* SHA
4840: 32 35 36 20 44 69 67 65 73 74 20 28 46 69 6e 67  256 Digest (Fing
4850: 65 72 70 72 69 6e 74 29 20 6f 66 20 63 65 72 74  erprint) of cert
4860: 20 2d 20 44 45 52 20 72 65 70 72 65 73 65 6e 74   - DER represent
4870: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20  ation */.    if 
4880: 28 58 35 30 39 5f 64 69 67 65 73 74 28 63 65 72  (X509_digest(cer
4890: 74 2c 20 45 56 50 5f 73 68 61 32 35 36 28 29 2c  t, EVP_sha256(),
48a0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
48b0: 2a 29 62 75 66 66 65 72 2c 20 26 75 6c 65 6e 29  *)buffer, &ulen)
48c0: 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a  ) {..LAPPEND_OBJ
48d0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
48e0: 62 6a 2c 20 22 73 68 61 32 35 36 5f 68 61 73 68  bj, "sha256_hash
48f0: 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78  ", String_to_Hex
4900: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ((unsigned char 
4910: 2a 29 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20  *)buffer, (int) 
4920: 75 6c 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ulen));.    }.. 
4930: 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 50 75     /* Subject Pu
4940: 62 6c 69 63 20 4b 65 79 20 49 6e 66 6f 20 73 70  blic Key Info sp
4950: 65 63 69 66 69 65 73 20 74 68 65 20 70 75 62 6c  ecifies the publ
4960: 69 63 20 6b 65 79 20 61 6e 64 20 69 64 65 6e 74  ic key and ident
4970: 69 66 69 65 73 20 74 68 65 0a 09 61 6c 67 6f 72  ifies the..algor
4980: 69 74 68 6d 20 77 69 74 68 20 77 68 69 63 68 20  ithm with which 
4990: 74 68 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e  the key is used.
49a0: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f   RFC 5280 sectio
49b0: 6e 20 34 2e 31 2e 32 2e 37 20 2a 2f 0a 20 20 20  n 4.1.2.7 */.   
49c0: 20 69 66 20 28 58 35 30 39 5f 67 65 74 5f 73 69   if (X509_get_si
49d0: 67 6e 61 74 75 72 65 5f 69 6e 66 6f 28 63 65 72  gnature_info(cer
49e0: 74 2c 20 26 6d 64 6e 69 64 2c 20 26 70 6b 6e 69  t, &mdnid, &pkni
49f0: 64 2c 20 26 62 69 74 73 2c 20 26 78 66 6c 61 67  d, &bits, &xflag
4a00: 73 29 29 20 7b 0a 09 41 53 4e 31 5f 42 49 54 5f  s)) {..ASN1_BIT_
4a10: 53 54 52 49 4e 47 20 2a 6b 65 79 3b 0a 09 75 6e  STRING *key;..un
4a20: 73 69 67 6e 65 64 20 69 6e 74 20 6e 3b 0a 0a 09  signed int n;...
4a30: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
4a40: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
4a50: 73 69 67 6e 69 6e 67 44 69 67 65 73 74 22 2c 20  signingDigest", 
4a60: 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6d 64 6e 69 64  OBJ_nid2ln(mdnid
4a70: 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44  ), -1);..LAPPEND
4a80: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73  _STR(interp, res
4a90: 75 6c 74 4f 62 6a 2c 20 22 70 75 62 6c 69 63 4b  ultObj, "publicK
4aa0: 65 79 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42  eyAlgorithm", OB
4ab0: 4a 5f 6e 69 64 32 6c 6e 28 70 6b 6e 69 64 29 2c  J_nid2ln(pknid),
4ac0: 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49   -1);..LAPPEND_I
4ad0: 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  NT(interp, resul
4ae0: 74 4f 62 6a 2c 20 22 62 69 74 73 22 2c 20 62 69  tObj, "bits", bi
4af0: 74 73 29 3b 20 2f 2a 20 45 66 66 65 63 74 69 76  ts); /* Effectiv
4b00: 65 20 73 65 63 75 72 69 74 79 20 62 69 74 73 20  e security bits 
4b10: 2a 2f 0a 0a 09 6b 65 79 20 3d 20 58 35 30 39 5f  */...key = X509_
4b20: 67 65 74 30 5f 70 75 62 6b 65 79 5f 62 69 74 73  get0_pubkey_bits
4b30: 74 72 28 63 65 72 74 29 3b 0a 09 4c 41 50 50 45  tr(cert);..LAPPE
4b40: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72  ND_OBJ(interp, r
4b50: 65 73 75 6c 74 4f 62 6a 2c 20 22 70 75 62 6c 69  esultObj, "publi
4b60: 63 4b 65 79 22 2c 20 53 74 72 69 6e 67 5f 74 6f  cKey", String_to
4b70: 5f 48 65 78 28 6b 65 79 2d 3e 64 61 74 61 2c 20  _Hex(key->data, 
4b80: 6b 65 79 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a 0a  key->length));..
4b90: 09 69 66 20 28 58 35 30 39 5f 70 75 62 6b 65 79  .if (X509_pubkey
4ba0: 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 45 56  _digest(cert, EV
4bb0: 50 5f 67 65 74 5f 64 69 67 65 73 74 62 79 6e 69  P_get_digestbyni
4bc0: 64 28 70 6b 6e 69 64 29 2c 20 28 75 6e 73 69 67  d(pknid), (unsig
4bd0: 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 65  ned char *)buffe
4be0: 72 2c 20 26 6e 29 29 20 7b 0a 09 20 20 20 20 4c  r, &n)) {..    L
4bf0: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72  APPEND_OBJ(inter
4c00: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70  p, resultObj, "p
4c10: 75 62 6c 69 63 4b 65 79 48 61 73 68 22 2c 20 53  ublicKeyHash", S
4c20: 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 28 75 6e  tring_to_Hex((un
4c30: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75  signed char *)bu
4c40: 66 66 65 72 2c 20 28 69 6e 74 29 20 6e 29 29 3b  ffer, (int) n));
4c50: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
4c60: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
4c70: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
4c80: 70 75 62 6c 69 63 4b 65 79 48 61 73 68 22 2c 20  publicKeyHash", 
4c90: 22 22 2c 20 30 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  "", 0);..}.../* 
4ca0: 64 69 67 65 73 74 20 6f 66 20 74 68 65 20 44 45  digest of the DE
4cb0: 52 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  R representation
4cc0: 20 6f 66 20 74 68 65 20 63 65 72 74 69 66 69 63   of the certific
4cd0: 61 74 65 20 2a 2f 0a 09 69 66 20 28 58 35 30 39  ate */..if (X509
4ce0: 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 45 56  _digest(cert, EV
4cf0: 50 5f 67 65 74 5f 64 69 67 65 73 74 62 79 6e 69  P_get_digestbyni
4d00: 64 28 6d 64 6e 69 64 29 2c 20 28 75 6e 73 69 67  d(mdnid), (unsig
4d10: 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 65  ned char *)buffe
4d20: 72 2c 20 26 6e 29 29 20 7b 0a 09 20 20 20 20 4c  r, &n)) {..    L
4d30: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72  APPEND_OBJ(inter
4d40: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73  p, resultObj, "s
4d50: 69 67 6e 61 74 75 72 65 48 61 73 68 22 2c 20 53  ignatureHash", S
4d60: 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 28 75 6e  tring_to_Hex((un
4d70: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75  signed char *)bu
4d80: 66 66 65 72 2c 20 28 69 6e 74 29 20 6e 29 29 3b  ffer, (int) n));
4d90: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
4da0: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
4db0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
4dc0: 73 69 67 6e 61 74 75 72 65 48 61 73 68 22 2c 20  signatureHash", 
4dd0: 22 22 2c 20 30 29 3b 0a 09 7d 0a 20 20 20 20 7d  "", 0);..}.    }
4de0: 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69  ..    /* Certifi
4df0: 63 61 74 65 20 50 75 72 70 6f 73 65 2e 20 43 61  cate Purpose. Ca
4e00: 6c 6c 20 62 65 66 6f 72 65 20 63 68 65 63 6b 69  ll before checki
4e10: 6e 67 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e  ng for extension
4e20: 73 2e 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  s. */.    LAPPEN
4e30: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65  D_STR(interp, re
4e40: 73 75 6c 74 4f 62 6a 2c 20 22 70 75 72 70 6f 73  sultObj, "purpos
4e50: 65 22 2c 20 54 6c 73 5f 78 35 30 39 50 75 72 70  e", Tls_x509Purp
4e60: 6f 73 65 28 63 65 72 74 29 2c 20 2d 31 29 3b 0a  ose(cert), -1);.
4e70: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28      LAPPEND_OBJ(
4e80: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
4e90: 6a 2c 20 22 63 65 72 74 69 66 69 63 61 74 65 50  j, "certificateP
4ea0: 75 72 70 6f 73 65 22 2c 20 54 6c 73 5f 78 35 30  urpose", Tls_x50
4eb0: 39 50 75 72 70 6f 73 65 73 28 69 6e 74 65 72 70  9Purposes(interp
4ec0: 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f  , cert));..    /
4ed0: 2a 20 47 65 74 20 65 78 74 65 6e 73 69 6f 6e 73  * Get extensions
4ee0: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20 78 66   flags */.    xf
4ef0: 6c 61 67 73 20 3d 20 58 35 30 39 5f 67 65 74 5f  lags = X509_get_
4f00: 65 78 74 65 6e 73 69 6f 6e 5f 66 6c 61 67 73 28  extension_flags(
4f10: 63 65 72 74 29 3b 0a 20 20 20 20 4c 41 50 50 45  cert);.    LAPPE
4f20: 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 72  ND_INT(interp, r
4f30: 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74 46 6c  esultObj, "extFl
4f40: 61 67 73 22 2c 20 78 66 6c 61 67 73 29 3b 0a 0a  ags", xflags);..
4f50: 09 2f 2a 20 43 68 65 63 6b 20 69 66 20 63 65 72  ./* Check if cer
4f60: 74 20 77 61 73 20 69 73 73 75 65 64 20 62 79 20  t was issued by 
4f70: 43 41 20 63 65 72 74 20 69 73 73 75 65 72 20 6f  CA cert issuer o
4f80: 72 20 73 65 6c 66 20 73 69 67 6e 65 64 20 2a 2f  r self signed */
4f90: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f  .    LAPPEND_BOO
4fa0: 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  L(interp, result
4fb0: 4f 62 6a 2c 20 22 73 65 6c 66 49 73 73 75 65 64  Obj, "selfIssued
4fc0: 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c  ", xflags & EXFL
4fd0: 41 47 5f 53 49 29 3b 0a 20 20 20 20 4c 41 50 50  AG_SI);.    LAPP
4fe0: 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
4ff0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 65 6c   resultObj, "sel
5000: 66 53 69 67 6e 65 64 22 2c 20 78 66 6c 61 67 73  fSigned", xflags
5010: 20 26 20 45 58 46 4c 41 47 5f 53 53 29 3b 0a 20   & EXFLAG_SS);. 
5020: 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28     LAPPEND_BOOL(
5030: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
5040: 6a 2c 20 22 69 73 50 72 6f 78 79 43 65 72 74 22  j, "isProxyCert"
5050: 2c 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41  , xflags & EXFLA
5060: 47 5f 50 52 4f 58 59 29 3b 0a 20 20 20 20 4c 41  G_PROXY);.    LA
5070: 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
5080: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65  p, resultObj, "e
5090: 78 74 49 6e 76 61 6c 69 64 22 2c 20 78 66 6c 61  xtInvalid", xfla
50a0: 67 73 20 26 20 45 58 46 4c 41 47 5f 49 4e 56 41  gs & EXFLAG_INVA
50b0: 4c 49 44 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  LID);.    LAPPEN
50c0: 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72  D_BOOL(interp, r
50d0: 65 73 75 6c 74 4f 62 6a 2c 20 22 69 73 43 41 43  esultObj, "isCAC
50e0: 65 72 74 22 2c 20 58 35 30 39 5f 63 68 65 63 6b  ert", X509_check
50f0: 5f 63 61 28 63 65 72 74 29 29 3b 0a 0a 20 20 20  _ca(cert));..   
5100: 20 2f 2a 20 54 68 65 20 55 6e 69 71 75 65 20 49   /* The Unique I
5110: 64 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 68  ds are used to h
5120: 61 6e 64 6c 65 20 74 68 65 20 70 6f 73 73 69 62  andle the possib
5130: 69 6c 69 74 79 20 6f 66 20 72 65 75 73 65 20 6f  ility of reuse o
5140: 66 20 73 75 62 6a 65 63 74 0a 09 61 6e 64 2f 6f  f subject..and/o
5150: 72 20 69 73 73 75 65 72 20 6e 61 6d 65 73 20 6f  r issuer names o
5160: 76 65 72 20 74 69 6d 65 2e 20 52 46 43 20 35 32  ver time. RFC 52
5170: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32  80 section 4.1.2
5180: 2e 38 20 2a 2f 0a 20 20 20 20 7b 0a 09 63 6f 6e  .8 */.    {..con
5190: 73 74 20 41 53 4e 31 5f 42 49 54 5f 53 54 52 49  st ASN1_BIT_STRI
51a0: 4e 47 20 2a 69 75 69 64 2c 20 2a 73 75 69 64 3b  NG *iuid, *suid;
51b0: 0a 09 58 35 30 39 5f 67 65 74 30 5f 75 69 64 73  ..X509_get0_uids
51c0: 28 63 65 72 74 2c 20 26 69 75 69 64 2c 20 26 73  (cert, &iuid, &s
51d0: 75 69 64 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74  uid);...Tcl_List
51e0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
51f0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
5200: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  bj, Tcl_NewStrin
5210: 67 4f 62 6a 28 22 69 73 73 75 65 72 55 6e 69 71  gObj("issuerUniq
5220: 75 65 49 64 22 2c 20 2d 31 29 29 3b 0a 09 69 66  ueId", -1));..if
5230: 20 28 69 75 69 64 20 21 3d 20 4e 55 4c 4c 29 20   (iuid != NULL) 
5240: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
5250: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5260: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
5270: 6a 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  j, Tcl_NewByteAr
5280: 72 61 79 4f 62 6a 28 28 63 6f 6e 73 74 20 75 6e  rayObj((const un
5290: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 69 75  signed char *)iu
52a0: 69 64 2d 3e 64 61 74 61 2c 20 28 54 63 6c 5f 53  id->data, (Tcl_S
52b0: 69 7a 65 29 20 69 75 69 64 2d 3e 6c 65 6e 67 74  ize) iuid->lengt
52c0: 68 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  h));..} else {..
52d0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
52e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
52f0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
5300: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5310: 28 22 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 0a 09  ("", -1));..}...
5320: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5330: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
5340: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f   resultObj, Tcl_
5350: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 75  NewStringObj("su
5360: 62 6a 65 63 74 55 6e 69 71 75 65 49 64 22 2c 20  bjectUniqueId", 
5370: 2d 31 29 29 3b 0a 09 69 66 20 28 73 75 69 64 20  -1));..if (suid 
5380: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
5390: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
53a0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
53b0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f   resultObj, Tcl_
53c0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
53d0: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
53e0: 63 68 61 72 20 2a 29 73 75 69 64 2d 3e 64 61 74  char *)suid->dat
53f0: 61 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 75  a, (Tcl_Size) su
5400: 69 64 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a 09 7d  id->length));..}
5410: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c   else {..    Tcl
5420: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5430: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65  ement(interp, re
5440: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77  sultObj, Tcl_New
5450: 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31  StringObj("", -1
5460: 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  ));..}.    }..  
5470: 20 20 2f 2a 20 58 35 30 39 20 76 33 20 45 78 74    /* X509 v3 Ext
5480: 65 6e 73 69 6f 6e 73 20 2d 20 52 46 43 20 35 32  ensions - RFC 52
5490: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32  80 section 4.1.2
54a0: 2e 39 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  .9 */.    LAPPEN
54b0: 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 65  D_INT(interp, re
54c0: 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74 43 6f 75  sultObj, "extCou
54d0: 6e 74 22 2c 20 58 35 30 39 5f 67 65 74 5f 65 78  nt", X509_get_ex
54e0: 74 5f 63 6f 75 6e 74 28 63 65 72 74 29 29 3b 0a  t_count(cert));.
54f0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28      LAPPEND_OBJ(
5500: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
5510: 6a 2c 20 22 65 78 74 65 6e 73 69 6f 6e 73 22 2c  j, "extensions",
5520: 20 54 6c 73 5f 78 35 30 39 45 78 74 65 6e 73 69   Tls_x509Extensi
5530: 6f 6e 73 28 69 6e 74 65 72 70 2c 20 63 65 72 74  ons(interp, cert
5540: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 75 74 68  ));..    /* Auth
5550: 6f 72 69 74 79 20 4b 65 79 20 49 64 65 6e 74 69  ority Key Identi
5560: 66 69 65 72 20 28 41 4b 49 29 20 69 73 20 74 68  fier (AKI) is th
5570: 65 20 53 75 62 6a 65 63 74 20 4b 65 79 20 49 64  e Subject Key Id
5580: 65 6e 74 69 66 69 65 72 20 28 53 4b 49 29 20 6f  entifier (SKI) o
5590: 66 0a 09 69 74 73 20 73 69 67 6e 65 72 20 28 74  f..its signer (t
55a0: 68 65 20 43 41 29 2e 20 52 46 43 20 35 32 38 30  he CA). RFC 5280
55b0: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31   section 4.2.1.1
55c0: 2c 20 4e 49 44 5f 61 75 74 68 6f 72 69 74 79 5f  , NID_authority_
55d0: 6b 65 79 5f 69 64 65 6e 74 69 66 69 65 72 20 2a  key_identifier *
55e0: 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42  /.    LAPPEND_OB
55f0: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  J(interp, result
5600: 4f 62 6a 2c 20 22 61 75 74 68 6f 72 69 74 79 4b  Obj, "authorityK
5610: 65 79 49 64 65 6e 74 69 66 69 65 72 22 2c 0a 09  eyIdentifier",..
5620: 54 6c 73 5f 78 35 30 39 49 64 65 6e 74 69 66 69  Tls_x509Identifi
5630: 65 72 28 58 35 30 39 5f 67 65 74 30 5f 61 75 74  er(X509_get0_aut
5640: 68 6f 72 69 74 79 5f 6b 65 79 5f 69 64 28 63 65  hority_key_id(ce
5650: 72 74 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  rt)));..    /* S
5660: 75 62 6a 65 63 74 20 4b 65 79 20 49 64 65 6e 74  ubject Key Ident
5670: 69 66 69 65 72 20 28 53 4b 49 29 20 69 73 20 75  ifier (SKI) is u
5680: 73 65 64 20 74 6f 20 69 64 65 6e 74 69 66 79 20  sed to identify 
5690: 63 65 72 74 69 66 69 63 61 74 65 73 20 74 68 61  certificates tha
56a0: 74 20 63 6f 6e 74 61 69 6e 0a 09 61 20 70 61 72  t contain..a par
56b0: 74 69 63 75 6c 61 72 20 70 75 62 6c 69 63 20 6b  ticular public k
56c0: 65 79 2e 20 52 46 43 20 35 32 38 30 20 73 65 63  ey. RFC 5280 sec
56d0: 74 69 6f 6e 20 34 2e 32 2e 31 2e 32 2c 20 4e 49  tion 4.2.1.2, NI
56e0: 44 5f 73 75 62 6a 65 63 74 5f 6b 65 79 5f 69 64  D_subject_key_id
56f0: 65 6e 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20  entifier */.    
5700: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65  LAPPEND_OBJ(inte
5710: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
5720: 73 75 62 6a 65 63 74 4b 65 79 49 64 65 6e 74 69  subjectKeyIdenti
5730: 66 69 65 72 22 2c 0a 09 54 6c 73 5f 78 35 30 39  fier",..Tls_x509
5740: 49 64 65 6e 74 69 66 69 65 72 28 58 35 30 39 5f  Identifier(X509_
5750: 67 65 74 30 5f 73 75 62 6a 65 63 74 5f 6b 65 79  get0_subject_key
5760: 5f 69 64 28 63 65 72 74 29 29 29 3b 0a 0a 20 20  _id(cert)));..  
5770: 20 20 2f 2a 20 4b 65 79 20 75 73 61 67 65 20 65    /* Key usage e
5780: 78 74 65 6e 73 69 6f 6e 20 64 65 66 69 6e 65 73  xtension defines
5790: 20 74 68 65 20 70 75 72 70 6f 73 65 20 28 65 2e   the purpose (e.
57a0: 67 2e 2c 20 65 6e 63 69 70 68 65 72 6d 65 6e 74  g., encipherment
57b0: 2c 20 73 69 67 6e 61 74 75 72 65 2c 20 63 65 72  , signature, cer
57c0: 74 69 66 69 63 61 74 65 0a 09 73 69 67 6e 69 6e  tificate..signin
57d0: 67 29 20 6f 66 20 74 68 65 20 6b 65 79 20 69 6e  g) of the key in
57e0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
57f0: 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69  . RFC 5280 secti
5800: 6f 6e 20 34 2e 32 2e 31 2e 33 2c 20 4e 49 44 5f  on 4.2.1.3, NID_
5810: 6b 65 79 5f 75 73 61 67 65 20 2a 2f 0a 20 20 20  key_usage */.   
5820: 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74   LAPPEND_OBJ(int
5830: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
5840: 22 6b 65 79 55 73 61 67 65 22 2c 20 54 6c 73 5f  "keyUsage", Tls_
5850: 78 35 30 39 4b 65 79 55 73 61 67 65 28 69 6e 74  x509KeyUsage(int
5860: 65 72 70 2c 20 63 65 72 74 2c 20 78 66 6c 61 67  erp, cert, xflag
5870: 73 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 65 72  s));..    /* Cer
5880: 74 69 66 69 63 61 74 65 20 50 6f 6c 69 63 69 65  tificate Policie
5890: 73 20 2d 20 69 6e 64 69 63 61 74 65 73 20 74 68  s - indicates th
58a0: 65 20 69 73 73 75 69 6e 67 20 43 41 20 63 6f 6e  e issuing CA con
58b0: 73 69 64 65 72 73 20 69 74 73 20 69 73 73 75 65  siders its issue
58c0: 72 44 6f 6d 61 69 6e 50 6f 6c 69 63 79 0a 09 65  rDomainPolicy..e
58d0: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
58e0: 20 73 75 62 6a 65 63 74 20 43 41 27 73 20 73 75   subject CA's su
58f0: 62 6a 65 63 74 44 6f 6d 61 69 6e 50 6f 6c 69 63  bjectDomainPolic
5900: 79 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74  y. RFC 5280 sect
5910: 69 6f 6e 20 34 2e 32 2e 31 2e 34 2c 20 4e 49 44  ion 4.2.1.4, NID
5920: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 70 6f 6c  _certificate_pol
5930: 69 63 69 65 73 20 2a 2f 0a 20 20 20 20 69 66 20  icies */.    if 
5940: 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47  (xflags & EXFLAG
5950: 5f 49 4e 56 41 4c 49 44 5f 50 4f 4c 49 43 59 29  _INVALID_POLICY)
5960: 20 7b 0a 09 2f 2a 20 52 65 6a 65 63 74 20 63 65   {../* Reject ce
5970: 72 74 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  rt */.    }..   
5980: 20 2f 2a 20 50 6f 6c 69 63 79 20 4d 61 70 70 69   /* Policy Mappi
5990: 6e 67 73 20 2d 20 52 46 43 20 35 32 38 30 20 73  ngs - RFC 5280 s
59a0: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 35 2c 20  ection 4.2.1.5, 
59b0: 4e 49 44 5f 70 6f 6c 69 63 79 5f 6d 61 70 70 69  NID_policy_mappi
59c0: 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ngs */..    /* S
59d0: 75 62 6a 65 63 74 20 41 6c 74 65 72 6e 61 74 69  ubject Alternati
59e0: 76 65 20 4e 61 6d 65 20 28 53 41 4e 29 20 63 6f  ve Name (SAN) co
59f0: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
5a00: 6c 20 55 52 4c 73 2c 20 44 4e 53 20 6e 61 6d 65  l URLs, DNS name
5a10: 73 2c 20 6f 72 20 49 50 0a 09 61 64 64 72 65 73  s, or IP..addres
5a20: 73 65 73 20 62 6f 75 6e 64 20 74 6f 20 63 65 72  ses bound to cer
5a30: 74 69 66 69 63 61 74 65 2e 20 52 46 43 20 35 32  tificate. RFC 52
5a40: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31  80 section 4.2.1
5a50: 2e 36 2c 20 4e 49 44 5f 73 75 62 6a 65 63 74 5f  .6, NID_subject_
5a60: 61 6c 74 5f 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  alt_name */.    
5a70: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65  LAPPEND_OBJ(inte
5a80: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
5a90: 73 75 62 6a 65 63 74 41 6c 74 4e 61 6d 65 22 2c  subjectAltName",
5aa0: 20 54 6c 73 5f 78 35 30 39 4e 61 6d 65 73 28 69   Tls_x509Names(i
5ab0: 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 4e 49 44  nterp, cert, NID
5ac0: 5f 73 75 62 6a 65 63 74 5f 61 6c 74 5f 6e 61 6d  _subject_alt_nam
5ad0: 65 2c 20 62 69 6f 29 29 3b 0a 0a 20 20 20 20 2f  e, bio));..    /
5ae0: 2a 20 49 73 73 75 65 72 20 41 6c 74 65 72 6e 61  * Issuer Alterna
5af0: 74 69 76 65 20 4e 61 6d 65 20 69 73 20 75 73 65  tive Name is use
5b00: 64 20 74 6f 20 61 73 73 6f 63 69 61 74 65 20 49  d to associate I
5b10: 6e 74 65 72 6e 65 74 20 73 74 79 6c 65 20 69 64  nternet style id
5b20: 65 6e 74 69 74 69 65 73 0a 09 77 69 74 68 20 74  entities..with t
5b30: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69  he certificate i
5b40: 73 73 75 65 72 2e 20 52 46 43 20 35 32 38 30 20  ssuer. RFC 5280 
5b50: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 37 2c  section 4.2.1.7,
5b60: 20 4e 49 44 5f 69 73 73 75 65 72 5f 61 6c 74 5f   NID_issuer_alt_
5b70: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50  name */.    LAPP
5b80: 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20  END_OBJ(interp, 
5b90: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 69 73 73 75  resultObj, "issu
5ba0: 65 72 41 6c 74 4e 61 6d 65 22 2c 20 54 6c 73 5f  erAltName", Tls_
5bb0: 78 35 30 39 4e 61 6d 65 73 28 69 6e 74 65 72 70  x509Names(interp
5bc0: 2c 20 63 65 72 74 2c 20 4e 49 44 5f 69 73 73 75  , cert, NID_issu
5bd0: 65 72 5f 61 6c 74 5f 6e 61 6d 65 2c 20 62 69 6f  er_alt_name, bio
5be0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a  ));..    /* Subj
5bf0: 65 63 74 20 44 69 72 65 63 74 6f 72 79 20 41 74  ect Directory At
5c00: 74 72 69 62 75 74 65 73 20 70 72 6f 76 69 64 65  tributes provide
5c10: 73 20 69 64 65 6e 74 69 66 69 63 61 74 69 6f 6e  s identification
5c20: 20 61 74 74 72 69 62 75 74 65 73 20 28 65 2e 67   attributes (e.g
5c30: 2e 2c 20 6e 61 74 69 6f 6e 61 6c 69 74 79 29 0a  ., nationality).
5c40: 09 6f 66 20 74 68 65 20 73 75 62 6a 65 63 74 2e  .of the subject.
5c50: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f   RFC 5280 sectio
5c60: 6e 20 34 2e 32 2e 31 2e 38 20 28 73 75 62 6a 65  n 4.2.1.8 (subje
5c70: 63 74 44 69 72 65 63 74 6f 72 79 41 74 74 72 69  ctDirectoryAttri
5c80: 62 75 74 65 73 29 20 2a 2f 0a 0a 20 20 20 20 2f  butes) */..    /
5c90: 2a 20 42 61 73 69 63 20 43 6f 6e 73 74 72 61 69  * Basic Constrai
5ca0: 6e 74 73 20 69 64 65 6e 74 69 66 69 65 73 20 77  nts identifies w
5cb0: 68 65 74 68 65 72 20 74 68 65 20 73 75 62 6a 65  hether the subje
5cc0: 63 74 20 6f 66 20 74 68 65 20 63 65 72 74 20 69  ct of the cert i
5cd0: 73 20 61 20 43 41 20 61 6e 64 0a 09 74 68 65 20  s a CA and..the 
5ce0: 6d 61 78 20 64 65 70 74 68 20 6f 66 20 76 61 6c  max depth of val
5cf0: 69 64 20 63 65 72 74 20 70 61 74 68 73 20 66 6f  id cert paths fo
5d00: 72 20 74 68 69 73 20 63 65 72 74 2e 20 52 46 43  r this cert. RFC
5d10: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
5d20: 32 2e 31 2e 39 2c 20 4e 49 44 5f 62 61 73 69 63  2.1.9, NID_basic
5d30: 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a  _constraints */.
5d40: 20 20 20 20 69 66 20 28 21 28 78 66 6c 61 67 73      if (!(xflags
5d50: 20 26 20 45 58 46 4c 41 47 5f 50 52 4f 58 59 29   & EXFLAG_PROXY)
5d60: 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e  ) {..LAPPEND_LON
5d70: 47 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  G(interp, result
5d80: 4f 62 6a 2c 20 22 70 61 74 68 4c 65 6e 22 2c 20  Obj, "pathLen", 
5d90: 58 35 30 39 5f 67 65 74 5f 70 61 74 68 6c 65 6e  X509_get_pathlen
5da0: 28 63 65 72 74 29 29 3b 0a 20 20 20 20 7d 20 65  (cert));.    } e
5db0: 6c 73 65 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 4c  lse {..LAPPEND_L
5dc0: 4f 4e 47 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ONG(interp, resu
5dd0: 6c 74 4f 62 6a 2c 20 22 70 61 74 68 4c 65 6e 22  ltObj, "pathLen"
5de0: 2c 20 58 35 30 39 5f 67 65 74 5f 70 72 6f 78 79  , X509_get_proxy
5df0: 5f 70 61 74 68 6c 65 6e 28 63 65 72 74 29 29 3b  _pathlen(cert));
5e00: 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45  .    }.    LAPPE
5e10: 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
5e20: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 62 61 73 69  resultObj, "basi
5e30: 63 43 6f 6e 73 74 72 61 69 6e 74 73 43 41 22 2c  cConstraintsCA",
5e40: 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47   xflags & EXFLAG
5e50: 5f 43 41 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 61  _CA);..    /* Na
5e60: 6d 65 20 43 6f 6e 73 74 72 61 69 6e 74 73 20 69  me Constraints i
5e70: 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 43  s only used in C
5e80: 41 20 63 65 72 74 73 20 74 6f 20 69 6e 64 69 63  A certs to indic
5e90: 61 74 65 20 74 68 65 20 6e 61 6d 65 20 73 70 61  ate the name spa
5ea0: 63 65 20 66 6f 72 0a 09 61 6c 6c 20 73 75 62 6a  ce for..all subj
5eb0: 65 63 74 20 6e 61 6d 65 73 20 69 6e 20 73 75 62  ect names in sub
5ec0: 73 65 71 75 65 6e 74 20 63 65 72 74 69 66 69 63  sequent certific
5ed0: 61 74 65 73 20 69 6e 20 61 20 63 65 72 74 69 66  ates in a certif
5ee0: 69 63 61 74 69 6f 6e 20 70 61 74 68 0a 09 4d 55  ication path..MU
5ef0: 53 54 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 52  ST be located. R
5f00: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20  FC 5280 section 
5f10: 34 2e 32 2e 31 2e 31 30 2c 20 4e 49 44 5f 6e 61  4.2.1.10, NID_na
5f20: 6d 65 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  me_constraints *
5f30: 2f 0a 0a 20 20 20 20 2f 2a 20 50 6f 6c 69 63 79  /..    /* Policy
5f40: 20 43 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20   Constraints is 
5f50: 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 43 41 20  only used in CA 
5f60: 63 65 72 74 73 20 74 6f 20 6c 69 6d 69 74 20 74  certs to limit t
5f70: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 0a 09  he length of a..
5f80: 63 65 72 74 20 63 68 61 69 6e 20 66 6f 72 20 74  cert chain for t
5f90: 68 61 74 20 43 41 2e 20 52 46 43 20 35 32 38 30  hat CA. RFC 5280
5fa0: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31   section 4.2.1.1
5fb0: 31 2c 20 4e 49 44 5f 70 6f 6c 69 63 79 5f 63 6f  1, NID_policy_co
5fc0: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20  nstraints */..  
5fd0: 20 20 2f 2a 20 45 78 74 65 6e 64 65 64 20 4b 65    /* Extended Ke
5fe0: 79 20 55 73 61 67 65 20 69 6e 64 69 63 61 74 65  y Usage indicate
5ff0: 73 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 74  s the purposes t
6000: 68 65 20 63 65 72 74 69 66 69 65 64 20 70 75 62  he certified pub
6010: 6c 69 63 20 6b 65 79 20 6d 61 79 20 62 65 0a 09  lic key may be..
6020: 75 73 65 64 2c 20 62 65 79 6f 6e 64 20 74 68 65  used, beyond the
6030: 20 62 61 73 69 63 20 70 75 72 70 6f 73 65 73 2e   basic purposes.
6040: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f   RFC 5280 sectio
6050: 6e 20 34 2e 32 2e 31 2e 31 32 2c 20 4e 49 44 5f  n 4.2.1.12, NID_
6060: 65 78 74 5f 6b 65 79 5f 75 73 61 67 65 20 2a 2f  ext_key_usage */
6070: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a  .    LAPPEND_OBJ
6080: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
6090: 62 6a 2c 20 22 65 78 74 65 6e 64 65 64 4b 65 79  bj, "extendedKey
60a0: 55 73 61 67 65 22 2c 20 54 6c 73 5f 78 35 30 39  Usage", Tls_x509
60b0: 45 78 74 4b 65 79 55 73 61 67 65 28 69 6e 74 65  ExtKeyUsage(inte
60c0: 72 70 2c 20 63 65 72 74 2c 20 78 66 6c 61 67 73  rp, cert, xflags
60d0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 52 4c 20  ));..    /* CRL 
60e0: 44 69 73 74 72 69 62 75 74 69 6f 6e 20 50 6f 69  Distribution Poi
60f0: 6e 74 73 20 69 64 65 6e 74 69 66 69 65 73 20 77  nts identifies w
6100: 68 65 72 65 20 43 52 4c 20 69 6e 66 6f 72 6d 61  here CRL informa
6110: 74 69 6f 6e 20 63 61 6e 20 62 65 20 6f 62 74 61  tion can be obta
6120: 69 6e 65 64 2e 0a 09 52 46 43 20 35 32 38 30 20  ined...RFC 5280 
6130: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 33  section 4.2.1.13
6140: 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f  */.    LAPPEND_O
6150: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  BJ(interp, resul
6160: 74 4f 62 6a 2c 20 22 63 72 6c 44 69 73 74 72 69  tObj, "crlDistri
6170: 62 75 74 69 6f 6e 50 6f 69 6e 74 73 22 2c 20 54  butionPoints", T
6180: 6c 73 5f 78 35 30 39 43 72 6c 44 70 28 69 6e 74  ls_x509CrlDp(int
6190: 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20  erp, cert));..  
61a0: 20 20 2f 2a 20 46 72 65 73 68 65 73 74 20 43 52    /* Freshest CR
61b0: 4c 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 20  L extension */. 
61c0: 20 20 20 69 66 20 28 78 66 6c 61 67 73 20 26 20     if (xflags & 
61d0: 45 58 46 4c 41 47 5f 46 52 45 53 48 45 53 54 29  EXFLAG_FRESHEST)
61e0: 20 7b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   {.    }..    /*
61f0: 20 41 75 74 68 6f 72 69 74 79 20 49 6e 66 6f 72   Authority Infor
6200: 6d 61 74 69 6f 6e 20 41 63 63 65 73 73 20 69 6e  mation Access in
6210: 64 69 63 61 74 65 73 20 68 6f 77 20 74 6f 20 61  dicates how to a
6220: 63 63 65 73 73 20 69 6e 66 6f 20 61 6e 64 20 73  ccess info and s
6230: 65 72 76 69 63 65 73 0a 09 66 6f 72 20 74 68 65  ervices..for the
6240: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73   certificate iss
6250: 75 65 72 2e 20 52 46 43 20 35 32 38 30 20 73 65  uer. RFC 5280 se
6260: 63 74 69 6f 6e 20 34 2e 32 2e 32 2e 31 2c 20 4e  ction 4.2.2.1, N
6270: 49 44 5f 69 6e 66 6f 5f 61 63 63 65 73 73 20 2a  ID_info_access *
6280: 2f 0a 0a 20 20 20 20 2f 2a 20 4f 6e 2d 6c 69 6e  /..    /* On-lin
6290: 65 20 43 65 72 74 69 66 69 63 61 74 65 20 53 74  e Certificate St
62a0: 61 74 75 73 20 50 72 6f 74 6f 63 6f 6c 20 28 4f  atus Protocol (O
62b0: 53 43 50 29 20 52 65 73 70 6f 6e 64 65 72 73 20  SCP) Responders 
62c0: 55 52 4c 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45  URL */.    LAPPE
62d0: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72  ND_OBJ(interp, r
62e0: 65 73 75 6c 74 4f 62 6a 2c 20 22 6f 63 73 70 52  esultObj, "ocspR
62f0: 65 73 70 6f 6e 64 65 72 73 22 2c 20 54 6c 73 5f  esponders", Tls_
6300: 78 35 30 39 4f 73 63 70 28 69 6e 74 65 72 70 2c  x509Oscp(interp,
6310: 20 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a   cert));..    /*
6320: 20 43 65 72 74 69 66 69 63 61 74 65 20 41 75 74   Certificate Aut
6330: 68 6f 72 69 74 79 20 28 43 41 29 20 49 73 73 75  hority (CA) Issu
6340: 65 72 73 20 55 52 4c 20 2a 2f 0a 20 20 20 20 4c  ers URL */.    L
6350: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72  APPEND_OBJ(inter
6360: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 63  p, resultObj, "c
6370: 61 49 73 73 75 65 72 73 22 2c 20 54 6c 73 5f 78  aIssuers", Tls_x
6380: 35 30 39 43 61 49 73 73 75 65 72 73 28 69 6e 74  509CaIssuers(int
6390: 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20  erp, cert));..  
63a0: 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 49 6e 66    /* Subject Inf
63b0: 6f 72 6d 61 74 69 6f 6e 20 41 63 63 65 73 73 20  ormation Access 
63c0: 2d 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69  - RFC 5280 secti
63d0: 6f 6e 20 34 2e 32 2e 32 2e 32 2c 20 4e 49 44 5f  on 4.2.2.2, NID_
63e0: 73 69 6e 66 6f 5f 61 63 63 65 73 73 20 2a 2f 0a  sinfo_access */.
63f0: 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63  .    /* Certific
6400: 61 74 65 20 41 6c 69 61 73 2e 20 49 66 20 75 73  ate Alias. If us
6410: 65 73 20 61 20 50 4b 43 53 23 31 32 20 73 74 72  es a PKCS#12 str
6420: 75 63 74 75 72 65 2c 20 61 6c 69 61 73 20 77 69  ucture, alias wi
6430: 6c 6c 20 72 65 66 6c 65 63 74 20 74 68 65 0a 09  ll reflect the..
6440: 66 72 69 65 6e 64 6c 79 4e 61 6d 65 20 61 74 74  friendlyName att
6450: 72 69 62 75 74 65 20 28 52 46 43 20 32 39 38 35  ribute (RFC 2985
6460: 29 2e 20 2a 2f 0a 20 20 20 20 7b 0a 09 69 6e 74  ). */.    {..int
6470: 20 69 6c 65 6e 20 3d 20 30 3b 0a 09 75 6e 73 69   ilen = 0;..unsi
6480: 67 6e 65 64 20 63 68 61 72 20 2a 73 74 72 69 6e  gned char *strin
6490: 67 20 3d 20 58 35 30 39 5f 61 6c 69 61 73 5f 67  g = X509_alias_g
64a0: 65 74 30 28 63 65 72 74 2c 20 26 69 6c 65 6e 29  et0(cert, &ilen)
64b0: 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
64c0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
64d0: 2c 20 22 61 6c 69 61 73 22 2c 20 28 63 68 61 72  , "alias", (char
64e0: 20 2a 29 20 73 74 72 69 6e 67 2c 20 28 54 63 6c   *) string, (Tcl
64f0: 5f 53 69 7a 65 29 20 69 6c 65 6e 29 3b 0a 09 73  _Size) ilen);..s
6500: 74 72 69 6e 67 20 3d 20 58 35 30 39 5f 6b 65 79  tring = X509_key
6510: 69 64 5f 67 65 74 30 28 63 65 72 74 2c 20 26 69  id_get0(cert, &i
6520: 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53  len);..LAPPEND_S
6530: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  TR(interp, resul
6540: 74 4f 62 6a 2c 20 22 6b 65 79 49 64 22 2c 20 28  tObj, "keyId", (
6550: 63 68 61 72 20 2a 29 20 73 74 72 69 6e 67 2c 20  char *) string, 
6560: 28 54 63 6c 5f 53 69 7a 65 29 20 69 6c 65 6e 29  (Tcl_Size) ilen)
6570: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6580: 43 65 72 74 69 66 69 63 61 74 65 20 61 6e 64 20  Certificate and 
6590: 64 75 6d 70 20 61 6c 6c 20 64 61 74 61 20 2a 2f  dump all data */
65a0: 0a 20 20 20 20 69 66 20 28 61 6c 6c 29 20 7b 0a  .    if (all) {.
65b0: 09 54 63 6c 5f 4f 62 6a 20 2a 61 6c 6c 4f 62 6a  .Tcl_Obj *allObj
65c0: 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72   = Tcl_NewByteAr
65d0: 72 61 79 4f 62 6a 28 4e 55 4c 4c 2c 20 30 29 3b  rayObj(NULL, 0);
65e0: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 65 72 74 4f  ..Tcl_Obj *certO
65f0: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  bj = Tcl_NewByte
6600: 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c 2c 20 30  ArrayObj(NULL, 0
6610: 29 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  );..unsigned cha
6620: 72 20 2a 61 6c 6c 53 74 72 2c 20 2a 63 65 72 74  r *allStr, *cert
6630: 53 74 72 3b 0a 0a 09 69 66 20 28 61 6c 6c 4f 62  Str;...if (allOb
6640: 6a 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 65 72  j == NULL || cer
6650: 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tObj == NULL) {.
6660: 09 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
6670: 43 6f 75 6e 74 28 61 6c 6c 4f 62 6a 29 3b 0a 09  Count(allObj);..
6680: 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f      BIO_free(bio
6690: 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 62  );..    ckfree(b
66a0: 75 66 66 65 72 29 3b 0a 09 20 20 20 20 72 65 74  uffer);..    ret
66b0: 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 09  urn resultObj;..
66c0: 7d 0a 0a 09 2f 2a 20 47 65 74 20 63 65 72 74 69  }.../* Get certi
66d0: 66 69 63 61 74 65 20 2a 2f 0a 09 63 65 72 74 53  ficate */..certS
66e0: 74 72 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65  tr = Tcl_SetByte
66f0: 41 72 72 61 79 4c 65 6e 67 74 68 28 63 65 72 74  ArrayLength(cert
6700: 4f 62 6a 2c 20 43 45 52 54 5f 53 54 52 5f 53 49  Obj, CERT_STR_SI
6710: 5a 45 29 3b 0a 09 6c 65 6e 20 3d 20 42 49 4f 5f  ZE);..len = BIO_
6720: 74 6f 5f 42 75 66 66 65 72 28 50 45 4d 5f 77 72  to_Buffer(PEM_wr
6730: 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 62 69 6f  ite_bio_X509(bio
6740: 2c 20 63 65 72 74 29 2c 20 62 69 6f 2c 20 63 65  , cert), bio, ce
6750: 72 74 53 74 72 2c 20 43 45 52 54 5f 53 54 52 5f  rtStr, CERT_STR_
6760: 53 49 5a 45 29 3b 0a 09 54 63 6c 5f 53 65 74 42  SIZE);..Tcl_SetB
6770: 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 63  yteArrayLength(c
6780: 65 72 74 4f 62 6a 2c 20 6c 65 6e 29 3b 0a 09 4c  ertObj, len);..L
6790: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72  APPEND_OBJ(inter
67a0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 63  p, resultObj, "c
67b0: 65 72 74 69 66 69 63 61 74 65 22 2c 20 63 65 72  ertificate", cer
67c0: 74 4f 62 6a 29 0a 0a 09 2f 2a 20 47 65 74 20 61  tObj).../* Get a
67d0: 6c 6c 20 69 6e 66 6f 20 6f 6e 20 63 65 72 74 69  ll info on certi
67e0: 66 69 63 61 74 65 20 2a 2f 0a 09 61 6c 6c 53 74  ficate */..allSt
67f0: 72 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41  r = Tcl_SetByteA
6800: 72 72 61 79 4c 65 6e 67 74 68 28 61 6c 6c 4f 62  rrayLength(allOb
6810: 6a 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 5a 45  j, CERT_STR_SIZE
6820: 20 2a 20 32 29 3b 0a 09 6c 65 6e 20 3d 20 42 49   * 2);..len = BI
6830: 4f 5f 74 6f 5f 42 75 66 66 65 72 28 58 35 30 39  O_to_Buffer(X509
6840: 5f 70 72 69 6e 74 5f 65 78 28 62 69 6f 2c 20 63  _print_ex(bio, c
6850: 65 72 74 2c 20 66 6c 61 67 73 2c 20 30 29 2c 20  ert, flags, 0), 
6860: 62 69 6f 2c 20 61 6c 6c 53 74 72 2c 20 43 45 52  bio, allStr, CER
6870: 54 5f 53 54 52 5f 53 49 5a 45 20 2a 20 32 29 3b  T_STR_SIZE * 2);
6880: 0a 09 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72  ..Tcl_SetByteArr
6890: 61 79 4c 65 6e 67 74 68 28 61 6c 6c 4f 62 6a 2c  ayLength(allObj,
68a0: 20 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f   len);..LAPPEND_
68b0: 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75  OBJ(interp, resu
68c0: 6c 74 4f 62 6a 2c 20 22 61 6c 6c 22 2c 20 61 6c  ltObj, "all", al
68d0: 6c 4f 62 6a 29 0a 20 20 20 20 7d 0a 0a 20 20 20  lObj).    }..   
68e0: 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a   BIO_free(bio);.
68f0: 20 20 20 20 63 6b 66 72 65 65 28 62 75 66 66 65      ckfree(buffe
6900: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
6910: 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a              esultObj;.}.