Hex Artifact Content

Artifact 6d1eaaa4651d82ffc6336511a707b608c72e93ea8c1f3147ffd239f8e86602f6:


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 68 65 78 5b 28 2a 69 70 74 72  r++ = hex[(*iptr
0510: 3e 3e 34 29 26 30 78 46 5d 3b 0a 09 2a 64 70 74  >>4)&0xF];..*dpt
0520: 72 2b 2b 20 3d 20 68 65 78 5b 28 2a 69 70 74 72  r++ = hex[(*iptr
0530: 2b 2b 29 26 30 78 46 5d 3b 0a 20 20 20 20 7d 0a  ++)&0xF];.    }.
0540: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c      return resul
0550: 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  tObj;.}../*. *--
0560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20  -----------. *. 
05b0: 2a 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 20  * BIO_to_Buffer 
05c0: 2d 2d 0a 20 2a 0a 20 2a 09 4f 75 74 70 75 74 20  --. *. *.Output 
05d0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 42 49  contents of a BI
05e0: 4f 20 74 6f 20 61 20 62 75 66 66 65 72 0a 20 2a  O to a buffer. *
05f0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
0600: 52 65 74 75 72 6e 73 20 6c 65 6e 67 74 68 20 6f  Returns length o
0610: 66 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66 66  f string in buff
0620: 65 72 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  er. *. * Side ef
0630: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  fects:. *.None. 
0640: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0660: 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 54 63 6c 5f 53 69 7a 65 20 42  -. */.Tcl_Size B
06a0: 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 69 6e 74  IO_to_Buffer(int
06b0: 20 72 65 73 75 6c 74 2c 20 42 49 4f 20 2a 62 69   result, BIO *bi
06c0: 6f 2c 20 76 6f 69 64 20 2a 6f 75 74 70 75 74 2c  o, void *output,
06d0: 20 69 6e 74 20 6f 6c 65 6e 29 20 7b 0a 20 20 20   int olen) {.   
06e0: 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 20 3d 20   Tcl_Size len = 
06f0: 30 3b 0a 20 20 20 20 69 6e 74 20 70 65 6e 64 69  0;.    int pendi
0700: 6e 67 20 3d 20 42 49 4f 5f 70 65 6e 64 69 6e 67  ng = BIO_pending
0710: 28 62 69 6f 29 3b 0a 0a 20 20 20 20 69 66 20 28  (bio);..    if (
0720: 72 65 73 75 6c 74 29 20 7b 0a 09 6c 65 6e 20 3d  result) {..len =
0730: 20 28 54 63 6c 5f 53 69 7a 65 29 20 42 49 4f 5f   (Tcl_Size) BIO_
0740: 72 65 61 64 28 62 69 6f 2c 20 6f 75 74 70 75 74  read(bio, output
0750: 2c 20 28 70 65 6e 64 69 6e 67 20 3c 20 6f 6c 65  , (pending < ole
0760: 6e 29 20 3f 20 70 65 6e 64 69 6e 67 20 3a 20 6f  n) ? pending : o
0770: 6c 65 6e 29 3b 0a 09 28 76 6f 69 64 29 42 49 4f  len);..(void)BIO
0780: 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09 69 66  _flush(bio);..if
0790: 20 28 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 20 20   (len < 0) {..  
07a0: 20 20 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 20 20    len = 0;..}.  
07b0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c    }.    return l
07c0: 65 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  en;.}.../*. *---
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a  ----------. *. *
0820: 20 54 6c 73 5f 78 35 30 39 45 78 74 65 6e 73 69   Tls_x509Extensi
0830: 6f 6e 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74  ons --. *. *.Get
0840: 20 6c 69 73 74 20 6f 66 20 58 2e 35 30 39 20 43   list of X.509 C
0850: 65 72 74 69 66 69 63 61 74 65 20 45 78 74 65 6e  ertificate Exten
0860: 73 69 6f 6e 73 0a 20 2a 0a 20 2a 20 52 65 73 75  sions. *. * Resu
0870: 6c 74 73 3a 0a 20 2a 09 54 43 4c 20 6c 69 73 74  lts:. *.TCL list
0880: 20 6f 66 20 65 78 74 65 6e 73 69 6f 6e 73 20 61   of extensions a
0890: 6e 64 20 62 6f 6f 6c 65 61 6e 20 63 72 69 74 69  nd boolean criti
08a0: 63 61 6c 20 73 74 61 74 75 73 0a 20 2a 0a 20 2a  cal status. *. *
08b0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
08c0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d  *.None. *. *----
08d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 54 63  ---------. */.Tc
0920: 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 45  l_Obj *Tls_x509E
0930: 78 74 65 6e 73 69 6f 6e 73 28 54 63 6c 5f 49 6e  xtensions(Tcl_In
0940: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35  terp *interp, X5
0950: 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20  09 *cert) {.    
0960: 63 6f 6e 73 74 20 53 54 41 43 4b 5f 4f 46 28 58  const STACK_OF(X
0970: 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e 29 20 2a  509_EXTENSION) *
0980: 65 78 74 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  exts;.    Tcl_Ob
0990: 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54  j *resultObj = T
09a0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
09b0: 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20   NULL);..    if 
09c0: 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55  (resultObj == NU
09d0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55  LL) {..return NU
09e0: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  LL;.    }..    i
09f0: 66 20 28 28 65 78 74 73 20 3d 20 58 35 30 39 5f  f ((exts = X509_
0a00: 67 65 74 30 5f 65 78 74 65 6e 73 69 6f 6e 73 28  get0_extensions(
0a10: 63 65 72 74 29 29 20 21 3d 20 4e 55 4c 4c 29 20  cert)) != NULL) 
0a20: 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b  {..for (int i=0;
0a30: 20 69 20 3c 20 58 35 30 39 5f 67 65 74 5f 65 78   i < X509_get_ex
0a40: 74 5f 63 6f 75 6e 74 28 63 65 72 74 29 3b 20 69  t_count(cert); i
0a50: 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f  ++) {..    X509_
0a60: 45 58 54 45 4e 53 49 4f 4e 20 2a 65 78 20 3d 20  EXTENSION *ex = 
0a70: 73 6b 5f 58 35 30 39 5f 45 58 54 45 4e 53 49 4f  sk_X509_EXTENSIO
0a80: 4e 5f 76 61 6c 75 65 28 65 78 74 73 2c 20 69 29  N_value(exts, i)
0a90: 3b 0a 09 20 20 20 20 41 53 4e 31 5f 4f 42 4a 45  ;..    ASN1_OBJE
0aa0: 43 54 20 2a 6f 62 6a 20 3d 20 58 35 30 39 5f 45  CT *obj = X509_E
0ab0: 58 54 45 4e 53 49 4f 4e 5f 67 65 74 5f 6f 62 6a  XTENSION_get_obj
0ac0: 65 63 74 28 65 78 29 3b 0a 09 20 20 20 20 2f 2a  ect(ex);..    /*
0ad0: 20 41 53 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49   ASN1_OCTET_STRI
0ae0: 4e 47 20 2a 64 61 74 61 20 3d 20 58 35 30 39 5f  NG *data = X509_
0af0: 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74 5f 64 61  EXTENSION_get_da
0b00: 74 61 28 65 78 29 3b 20 2a 2f 0a 09 20 20 20 20  ta(ex); */..    
0b10: 69 6e 74 20 63 72 69 74 69 63 61 6c 20 3d 20 58  int critical = X
0b20: 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65  509_EXTENSION_ge
0b30: 74 5f 63 72 69 74 69 63 61 6c 28 65 78 29 3b 0a  t_critical(ex);.
0b40: 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f  .    LAPPEND_BOO
0b50: 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  L(interp, result
0b60: 4f 62 6a 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28  Obj, OBJ_nid2ln(
0b70: 4f 42 4a 5f 6f 62 6a 32 6e 69 64 28 6f 62 6a 29  OBJ_obj2nid(obj)
0b80: 29 2c 20 63 72 69 74 69 63 61 6c 29 3b 0a 09 7d  ), critical);..}
0b90: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
0ba0: 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a  n resultObj;.}..
0bb0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
0bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bd0: 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30  --. *. * Tls_x50
0c10: 39 49 64 65 6e 74 69 66 69 65 72 20 2d 2d 0a 20  9Identifier --. 
0c20: 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30 39 20 63  *. *.Get X.509 c
0c30: 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f  ertificate Autho
0c40: 72 69 74 79 20 6f 72 20 53 75 62 6a 65 63 74 20  rity or Subject 
0c50: 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 73 0a  Key Identifiers.
0c60: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
0c70: 2a 09 54 43 4c 20 62 79 74 65 20 61 72 72 61 79  *.TCL byte array
0c80: 20 6f 62 6a 65 63 74 20 77 69 74 68 20 78 35 30   object with x50
0c90: 39 20 69 64 65 6e 74 69 66 69 65 72 20 61 73 20  9 identifier as 
0ca0: 61 20 68 65 78 20 73 74 72 69 6e 67 0a 20 2a 0a  a hex string. *.
0cb0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
0cc0: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d  . *.None. *. *--
0cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a  -----------. */.
0d20: 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30  Tcl_Obj *Tls_x50
0d30: 39 49 64 65 6e 74 69 66 69 65 72 28 63 6f 6e 73  9Identifier(cons
0d40: 74 20 41 53 4e 31 5f 4f 43 54 45 54 5f 53 54 52  t ASN1_OCTET_STR
0d50: 49 4e 47 20 2a 61 73 74 72 69 6e 67 29 20 7b 0a  ING *astring) {.
0d60: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73      Tcl_Obj *res
0d70: 75 6c 74 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 0a  ultObj = NULL;..
0d80: 20 20 20 20 69 66 20 28 61 73 74 72 69 6e 67 20      if (astring 
0d90: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 75  != NULL) {..resu
0da0: 6c 74 4f 62 6a 20 3d 20 53 74 72 69 6e 67 5f 74  ltObj = String_t
0db0: 6f 5f 48 65 78 28 28 75 6e 73 69 67 6e 65 64 20  o_Hex((unsigned 
0dc0: 63 68 61 72 20 2a 29 41 53 4e 31 5f 53 54 52 49  char *)ASN1_STRI
0dd0: 4e 47 5f 67 65 74 30 5f 64 61 74 61 28 61 73 74  NG_get0_data(ast
0de0: 72 69 6e 67 29 2c 0a 09 20 20 20 20 41 53 4e 31  ring),..    ASN1
0df0: 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 61  _STRING_length(a
0e00: 73 74 72 69 6e 67 29 29 3b 0a 20 20 20 20 7d 0a  string));.    }.
0e10: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c      return resul
0e20: 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  tObj;.}../*. *--
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20  -----------. *. 
0e80: 2a 20 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 61  * Tls_x509KeyUsa
0e90: 67 65 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20  ge --. *. *.Get 
0ea0: 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74  X.509 certificat
0eb0: 65 20 6b 65 79 20 75 73 61 67 65 20 74 79 70 65  e key usage type
0ec0: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  s. *. * Results:
0ed0: 0a 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20  . *.Tcl list of 
0ee0: 74 79 70 65 73 0a 20 2a 0a 20 2a 20 53 69 64 65  types. *. * Side
0ef0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
0f00: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
0f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f20: 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a  ----. */.Tcl_Obj
0f60: 20 2a 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 61   *Tls_x509KeyUsa
0f70: 67 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ge(Tcl_Interp *i
0f80: 6e 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72  nterp, X509 *cer
0f90: 74 2c 20 75 69 6e 74 33 32 5f 74 20 78 66 6c 61  t, uint32_t xfla
0fa0: 67 73 29 20 7b 0a 20 20 20 20 75 69 6e 74 33 32  gs) {.    uint32
0fb0: 5f 74 20 75 73 61 67 65 20 3d 20 58 35 30 39 5f  _t usage = X509_
0fc0: 67 65 74 5f 6b 65 79 5f 75 73 61 67 65 28 63 65  get_key_usage(ce
0fd0: 72 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  rt);.    Tcl_Obj
0fe0: 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63   *resultObj = Tc
0ff0: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
1000: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28  NULL);..    if (
1010: 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c  resultObj == NUL
1020: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  L) {..return NUL
1030: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  L;.    }..    if
1040: 20 28 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c   ((xflags & EXFL
1050: 41 47 5f 4b 55 53 41 47 45 29 20 26 26 20 75 73  AG_KUSAGE) && us
1060: 61 67 65 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58  age < UINT32_MAX
1070: 29 20 7b 0a 09 69 66 20 28 75 73 61 67 65 20 26  ) {..if (usage &
1080: 20 4b 55 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e   KU_DIGITAL_SIGN
1090: 41 54 55 52 45 29 20 7b 0a 09 20 20 20 20 54 63  ATURE) {..    Tc
10a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
10c0: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
10d0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 44 69 67 69  wStringObj("Digi
10e0: 74 61 6c 20 53 69 67 6e 61 74 75 72 65 22 2c 20  tal Signature", 
10f0: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73  -1));..}..if (us
1100: 61 67 65 20 26 20 4b 55 5f 4e 4f 4e 5f 52 45 50  age & KU_NON_REP
1110: 55 44 49 41 54 49 4f 4e 29 20 7b 0a 09 20 20 20  UDIATION) {..   
1120: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1130: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1140: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c  , resultObj, Tcl
1150: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e  _NewStringObj("N
1160: 6f 6e 2d 52 65 70 75 64 69 61 74 69 6f 6e 22 2c  on-Repudiation",
1170: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75   -1));..}..if (u
1180: 73 61 67 65 20 26 20 4b 55 5f 4b 45 59 5f 45 4e  sage & KU_KEY_EN
1190: 43 49 50 48 45 52 4d 45 4e 54 29 20 7b 0a 09 20  CIPHERMENT) {.. 
11a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
11b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11c0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54  rp, resultObj, T
11d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
11e0: 22 4b 65 79 20 45 6e 63 69 70 68 65 72 6d 65 6e  "Key Enciphermen
11f0: 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66  t", -1));..}..if
1200: 20 28 75 73 61 67 65 20 26 20 4b 55 5f 44 41 54   (usage & KU_DAT
1210: 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 29 20  A_ENCIPHERMENT) 
1220: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
1230: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1240: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
1250: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  j, Tcl_NewString
1260: 4f 62 6a 28 22 44 61 74 61 20 45 6e 63 69 70 68  Obj("Data Enciph
1270: 65 72 6d 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09  erment", -1));..
1280: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b  }..if (usage & K
1290: 55 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 29  U_KEY_AGREEMENT)
12a0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
12b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12c0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
12d0: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  bj, Tcl_NewStrin
12e0: 67 4f 62 6a 28 22 4b 65 79 20 41 67 72 65 65 6d  gObj("Key Agreem
12f0: 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  ent", -1));..}..
1300: 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f 4b  if (usage & KU_K
1310: 45 59 5f 43 45 52 54 5f 53 49 47 4e 29 20 7b 0a  EY_CERT_SIGN) {.
1320: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1330: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1340: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
1350: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1360: 6a 28 22 43 65 72 74 69 66 69 63 61 74 65 20 53  j("Certificate S
1370: 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09  igning", -1));..
1380: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b  }..if (usage & K
1390: 55 5f 43 52 4c 5f 53 49 47 4e 29 20 7b 0a 09 20  U_CRL_SIGN) {.. 
13a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
13b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
13c0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54  rp, resultObj, T
13d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
13e0: 22 43 52 4c 20 53 69 67 6e 69 6e 67 22 2c 20 2d  "CRL Signing", -
13f0: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61  1));..}..if (usa
1400: 67 65 20 26 20 4b 55 5f 45 4e 43 49 50 48 45 52  ge & KU_ENCIPHER
1410: 5f 4f 4e 4c 59 29 20 7b 0a 09 20 20 20 20 54 63  _ONLY) {..    Tc
1420: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1430: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
1440: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
1450: 77 53 74 72 69 6e 67 4f 62 6a 28 22 45 6e 63 69  wStringObj("Enci
1460: 70 68 65 72 20 4f 6e 6c 79 22 2c 20 2d 31 29 29  pher Only", -1))
1470: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20  ;..}..if (usage 
1480: 26 20 4b 55 5f 44 45 43 49 50 48 45 52 5f 4f 4e  & KU_DECIPHER_ON
1490: 4c 59 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  LY) {..    Tcl_L
14a0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
14b0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ent(interp, resu
14c0: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74  ltObj, Tcl_NewSt
14d0: 72 69 6e 67 4f 62 6a 28 22 44 65 63 69 70 68 65  ringObj("Deciphe
14e0: 72 20 4f 6e 6c 79 22 2c 20 2d 31 29 29 3b 0a 09  r Only", -1));..
14f0: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  }.    } else {..
1500: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1510: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1520: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
1530: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1540: 28 22 75 6e 72 65 73 74 72 69 63 74 65 64 22 2c  ("unrestricted",
1550: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20   -1));.    }.   
1560: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62   return resultOb
1570: 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  j;.}../*. *-----
1580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54  --------. *. * T
15d0: 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 65 20 2d  ls_x509Purpose -
15e0: 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30  -. *. *.Get X.50
15f0: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75  9 certificate pu
1600: 72 70 6f 73 65 0a 20 2a 0a 20 2a 20 52 65 73 75  rpose. *. * Resu
1610: 6c 74 73 3a 0a 20 2a 09 50 75 72 70 6f 73 65 20  lts:. *.Purpose 
1620: 73 74 72 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64  string. *. * Sid
1630: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
1640: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ne. *. *--------
1650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1660: 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 63 68 61 72 20 2a  -----. */.char *
16a0: 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 65 28  Tls_x509Purpose(
16b0: 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20  X509 *cert) {.  
16c0: 20 20 63 68 61 72 20 2a 70 75 72 70 6f 73 65 20    char *purpose 
16d0: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20  = NULL;..    if 
16e0: 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70  (X509_check_purp
16f0: 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50  ose(cert, X509_P
1700: 55 52 50 4f 53 45 5f 53 53 4c 5f 43 4c 49 45 4e  URPOSE_SSL_CLIEN
1710: 54 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75  T, 0) > 0) {..pu
1720: 72 70 6f 73 65 20 3d 20 22 53 53 4c 20 43 6c 69  rpose = "SSL Cli
1730: 65 6e 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ent";.    } else
1740: 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f   if (X509_check_
1750: 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35  purpose(cert, X5
1760: 30 39 5f 50 55 52 50 4f 53 45 5f 53 53 4c 5f 53  09_PURPOSE_SSL_S
1770: 45 52 56 45 52 2c 20 30 29 20 3e 20 30 29 20 7b  ERVER, 0) > 0) {
1780: 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 53 53 4c  ..purpose = "SSL
1790: 20 53 65 72 76 65 72 22 3b 0a 20 20 20 20 7d 20   Server";.    } 
17a0: 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68  else if (X509_ch
17b0: 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74  eck_purpose(cert
17c0: 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 4e  , X509_PURPOSE_N
17d0: 53 5f 53 53 4c 5f 53 45 52 56 45 52 2c 20 30 29  S_SSL_SERVER, 0)
17e0: 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65   > 0) {..purpose
17f0: 20 3d 20 22 4d 53 53 20 53 53 4c 20 53 65 72 76   = "MSS SSL Serv
1800: 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  er";.    } else 
1810: 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70  if (X509_check_p
1820: 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30  urpose(cert, X50
1830: 39 5f 50 55 52 50 4f 53 45 5f 53 4d 49 4d 45 5f  9_PURPOSE_SMIME_
1840: 53 49 47 4e 2c 20 30 29 20 3e 20 30 29 20 7b 0a  SIGN, 0) > 0) {.
1850: 09 70 75 72 70 6f 73 65 20 3d 20 22 53 4d 49 4d  .purpose = "SMIM
1860: 45 20 53 69 67 6e 69 6e 67 22 3b 0a 20 20 20 20  E Signing";.    
1870: 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f  } else if (X509_
1880: 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65  check_purpose(ce
1890: 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45  rt, X509_PURPOSE
18a0: 5f 53 4d 49 4d 45 5f 45 4e 43 52 59 50 54 2c 20  _SMIME_ENCRYPT, 
18b0: 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f  0) > 0) {..purpo
18c0: 73 65 20 3d 20 22 53 4d 49 4d 45 20 45 6e 63 72  se = "SMIME Encr
18d0: 79 70 74 69 6f 6e 22 3b 0a 20 20 20 20 7d 20 65  yption";.    } e
18e0: 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65  lse if (X509_che
18f0: 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c  ck_purpose(cert,
1900: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 43 52   X509_PURPOSE_CR
1910: 4c 5f 53 49 47 4e 2c 20 30 29 20 3e 20 30 29 20  L_SIGN, 0) > 0) 
1920: 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 43 52  {..purpose = "CR
1930: 4c 20 53 69 67 6e 69 6e 67 22 3b 0a 20 20 20 20  L Signing";.    
1940: 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f  } else if (X509_
1950: 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65  check_purpose(ce
1960: 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45  rt, X509_PURPOSE
1970: 5f 41 4e 59 2c 20 30 29 20 3e 20 30 29 20 7b 0a  _ANY, 0) > 0) {.
1980: 09 70 75 72 70 6f 73 65 20 3d 20 22 41 6e 79 22  .purpose = "Any"
1990: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
19a0: 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70  (X509_check_purp
19b0: 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50  ose(cert, X509_P
19c0: 55 52 50 4f 53 45 5f 4f 43 53 50 5f 48 45 4c 50  URPOSE_OCSP_HELP
19d0: 45 52 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70  ER, 0) > 0) {..p
19e0: 75 72 70 6f 73 65 20 3d 20 22 4f 43 53 50 20 48  urpose = "OCSP H
19f0: 65 6c 70 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c  elper";.    } el
1a00: 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63  se if (X509_chec
1a10: 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20  k_purpose(cert, 
1a20: 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 54 49 4d  X509_PURPOSE_TIM
1a30: 45 53 54 41 4d 50 5f 53 49 47 4e 2c 20 30 29 20  ESTAMP_SIGN, 0) 
1a40: 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20  > 0) {..purpose 
1a50: 3d 20 22 54 69 6d 65 73 74 61 6d 70 20 53 69 67  = "Timestamp Sig
1a60: 6e 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73  ning";.    } els
1a70: 65 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22  e {..purpose = "
1a80: 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  ";.    }.    ret
1a90: 75 72 6e 20 70 75 72 70 6f 73 65 3b 0a 7d 0a 0a  urn purpose;.}..
1aa0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
1ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30  --. *. * Tls_x50
1b00: 39 50 75 72 70 6f 73 65 73 20 2d 2d 0a 20 2a 0a  9Purposes --. *.
1b10: 20 2a 09 47 65 74 20 58 2e 35 30 39 20 63 65 72   *.Get X.509 cer
1b20: 74 69 66 69 63 61 74 65 20 70 75 72 70 6f 73 65  tificate purpose
1b30: 20 74 79 70 65 73 0a 20 2a 0a 20 2a 20 52 65 73   types. *. * Res
1b40: 75 6c 74 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73  ults:. *.Tcl lis
1b50: 74 20 6f 66 20 65 61 63 68 20 70 75 72 70 6f 73  t of each purpos
1b60: 65 20 61 6e 64 20 77 68 65 74 68 65 72 20 69 74  e and whether it
1b70: 20 69 73 20 43 41 20 6f 72 20 6e 6f 6e 2d 43 41   is CA or non-CA
1b80: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
1b90: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  cts:. *.None. *.
1ba0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a  ---------------.
1bf0: 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73   */.Tcl_Obj *Tls
1c00: 5f 78 35 30 39 50 75 72 70 6f 73 65 73 28 54 63  _x509Purposes(Tc
1c10: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1c20: 2c 20 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a  , X509 *cert) {.
1c30: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73      Tcl_Obj *res
1c40: 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77  ultObj = Tcl_New
1c50: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
1c60: 3b 0a 20 20 20 20 58 35 30 39 5f 50 55 52 50 4f  ;.    X509_PURPO
1c70: 53 45 20 2a 70 74 6d 70 3b 0a 0a 20 20 20 20 69  SE *ptmp;..    i
1c80: 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20  f (resultObj == 
1c90: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
1ca0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
1cb0: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b   for (int i = 0;
1cc0: 20 69 20 3c 20 58 35 30 39 5f 50 55 52 50 4f 53   i < X509_PURPOS
1cd0: 45 5f 67 65 74 5f 63 6f 75 6e 74 28 29 3b 20 69  E_get_count(); i
1ce0: 2b 2b 29 20 7b 0a 09 70 74 6d 70 20 3d 20 58 35  ++) {..ptmp = X5
1cf0: 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 30 28  09_PURPOSE_get0(
1d00: 69 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 74 6d  i);..Tcl_Obj *tm
1d10: 70 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  pPtr = Tcl_NewLi
1d20: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
1d30: 0a 09 66 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30  ..for (int j = 0
1d40: 3b 20 6a 20 3c 20 32 3b 20 6a 2b 2b 29 20 7b 0a  ; j < 2; j++) {.
1d50: 09 20 20 20 20 69 6e 74 20 69 64 72 65 74 20 3d  .    int idret =
1d60: 20 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70   X509_check_purp
1d70: 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50  ose(cert, X509_P
1d80: 55 52 50 4f 53 45 5f 67 65 74 5f 69 64 28 70 74  URPOSE_get_id(pt
1d90: 6d 70 29 2c 20 6a 29 3b 0a 09 20 20 20 20 54 63  mp), j);..    Tc
1da0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1db0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 74  lement(interp, t
1dc0: 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mpPtr, Tcl_NewSt
1dd0: 72 69 6e 67 4f 62 6a 28 6a 20 3f 20 22 43 41 22  ringObj(j ? "CA"
1de0: 20 3a 20 22 6e 6f 6e 43 41 22 2c 20 2d 31 29 29   : "nonCA", -1))
1df0: 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ;..    Tcl_ListO
1e00: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1e10: 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 2c 20  interp, tmpPtr, 
1e20: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1e30: 28 69 64 72 65 74 20 3d 3d 20 31 20 3f 20 22 59  (idret == 1 ? "Y
1e40: 65 73 22 20 3a 20 22 4e 6f 22 2c 20 2d 31 29 29  es" : "No", -1))
1e50: 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42  ;..}..LAPPEND_OB
1e60: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  J(interp, result
1e70: 4f 62 6a 2c 20 58 35 30 39 5f 50 55 52 50 4f 53  Obj, X509_PURPOS
1e80: 45 5f 67 65 74 30 5f 6e 61 6d 65 28 70 74 6d 70  E_get0_name(ptmp
1e90: 29 2c 20 74 6d 70 50 74 72 29 3b 0a 20 20 20 20  ), tmpPtr);.    
1ea0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  }.    return res
1eb0: 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  ultObj;.}../*. *
1ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a  -------------. *
1f10: 0a 20 2a 20 54 6c 73 5f 78 35 30 39 4e 61 6d 65  . * Tls_x509Name
1f20: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 61  s --. *. *.Get a
1f30: 20 6c 69 73 74 20 6f 66 20 53 75 62 6a 65 63 74   list of Subject
1f40: 20 41 6c 74 65 72 6e 61 74 65 20 4e 61 6d 65 73   Alternate Names
1f50: 20 28 53 41 4e 29 20 6f 72 20 49 73 73 75 65 72   (SAN) or Issuer
1f60: 20 41 6c 74 65 72 6e 61 74 65 20 4e 61 6d 65 73   Alternate Names
1f70: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
1f80: 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 61   *.Tcl list of a
1f90: 6c 74 65 72 6e 61 74 65 20 6e 61 6d 65 73 0a 20  lternate names. 
1fa0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
1fb0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a  -------------. *
2010: 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78  /.Tcl_Obj *Tls_x
2020: 35 30 39 4e 61 6d 65 73 28 54 63 6c 5f 49 6e 74  509Names(Tcl_Int
2030: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30  erp *interp, X50
2040: 39 20 2a 63 65 72 74 2c 20 69 6e 74 20 6e 69 64  9 *cert, int nid
2050: 2c 20 42 49 4f 20 2a 62 69 6f 29 20 7b 0a 20 20  , BIO *bio) {.  
2060: 20 20 53 54 41 43 4b 5f 4f 46 28 47 45 4e 45 52    STACK_OF(GENER
2070: 41 4c 5f 4e 41 4d 45 29 20 2a 6e 61 6d 65 73 3b  AL_NAME) *names;
2080: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65  .    Tcl_Obj *re
2090: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  sultObj = Tcl_Ne
20a0: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
20b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20  );.    Tcl_Size 
20c0: 6c 65 6e 3b 0a 20 20 20 20 63 68 61 72 20 62 75  len;.    char bu
20d0: 66 66 65 72 5b 31 30 32 34 5d 3b 0a 0a 20 20 20  ffer[1024];..   
20e0: 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d   if (resultObj =
20f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
2100: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
2110: 20 20 20 69 66 20 28 28 6e 61 6d 65 73 20 3d 20     if ((names = 
2120: 58 35 30 39 5f 67 65 74 5f 65 78 74 5f 64 32 69  X509_get_ext_d2i
2130: 28 63 65 72 74 2c 20 6e 69 64 2c 20 4e 55 4c 4c  (cert, nid, NULL
2140: 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c  , NULL)) != NULL
2150: 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69 3d  ) {..for (int i=
2160: 30 3b 20 69 20 3c 20 73 6b 5f 47 45 4e 45 52 41  0; i < sk_GENERA
2170: 4c 5f 4e 41 4d 45 5f 6e 75 6d 28 6e 61 6d 65 73  L_NAME_num(names
2180: 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 63  ); i++) {..    c
2190: 6f 6e 73 74 20 47 45 4e 45 52 41 4c 5f 4e 41 4d  onst GENERAL_NAM
21a0: 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 47 45 4e  E *name = sk_GEN
21b0: 45 52 41 4c 5f 4e 41 4d 45 5f 76 61 6c 75 65 28  ERAL_NAME_value(
21c0: 6e 61 6d 65 73 2c 20 69 29 3b 0a 0a 09 20 20 20  names, i);...   
21d0: 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75   len = BIO_to_Bu
21e0: 66 66 65 72 28 6e 61 6d 65 20 26 26 20 47 45 4e  ffer(name && GEN
21f0: 45 52 41 4c 5f 4e 41 4d 45 5f 70 72 69 6e 74 28  ERAL_NAME_print(
2200: 62 69 6f 2c 20 28 47 45 4e 45 52 41 4c 5f 4e 41  bio, (GENERAL_NA
2210: 4d 45 20 2a 29 20 6e 61 6d 65 29 2c 20 62 69 6f  ME *) name), bio
2220: 2c 20 62 75 66 66 65 72 2c 20 31 30 32 34 29 3b  , buffer, 1024);
2230: 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  ..    LAPPEND_ST
2240: 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  R(interp, result
2250: 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 62 75 66 66 65  Obj, NULL, buffe
2260: 72 2c 20 6c 65 6e 29 3b 0a 09 7d 0a 09 73 6b 5f  r, len);..}..sk_
2270: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70 6f 70  GENERAL_NAME_pop
2280: 5f 66 72 65 65 28 6e 61 6d 65 73 2c 20 47 45 4e  _free(names, GEN
2290: 45 52 41 4c 5f 4e 41 4d 45 5f 66 72 65 65 29 3b  ERAL_NAME_free);
22a0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
22b0: 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a  n resultObj;.}..
22c0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2310: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30  --. *. * Tls_x50
2320: 39 45 78 74 4b 65 79 55 73 61 67 65 20 2d 2d 0a  9ExtKeyUsage --.
2330: 20 2a 0a 20 2a 09 47 65 74 20 61 20 6c 69 73 74   *. *.Get a list
2340: 20 6f 66 20 45 78 74 65 6e 64 65 64 20 4b 65 79   of Extended Key
2350: 20 55 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52 65   Usages. *. * Re
2360: 74 75 72 6e 73 3a 0a 20 2a 09 54 63 6c 20 6c 69  turns:. *.Tcl li
2370: 73 74 20 6f 66 20 75 73 61 67 65 73 0a 20 2a 0a  st of usages. *.
2380: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
2390: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d  . *.None. *. *--
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
23f0: 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30  Tcl_Obj *Tls_x50
2400: 39 45 78 74 4b 65 79 55 73 61 67 65 28 54 63 6c  9ExtKeyUsage(Tcl
2410: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2420: 20 58 35 30 39 20 2a 63 65 72 74 2c 20 75 69 6e   X509 *cert, uin
2430: 74 33 32 5f 74 20 78 66 6c 61 67 73 29 20 7b 0a  t32_t xflags) {.
2440: 20 20 20 20 75 69 6e 74 33 32 5f 74 20 75 73 61      uint32_t usa
2450: 67 65 20 3d 20 58 35 30 39 5f 67 65 74 5f 6b 65  ge = X509_get_ke
2460: 79 5f 75 73 61 67 65 28 63 65 72 74 29 3b 0a 20  y_usage(cert);. 
2470: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75     Tcl_Obj *resu
2480: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c  ltObj = Tcl_NewL
2490: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
24a0: 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74  ..    if (result
24b0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Obj == NULL) {..
24c0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
24d0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 78 66 6c   }..    if ((xfl
24e0: 61 67 73 20 26 20 45 58 46 4c 41 47 5f 58 4b 55  ags & EXFLAG_XKU
24f0: 53 41 47 45 29 20 26 26 20 75 73 61 67 65 20 3c  SAGE) && usage <
2500: 20 55 49 4e 54 33 32 5f 4d 41 58 29 20 7b 0a 09   UINT32_MAX) {..
2510: 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 74  usage = X509_get
2520: 5f 65 78 74 65 6e 64 65 64 5f 6b 65 79 5f 75 73  _extended_key_us
2530: 61 67 65 28 63 65 72 74 29 3b 0a 0a 09 69 66 20  age(cert);...if 
2540: 28 75 73 61 67 65 20 26 20 58 4b 55 5f 53 53 4c  (usage & XKU_SSL
2550: 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20  _SERVER) {..    
2560: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2570: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2580: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f   resultObj, Tcl_
2590: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 4c  NewStringObj("TL
25a0: 53 20 57 65 62 20 53 65 72 76 65 72 20 41 75 74  S Web Server Aut
25b0: 68 65 6e 74 69 63 61 74 69 6f 6e 22 2c 20 2d 31  hentication", -1
25c0: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67  ));..}..if (usag
25d0: 65 20 26 20 58 4b 55 5f 53 53 4c 5f 43 4c 49 45  e & XKU_SSL_CLIE
25e0: 4e 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  NT) {..    Tcl_L
25f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2600: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ent(interp, resu
2610: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74  ltObj, Tcl_NewSt
2620: 72 69 6e 67 4f 62 6a 28 22 54 4c 53 20 57 65 62  ringObj("TLS Web
2630: 20 43 6c 69 65 6e 74 20 41 75 74 68 65 6e 74 69   Client Authenti
2640: 63 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09  cation", -1));..
2650: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58  }..if (usage & X
2660: 4b 55 5f 53 4d 49 4d 45 29 20 7b 0a 09 20 20 20  KU_SMIME) {..   
2670: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2680: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2690: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c  , resultObj, Tcl
26a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 45  _NewStringObj("E
26b0: 2d 6d 61 69 6c 20 50 72 6f 74 65 63 74 69 6f 6e  -mail Protection
26c0: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
26d0: 28 75 73 61 67 65 20 26 20 58 4b 55 5f 43 4f 44  (usage & XKU_COD
26e0: 45 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 20 54  E_SIGN) {..    T
26f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2700: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2710: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e  resultObj, Tcl_N
2720: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 43 6f 64  ewStringObj("Cod
2730: 65 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29  e Signing", -1))
2740: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20  ;..}..if (usage 
2750: 26 20 58 4b 55 5f 53 47 43 29 20 7b 0a 09 20 20  & XKU_SGC) {..  
2760: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2770: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2780: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
2790: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
27a0: 53 47 43 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  SGC", -1));..}..
27b0: 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f  if (usage & XKU_
27c0: 4f 43 53 50 5f 53 49 47 4e 29 20 7b 0a 09 20 20  OCSP_SIGN) {..  
27d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
27e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
27f0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
2800: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
2810: 4f 43 53 50 20 53 69 67 6e 69 6e 67 22 2c 20 2d  OCSP Signing", -
2820: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61  1));..}..if (usa
2830: 67 65 20 26 20 58 4b 55 5f 54 49 4d 45 53 54 41  ge & XKU_TIMESTA
2840: 4d 50 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  MP) {..    Tcl_L
2850: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2860: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ent(interp, resu
2870: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74  ltObj, Tcl_NewSt
2880: 72 69 6e 67 4f 62 6a 28 22 54 69 6d 65 20 53 74  ringObj("Time St
2890: 61 6d 70 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09  amping", -1));..
28a0: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58  }..if (usage & X
28b0: 4b 55 5f 44 56 43 53 20 29 20 7b 0a 09 20 20 20  KU_DVCS ) {..   
28c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
28d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
28e0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c  , resultObj, Tcl
28f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 44  _NewStringObj("D
2900: 56 43 53 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  VCS", -1));..}..
2910: 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f  if (usage & XKU_
2920: 41 4e 59 45 4b 55 29 20 7b 0a 09 20 20 20 20 54  ANYEKU) {..    T
2930: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2940: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2950: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e  resultObj, Tcl_N
2960: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 41 6e 79  ewStringObj("Any
2970: 20 45 78 74 65 6e 64 65 64 20 4b 65 79 20 55 73   Extended Key Us
2980: 61 67 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20  age", -1));..}. 
2990: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20     } else {..   
29a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
29b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
29c0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c  , resultObj, Tcl
29d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75  _NewStringObj("u
29e0: 6e 72 65 73 74 72 69 63 74 65 64 22 2c 20 2d 31  nrestricted", -1
29f0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ));.    }.    re
2a00: 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a  turn resultObj;.
2a10: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
2a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a60: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
2a70: 78 35 30 39 43 72 6c 44 70 20 2d 2d 0a 20 2a 0a  x509CrlDp --. *.
2a80: 20 2a 09 47 65 74 20 6c 69 73 74 20 6f 66 20 43   *.Get list of C
2a90: 52 4c 20 44 69 73 74 72 69 62 75 74 69 6f 6e 20  RL Distribution 
2aa0: 50 6f 69 6e 74 73 0a 20 2a 0a 20 2a 20 52 65 74  Points. *. * Ret
2ab0: 75 72 6e 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73  urns:. *.Tcl lis
2ac0: 74 20 6f 66 20 55 52 49 73 20 61 6e 64 20 72 65  t of URIs and re
2ad0: 6c 61 74 69 76 65 2d 6e 61 6d 65 73 0a 20 2a 0a  lative-names. *.
2ae0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
2af0: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d  . *.None. *. *--
2b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
2b50: 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30  Tcl_Obj *Tls_x50
2b60: 39 43 72 6c 44 70 28 54 63 6c 5f 49 6e 74 65 72  9CrlDp(Tcl_Inter
2b70: 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20  p *interp, X509 
2b80: 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 53 54 41  *cert) {.    STA
2b90: 43 4b 5f 4f 46 28 44 49 53 54 5f 50 4f 49 4e 54  CK_OF(DIST_POINT
2ba0: 29 20 2a 63 72 6c 3b 0a 20 20 20 20 54 63 6c 5f  ) *crl;.    Tcl_
2bb0: 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d  Obj *resultObj =
2bc0: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
2bd0: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69  0, NULL);..    i
2be0: 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20  f (resultObj == 
2bf0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
2c00: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
2c10: 20 69 66 20 28 28 63 72 6c 20 3d 20 58 35 30 39   if ((crl = X509
2c20: 5f 67 65 74 5f 65 78 74 5f 64 32 69 28 63 65 72  _get_ext_d2i(cer
2c30: 74 2c 20 4e 49 44 5f 63 72 6c 5f 64 69 73 74 72  t, NID_crl_distr
2c40: 69 62 75 74 69 6f 6e 5f 70 6f 69 6e 74 73 2c 20  ibution_points, 
2c50: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20  NULL, NULL)) != 
2c60: 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e  NULL) {..for (in
2c70: 74 20 69 3d 30 3b 20 69 20 3c 20 73 6b 5f 44 49  t i=0; i < sk_DI
2c80: 53 54 5f 50 4f 49 4e 54 5f 6e 75 6d 28 63 72 6c  ST_POINT_num(crl
2c90: 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 44  ); i++) {..    D
2ca0: 49 53 54 5f 50 4f 49 4e 54 20 2a 64 70 20 3d 20  IST_POINT *dp = 
2cb0: 73 6b 5f 44 49 53 54 5f 50 4f 49 4e 54 5f 76 61  sk_DIST_POINT_va
2cc0: 6c 75 65 28 63 72 6c 2c 20 69 29 3b 0a 09 20 20  lue(crl, i);..  
2cd0: 20 20 44 49 53 54 5f 50 4f 49 4e 54 5f 4e 41 4d    DIST_POINT_NAM
2ce0: 45 20 2a 64 69 73 74 70 6f 69 6e 74 20 3d 20 64  E *distpoint = d
2cf0: 70 2d 3e 64 69 73 74 70 6f 69 6e 74 3b 0a 0a 09  p->distpoint;...
2d00: 20 20 20 20 69 66 20 28 64 69 73 74 70 6f 69 6e      if (distpoin
2d10: 74 2d 3e 74 79 70 65 20 3d 3d 20 30 29 20 7b 0a  t->type == 0) {.
2d20: 09 09 2f 2a 20 66 75 6c 6c 2d 6e 61 6d 65 20 47  ../* full-name G
2d30: 45 4e 45 52 41 4c 49 5a 45 44 4e 41 4d 45 20 2a  ENERALIZEDNAME *
2d40: 2f 0a 09 09 66 6f 72 20 28 69 6e 74 20 6a 20 3d  /...for (int j =
2d50: 20 30 3b 20 6a 20 3c 20 73 6b 5f 47 45 4e 45 52   0; j < sk_GENER
2d60: 41 4c 5f 4e 41 4d 45 5f 6e 75 6d 28 64 69 73 74  AL_NAME_num(dist
2d70: 70 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c  point->name.full
2d80: 6e 61 6d 65 29 3b 20 6a 2b 2b 29 20 7b 0a 09 09  name); j++) {...
2d90: 20 20 20 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45      GENERAL_NAME
2da0: 20 2a 67 65 6e 20 3d 20 73 6b 5f 47 45 4e 45 52   *gen = sk_GENER
2db0: 41 4c 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 64 69  AL_NAME_value(di
2dc0: 73 74 70 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 66 75  stpoint->name.fu
2dd0: 6c 6c 6e 61 6d 65 2c 20 6a 29 3b 0a 09 09 20 20  llname, j);...  
2de0: 20 20 69 6e 74 20 74 79 70 65 3b 0a 09 09 20 20    int type;...  
2df0: 20 20 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 75    ASN1_STRING *u
2e00: 72 69 20 3d 20 47 45 4e 45 52 41 4c 5f 4e 41 4d  ri = GENERAL_NAM
2e10: 45 5f 67 65 74 30 5f 76 61 6c 75 65 28 67 65 6e  E_get0_value(gen
2e20: 2c 20 26 74 79 70 65 29 3b 0a 09 09 20 20 20 20  , &type);...    
2e30: 69 66 20 28 74 79 70 65 20 3d 3d 20 47 45 4e 5f  if (type == GEN_
2e40: 55 52 49 29 20 7b 0a 09 09 09 4c 41 50 50 45 4e  URI) {....LAPPEN
2e50: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65  D_STR(interp, re
2e60: 73 75 6c 74 4f 62 6a 2c 20 28 63 68 61 72 20 2a  sultObj, (char *
2e70: 29 20 4e 55 4c 4c 2c 20 28 63 68 61 72 20 2a 29  ) NULL, (char *)
2e80: 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74   ASN1_STRING_get
2e90: 30 5f 64 61 74 61 28 75 72 69 29 2c 20 28 54 63  0_data(uri), (Tc
2ea0: 6c 5f 53 69 7a 65 29 20 41 53 4e 31 5f 53 54 52  l_Size) ASN1_STR
2eb0: 49 4e 47 5f 6c 65 6e 67 74 68 28 75 72 69 29 29  ING_length(uri))
2ec0: 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20  ;...    }...}.. 
2ed0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 69     } else if (di
2ee0: 73 74 70 6f 69 6e 74 2d 3e 74 79 70 65 20 3d 3d  stpoint->type ==
2ef0: 20 31 29 20 7b 0a 09 09 2f 2a 20 72 65 6c 61 74   1) {.../* relat
2f00: 69 76 65 2d 6e 61 6d 65 20 58 35 30 39 4e 41 4d  ive-name X509NAM
2f10: 45 20 2a 2f 0a 09 09 53 54 41 43 4b 5f 4f 46 28  E */...STACK_OF(
2f20: 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 29  X509_NAME_ENTRY)
2f30: 20 2a 73 6b 5f 72 65 6c 6e 61 6d 65 20 3d 20 64   *sk_relname = d
2f40: 69 73 74 70 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 72  istpoint->name.r
2f50: 65 6c 61 74 69 76 65 6e 61 6d 65 3b 0a 09 09 66  elativename;...f
2f60: 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a  or (int j = 0; j
2f70: 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f   < sk_X509_NAME_
2f80: 45 4e 54 52 59 5f 6e 75 6d 28 73 6b 5f 72 65 6c  ENTRY_num(sk_rel
2f90: 6e 61 6d 65 29 3b 20 6a 2b 2b 29 20 7b 0a 09 09  name); j++) {...
2fa0: 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e      X509_NAME_EN
2fb0: 54 52 59 20 2a 65 20 3d 20 73 6b 5f 58 35 30 39  TRY *e = sk_X509
2fc0: 5f 4e 41 4d 45 5f 45 4e 54 52 59 5f 76 61 6c 75  _NAME_ENTRY_valu
2fd0: 65 28 73 6b 5f 72 65 6c 6e 61 6d 65 2c 20 6a 29  e(sk_relname, j)
2fe0: 3b 0a 09 09 20 20 20 20 41 53 4e 31 5f 53 54 52  ;...    ASN1_STR
2ff0: 49 4e 47 20 2a 64 20 3d 20 58 35 30 39 5f 4e 41  ING *d = X509_NA
3000: 4d 45 5f 45 4e 54 52 59 5f 67 65 74 5f 64 61 74  ME_ENTRY_get_dat
3010: 61 28 65 29 3b 0a 09 09 20 20 20 20 4c 41 50 50  a(e);...    LAPP
3020: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
3030: 72 65 73 75 6c 74 4f 62 6a 2c 20 28 63 68 61 72  resultObj, (char
3040: 20 2a 29 20 4e 55 4c 4c 2c 20 28 63 68 61 72 20   *) NULL, (char 
3050: 2a 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 64  *) ASN1_STRING_d
3060: 61 74 61 28 64 29 2c 20 28 54 63 6c 5f 53 69 7a  ata(d), (Tcl_Siz
3070: 65 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c  e) ASN1_STRING_l
3080: 65 6e 67 74 68 28 64 29 29 3b 0a 09 09 7d 0a 09  ength(d));...}..
3090: 20 20 20 20 7d 0a 09 7d 0a 09 43 52 4c 5f 44 49      }..}..CRL_DI
30a0: 53 54 5f 50 4f 49 4e 54 53 5f 66 72 65 65 28 63  ST_POINTS_free(c
30b0: 72 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rl);.    }.    r
30c0: 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b  eturn resultObj;
30d0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3120: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
3130: 5f 78 35 30 39 4f 73 63 70 0a 20 2a 0a 20 2a 09  _x509Oscp. *. *.
3140: 47 65 74 20 6c 69 73 74 20 6f 66 20 4f 6e 2d 6c  Get list of On-l
3150: 69 6e 65 20 43 65 72 74 69 66 69 63 61 74 65 20  ine Certificate 
3160: 53 74 61 74 75 73 20 50 72 6f 74 6f 63 6f 6c 20  Status Protocol 
3170: 28 4f 53 43 50 29 20 55 52 49 73 0a 20 2a 0a 20  (OSCP) URIs. *. 
3180: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63  * Results:. *.Tc
3190: 6c 20 6c 69 73 74 20 6f 66 20 55 52 49 73 0a 20  l list of URIs. 
31a0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
31b0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
31c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
3210: 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78  /.Tcl_Obj *Tls_x
3220: 35 30 39 4f 73 63 70 28 54 63 6c 5f 49 6e 74 65  509Oscp(Tcl_Inte
3230: 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39  rp *interp, X509
3240: 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 53 54   *cert) {.    ST
3250: 41 43 4b 5f 4f 46 28 4f 50 45 4e 53 53 4c 5f 53  ACK_OF(OPENSSL_S
3260: 54 52 49 4e 47 29 20 2a 6f 63 73 70 3b 0a 20 20  TRING) *ocsp;.  
3270: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c    Tcl_Obj *resul
3280: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  tObj = Tcl_NewLi
3290: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
32a0: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f  .    if (resultO
32b0: 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  bj == NULL) {..r
32c0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
32d0: 7d 0a 0a 20 20 20 20 69 66 20 28 28 6f 63 73 70  }..    if ((ocsp
32e0: 20 3d 20 58 35 30 39 5f 67 65 74 31 5f 6f 63 73   = X509_get1_ocs
32f0: 70 28 63 65 72 74 29 29 20 21 3d 20 4e 55 4c 4c  p(cert)) != NULL
3300: 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20  ) {..for (int i 
3310: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 4f 50 45 4e  = 0; i < sk_OPEN
3320: 53 53 4c 5f 53 54 52 49 4e 47 5f 6e 75 6d 28 6f  SSL_STRING_num(o
3330: 63 73 70 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20  csp); i++) {..  
3340: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
3350: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
3360: 20 4e 55 4c 4c 2c 20 73 6b 5f 4f 50 45 4e 53 53   NULL, sk_OPENSS
3370: 4c 5f 53 54 52 49 4e 47 5f 76 61 6c 75 65 28 6f  L_STRING_value(o
3380: 63 73 70 2c 20 69 29 2c 20 2d 31 29 3b 0a 09 7d  csp, i), -1);..}
3390: 0a 09 58 35 30 39 5f 65 6d 61 69 6c 5f 66 72 65  ..X509_email_fre
33a0: 65 28 6f 63 73 70 29 3b 0a 20 20 20 20 7d 0a 20  e(ocsp);.    }. 
33b0: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74     return result
33c0: 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  Obj;.}../*. *---
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
3420: 20 54 6c 73 5f 78 35 30 39 43 61 49 73 73 75 65   Tls_x509CaIssue
3430: 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20  rs --. *. *.Get 
3440: 6c 69 73 74 20 6f 66 20 43 65 72 74 69 66 69 63  list of Certific
3450: 61 74 65 20 41 75 74 68 6f 72 69 74 79 20 28 43  ate Authority (C
3460: 41 29 20 49 73 73 75 65 72 20 55 52 49 73 0a 20  A) Issuer URIs. 
3470: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
3480: 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 43 41 20  .Tcl list of CA 
3490: 69 73 73 75 65 72 20 55 52 49 73 0a 20 2a 0a 20  issuer URIs. *. 
34a0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
34b0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.None. *. *---
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54  ----------. */.T
3510: 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39  cl_Obj *Tls_x509
3520: 43 61 49 73 73 75 65 72 73 28 54 63 6c 5f 49 6e  CaIssuers(Tcl_In
3530: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35  terp *interp, X5
3540: 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20  09 *cert) {.    
3550: 53 54 41 43 4b 5f 4f 46 28 41 43 43 45 53 53 5f  STACK_OF(ACCESS_
3560: 44 45 53 43 52 49 50 54 49 4f 4e 29 20 2a 61 64  DESCRIPTION) *ad
3570: 73 3b 0a 20 20 20 20 41 43 43 45 53 53 5f 44 45  s;.    ACCESS_DE
3580: 53 43 52 49 50 54 49 4f 4e 20 2a 61 64 3b 0a 20  SCRIPTION *ad;. 
3590: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75     Tcl_Obj *resu
35a0: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c  ltObj = Tcl_NewL
35b0: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
35c0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
35d0: 61 72 20 2a 62 75 66 3b 0a 0a 20 20 20 20 69 66  ar *buf;..    if
35e0: 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e   (resultObj == N
35f0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e  ULL) {..return N
3600: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
3610: 69 66 20 28 28 61 64 73 20 3d 20 58 35 30 39 5f  if ((ads = X509_
3620: 67 65 74 5f 65 78 74 5f 64 32 69 28 63 65 72 74  get_ext_d2i(cert
3630: 2c 20 4e 49 44 5f 69 6e 66 6f 5f 61 63 63 65 73  , NID_info_acces
3640: 73 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20  s, NULL, NULL)) 
3650: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20  != NULL) {..for 
3660: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (int i = 0; i < 
3670: 73 6b 5f 41 43 43 45 53 53 5f 44 45 53 43 52 49  sk_ACCESS_DESCRI
3680: 50 54 49 4f 4e 5f 6e 75 6d 28 61 64 73 29 3b 20  PTION_num(ads); 
3690: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 61 64 20 3d  i++) {..    ad =
36a0: 20 73 6b 5f 41 43 43 45 53 53 5f 44 45 53 43 52   sk_ACCESS_DESCR
36b0: 49 50 54 49 4f 4e 5f 76 61 6c 75 65 28 61 64 73  IPTION_value(ads
36c0: 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 4f  , i);..    if (O
36d0: 42 4a 5f 6f 62 6a 32 6e 69 64 28 61 64 2d 3e 6d  BJ_obj2nid(ad->m
36e0: 65 74 68 6f 64 29 20 3d 3d 20 4e 49 44 5f 61 64  ethod) == NID_ad
36f0: 5f 63 61 5f 69 73 73 75 65 72 73 20 26 26 20 61  _ca_issuers && a
3700: 64 2d 3e 6c 6f 63 61 74 69 6f 6e 29 20 7b 0a 09  d->location) {..
3710: 09 69 66 20 28 61 64 2d 3e 6c 6f 63 61 74 69 6f  .if (ad->locatio
3720: 6e 2d 3e 74 79 70 65 20 3d 3d 20 47 45 4e 5f 55  n->type == GEN_U
3730: 52 49 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f  RI) {...    Tcl_
3740: 53 69 7a 65 20 6c 65 6e 20 3d 20 28 54 63 6c 5f  Size len = (Tcl_
3750: 53 69 7a 65 29 20 41 53 4e 31 5f 53 54 52 49 4e  Size) ASN1_STRIN
3760: 47 5f 74 6f 5f 55 54 46 38 28 26 62 75 66 2c 20  G_to_UTF8(&buf, 
3770: 61 64 2d 3e 6c 6f 63 61 74 69 6f 6e 2d 3e 64 2e  ad->location->d.
3780: 75 6e 69 66 6f 72 6d 52 65 73 6f 75 72 63 65 49  uniformResourceI
3790: 64 65 6e 74 69 66 69 65 72 29 3b 0a 09 09 20 20  dentifier);...  
37a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
37b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
37c0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
37d0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
37e0: 63 68 61 72 20 2a 29 20 62 75 66 2c 20 6c 65 6e  char *) buf, len
37f0: 29 29 3b 0a 09 09 20 20 20 20 4f 50 45 4e 53 53  ));...    OPENSS
3800: 4c 5f 66 72 65 65 28 62 75 66 29 3b 0a 09 09 20  L_free(buf);... 
3810: 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 20     break;...}.. 
3820: 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 73 6b 5f 41     }..}../* sk_A
3830: 43 43 45 53 53 5f 44 45 53 43 52 49 50 54 49 4f  CCESS_DESCRIPTIO
3840: 4e 5f 70 6f 70 5f 66 72 65 65 28 61 64 73 2c 20  N_pop_free(ads, 
3850: 41 43 43 45 53 53 5f 44 45 53 43 52 49 50 54 49  ACCESS_DESCRIPTI
3860: 4f 4e 5f 66 72 65 65 29 3b 20 2a 2f 0a 09 41 55  ON_free); */..AU
3870: 54 48 4f 52 49 54 59 5f 49 4e 46 4f 5f 41 43 43  THORITY_INFO_ACC
3880: 45 53 53 5f 66 72 65 65 28 61 64 73 29 3b 0a 20  ESS_free(ads);. 
3890: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
38a0: 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0c 0a 2f  resultObj;.}.../
38b0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
38c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3900: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 4e 65 77 58  -. *. * Tls_NewX
3910: 35 30 39 4f 62 6a 20 2d 2d 0a 20 2a 0a 20 2a 09  509Obj --. *. *.
3920: 50 61 72 73 65 73 20 61 20 58 35 30 39 20 63 65  Parses a X509 ce
3930: 72 74 69 66 69 63 61 74 65 20 61 6e 64 20 72 65  rtificate and re
3940: 74 75 72 6e 73 20 63 6f 6e 74 65 6e 74 73 20 61  turns contents a
3950: 73 20 61 20 6b 65 79 2d 76 61 6c 75 65 20 54 63  s a key-value Tc
3960: 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65  l list.. *. * Re
3970: 73 75 6c 74 3a 0a 20 2a 09 41 20 54 63 6c 20 4c  sult:. *.A Tcl L
3980: 69 73 74 20 77 69 74 68 20 74 68 65 20 58 35 30  ist with the X50
3990: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e  9 certificate in
39a0: 66 6f 20 61 73 20 61 20 6b 65 79 2d 76 61 6c 75  fo as a key-valu
39b0: 65 20 6c 69 73 74 0a 20 2a 0a 20 2a 20 53 69 64  e list. *. * Sid
39c0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
39d0: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ne. *. *--------
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a20: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62  -----. */.Tcl_Ob
3a30: 6a 20 2a 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62  j *Tls_NewX509Ob
3a40: 6a 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  j(Tcl_Interp *in
3a50: 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74  terp, X509 *cert
3a60: 2c 20 69 6e 74 20 61 6c 6c 29 20 7b 0a 20 20 20  , int all) {.   
3a70: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74   Tcl_Obj *result
3a80: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Obj = Tcl_NewLis
3a90: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20  tObj(0, NULL);. 
3aa0: 20 20 20 42 49 4f 20 2a 62 69 6f 20 3d 20 42 49     BIO *bio = BI
3ab0: 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
3ac0: 29 29 3b 0a 20 20 20 20 69 6e 74 20 6d 64 6e 69  ));.    int mdni
3ad0: 64 2c 20 70 6b 6e 69 64 2c 20 62 69 74 73 3b 0a  d, pknid, bits;.
3ae0: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e      Tcl_Size len
3af0: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
3b00: 6e 74 20 75 6c 65 6e 3b 0a 20 20 20 20 75 69 6e  nt ulen;.    uin
3b10: 74 33 32 5f 74 20 78 66 6c 61 67 73 3b 0a 20 20  t32_t xflags;.  
3b20: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
3b30: 66 6c 61 67 73 20 3d 20 58 4e 5f 46 4c 41 47 5f  flags = XN_FLAG_
3b40: 52 46 43 32 32 35 33 20 7c 20 41 53 4e 31 5f 53  RFC2253 | ASN1_S
3b50: 54 52 46 4c 47 53 5f 55 54 46 38 5f 43 4f 4e 56  TRFLGS_UTF8_CONV
3b60: 45 52 54 3b 0a 20 20 20 20 66 6c 61 67 73 20 26  ERT;.    flags &
3b70: 3d 20 7e 41 53 4e 31 5f 53 54 52 46 4c 47 53 5f  = ~ASN1_STRFLGS_
3b80: 45 53 43 5f 4d 53 42 3b 0a 0a 20 20 20 20 63 68  ESC_MSB;..    ch
3b90: 61 72 20 2a 62 75 66 66 65 72 20 3d 20 63 6b 61  ar *buffer = cka
3ba0: 6c 6c 6f 63 28 42 55 46 53 49 5a 20 3e 20 45 56  lloc(BUFSIZ > EV
3bb0: 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 20 3f 20  P_MAX_MD_SIZE ? 
3bc0: 42 55 46 53 49 5a 20 3a 20 45 56 50 5f 4d 41 58  BUFSIZ : EVP_MAX
3bd0: 5f 4d 44 5f 53 49 5a 45 29 3b 0a 0a 20 20 20 20  _MD_SIZE);..    
3be0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
3bf0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65  );..    if (inte
3c00: 72 70 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 65  rp == NULL || ce
3c10: 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62 69  rt == NULL || bi
3c20: 6f 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 65 73  o == NULL || res
3c30: 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 20 7c  ultObj == NULL |
3c40: 7c 20 62 75 66 66 65 72 20 3d 3d 20 4e 55 4c 4c  | buffer == NULL
3c50: 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66  ) {..Tcl_DecrRef
3c60: 43 6f 75 6e 74 28 72 65 73 75 6c 74 4f 62 6a 29  Count(resultObj)
3c70: 3b 0a 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29  ;..BIO_free(bio)
3c80: 3b 0a 09 69 66 20 28 62 75 66 66 65 72 20 21 3d  ;..if (buffer !=
3c90: 20 4e 55 4c 4c 29 20 63 6b 66 72 65 65 28 62 75   NULL) ckfree(bu
3ca0: 66 66 65 72 29 3b 0a 09 72 65 74 75 72 6e 20 4e  ffer);..return N
3cb0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
3cc0: 2f 2a 20 53 69 67 6e 61 74 75 72 65 20 61 6c 67  /* Signature alg
3cd0: 6f 72 69 74 68 6d 20 61 6e 64 20 76 61 6c 75 65  orithm and value
3ce0: 20 2d 20 52 46 43 20 35 32 38 30 20 73 65 63 74   - RFC 5280 sect
3cf0: 69 6f 6e 20 34 2e 31 2e 31 2e 32 20 61 6e 64 20  ion 4.1.1.2 and 
3d00: 34 2e 31 2e 31 2e 33 20 2a 2f 0a 20 20 20 20 2f  4.1.1.3 */.    /
3d10: 2a 20 73 69 67 6e 61 74 75 72 65 41 6c 67 6f 72  * signatureAlgor
3d20: 69 74 68 6d 20 69 73 20 74 68 65 20 69 64 20 6f  ithm is the id o
3d30: 66 20 74 68 65 20 63 72 79 70 74 6f 67 72 61 70  f the cryptograp
3d40: 68 69 63 20 61 6c 67 6f 72 69 74 68 6d 20 75 73  hic algorithm us
3d50: 65 64 20 62 79 20 74 68 65 0a 09 43 41 20 74 6f  ed by the..CA to
3d60: 20 73 69 67 6e 20 74 68 69 73 20 63 65 72 74 2e   sign this cert.
3d70: 20 73 69 67 6e 61 74 75 72 65 56 61 6c 75 65 20   signatureValue 
3d80: 69 73 20 74 68 65 20 64 69 67 69 74 61 6c 20 73  is the digital s
3d90: 69 67 6e 61 74 75 72 65 20 63 6f 6d 70 75 74 65  ignature compute
3da0: 64 0a 09 75 70 6f 6e 20 74 68 65 20 41 53 4e 2e  d..upon the ASN.
3db0: 31 20 44 45 52 20 65 6e 63 6f 64 65 64 20 74 62  1 DER encoded tb
3dc0: 73 43 65 72 74 69 66 69 63 61 74 65 2e 20 2a 2f  sCertificate. */
3dd0: 0a 20 20 20 20 7b 0a 09 63 6f 6e 73 74 20 58 35  .    {..const X5
3de0: 30 39 5f 41 4c 47 4f 52 20 2a 73 69 67 5f 61 6c  09_ALGOR *sig_al
3df0: 67 3b 0a 09 63 6f 6e 73 74 20 41 53 4e 31 5f 42  g;..const ASN1_B
3e00: 49 54 5f 53 54 52 49 4e 47 20 2a 73 69 67 3b 0a  IT_STRING *sig;.
3e10: 09 69 6e 74 20 73 69 67 5f 6e 69 64 3b 0a 0a 09  .int sig_nid;...
3e20: 58 35 30 39 5f 67 65 74 30 5f 73 69 67 6e 61 74  X509_get0_signat
3e30: 75 72 65 28 26 73 69 67 2c 20 26 73 69 67 5f 61  ure(&sig, &sig_a
3e40: 6c 67 2c 20 63 65 72 74 29 3b 0a 09 2f 2a 20 73  lg, cert);../* s
3e50: 69 67 5f 6e 69 64 20 3d 20 58 35 30 39 5f 67 65  ig_nid = X509_ge
3e60: 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28  t_signature_nid(
3e70: 63 65 72 74 29 20 2a 2f 0a 09 73 69 67 5f 6e 69  cert) */..sig_ni
3e80: 64 20 3d 20 4f 42 4a 5f 6f 62 6a 32 6e 69 64 28  d = OBJ_obj2nid(
3e90: 73 69 67 5f 61 6c 67 2d 3e 61 6c 67 6f 72 69 74  sig_alg->algorit
3ea0: 68 6d 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  hm);..LAPPEND_ST
3eb0: 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  R(interp, result
3ec0: 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75 72 65 41  Obj, "signatureA
3ed0: 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e  lgorithm", OBJ_n
3ee0: 69 64 32 6c 6e 28 73 69 67 5f 6e 69 64 29 2c 20  id2ln(sig_nid), 
3ef0: 2d 31 29 3b 0a 09 69 66 20 28 73 69 67 5f 6e 69  -1);..if (sig_ni
3f00: 64 20 21 3d 20 4e 49 44 5f 75 6e 64 65 66 29 20  d != NID_undef) 
3f10: 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f  {..    LAPPEND_O
3f20: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  BJ(interp, resul
3f30: 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75 72 65  tObj, "signature
3f40: 56 61 6c 75 65 22 2c 20 53 74 72 69 6e 67 5f 74  Value", String_t
3f50: 6f 5f 48 65 78 28 73 69 67 2d 3e 64 61 74 61 2c  o_Hex(sig->data,
3f60: 20 73 69 67 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a   sig->length));.
3f70: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 4c  .} else {..    L
3f80: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
3f90: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73  p, resultObj, "s
3fa0: 69 67 6e 61 74 75 72 65 56 61 6c 75 65 22 2c 20  ignatureValue", 
3fb0: 22 22 2c 20 30 29 3b 0a 09 7d 0a 20 20 20 20 7d  "", 0);..}.    }
3fc0: 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e  ..    /* Version
3fd0: 20 6f 66 20 74 68 65 20 65 6e 63 6f 64 65 64 20   of the encoded 
3fe0: 63 65 72 74 69 66 69 63 61 74 65 20 2d 20 52 46  certificate - RF
3ff0: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34  C 5280 section 4
4000: 2e 31 2e 32 2e 31 20 2a 2f 0a 20 20 20 20 4c 41  .1.2.1 */.    LA
4010: 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72  PPEND_LONG(inter
4020: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 76  p, resultObj, "v
4030: 65 72 73 69 6f 6e 22 2c 20 58 35 30 39 5f 67 65  ersion", X509_ge
4040: 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 29 2b  t_version(cert)+
4050: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 69 71  1);..    /* Uniq
4060: 75 65 20 6e 75 6d 62 65 72 20 61 73 73 69 67 6e  ue number assign
4070: 65 64 20 62 79 20 43 41 20 74 6f 20 63 65 72 74  ed by CA to cert
4080: 69 66 69 63 61 74 65 20 2d 20 52 46 43 20 35 32  ificate - RFC 52
4090: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32  80 section 4.1.2
40a0: 2e 32 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20  .2 */.    len = 
40b0: 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 69 32  BIO_to_Buffer(i2
40c0: 61 5f 41 53 4e 31 5f 49 4e 54 45 47 45 52 28 62  a_ASN1_INTEGER(b
40d0: 69 6f 2c 20 58 35 30 39 5f 67 65 74 30 5f 73 65  io, X509_get0_se
40e0: 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29  rialNumber(cert)
40f0: 29 2c 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20  ), bio, buffer, 
4100: 42 55 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50  BUFSIZ);.    LAP
4110: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
4120: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 65 72   resultObj, "ser
4130: 69 61 6c 4e 75 6d 62 65 72 22 2c 20 62 75 66 66  ialNumber", buff
4140: 65 72 2c 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f  er, len);..    /
4150: 2a 20 53 69 67 6e 61 74 75 72 65 20 61 6c 67 6f  * Signature algo
4160: 72 69 74 68 6d 20 75 73 65 64 20 62 79 20 74 68  rithm used by th
4170: 65 20 43 41 20 74 6f 20 73 69 67 6e 20 74 68 65  e CA to sign the
4180: 20 63 65 72 74 69 66 69 63 61 74 65 2e 20 4d 75   certificate. Mu
4190: 73 74 20 6d 61 74 63 68 0a 09 73 69 67 6e 61 74  st match..signat
41a0: 75 72 65 41 6c 67 6f 72 69 74 68 6d 2e 20 52 46  ureAlgorithm. RF
41b0: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34  C 5280 section 4
41c0: 2e 31 2e 32 2e 33 20 2a 2f 0a 20 20 20 20 4c 41  .1.2.3 */.    LA
41d0: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
41e0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69  , resultObj, "si
41f0: 67 6e 61 74 75 72 65 22 2c 20 4f 42 4a 5f 6e 69  gnature", OBJ_ni
4200: 64 32 6c 6e 28 58 35 30 39 5f 67 65 74 5f 73 69  d2ln(X509_get_si
4210: 67 6e 61 74 75 72 65 5f 6e 69 64 28 63 65 72 74  gnature_nid(cert
4220: 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  )), -1);..    /*
4230: 20 49 73 73 75 65 72 20 69 64 65 6e 74 69 66 69   Issuer identifi
4240: 65 73 20 74 68 65 20 65 6e 74 69 74 79 20 74 68  es the entity th
4250: 61 74 20 73 69 67 6e 65 64 20 61 6e 64 20 69 73  at signed and is
4260: 73 75 65 64 20 74 68 65 20 63 65 72 74 2e 20 52  sued the cert. R
4270: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20  FC 5280 section 
4280: 34 2e 31 2e 32 2e 34 20 2a 2f 0a 20 20 20 20 6c  4.1.2.4 */.    l
4290: 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66  en = BIO_to_Buff
42a0: 65 72 28 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69  er(X509_NAME_pri
42b0: 6e 74 5f 65 78 28 62 69 6f 2c 20 58 35 30 39 5f  nt_ex(bio, X509_
42c0: 67 65 74 5f 69 73 73 75 65 72 5f 6e 61 6d 65 28  get_issuer_name(
42d0: 63 65 72 74 29 2c 20 30 2c 20 66 6c 61 67 73 29  cert), 0, flags)
42e0: 2c 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42  , bio, buffer, B
42f0: 55 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50  UFSIZ);.    LAPP
4300: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
4310: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 69 73 73 75  resultObj, "issu
4320: 65 72 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e  er", buffer, len
4330: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 69  );..    /* Certi
4340: 66 69 63 61 74 65 20 76 61 6c 69 64 69 74 79 20  ficate validity 
4350: 70 65 72 69 6f 64 20 69 73 20 74 68 65 20 69 6e  period is the in
4360: 74 65 72 76 61 6c 20 74 68 65 20 43 41 20 77 61  terval the CA wa
4370: 72 72 61 6e 74 73 20 74 68 61 74 20 69 74 20 77  rrants that it w
4380: 69 6c 6c 0a 09 6d 61 69 6e 74 61 69 6e 20 69 6e  ill..maintain in
4390: 66 6f 20 6f 6e 20 74 68 65 20 73 74 61 74 75 73  fo on the status
43a0: 20 6f 66 20 74 68 65 20 63 65 72 74 69 66 69 63   of the certific
43b0: 61 74 65 2e 20 52 46 43 20 35 32 38 30 20 73 65  ate. RFC 5280 se
43c0: 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 35 20 2a 2f  ction 4.1.2.5 */
43d0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 56 61 6c 69  .    /* Get Vali
43e0: 64 69 74 79 20 2d 20 4e 6f 74 20 42 65 66 6f 72  dity - Not Befor
43f0: 65 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42  e */.    len = B
4400: 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 41 53 4e  IO_to_Buffer(ASN
4410: 31 5f 54 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f  1_TIME_print(bio
4420: 2c 20 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74 42  , X509_get0_notB
4430: 65 66 6f 72 65 28 63 65 72 74 29 29 2c 20 62 69  efore(cert)), bi
4440: 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49  o, buffer, BUFSI
4450: 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  Z);.    LAPPEND_
4460: 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75  STR(interp, resu
4470: 6c 74 4f 62 6a 2c 20 22 6e 6f 74 42 65 66 6f 72  ltObj, "notBefor
4480: 65 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29  e", buffer, len)
4490: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 56 61  ;..    /* Get Va
44a0: 6c 69 64 69 74 79 20 2d 20 4e 6f 74 20 41 66 74  lidity - Not Aft
44b0: 65 72 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20  er */.    len = 
44c0: 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 41 53  BIO_to_Buffer(AS
44d0: 4e 31 5f 54 49 4d 45 5f 70 72 69 6e 74 28 62 69  N1_TIME_print(bi
44e0: 6f 2c 20 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74  o, X509_get0_not
44f0: 41 66 74 65 72 28 63 65 72 74 29 29 2c 20 62 69  After(cert)), bi
4500: 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49  o, buffer, BUFSI
4510: 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  Z);.    LAPPEND_
4520: 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75  STR(interp, resu
4530: 6c 74 4f 62 6a 2c 20 22 6e 6f 74 41 66 74 65 72  ltObj, "notAfter
4540: 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b  ", buffer, len);
4550: 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74  ..    /* Subject
4560: 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20   identifies the 
4570: 65 6e 74 69 74 79 20 61 73 73 6f 63 69 61 74 65  entity associate
4580: 64 20 77 69 74 68 20 74 68 65 20 70 75 62 6c 69  d with the publi
4590: 63 20 6b 65 79 20 73 74 6f 72 65 64 20 69 6e 0a  c key stored in.
45a0: 09 74 68 65 20 73 75 62 6a 65 63 74 20 70 75 62  .the subject pub
45b0: 6c 69 63 20 6b 65 79 20 66 69 65 6c 64 2e 20 52  lic key field. R
45c0: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20  FC 5280 section 
45d0: 34 2e 31 2e 32 2e 36 20 2a 2f 0a 20 20 20 20 6c  4.1.2.6 */.    l
45e0: 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66  en = BIO_to_Buff
45f0: 65 72 28 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69  er(X509_NAME_pri
4600: 6e 74 5f 65 78 28 62 69 6f 2c 20 58 35 30 39 5f  nt_ex(bio, X509_
4610: 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65  get_subject_name
4620: 28 63 65 72 74 29 2c 20 30 2c 20 66 6c 61 67 73  (cert), 0, flags
4630: 29 2c 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20  ), bio, buffer, 
4640: 42 55 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50  BUFSIZ);.    LAP
4650: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
4660: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 75 62   resultObj, "sub
4670: 6a 65 63 74 22 2c 20 62 75 66 66 65 72 2c 20 6c  ject", buffer, l
4680: 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 48 41  en);..    /* SHA
4690: 31 20 44 69 67 65 73 74 20 28 46 69 6e 67 65 72  1 Digest (Finger
46a0: 70 72 69 6e 74 29 20 6f 66 20 63 65 72 74 20 2d  print) of cert -
46b0: 20 44 45 52 20 72 65 70 72 65 73 65 6e 74 61 74   DER representat
46c0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 58  ion */.    if (X
46d0: 35 30 39 5f 64 69 67 65 73 74 28 63 65 72 74 2c  509_digest(cert,
46e0: 20 45 56 50 5f 73 68 61 31 28 29 2c 20 28 75 6e   EVP_sha1(), (un
46f0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75  signed char *)bu
4700: 66 66 65 72 2c 20 26 75 6c 65 6e 29 29 20 7b 0a  ffer, &ulen)) {.
4710: 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74  .LAPPEND_OBJ(int
4720: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
4730: 22 73 68 61 31 5f 68 61 73 68 22 2c 20 53 74 72  "sha1_hash", Str
4740: 69 6e 67 5f 74 6f 5f 48 65 78 28 28 75 6e 73 69  ing_to_Hex((unsi
4750: 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66  gned char *)buff
4760: 65 72 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29  er, (int) ulen))
4770: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4780: 53 48 41 32 35 36 20 44 69 67 65 73 74 20 28 46  SHA256 Digest (F
4790: 69 6e 67 65 72 70 72 69 6e 74 29 20 6f 66 20 63  ingerprint) of c
47a0: 65 72 74 20 2d 20 44 45 52 20 72 65 70 72 65 73  ert - DER repres
47b0: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
47c0: 69 66 20 28 58 35 30 39 5f 64 69 67 65 73 74 28  if (X509_digest(
47d0: 63 65 72 74 2c 20 45 56 50 5f 73 68 61 32 35 36  cert, EVP_sha256
47e0: 28 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  (), (unsigned ch
47f0: 61 72 20 2a 29 62 75 66 66 65 72 2c 20 26 75 6c  ar *)buffer, &ul
4800: 65 6e 29 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f  en)) {..LAPPEND_
4810: 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75  OBJ(interp, resu
4820: 6c 74 4f 62 6a 2c 20 22 73 68 61 32 35 36 5f 68  ltObj, "sha256_h
4830: 61 73 68 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f  ash", String_to_
4840: 48 65 78 28 28 75 6e 73 69 67 6e 65 64 20 63 68  Hex((unsigned ch
4850: 61 72 20 2a 29 62 75 66 66 65 72 2c 20 28 69 6e  ar *)buffer, (in
4860: 74 29 20 75 6c 65 6e 29 29 3b 0a 20 20 20 20 7d  t) ulen));.    }
4870: 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74  ..    /* Subject
4880: 20 50 75 62 6c 69 63 20 4b 65 79 20 49 6e 66 6f   Public Key Info
4890: 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 70   specifies the p
48a0: 75 62 6c 69 63 20 6b 65 79 20 61 6e 64 20 69 64  ublic key and id
48b0: 65 6e 74 69 66 69 65 73 20 74 68 65 0a 09 61 6c  entifies the..al
48c0: 67 6f 72 69 74 68 6d 20 77 69 74 68 20 77 68 69  gorithm with whi
48d0: 63 68 20 74 68 65 20 6b 65 79 20 69 73 20 75 73  ch the key is us
48e0: 65 64 2e 20 52 46 43 20 35 32 38 30 20 73 65 63  ed. RFC 5280 sec
48f0: 74 69 6f 6e 20 34 2e 31 2e 32 2e 37 20 2a 2f 0a  tion 4.1.2.7 */.
4900: 20 20 20 20 69 66 20 28 58 35 30 39 5f 67 65 74      if (X509_get
4910: 5f 73 69 67 6e 61 74 75 72 65 5f 69 6e 66 6f 28  _signature_info(
4920: 63 65 72 74 2c 20 26 6d 64 6e 69 64 2c 20 26 70  cert, &mdnid, &p
4930: 6b 6e 69 64 2c 20 26 62 69 74 73 2c 20 26 78 66  knid, &bits, &xf
4940: 6c 61 67 73 29 29 20 7b 0a 09 41 53 4e 31 5f 42  lags)) {..ASN1_B
4950: 49 54 5f 53 54 52 49 4e 47 20 2a 6b 65 79 3b 0a  IT_STRING *key;.
4960: 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 3b  .unsigned int n;
4970: 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ...LAPPEND_STR(i
4980: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
4990: 2c 20 22 73 69 67 6e 69 6e 67 44 69 67 65 73 74  , "signingDigest
49a0: 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6d 64  ", OBJ_nid2ln(md
49b0: 6e 69 64 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50  nid), -1);..LAPP
49c0: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
49d0: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 75 62 6c  resultObj, "publ
49e0: 69 63 4b 65 79 41 6c 67 6f 72 69 74 68 6d 22 2c  icKeyAlgorithm",
49f0: 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 70 6b 6e 69   OBJ_nid2ln(pkni
4a00: 64 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  d), -1);..LAPPEN
4a10: 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 65  D_INT(interp, re
4a20: 73 75 6c 74 4f 62 6a 2c 20 22 62 69 74 73 22 2c  sultObj, "bits",
4a30: 20 62 69 74 73 29 3b 20 2f 2a 20 45 66 66 65 63   bits); /* Effec
4a40: 74 69 76 65 20 73 65 63 75 72 69 74 79 20 62 69  tive security bi
4a50: 74 73 20 2a 2f 0a 0a 09 6b 65 79 20 3d 20 58 35  ts */...key = X5
4a60: 30 39 5f 67 65 74 30 5f 70 75 62 6b 65 79 5f 62  09_get0_pubkey_b
4a70: 69 74 73 74 72 28 63 65 72 74 29 3b 0a 09 4c 41  itstr(cert);..LA
4a80: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70  PPEND_OBJ(interp
4a90: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 75  , resultObj, "pu
4aa0: 62 6c 69 63 4b 65 79 22 2c 20 53 74 72 69 6e 67  blicKey", String
4ab0: 5f 74 6f 5f 48 65 78 28 6b 65 79 2d 3e 64 61 74  _to_Hex(key->dat
4ac0: 61 2c 20 6b 65 79 2d 3e 6c 65 6e 67 74 68 29 29  a, key->length))
4ad0: 3b 0a 0a 09 69 66 20 28 58 35 30 39 5f 70 75 62  ;...if (X509_pub
4ae0: 6b 65 79 5f 64 69 67 65 73 74 28 63 65 72 74 2c  key_digest(cert,
4af0: 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74 62   EVP_get_digestb
4b00: 79 6e 69 64 28 70 6b 6e 69 64 29 2c 20 28 75 6e  ynid(pknid), (un
4b10: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75  signed char *)bu
4b20: 66 66 65 72 2c 20 26 6e 29 29 20 7b 0a 09 20 20  ffer, &n)) {..  
4b30: 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e    LAPPEND_OBJ(in
4b40: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
4b50: 20 22 70 75 62 6c 69 63 4b 65 79 48 61 73 68 22   "publicKeyHash"
4b60: 2c 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28  , String_to_Hex(
4b70: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
4b80: 29 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20 6e  )buffer, (int) n
4b90: 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  ));..} else {.. 
4ba0: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
4bb0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
4bc0: 2c 20 22 70 75 62 6c 69 63 4b 65 79 48 61 73 68  , "publicKeyHash
4bd0: 22 2c 20 22 22 2c 20 30 29 3b 0a 09 7d 0a 0a 09  ", "", 0);..}...
4be0: 2f 2a 20 64 69 67 65 73 74 20 6f 66 20 74 68 65  /* digest of the
4bf0: 20 44 45 52 20 72 65 70 72 65 73 65 6e 74 61 74   DER representat
4c00: 69 6f 6e 20 6f 66 20 74 68 65 20 63 65 72 74 69  ion of the certi
4c10: 66 69 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 58  ficate */..if (X
4c20: 35 30 39 5f 64 69 67 65 73 74 28 63 65 72 74 2c  509_digest(cert,
4c30: 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74 62   EVP_get_digestb
4c40: 79 6e 69 64 28 6d 64 6e 69 64 29 2c 20 28 75 6e  ynid(mdnid), (un
4c50: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75  signed char *)bu
4c60: 66 66 65 72 2c 20 26 6e 29 29 20 7b 0a 09 20 20  ffer, &n)) {..  
4c70: 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e    LAPPEND_OBJ(in
4c80: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
4c90: 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 22   "signatureHash"
4ca0: 2c 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28  , String_to_Hex(
4cb0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
4cc0: 29 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20 6e  )buffer, (int) n
4cd0: 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  ));..} else {.. 
4ce0: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
4cf0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
4d00: 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68  , "signatureHash
4d10: 22 2c 20 22 22 2c 20 30 29 3b 0a 09 7d 0a 20 20  ", "", 0);..}.  
4d20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74    }..    /* Cert
4d30: 69 66 69 63 61 74 65 20 50 75 72 70 6f 73 65 2e  ificate Purpose.
4d40: 20 43 61 6c 6c 20 62 65 66 6f 72 65 20 63 68 65   Call before che
4d50: 63 6b 69 6e 67 20 66 6f 72 20 65 78 74 65 6e 73  cking for extens
4d60: 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 4c 41 50  ions. */.    LAP
4d70: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
4d80: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 75 72   resultObj, "pur
4d90: 70 6f 73 65 22 2c 20 54 6c 73 5f 78 35 30 39 50  pose", Tls_x509P
4da0: 75 72 70 6f 73 65 28 63 65 72 74 29 2c 20 2d 31  urpose(cert), -1
4db0: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f  );.    LAPPEND_O
4dc0: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  BJ(interp, resul
4dd0: 74 4f 62 6a 2c 20 22 63 65 72 74 69 66 69 63 61  tObj, "certifica
4de0: 74 65 50 75 72 70 6f 73 65 22 2c 20 54 6c 73 5f  tePurpose", Tls_
4df0: 78 35 30 39 50 75 72 70 6f 73 65 73 28 69 6e 74  x509Purposes(int
4e00: 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20  erp, cert));..  
4e10: 20 20 2f 2a 20 47 65 74 20 65 78 74 65 6e 73 69    /* Get extensi
4e20: 6f 6e 73 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20  ons flags */.   
4e30: 20 78 66 6c 61 67 73 20 3d 20 58 35 30 39 5f 67   xflags = X509_g
4e40: 65 74 5f 65 78 74 65 6e 73 69 6f 6e 5f 66 6c 61  et_extension_fla
4e50: 67 73 28 63 65 72 74 29 3b 0a 20 20 20 20 4c 41  gs(cert);.    LA
4e60: 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
4e70: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78  , resultObj, "ex
4e80: 74 46 6c 61 67 73 22 2c 20 78 66 6c 61 67 73 29  tFlags", xflags)
4e90: 3b 0a 0a 09 2f 2a 20 43 68 65 63 6b 20 69 66 20  ;.../* Check if 
4ea0: 63 65 72 74 20 77 61 73 20 69 73 73 75 65 64 20  cert was issued 
4eb0: 62 79 20 43 41 20 63 65 72 74 20 69 73 73 75 65  by CA cert issue
4ec0: 72 20 6f 72 20 73 65 6c 66 20 73 69 67 6e 65 64  r or self signed
4ed0: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
4ee0: 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65 73  BOOL(interp, res
4ef0: 75 6c 74 4f 62 6a 2c 20 22 73 65 6c 66 49 73 73  ultObj, "selfIss
4f00: 75 65 64 22 2c 20 78 66 6c 61 67 73 20 26 20 45  ued", xflags & E
4f10: 58 46 4c 41 47 5f 53 49 29 3b 0a 20 20 20 20 4c  XFLAG_SI);.    L
4f20: 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
4f30: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
4f40: 73 65 6c 66 53 69 67 6e 65 64 22 2c 20 78 66 6c  selfSigned", xfl
4f50: 61 67 73 20 26 20 45 58 46 4c 41 47 5f 53 53 29  ags & EXFLAG_SS)
4f60: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f  ;.    LAPPEND_BO
4f70: 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  OL(interp, resul
4f80: 74 4f 62 6a 2c 20 22 69 73 50 72 6f 78 79 43 65  tObj, "isProxyCe
4f90: 72 74 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58  rt", xflags & EX
4fa0: 46 4c 41 47 5f 50 52 4f 58 59 29 3b 0a 20 20 20  FLAG_PROXY);.   
4fb0: 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e   LAPPEND_BOOL(in
4fc0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
4fd0: 20 22 65 78 74 49 6e 76 61 6c 69 64 22 2c 20 78   "extInvalid", x
4fe0: 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 49  flags & EXFLAG_I
4ff0: 4e 56 41 4c 49 44 29 3b 0a 20 20 20 20 4c 41 50  NVALID);.    LAP
5000: 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
5010: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 69 73  , resultObj, "is
5020: 43 41 43 65 72 74 22 2c 20 58 35 30 39 5f 63 68  CACert", X509_ch
5030: 65 63 6b 5f 63 61 28 63 65 72 74 29 29 3b 0a 0a  eck_ca(cert));..
5040: 20 20 20 20 2f 2a 20 54 68 65 20 55 6e 69 71 75      /* The Uniqu
5050: 65 20 49 64 73 20 61 72 65 20 75 73 65 64 20 74  e Ids are used t
5060: 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 70 6f 73  o handle the pos
5070: 73 69 62 69 6c 69 74 79 20 6f 66 20 72 65 75 73  sibility of reus
5080: 65 20 6f 66 20 73 75 62 6a 65 63 74 0a 09 61 6e  e of subject..an
5090: 64 2f 6f 72 20 69 73 73 75 65 72 20 6e 61 6d 65  d/or issuer name
50a0: 73 20 6f 76 65 72 20 74 69 6d 65 2e 20 52 46 43  s over time. RFC
50b0: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
50c0: 31 2e 32 2e 38 20 2a 2f 0a 20 20 20 20 7b 0a 09  1.2.8 */.    {..
50d0: 63 6f 6e 73 74 20 41 53 4e 31 5f 42 49 54 5f 53  const ASN1_BIT_S
50e0: 54 52 49 4e 47 20 2a 69 75 69 64 2c 20 2a 73 75  TRING *iuid, *su
50f0: 69 64 3b 0a 09 58 35 30 39 5f 67 65 74 30 5f 75  id;..X509_get0_u
5100: 69 64 73 28 63 65 72 74 2c 20 26 69 75 69 64 2c  ids(cert, &iuid,
5110: 20 26 73 75 69 64 29 3b 0a 0a 09 54 63 6c 5f 4c   &suid);...Tcl_L
5120: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5130: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ent(interp, resu
5140: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74  ltObj, Tcl_NewSt
5150: 72 69 6e 67 4f 62 6a 28 22 69 73 73 75 65 72 55  ringObj("issuerU
5160: 6e 69 71 75 65 49 64 22 2c 20 2d 31 29 29 3b 0a  niqueId", -1));.
5170: 09 69 66 20 28 69 75 69 64 20 21 3d 20 4e 55 4c  .if (iuid != NUL
5180: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  L) {..    Tcl_Li
5190: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
51a0: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  nt(interp, resul
51b0: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 42 79 74  tObj, Tcl_NewByt
51c0: 65 41 72 72 61 79 4f 62 6a 28 28 63 6f 6e 73 74  eArrayObj((const
51d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
51e0: 29 69 75 69 64 2d 3e 64 61 74 61 2c 20 28 54 63  )iuid->data, (Tc
51f0: 6c 5f 53 69 7a 65 29 20 69 75 69 64 2d 3e 6c 65  l_Size) iuid->le
5200: 6e 67 74 68 29 29 3b 0a 09 7d 20 65 6c 73 65 20  ngth));..} else 
5210: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
5220: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5230: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
5240: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  j, Tcl_NewString
5250: 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 09 7d  Obj("", -1));..}
5260: 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ...Tcl_ListObjAp
5270: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5280: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54  rp, resultObj, T
5290: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
52a0: 22 73 75 62 6a 65 63 74 55 6e 69 71 75 65 49 64  "subjectUniqueId
52b0: 22 2c 20 2d 31 29 29 3b 0a 09 69 66 20 28 73 75  ", -1));..if (su
52c0: 69 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  id != NULL) {.. 
52d0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
52e0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
52f0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54  rp, resultObj, T
5300: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
5310: 62 6a 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  bj((const unsign
5320: 65 64 20 63 68 61 72 20 2a 29 73 75 69 64 2d 3e  ed char *)suid->
5330: 64 61 74 61 2c 20 28 54 63 6c 5f 53 69 7a 65 29  data, (Tcl_Size)
5340: 20 73 75 69 64 2d 3e 6c 65 6e 67 74 68 29 29 3b   suid->length));
5350: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
5360: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5370: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
5380: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f   resultObj, Tcl_
5390: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c  NewStringObj("",
53a0: 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a   -1));..}.    }.
53b0: 0a 20 20 20 20 2f 2a 20 58 35 30 39 20 76 33 20  .    /* X509 v3 
53c0: 45 78 74 65 6e 73 69 6f 6e 73 20 2d 20 52 46 43  Extensions - RFC
53d0: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
53e0: 31 2e 32 2e 39 20 2a 2f 0a 20 20 20 20 4c 41 50  1.2.9 */.    LAP
53f0: 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
5400: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74   resultObj, "ext
5410: 43 6f 75 6e 74 22 2c 20 58 35 30 39 5f 67 65 74  Count", X509_get
5420: 5f 65 78 74 5f 63 6f 75 6e 74 28 63 65 72 74 29  _ext_count(cert)
5430: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f  );.    LAPPEND_O
5440: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  BJ(interp, resul
5450: 74 4f 62 6a 2c 20 22 65 78 74 65 6e 73 69 6f 6e  tObj, "extension
5460: 73 22 2c 20 54 6c 73 5f 78 35 30 39 45 78 74 65  s", Tls_x509Exte
5470: 6e 73 69 6f 6e 73 28 69 6e 74 65 72 70 2c 20 63  nsions(interp, c
5480: 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  ert));..    /* A
5490: 75 74 68 6f 72 69 74 79 20 4b 65 79 20 49 64 65  uthority Key Ide
54a0: 6e 74 69 66 69 65 72 20 28 41 4b 49 29 20 69 73  ntifier (AKI) is
54b0: 20 74 68 65 20 53 75 62 6a 65 63 74 20 4b 65 79   the Subject Key
54c0: 20 49 64 65 6e 74 69 66 69 65 72 20 28 53 4b 49   Identifier (SKI
54d0: 29 20 6f 66 0a 09 69 74 73 20 73 69 67 6e 65 72  ) of..its signer
54e0: 20 28 74 68 65 20 43 41 29 2e 20 52 46 43 20 35   (the CA). RFC 5
54f0: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e  280 section 4.2.
5500: 31 2e 31 2c 20 4e 49 44 5f 61 75 74 68 6f 72 69  1.1, NID_authori
5510: 74 79 5f 6b 65 79 5f 69 64 65 6e 74 69 66 69 65  ty_key_identifie
5520: 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44  r */.    LAPPEND
5530: 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73  _OBJ(interp, res
5540: 75 6c 74 4f 62 6a 2c 20 22 61 75 74 68 6f 72 69  ultObj, "authori
5550: 74 79 4b 65 79 49 64 65 6e 74 69 66 69 65 72 22  tyKeyIdentifier"
5560: 2c 0a 09 54 6c 73 5f 78 35 30 39 49 64 65 6e 74  ,..Tls_x509Ident
5570: 69 66 69 65 72 28 58 35 30 39 5f 67 65 74 30 5f  ifier(X509_get0_
5580: 61 75 74 68 6f 72 69 74 79 5f 6b 65 79 5f 69 64  authority_key_id
5590: 28 63 65 72 74 29 29 29 3b 0a 0a 20 20 20 20 2f  (cert)));..    /
55a0: 2a 20 53 75 62 6a 65 63 74 20 4b 65 79 20 49 64  * Subject Key Id
55b0: 65 6e 74 69 66 69 65 72 20 28 53 4b 49 29 20 69  entifier (SKI) i
55c0: 73 20 75 73 65 64 20 74 6f 20 69 64 65 6e 74 69  s used to identi
55d0: 66 79 20 63 65 72 74 69 66 69 63 61 74 65 73 20  fy certificates 
55e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 0a 09 61 20  that contain..a 
55f0: 70 61 72 74 69 63 75 6c 61 72 20 70 75 62 6c 69  particular publi
5600: 63 20 6b 65 79 2e 20 52 46 43 20 35 32 38 30 20  c key. RFC 5280 
5610: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 32 2c  section 4.2.1.2,
5620: 20 4e 49 44 5f 73 75 62 6a 65 63 74 5f 6b 65 79   NID_subject_key
5630: 5f 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a 20  _identifier */. 
5640: 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69     LAPPEND_OBJ(i
5650: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
5660: 2c 20 22 73 75 62 6a 65 63 74 4b 65 79 49 64 65  , "subjectKeyIde
5670: 6e 74 69 66 69 65 72 22 2c 0a 09 54 6c 73 5f 78  ntifier",..Tls_x
5680: 35 30 39 49 64 65 6e 74 69 66 69 65 72 28 58 35  509Identifier(X5
5690: 30 39 5f 67 65 74 30 5f 73 75 62 6a 65 63 74 5f  09_get0_subject_
56a0: 6b 65 79 5f 69 64 28 63 65 72 74 29 29 29 3b 0a  key_id(cert)));.
56b0: 0a 20 20 20 20 2f 2a 20 4b 65 79 20 75 73 61 67  .    /* Key usag
56c0: 65 20 65 78 74 65 6e 73 69 6f 6e 20 64 65 66 69  e extension defi
56d0: 6e 65 73 20 74 68 65 20 70 75 72 70 6f 73 65 20  nes the purpose 
56e0: 28 65 2e 67 2e 2c 20 65 6e 63 69 70 68 65 72 6d  (e.g., encipherm
56f0: 65 6e 74 2c 20 73 69 67 6e 61 74 75 72 65 2c 20  ent, signature, 
5700: 63 65 72 74 69 66 69 63 61 74 65 0a 09 73 69 67  certificate..sig
5710: 6e 69 6e 67 29 20 6f 66 20 74 68 65 20 6b 65 79  ning) of the key
5720: 20 69 6e 20 74 68 65 20 63 65 72 74 69 66 69 63   in the certific
5730: 61 74 65 2e 20 52 46 43 20 35 32 38 30 20 73 65  ate. RFC 5280 se
5740: 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 33 2c 20 4e  ction 4.2.1.3, N
5750: 49 44 5f 6b 65 79 5f 75 73 61 67 65 20 2a 2f 0a  ID_key_usage */.
5760: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28      LAPPEND_OBJ(
5770: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
5780: 6a 2c 20 22 6b 65 79 55 73 61 67 65 22 2c 20 54  j, "keyUsage", T
5790: 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65 28  ls_x509KeyUsage(
57a0: 69 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 78 66  interp, cert, xf
57b0: 6c 61 67 73 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  lags));..    /* 
57c0: 43 65 72 74 69 66 69 63 61 74 65 20 50 6f 6c 69  Certificate Poli
57d0: 63 69 65 73 20 2d 20 69 6e 64 69 63 61 74 65 73  cies - indicates
57e0: 20 74 68 65 20 69 73 73 75 69 6e 67 20 43 41 20   the issuing CA 
57f0: 63 6f 6e 73 69 64 65 72 73 20 69 74 73 20 69 73  considers its is
5800: 73 75 65 72 44 6f 6d 61 69 6e 50 6f 6c 69 63 79  suerDomainPolicy
5810: 0a 09 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  ..equivalent to 
5820: 74 68 65 20 73 75 62 6a 65 63 74 20 43 41 27 73  the subject CA's
5830: 20 73 75 62 6a 65 63 74 44 6f 6d 61 69 6e 50 6f   subjectDomainPo
5840: 6c 69 63 79 2e 20 52 46 43 20 35 32 38 30 20 73  licy. RFC 5280 s
5850: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 34 2c 20  ection 4.2.1.4, 
5860: 4e 49 44 5f 63 65 72 74 69 66 69 63 61 74 65 5f  NID_certificate_
5870: 70 6f 6c 69 63 69 65 73 20 2a 2f 0a 20 20 20 20  policies */.    
5880: 69 66 20 28 78 66 6c 61 67 73 20 26 20 45 58 46  if (xflags & EXF
5890: 4c 41 47 5f 49 4e 56 41 4c 49 44 5f 50 4f 4c 49  LAG_INVALID_POLI
58a0: 43 59 29 20 7b 0a 09 2f 2a 20 52 65 6a 65 63 74  CY) {../* Reject
58b0: 20 63 65 72 74 20 2a 2f 0a 20 20 20 20 7d 0a 0a   cert */.    }..
58c0: 20 20 20 20 2f 2a 20 50 6f 6c 69 63 79 20 4d 61      /* Policy Ma
58d0: 70 70 69 6e 67 73 20 2d 20 52 46 43 20 35 32 38  ppings - RFC 528
58e0: 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e  0 section 4.2.1.
58f0: 35 2c 20 4e 49 44 5f 70 6f 6c 69 63 79 5f 6d 61  5, NID_policy_ma
5900: 70 70 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f  ppings */..    /
5910: 2a 20 53 75 62 6a 65 63 74 20 41 6c 74 65 72 6e  * Subject Altern
5920: 61 74 69 76 65 20 4e 61 6d 65 20 28 53 41 4e 29  ative Name (SAN)
5930: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
5940: 6f 6e 61 6c 20 55 52 4c 73 2c 20 44 4e 53 20 6e  onal URLs, DNS n
5950: 61 6d 65 73 2c 20 6f 72 20 49 50 0a 09 61 64 64  ames, or IP..add
5960: 72 65 73 73 65 73 20 62 6f 75 6e 64 20 74 6f 20  resses bound to 
5970: 63 65 72 74 69 66 69 63 61 74 65 2e 20 52 46 43  certificate. RFC
5980: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
5990: 32 2e 31 2e 36 2c 20 4e 49 44 5f 73 75 62 6a 65  2.1.6, NID_subje
59a0: 63 74 5f 61 6c 74 5f 6e 61 6d 65 20 2a 2f 0a 20  ct_alt_name */. 
59b0: 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69     LAPPEND_OBJ(i
59c0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
59d0: 2c 20 22 73 75 62 6a 65 63 74 41 6c 74 4e 61 6d  , "subjectAltNam
59e0: 65 22 2c 20 54 6c 73 5f 78 35 30 39 4e 61 6d 65  e", Tls_x509Name
59f0: 73 28 69 6e 74 65 72 70 2c 20 63 65 72 74 2c 20  s(interp, cert, 
5a00: 4e 49 44 5f 73 75 62 6a 65 63 74 5f 61 6c 74 5f  NID_subject_alt_
5a10: 6e 61 6d 65 2c 20 62 69 6f 29 29 3b 0a 0a 20 20  name, bio));..  
5a20: 20 20 2f 2a 20 49 73 73 75 65 72 20 41 6c 74 65    /* Issuer Alte
5a30: 72 6e 61 74 69 76 65 20 4e 61 6d 65 20 69 73 20  rnative Name is 
5a40: 75 73 65 64 20 74 6f 20 61 73 73 6f 63 69 61 74  used to associat
5a50: 65 20 49 6e 74 65 72 6e 65 74 20 73 74 79 6c 65  e Internet style
5a60: 20 69 64 65 6e 74 69 74 69 65 73 0a 09 77 69 74   identities..wit
5a70: 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  h the certificat
5a80: 65 20 69 73 73 75 65 72 2e 20 52 46 43 20 35 32  e issuer. RFC 52
5a90: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31  80 section 4.2.1
5aa0: 2e 37 2c 20 4e 49 44 5f 69 73 73 75 65 72 5f 61  .7, NID_issuer_a
5ab0: 6c 74 5f 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c  lt_name */.    L
5ac0: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72  APPEND_OBJ(inter
5ad0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 69  p, resultObj, "i
5ae0: 73 73 75 65 72 41 6c 74 4e 61 6d 65 22 2c 20 54  ssuerAltName", T
5af0: 6c 73 5f 78 35 30 39 4e 61 6d 65 73 28 69 6e 74  ls_x509Names(int
5b00: 65 72 70 2c 20 63 65 72 74 2c 20 4e 49 44 5f 69  erp, cert, NID_i
5b10: 73 73 75 65 72 5f 61 6c 74 5f 6e 61 6d 65 2c 20  ssuer_alt_name, 
5b20: 62 69 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  bio));..    /* S
5b30: 75 62 6a 65 63 74 20 44 69 72 65 63 74 6f 72 79  ubject Directory
5b40: 20 41 74 74 72 69 62 75 74 65 73 20 70 72 6f 76   Attributes prov
5b50: 69 64 65 73 20 69 64 65 6e 74 69 66 69 63 61 74  ides identificat
5b60: 69 6f 6e 20 61 74 74 72 69 62 75 74 65 73 20 28  ion attributes (
5b70: 65 2e 67 2e 2c 20 6e 61 74 69 6f 6e 61 6c 69 74  e.g., nationalit
5b80: 79 29 0a 09 6f 66 20 74 68 65 20 73 75 62 6a 65  y)..of the subje
5b90: 63 74 2e 20 52 46 43 20 35 32 38 30 20 73 65 63  ct. RFC 5280 sec
5ba0: 74 69 6f 6e 20 34 2e 32 2e 31 2e 38 20 28 73 75  tion 4.2.1.8 (su
5bb0: 62 6a 65 63 74 44 69 72 65 63 74 6f 72 79 41 74  bjectDirectoryAt
5bc0: 74 72 69 62 75 74 65 73 29 20 2a 2f 0a 0a 20 20  tributes) */..  
5bd0: 20 20 2f 2a 20 42 61 73 69 63 20 43 6f 6e 73 74    /* Basic Const
5be0: 72 61 69 6e 74 73 20 69 64 65 6e 74 69 66 69 65  raints identifie
5bf0: 73 20 77 68 65 74 68 65 72 20 74 68 65 20 73 75  s whether the su
5c00: 62 6a 65 63 74 20 6f 66 20 74 68 65 20 63 65 72  bject of the cer
5c10: 74 20 69 73 20 61 20 43 41 20 61 6e 64 0a 09 74  t is a CA and..t
5c20: 68 65 20 6d 61 78 20 64 65 70 74 68 20 6f 66 20  he max depth of 
5c30: 76 61 6c 69 64 20 63 65 72 74 20 70 61 74 68 73  valid cert paths
5c40: 20 66 6f 72 20 74 68 69 73 20 63 65 72 74 2e 20   for this cert. 
5c50: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e  RFC 5280 section
5c60: 20 34 2e 32 2e 31 2e 39 2c 20 4e 49 44 5f 62 61   4.2.1.9, NID_ba
5c70: 73 69 63 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  sic_constraints 
5c80: 2a 2f 0a 20 20 20 20 69 66 20 28 21 28 78 66 6c  */.    if (!(xfl
5c90: 61 67 73 20 26 20 45 58 46 4c 41 47 5f 50 52 4f  ags & EXFLAG_PRO
5ca0: 58 59 29 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f  XY)) {..LAPPEND_
5cb0: 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 72 65 73  LONG(interp, res
5cc0: 75 6c 74 4f 62 6a 2c 20 22 70 61 74 68 4c 65 6e  ultObj, "pathLen
5cd0: 22 2c 20 58 35 30 39 5f 67 65 74 5f 70 61 74 68  ", X509_get_path
5ce0: 6c 65 6e 28 63 65 72 74 29 29 3b 0a 20 20 20 20  len(cert));.    
5cf0: 7d 20 65 6c 73 65 20 7b 0a 09 4c 41 50 50 45 4e  } else {..LAPPEN
5d00: 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 72  D_LONG(interp, r
5d10: 65 73 75 6c 74 4f 62 6a 2c 20 22 70 61 74 68 4c  esultObj, "pathL
5d20: 65 6e 22 2c 20 58 35 30 39 5f 67 65 74 5f 70 72  en", X509_get_pr
5d30: 6f 78 79 5f 70 61 74 68 6c 65 6e 28 63 65 72 74  oxy_pathlen(cert
5d40: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41  ));.    }.    LA
5d50: 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
5d60: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 62  p, resultObj, "b
5d70: 61 73 69 63 43 6f 6e 73 74 72 61 69 6e 74 73 43  asicConstraintsC
5d80: 41 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58 46  A", xflags & EXF
5d90: 4c 41 47 5f 43 41 29 3b 0a 0a 20 20 20 20 2f 2a  LAG_CA);..    /*
5da0: 20 4e 61 6d 65 20 43 6f 6e 73 74 72 61 69 6e 74   Name Constraint
5db0: 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69  s is only used i
5dc0: 6e 20 43 41 20 63 65 72 74 73 20 74 6f 20 69 6e  n CA certs to in
5dd0: 64 69 63 61 74 65 20 74 68 65 20 6e 61 6d 65 20  dicate the name 
5de0: 73 70 61 63 65 20 66 6f 72 0a 09 61 6c 6c 20 73  space for..all s
5df0: 75 62 6a 65 63 74 20 6e 61 6d 65 73 20 69 6e 20  ubject names in 
5e00: 73 75 62 73 65 71 75 65 6e 74 20 63 65 72 74 69  subsequent certi
5e10: 66 69 63 61 74 65 73 20 69 6e 20 61 20 63 65 72  ficates in a cer
5e20: 74 69 66 69 63 61 74 69 6f 6e 20 70 61 74 68 0a  tification path.
5e30: 09 4d 55 53 54 20 62 65 20 6c 6f 63 61 74 65 64  .MUST be located
5e40: 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69  . RFC 5280 secti
5e50: 6f 6e 20 34 2e 32 2e 31 2e 31 30 2c 20 4e 49 44  on 4.2.1.10, NID
5e60: 5f 6e 61 6d 65 5f 63 6f 6e 73 74 72 61 69 6e 74  _name_constraint
5e70: 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 50 6f 6c  s */..    /* Pol
5e80: 69 63 79 20 43 6f 6e 73 74 72 61 69 6e 74 73 20  icy Constraints 
5e90: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20  is only used in 
5ea0: 43 41 20 63 65 72 74 73 20 74 6f 20 6c 69 6d 69  CA certs to limi
5eb0: 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  t the length of 
5ec0: 61 0a 09 63 65 72 74 20 63 68 61 69 6e 20 66 6f  a..cert chain fo
5ed0: 72 20 74 68 61 74 20 43 41 2e 20 52 46 43 20 35  r that CA. RFC 5
5ee0: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e  280 section 4.2.
5ef0: 31 2e 31 31 2c 20 4e 49 44 5f 70 6f 6c 69 63 79  1.11, NID_policy
5f00: 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a  _constraints */.
5f10: 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e 64 65 64  .    /* Extended
5f20: 20 4b 65 79 20 55 73 61 67 65 20 69 6e 64 69 63   Key Usage indic
5f30: 61 74 65 73 20 74 68 65 20 70 75 72 70 6f 73 65  ates the purpose
5f40: 73 20 74 68 65 20 63 65 72 74 69 66 69 65 64 20  s the certified 
5f50: 70 75 62 6c 69 63 20 6b 65 79 20 6d 61 79 20 62  public key may b
5f60: 65 0a 09 75 73 65 64 2c 20 62 65 79 6f 6e 64 20  e..used, beyond 
5f70: 74 68 65 20 62 61 73 69 63 20 70 75 72 70 6f 73  the basic purpos
5f80: 65 73 2e 20 52 46 43 20 35 32 38 30 20 73 65 63  es. RFC 5280 sec
5f90: 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 32 2c 20 4e  tion 4.2.1.12, N
5fa0: 49 44 5f 65 78 74 5f 6b 65 79 5f 75 73 61 67 65  ID_ext_key_usage
5fb0: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
5fc0: 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75  OBJ(interp, resu
5fd0: 6c 74 4f 62 6a 2c 20 22 65 78 74 65 6e 64 65 64  ltObj, "extended
5fe0: 4b 65 79 55 73 61 67 65 22 2c 20 54 6c 73 5f 78  KeyUsage", Tls_x
5ff0: 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 28 69  509ExtKeyUsage(i
6000: 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 78 66 6c  nterp, cert, xfl
6010: 61 67 73 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ags));..    /* C
6020: 52 4c 20 44 69 73 74 72 69 62 75 74 69 6f 6e 20  RL Distribution 
6030: 50 6f 69 6e 74 73 20 69 64 65 6e 74 69 66 69 65  Points identifie
6040: 73 20 77 68 65 72 65 20 43 52 4c 20 69 6e 66 6f  s where CRL info
6050: 72 6d 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 6f  rmation can be o
6060: 62 74 61 69 6e 65 64 2e 0a 09 52 46 43 20 35 32  btained...RFC 52
6070: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31  80 section 4.2.1
6080: 2e 31 33 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  .13*/.    LAPPEN
6090: 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65  D_OBJ(interp, re
60a0: 73 75 6c 74 4f 62 6a 2c 20 22 63 72 6c 44 69 73  sultObj, "crlDis
60b0: 74 72 69 62 75 74 69 6f 6e 50 6f 69 6e 74 73 22  tributionPoints"
60c0: 2c 20 54 6c 73 5f 78 35 30 39 43 72 6c 44 70 28  , Tls_x509CrlDp(
60d0: 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a  interp, cert));.
60e0: 0a 20 20 20 20 2f 2a 20 46 72 65 73 68 65 73 74  .    /* Freshest
60f0: 20 43 52 4c 20 65 78 74 65 6e 73 69 6f 6e 20 2a   CRL extension *
6100: 2f 0a 20 20 20 20 69 66 20 28 78 66 6c 61 67 73  /.    if (xflags
6110: 20 26 20 45 58 46 4c 41 47 5f 46 52 45 53 48 45   & EXFLAG_FRESHE
6120: 53 54 29 20 7b 0a 20 20 20 20 7d 0a 0a 20 20 20  ST) {.    }..   
6130: 20 2f 2a 20 41 75 74 68 6f 72 69 74 79 20 49 6e   /* Authority In
6140: 66 6f 72 6d 61 74 69 6f 6e 20 41 63 63 65 73 73  formation Access
6150: 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 74   indicates how t
6160: 6f 20 61 63 63 65 73 73 20 69 6e 66 6f 20 61 6e  o access info an
6170: 64 20 73 65 72 76 69 63 65 73 0a 09 66 6f 72 20  d services..for 
6180: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  the certificate 
6190: 69 73 73 75 65 72 2e 20 52 46 43 20 35 32 38 30  issuer. RFC 5280
61a0: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 32 2e 31   section 4.2.2.1
61b0: 2c 20 4e 49 44 5f 69 6e 66 6f 5f 61 63 63 65 73  , NID_info_acces
61c0: 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4f 6e 2d  s */..    /* On-
61d0: 6c 69 6e 65 20 43 65 72 74 69 66 69 63 61 74 65  line Certificate
61e0: 20 53 74 61 74 75 73 20 50 72 6f 74 6f 63 6f 6c   Status Protocol
61f0: 20 28 4f 53 43 50 29 20 52 65 73 70 6f 6e 64 65   (OSCP) Responde
6200: 72 73 20 55 52 4c 20 2a 2f 0a 20 20 20 20 4c 41  rs URL */.    LA
6210: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70  PPEND_OBJ(interp
6220: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6f 63  , resultObj, "oc
6230: 73 70 52 65 73 70 6f 6e 64 65 72 73 22 2c 20 54  spResponders", T
6240: 6c 73 5f 78 35 30 39 4f 73 63 70 28 69 6e 74 65  ls_x509Oscp(inte
6250: 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 20  rp, cert));..   
6260: 20 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65 20   /* Certificate 
6270: 41 75 74 68 6f 72 69 74 79 20 28 43 41 29 20 49  Authority (CA) I
6280: 73 73 75 65 72 73 20 55 52 4c 20 2a 2f 0a 20 20  ssuers URL */.  
6290: 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e    LAPPEND_OBJ(in
62a0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
62b0: 20 22 63 61 49 73 73 75 65 72 73 22 2c 20 54 6c   "caIssuers", Tl
62c0: 73 5f 78 35 30 39 43 61 49 73 73 75 65 72 73 28  s_x509CaIssuers(
62d0: 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a  interp, cert));.
62e0: 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20  .    /* Subject 
62f0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 41 63 63 65  Information Acce
6300: 73 73 20 2d 20 52 46 43 20 35 32 38 30 20 73 65  ss - RFC 5280 se
6310: 63 74 69 6f 6e 20 34 2e 32 2e 32 2e 32 2c 20 4e  ction 4.2.2.2, N
6320: 49 44 5f 73 69 6e 66 6f 5f 61 63 63 65 73 73 20  ID_sinfo_access 
6330: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 69  */..    /* Certi
6340: 66 69 63 61 74 65 20 41 6c 69 61 73 2e 20 49 66  ficate Alias. If
6350: 20 75 73 65 73 20 61 20 50 4b 43 53 23 31 32 20   uses a PKCS#12 
6360: 73 74 72 75 63 74 75 72 65 2c 20 61 6c 69 61 73  structure, alias
6370: 20 77 69 6c 6c 20 72 65 66 6c 65 63 74 20 74 68   will reflect th
6380: 65 0a 09 66 72 69 65 6e 64 6c 79 4e 61 6d 65 20  e..friendlyName 
6390: 61 74 74 72 69 62 75 74 65 20 28 52 46 43 20 32  attribute (RFC 2
63a0: 39 38 35 29 2e 20 2a 2f 0a 20 20 20 20 7b 0a 09  985). */.    {..
63b0: 69 6e 74 20 69 6c 65 6e 20 3d 20 30 3b 0a 09 75  int ilen = 0;..u
63c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 74  nsigned char *st
63d0: 72 69 6e 67 20 3d 20 58 35 30 39 5f 61 6c 69 61  ring = X509_alia
63e0: 73 5f 67 65 74 30 28 63 65 72 74 2c 20 26 69 6c  s_get0(cert, &il
63f0: 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  en);..LAPPEND_ST
6400: 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  R(interp, result
6410: 4f 62 6a 2c 20 22 61 6c 69 61 73 22 2c 20 28 63  Obj, "alias", (c
6420: 68 61 72 20 2a 29 20 73 74 72 69 6e 67 2c 20 28  har *) string, (
6430: 54 63 6c 5f 53 69 7a 65 29 20 69 6c 65 6e 29 3b  Tcl_Size) ilen);
6440: 0a 09 73 74 72 69 6e 67 20 3d 20 58 35 30 39 5f  ..string = X509_
6450: 6b 65 79 69 64 5f 67 65 74 30 28 63 65 72 74 2c  keyid_get0(cert,
6460: 20 26 69 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e   &ilen);..LAPPEN
6470: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65  D_STR(interp, re
6480: 73 75 6c 74 4f 62 6a 2c 20 22 6b 65 79 49 64 22  sultObj, "keyId"
6490: 2c 20 28 63 68 61 72 20 2a 29 20 73 74 72 69 6e  , (char *) strin
64a0: 67 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 69 6c  g, (Tcl_Size) il
64b0: 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  en);.    }..    
64c0: 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65 20 61  /* Certificate a
64d0: 6e 64 20 64 75 6d 70 20 61 6c 6c 20 64 61 74 61  nd dump all data
64e0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 6c 29   */.    if (all)
64f0: 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 61 6c 6c   {..Tcl_Obj *all
6500: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74  Obj = Tcl_NewByt
6510: 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c 2c 20  eArrayObj(NULL, 
6520: 30 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 65  0);..Tcl_Obj *ce
6530: 72 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42  rtObj = Tcl_NewB
6540: 79 74 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c  yteArrayObj(NULL
6550: 2c 20 30 29 3b 0a 09 75 6e 73 69 67 6e 65 64 20  , 0);..unsigned 
6560: 63 68 61 72 20 2a 61 6c 6c 53 74 72 2c 20 2a 63  char *allStr, *c
6570: 65 72 74 53 74 72 3b 0a 0a 09 69 66 20 28 61 6c  ertStr;...if (al
6580: 6c 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  lObj == NULL || 
6590: 63 65 72 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29  certObj == NULL)
65a0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72   {..    Tcl_Decr
65b0: 52 65 66 43 6f 75 6e 74 28 61 6c 6c 4f 62 6a 29  RefCount(allObj)
65c0: 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28  ;..    BIO_free(
65d0: 62 69 6f 29 3b 0a 09 20 20 20 20 63 6b 66 72 65  bio);..    ckfre
65e0: 65 28 62 75 66 66 65 72 29 3b 0a 09 20 20 20 20  e(buffer);..    
65f0: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a  return resultObj
6600: 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 63 65  ;..}.../* Get ce
6610: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 63 65  rtificate */..ce
6620: 72 74 53 74 72 20 3d 20 54 63 6c 5f 53 65 74 42  rtStr = Tcl_SetB
6630: 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 63  yteArrayLength(c
6640: 65 72 74 4f 62 6a 2c 20 43 45 52 54 5f 53 54 52  ertObj, CERT_STR
6650: 5f 53 49 5a 45 29 3b 0a 09 6c 65 6e 20 3d 20 42  _SIZE);..len = B
6660: 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 50 45 4d  IO_to_Buffer(PEM
6670: 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28  _write_bio_X509(
6680: 62 69 6f 2c 20 63 65 72 74 29 2c 20 62 69 6f 2c  bio, cert), bio,
6690: 20 63 65 72 74 53 74 72 2c 20 43 45 52 54 5f 53   certStr, CERT_S
66a0: 54 52 5f 53 49 5a 45 29 3b 0a 09 54 63 6c 5f 53  TR_SIZE);..Tcl_S
66b0: 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74  etByteArrayLengt
66c0: 68 28 63 65 72 74 4f 62 6a 2c 20 6c 65 6e 29 3b  h(certObj, len);
66d0: 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e  ..LAPPEND_OBJ(in
66e0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
66f0: 20 22 63 65 72 74 69 66 69 63 61 74 65 22 2c 20   "certificate", 
6700: 63 65 72 74 4f 62 6a 29 0a 0a 09 2f 2a 20 47 65  certObj).../* Ge
6710: 74 20 61 6c 6c 20 69 6e 66 6f 20 6f 6e 20 63 65  t all info on ce
6720: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 61 6c  rtificate */..al
6730: 6c 53 74 72 20 3d 20 54 63 6c 5f 53 65 74 42 79  lStr = Tcl_SetBy
6740: 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 61 6c  teArrayLength(al
6750: 6c 4f 62 6a 2c 20 43 45 52 54 5f 53 54 52 5f 53  lObj, CERT_STR_S
6760: 49 5a 45 20 2a 20 32 29 3b 0a 09 6c 65 6e 20 3d  IZE * 2);..len =
6770: 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 58   BIO_to_Buffer(X
6780: 35 30 39 5f 70 72 69 6e 74 5f 65 78 28 62 69 6f  509_print_ex(bio
6790: 2c 20 63 65 72 74 2c 20 66 6c 61 67 73 2c 20 30  , cert, flags, 0
67a0: 29 2c 20 62 69 6f 2c 20 61 6c 6c 53 74 72 2c 20  ), bio, allStr, 
67b0: 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 20 2a 20  CERT_STR_SIZE * 
67c0: 32 29 3b 0a 09 54 63 6c 5f 53 65 74 42 79 74 65  2);..Tcl_SetByte
67d0: 41 72 72 61 79 4c 65 6e 67 74 68 28 61 6c 6c 4f  ArrayLength(allO
67e0: 62 6a 2c 20 6c 65 6e 29 3b 0a 09 4c 41 50 50 45  bj, len);..LAPPE
67f0: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72  ND_OBJ(interp, r
6800: 65 73 75 6c 74 4f 62 6a 2c 20 22 61 6c 6c 22 2c  esultObj, "all",
6810: 20 61 6c 6c 4f 62 6a 29 0a 20 20 20 20 7d 0a 0a   allObj).    }..
6820: 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f      BIO_free(bio
6830: 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 75  );.    ckfree(bu
6840: 66 66 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ffer);.    retur
6850: 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a     n resultObj;.}.