Hex Artifact Content

Artifact 63f82395308f5d33fd8de237c3f8743903d18dcaec4b84d3be5d9c2fc2bf54d7:


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  <[email protected]
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 63 6f 6e 73  ring_to_Hex(cons
0390: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
03a0: 2a 69 6e 70 75 74 2c 20 69 6e 74 20 69 6c 65 6e  *input, int ilen
03b0: 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  ) {.    const un
03c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 70 74  signed char *ipt
03d0: 72 20 3d 20 69 6e 70 75 74 3b 0a 20 20 20 20 54  r = input;.    T
03e0: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62  cl_Obj *resultOb
03f0: 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  j = Tcl_NewByteA
0400: 72 72 61 79 4f 62 6a 28 4e 55 4c 4c 2c 20 30 29  rrayObj(NULL, 0)
0410: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
0420: 68 61 72 20 2a 64 61 74 61 20 3d 20 54 63 6c 5f  har *data = Tcl_
0430: 53 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67  SetByteArrayLeng
0440: 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c 20 28 54  th(resultObj, (T
0450: 63 6c 5f 53 69 7a 65 29 69 6c 65 6e 2a 32 29 3b  cl_Size)ilen*2);
0460: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
0470: 61 72 20 2a 64 70 74 72 20 3d 20 26 64 61 74 61  ar *dptr = &data
0480: 5b 30 5d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  [0];.    const c
0490: 68 61 72 20 2a 68 65 78 20 3d 20 22 30 31 32 33  har *hex = "0123
04a0: 34 35 36 37 38 39 61 62 63 64 65 66 22 3b 0a 0a  456789abcdef";..
04b0: 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62      if (resultOb
04c0: 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  j == NULL) {..re
04d0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
04e0: 0a 0a 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69  ..    for (int i
04f0: 20 3d 20 30 3b 20 69 20 3c 20 69 6c 65 6e 3b 20   = 0; i < ilen; 
0500: 69 2b 2b 29 20 7b 0a 09 2a 64 70 74 72 2b 2b 20  i++) {..*dptr++ 
0510: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
0520: 29 68 65 78 5b 28 2a 69 70 74 72 3e 3e 34 29 26  )hex[(*iptr>>4)&
0530: 30 78 46 5d 3b 0a 09 2a 64 70 74 72 2b 2b 20 3d  0xF];..*dptr++ =
0540: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
0550: 68 65 78 5b 28 2a 69 70 74 72 2b 2b 29 26 30 78  hex[(*iptr++)&0x
0560: 46 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  F];.    }.    re
0570: 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a  turn resultObj;.
0580: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05d0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 49 4f 5f  -----. *. * BIO_
05e0: 74 6f 5f 42 75 66 66 65 72 20 2d 2d 0a 20 2a 0a  to_Buffer --. *.
05f0: 20 2a 09 4f 75 74 70 75 74 20 63 6f 6e 74 65 6e   *.Output conten
0600: 74 73 20 6f 66 20 61 20 42 49 4f 20 74 6f 20 61  ts of a BIO to a
0610: 20 62 75 66 66 65 72 0a 20 2a 0a 20 2a 20 52 65   buffer. *. * Re
0620: 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e  sults:. *.Return
0630: 73 20 6c 65 6e 67 74 68 20 6f 66 20 73 74 72 69  s length of stri
0640: 6e 67 20 69 6e 20 62 75 66 66 65 72 0a 20 2a 0a  ng in buffer. *.
0650: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
0660: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d  . *.None. *. *--
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
06c0: 54 63 6c 5f 53 69 7a 65 20 42 49 4f 5f 74 6f 5f  Tcl_Size BIO_to_
06d0: 42 75 66 66 65 72 28 69 6e 74 20 72 65 73 75 6c  Buffer(int resul
06e0: 74 2c 20 42 49 4f 20 2a 62 69 6f 2c 20 76 6f 69  t, BIO *bio, voi
06f0: 64 20 2a 6f 75 74 70 75 74 2c 20 69 6e 74 20 6f  d *output, int o
0700: 6c 65 6e 29 20 7b 0a 20 20 20 20 54 63 6c 5f 53  len) {.    Tcl_S
0710: 69 7a 65 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20  ize len = 0;.   
0720: 20 69 6e 74 20 70 65 6e 64 69 6e 67 20 3d 20 42   int pending = B
0730: 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 3b  IO_pending(bio);
0740: 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74  ..    if (result
0750: 29 20 7b 0a 09 6c 65 6e 20 3d 20 28 54 63 6c 5f  ) {..len = (Tcl_
0760: 53 69 7a 65 29 20 42 49 4f 5f 72 65 61 64 28 62  Size) BIO_read(b
0770: 69 6f 2c 20 6f 75 74 70 75 74 2c 20 28 70 65 6e  io, output, (pen
0780: 64 69 6e 67 20 3c 20 6f 6c 65 6e 29 20 3f 20 70  ding < olen) ? p
0790: 65 6e 64 69 6e 67 20 3a 20 6f 6c 65 6e 29 3b 0a  ending : olen);.
07a0: 09 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68  .(void)BIO_flush
07b0: 28 62 69 6f 29 3b 0a 09 69 66 20 28 6c 65 6e 20  (bio);..if (len 
07c0: 3c 20 30 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20  < 0) {..    len 
07d0: 3d 20 30 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20  = 0;..}.    }.  
07e0: 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 7d 0a    return len;.}.
07f0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0840: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78  ----. *. * Tls_x
0850: 35 30 39 45 78 74 65 6e 73 69 6f 6e 73 20 2d 2d  509Extensions --
0860: 0a 20 2a 0a 20 2a 09 47 65 74 20 6c 69 73 74 20  . *. *.Get list 
0870: 6f 66 20 58 2e 35 30 39 20 43 65 72 74 69 66 69  of X.509 Certifi
0880: 63 61 74 65 20 45 78 74 65 6e 73 69 6f 6e 73 0a  cate Extensions.
0890: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
08a0: 2a 09 54 43 4c 20 6c 69 73 74 20 6f 66 20 65 78  *.TCL list of ex
08b0: 74 65 6e 73 69 6f 6e 73 20 61 6e 64 20 62 6f 6f  tensions and boo
08c0: 6c 65 61 6e 20 63 72 69 74 69 63 61 6c 20 73 74  lean critical st
08d0: 61 74 75 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20  atus. *. * Side 
08e0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
08f0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
0900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0940: 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20  ---. */.Tcl_Obj 
0950: 2a 54 6c 73 5f 78 35 30 39 45 78 74 65 6e 73 69  *Tls_x509Extensi
0960: 6f 6e 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ons(Tcl_Interp *
0970: 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65  interp, X509 *ce
0980: 72 74 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  rt) {.    const 
0990: 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 45 58  STACK_OF(X509_EX
09a0: 54 45 4e 53 49 4f 4e 29 20 2a 65 78 74 73 3b 0a  TENSION) *exts;.
09b0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73      Tcl_Obj *res
09c0: 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77  ultObj = Tcl_New
09d0: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
09e0: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c  ;..    if (resul
09f0: 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tObj == NULL) {.
0a00: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
0a10: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 65 78    }..    if ((ex
0a20: 74 73 20 3d 20 58 35 30 39 5f 67 65 74 30 5f 65  ts = X509_get0_e
0a30: 78 74 65 6e 73 69 6f 6e 73 28 63 65 72 74 29 29  xtensions(cert))
0a40: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72   != NULL) {..for
0a50: 20 28 69 6e 74 20 69 3d 30 3b 20 69 20 3c 20 58   (int i=0; i < X
0a60: 35 30 39 5f 67 65 74 5f 65 78 74 5f 63 6f 75 6e  509_get_ext_coun
0a70: 74 28 63 65 72 74 29 3b 20 69 2b 2b 29 20 7b 0a  t(cert); i++) {.
0a80: 09 20 20 20 20 58 35 30 39 5f 45 58 54 45 4e 53  .    X509_EXTENS
0a90: 49 4f 4e 20 2a 65 78 20 3d 20 73 6b 5f 58 35 30  ION *ex = sk_X50
0aa0: 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 76 61 6c 75  9_EXTENSION_valu
0ab0: 65 28 65 78 74 73 2c 20 69 29 3b 0a 23 69 66 20  e(exts, i);.#if 
0ac0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
0ad0: 4e 55 4d 42 45 52 20 3c 20 30 78 34 30 30 30 30  NUMBER < 0x40000
0ae0: 30 30 30 4c 0a 09 20 20 20 20 41 53 4e 31 5f 4f  000L..    ASN1_O
0af0: 42 4a 45 43 54 20 2a 6f 62 6a 20 3d 20 58 35 30  BJECT *obj = X50
0b00: 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74 5f  9_EXTENSION_get_
0b10: 6f 62 6a 65 63 74 28 65 78 29 3b 0a 23 65 6c 73  object(ex);.#els
0b20: 65 0a 09 20 20 20 20 63 6f 6e 73 74 20 41 53 4e  e..    const ASN
0b30: 31 5f 4f 42 4a 45 43 54 20 2a 6f 62 6a 20 3d 20  1_OBJECT *obj = 
0b40: 58 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 67  X509_EXTENSION_g
0b50: 65 74 5f 6f 62 6a 65 63 74 28 65 78 29 3b 0a 23  et_object(ex);.#
0b60: 65 6e 64 69 66 0a 09 20 20 20 20 2f 2a 20 41 53  endif..    /* AS
0b70: 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49 4e 47 20  N1_OCTET_STRING 
0b80: 2a 64 61 74 61 20 3d 20 58 35 30 39 5f 45 58 54  *data = X509_EXT
0b90: 45 4e 53 49 4f 4e 5f 67 65 74 5f 64 61 74 61 28  ENSION_get_data(
0ba0: 65 78 29 3b 20 2a 2f 0a 09 20 20 20 20 69 6e 74  ex); */..    int
0bb0: 20 63 72 69 74 69 63 61 6c 20 3d 20 58 35 30 39   critical = X509
0bc0: 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74 5f 63  _EXTENSION_get_c
0bd0: 72 69 74 69 63 61 6c 28 65 78 29 3b 0a 09 20 20  ritical(ex);..  
0be0: 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69    LAPPEND_BOOL(i
0bf0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
0c00: 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 4f 42 4a  , OBJ_nid2ln(OBJ
0c10: 5f 6f 62 6a 32 6e 69 64 28 28 63 6f 6e 73 74 20  _obj2nid((const 
0c20: 41 53 4e 31 5f 4f 42 4a 45 43 54 20 2a 29 6f 62  ASN1_OBJECT *)ob
0c30: 6a 29 29 2c 20 63 72 69 74 69 63 61 6c 29 3b 0a  j)), critical);.
0c40: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  .}.    }.    ret
0c50: 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d  urn resultObj;.}
0c60: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
0c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cb0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78  ----. *. * Tls_x
0cc0: 35 30 39 49 64 65 6e 74 69 66 69 65 72 20 2d 2d  509Identifier --
0cd0: 0a 20 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30 39  . *. *.Get X.509
0ce0: 20 63 65 72 74 69 66 69 63 61 74 65 20 41 75 74   certificate Aut
0cf0: 68 6f 72 69 74 79 20 6f 72 20 53 75 62 6a 65 63  hority or Subjec
0d00: 74 20 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72  t Key Identifier
0d10: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  s. *. * Results:
0d20: 0a 20 2a 09 54 43 4c 20 62 79 74 65 20 61 72 72  . *.TCL byte arr
0d30: 61 79 20 6f 62 6a 65 63 74 20 77 69 74 68 20 78  ay object with x
0d40: 35 30 39 20 69 64 65 6e 74 69 66 69 65 72 20 61  509 identifier a
0d50: 73 20 61 20 68 65 78 20 73 74 72 69 6e 67 0a 20  s a hex string. 
0d60: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
0d70: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
0d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
0dd0: 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78  /.Tcl_Obj *Tls_x
0de0: 35 30 39 49 64 65 6e 74 69 66 69 65 72 28 63 6f  509Identifier(co
0df0: 6e 73 74 20 41 53 4e 31 5f 4f 43 54 45 54 5f 53  nst ASN1_OCTET_S
0e00: 54 52 49 4e 47 20 2a 61 73 74 72 69 6e 67 29 20  TRING *astring) 
0e10: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72  {.    Tcl_Obj *r
0e20: 65 73 75 6c 74 4f 62 6a 20 3d 20 4e 55 4c 4c 3b  esultObj = NULL;
0e30: 0a 0a 20 20 20 20 69 66 20 28 61 73 74 72 69 6e  ..    if (astrin
0e40: 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  g != NULL) {..re
0e50: 73 75 6c 74 4f 62 6a 20 3d 20 53 74 72 69 6e 67  sultObj = String
0e60: 5f 74 6f 5f 48 65 78 28 41 53 4e 31 5f 53 54 52  _to_Hex(ASN1_STR
0e70: 49 4e 47 5f 67 65 74 30 5f 64 61 74 61 28 61 73  ING_get0_data(as
0e80: 74 72 69 6e 67 29 2c 20 41 53 4e 31 5f 53 54 52  tring), ASN1_STR
0e90: 49 4e 47 5f 6c 65 6e 67 74 68 28 61 73 74 72 69  ING_length(astri
0ea0: 6e 67 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ng));.    }.    
0eb0: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a  return resultObj
0ec0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f10: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
0f20: 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65 20 2d  s_x509KeyUsage -
0f30: 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30  -. *. *.Get X.50
0f40: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 6b 65  9 certificate ke
0f50: 79 20 75 73 61 67 65 20 74 79 70 65 73 0a 20 2a  y usage types. *
0f60: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
0f70: 54 63 6c 20 6c 69 73 74 20 6f 66 20 74 79 70 65  Tcl list of type
0f80: 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  s. *. * Side eff
0f90: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ects:. *.None. *
0fa0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ff0: 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c  . */.Tcl_Obj *Tl
1000: 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65 28 54  s_x509KeyUsage(T
1010: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1020: 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c 20 75  p, X509 *cert, u
1030: 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 73 29 20  int32_t xflags) 
1040: 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 75  {.    uint32_t u
1050: 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 74 5f  sage = X509_get_
1060: 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74 29 3b  key_usage(cert);
1070: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65  .    Tcl_Obj *re
1080: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  sultObj = Tcl_Ne
1090: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
10a0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75  );..    if (resu
10b0: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ltObj == NULL) {
10c0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
10d0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 78     }..    if ((x
10e0: 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 4b  flags & EXFLAG_K
10f0: 55 53 41 47 45 29 20 26 26 20 75 73 61 67 65 20  USAGE) && usage 
1100: 3c 20 55 49 4e 54 33 32 5f 4d 41 58 29 20 7b 0a  < UINT32_MAX) {.
1110: 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f  .if (usage & KU_
1120: 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 54 55 52  DIGITAL_SIGNATUR
1130: 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  E) {..    Tcl_Li
1140: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1150: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  nt(interp, resul
1160: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tObj, Tcl_NewStr
1170: 69 6e 67 4f 62 6a 28 22 44 69 67 69 74 61 6c 20  ingObj("Digital 
1180: 53 69 67 6e 61 74 75 72 65 22 2c 20 2d 31 29 29  Signature", -1))
1190: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20  ;..}..if (usage 
11a0: 26 20 4b 55 5f 4e 4f 4e 5f 52 45 50 55 44 49 41  & KU_NON_REPUDIA
11b0: 54 49 4f 4e 29 20 7b 0a 09 20 20 20 20 54 63 6c  TION) {..    Tcl
11c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11d0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65  ement(interp, re
11e0: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77  sultObj, Tcl_New
11f0: 53 74 72 69 6e 67 4f 62 6a 28 22 4e 6f 6e 2d 52  StringObj("Non-R
1200: 65 70 75 64 69 61 74 69 6f 6e 22 2c 20 2d 31 29  epudiation", -1)
1210: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65  );..}..if (usage
1220: 20 26 20 4b 55 5f 4b 45 59 5f 45 4e 43 49 50 48   & KU_KEY_ENCIPH
1230: 45 52 4d 45 4e 54 29 20 7b 0a 09 20 20 20 20 54  ERMENT) {..    T
1240: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1250: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1260: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e  resultObj, Tcl_N
1270: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4b 65 79  ewStringObj("Key
1280: 20 45 6e 63 69 70 68 65 72 6d 65 6e 74 22 2c 20   Encipherment", 
1290: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73  -1));..}..if (us
12a0: 61 67 65 20 26 20 4b 55 5f 44 41 54 41 5f 45 4e  age & KU_DATA_EN
12b0: 43 49 50 48 45 52 4d 45 4e 54 29 20 7b 0a 09 20  CIPHERMENT) {.. 
12c0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
12d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
12e0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54  rp, resultObj, T
12f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1300: 22 44 61 74 61 20 45 6e 63 69 70 68 65 72 6d 65  "Data Encipherme
1310: 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  nt", -1));..}..i
1320: 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f 4b 45  f (usage & KU_KE
1330: 59 5f 41 47 52 45 45 4d 45 4e 54 29 20 7b 0a 09  Y_AGREEMENT) {..
1340: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1350: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1360: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
1370: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1380: 28 22 4b 65 79 20 41 67 72 65 65 6d 65 6e 74 22  ("Key Agreement"
1390: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
13a0: 75 73 61 67 65 20 26 20 4b 55 5f 4b 45 59 5f 43  usage & KU_KEY_C
13b0: 45 52 54 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20  ERT_SIGN) {..   
13c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
13d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
13e0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c  , resultObj, Tcl
13f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 43  _NewStringObj("C
1400: 65 72 74 69 66 69 63 61 74 65 20 53 69 67 6e 69  ertificate Signi
1410: 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  ng", -1));..}..i
1420: 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f 43 52  f (usage & KU_CR
1430: 4c 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 20 54  L_SIGN) {..    T
1440: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1450: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1460: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e  resultObj, Tcl_N
1470: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 43 52 4c  ewStringObj("CRL
1480: 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 3b   Signing", -1));
1490: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26  ..}..if (usage &
14a0: 20 4b 55 5f 45 4e 43 49 50 48 45 52 5f 4f 4e 4c   KU_ENCIPHER_ONL
14b0: 59 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  Y) {..    Tcl_Li
14c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
14d0: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  nt(interp, resul
14e0: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tObj, Tcl_NewStr
14f0: 69 6e 67 4f 62 6a 28 22 45 6e 63 69 70 68 65 72  ingObj("Encipher
1500: 20 4f 6e 6c 79 22 2c 20 2d 31 29 29 3b 0a 09 7d   Only", -1));..}
1510: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55  ..if (usage & KU
1520: 5f 44 45 43 49 50 48 45 52 5f 4f 4e 4c 59 29 20  _DECIPHER_ONLY) 
1530: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
1540: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1550: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
1560: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  j, Tcl_NewString
1570: 4f 62 6a 28 22 44 65 63 69 70 68 65 72 20 4f 6e  Obj("Decipher On
1580: 6c 79 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 20  ly", -1));..}.  
1590: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20    } else {..    
15a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
15b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
15c0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f   resultObj, Tcl_
15d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e  NewStringObj("un
15e0: 72 65 73 74 72 69 63 74 65 64 22 2c 20 2d 31 29  restricted", -1)
15f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
1600: 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d  urn resultObj;.}
1610: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
1620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1660: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78  ----. *. * Tls_x
1670: 35 30 39 50 75 72 70 6f 73 65 20 2d 2d 0a 20 2a  509Purpose --. *
1680: 0a 20 2a 09 47 65 74 20 58 2e 35 30 39 20 63 65  . *.Get X.509 ce
1690: 72 74 69 66 69 63 61 74 65 20 70 75 72 70 6f 73  rtificate purpos
16a0: 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  e. *. * Results:
16b0: 0a 20 2a 09 50 75 72 70 6f 73 65 20 73 74 72 69  . *.Purpose stri
16c0: 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ng. *. * Side ef
16d0: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  fects:. *.None. 
16e0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 0a 20 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  -. */.const char
1740: 20 2a 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73   *Tls_x509Purpos
1750: 65 28 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a  e(X509 *cert) {.
1760: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1770: 70 75 72 70 6f 73 65 20 3d 20 4e 55 4c 4c 3b 0a  purpose = NULL;.
1780: 0a 20 20 20 20 69 66 20 28 58 35 30 39 5f 63 68  .    if (X509_ch
1790: 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74  eck_purpose(cert
17a0: 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 53  , X509_PURPOSE_S
17b0: 53 4c 5f 43 4c 49 45 4e 54 2c 20 30 29 20 3e 20  SL_CLIENT, 0) > 
17c0: 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20  0) {..purpose = 
17d0: 22 53 53 4c 20 43 6c 69 65 6e 74 22 3b 0a 20 20  "SSL Client";.  
17e0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30    } else if (X50
17f0: 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28  9_check_purpose(
1800: 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f  cert, X509_PURPO
1810: 53 45 5f 53 53 4c 5f 53 45 52 56 45 52 2c 20 30  SE_SSL_SERVER, 0
1820: 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73  ) > 0) {..purpos
1830: 65 20 3d 20 22 53 53 4c 20 53 65 72 76 65 72 22  e = "SSL Server"
1840: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
1850: 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70  (X509_check_purp
1860: 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50  ose(cert, X509_P
1870: 55 52 50 4f 53 45 5f 4e 53 5f 53 53 4c 5f 53 45  URPOSE_NS_SSL_SE
1880: 52 56 45 52 2c 20 30 29 20 3e 20 30 29 20 7b 0a  RVER, 0) > 0) {.
1890: 09 70 75 72 70 6f 73 65 20 3d 20 22 4d 53 53 20  .purpose = "MSS 
18a0: 53 53 4c 20 53 65 72 76 65 72 22 3b 0a 20 20 20  SSL Server";.   
18b0: 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39   } else if (X509
18c0: 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63  _check_purpose(c
18d0: 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53  ert, X509_PURPOS
18e0: 45 5f 53 4d 49 4d 45 5f 53 49 47 4e 2c 20 30 29  E_SMIME_SIGN, 0)
18f0: 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65   > 0) {..purpose
1900: 20 3d 20 22 53 4d 49 4d 45 20 53 69 67 6e 69 6e   = "SMIME Signin
1910: 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  g";.    } else i
1920: 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75  f (X509_check_pu
1930: 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39  rpose(cert, X509
1940: 5f 50 55 52 50 4f 53 45 5f 53 4d 49 4d 45 5f 45  _PURPOSE_SMIME_E
1950: 4e 43 52 59 50 54 2c 20 30 29 20 3e 20 30 29 20  NCRYPT, 0) > 0) 
1960: 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 53 4d  {..purpose = "SM
1970: 49 4d 45 20 45 6e 63 72 79 70 74 69 6f 6e 22 3b  IME Encryption";
1980: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
1990: 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f  X509_check_purpo
19a0: 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55  se(cert, X509_PU
19b0: 52 50 4f 53 45 5f 43 52 4c 5f 53 49 47 4e 2c 20  RPOSE_CRL_SIGN, 
19c0: 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f  0) > 0) {..purpo
19d0: 73 65 20 3d 20 22 43 52 4c 20 53 69 67 6e 69 6e  se = "CRL Signin
19e0: 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  g";.    } else i
19f0: 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75  f (X509_check_pu
1a00: 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39  rpose(cert, X509
1a10: 5f 50 55 52 50 4f 53 45 5f 41 4e 59 2c 20 30 29  _PURPOSE_ANY, 0)
1a20: 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65   > 0) {..purpose
1a30: 20 3d 20 22 41 6e 79 22 3b 0a 20 20 20 20 7d 20   = "Any";.    } 
1a40: 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68  else if (X509_ch
1a50: 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74  eck_purpose(cert
1a60: 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 4f  , X509_PURPOSE_O
1a70: 43 53 50 5f 48 45 4c 50 45 52 2c 20 30 29 20 3e  CSP_HELPER, 0) >
1a80: 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d   0) {..purpose =
1a90: 20 22 4f 43 53 50 20 48 65 6c 70 65 72 22 3b 0a   "OCSP Helper";.
1aa0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 58      } else if (X
1ab0: 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73  509_check_purpos
1ac0: 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52  e(cert, X509_PUR
1ad0: 50 4f 53 45 5f 54 49 4d 45 53 54 41 4d 50 5f 53  POSE_TIMESTAMP_S
1ae0: 49 47 4e 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09  IGN, 0) > 0) {..
1af0: 70 75 72 70 6f 73 65 20 3d 20 22 54 69 6d 65 73  purpose = "Times
1b00: 74 61 6d 70 20 53 69 67 6e 69 6e 67 22 3b 0a 20  tamp Signing";. 
1b10: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 75 72     } else {..pur
1b20: 70 6f 73 65 20 3d 20 22 22 3b 0a 20 20 20 20 7d  pose = "";.    }
1b30: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 75 72 70  .    return purp
1b40: 6f 73 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  ose;.}../*. *---
1b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
1ba0: 20 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 65   Tls_x509Purpose
1bb0: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 58  s --. *. *.Get X
1bc0: 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
1bd0: 20 70 75 72 70 6f 73 65 20 74 79 70 65 73 0a 20   purpose types. 
1be0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
1bf0: 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 65 61 63  .Tcl list of eac
1c00: 68 20 70 75 72 70 6f 73 65 20 61 6e 64 20 77 68  h purpose and wh
1c10: 65 74 68 65 72 20 69 74 20 69 73 20 43 41 20 6f  ether it is CA o
1c20: 72 20 6e 6f 6e 2d 43 41 0a 20 2a 0a 20 2a 20 53  r non-CA. *. * S
1c30: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
1c40: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  None. *. *------
1c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c90: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f  -------. */.Tcl_
1ca0: 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 50 75 72  Obj *Tls_x509Pur
1cb0: 70 6f 73 65 73 28 54 63 6c 5f 49 6e 74 65 72 70  poses(Tcl_Interp
1cc0: 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a   *interp, X509 *
1cd0: 63 65 72 74 29 20 7b 0a 20 20 20 20 54 63 6c 5f  cert) {.    Tcl_
1ce0: 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d  Obj *resultObj =
1cf0: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
1d00: 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 58 35  0, NULL);.    X5
1d10: 30 39 5f 50 55 52 50 4f 53 45 20 2a 70 74 6d 70  09_PURPOSE *ptmp
1d20: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c  ;..    if (resul
1d30: 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tObj == NULL) {.
1d40: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
1d50: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 69 6e    }..    for (in
1d60: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 58 35 30  t i = 0; i < X50
1d70: 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 5f 63 6f  9_PURPOSE_get_co
1d80: 75 6e 74 28 29 3b 20 69 2b 2b 29 20 7b 0a 09 70  unt(); i++) {..p
1d90: 74 6d 70 20 3d 20 58 35 30 39 5f 50 55 52 50 4f  tmp = X509_PURPO
1da0: 53 45 5f 67 65 74 30 28 69 29 3b 0a 09 54 63 6c  SE_get0(i);..Tcl
1db0: 5f 4f 62 6a 20 2a 74 6d 70 50 74 72 20 3d 20 54  _Obj *tmpPtr = T
1dc0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
1dd0: 20 4e 55 4c 4c 29 3b 0a 0a 09 66 6f 72 20 28 69   NULL);...for (i
1de0: 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 3c 20 32 3b  nt j = 0; j < 2;
1df0: 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 69 6e 74   j++) {..    int
1e00: 20 69 64 72 65 74 20 3d 20 58 35 30 39 5f 63 68   idret = X509_ch
1e10: 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74  eck_purpose(cert
1e20: 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67  , X509_PURPOSE_g
1e30: 65 74 5f 69 64 28 70 74 6d 70 29 2c 20 6a 29 3b  et_id(ptmp), j);
1e40: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
1e50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1e60: 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 2c 20 54  nterp, tmpPtr, T
1e70: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1e80: 6a 20 3f 20 22 43 41 22 20 3a 20 22 6e 6f 6e 43  j ? "CA" : "nonC
1e90: 41 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 54  A", -1));..    T
1ea0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1eb0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1ec0: 74 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  tmpPtr, Tcl_NewS
1ed0: 74 72 69 6e 67 4f 62 6a 28 69 64 72 65 74 20 3d  tringObj(idret =
1ee0: 3d 20 31 20 3f 20 22 59 65 73 22 20 3a 20 22 4e  = 1 ? "Yes" : "N
1ef0: 6f 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41  o", -1));..}..LA
1f00: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70  PPEND_OBJ(interp
1f10: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 58 35 30  , resultObj, X50
1f20: 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 30 5f 6e  9_PURPOSE_get0_n
1f30: 61 6d 65 28 70 74 6d 70 29 2c 20 74 6d 70 50 74  ame(ptmp), tmpPt
1f40: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  r);.    }.    re
1f50: 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a  turn resultObj;.
1f60: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
1f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
1fc0: 78 35 30 39 4e 61 6d 65 73 20 2d 2d 0a 20 2a 0a  x509Names --. *.
1fd0: 20 2a 09 47 65 74 20 61 20 6c 69 73 74 20 6f 66   *.Get a list of
1fe0: 20 53 75 62 6a 65 63 74 20 41 6c 74 65 72 6e 61   Subject Alterna
1ff0: 74 65 20 4e 61 6d 65 73 20 28 53 41 4e 29 20 6f  te Names (SAN) o
2000: 72 20 49 73 73 75 65 72 20 41 6c 74 65 72 6e 61  r Issuer Alterna
2010: 74 65 20 4e 61 6d 65 73 0a 20 2a 0a 20 2a 20 52  te Names. *. * R
2020: 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 6c 20 6c  esults:. *.Tcl l
2030: 69 73 74 20 6f 66 20 61 6c 74 65 72 6e 61 74 65  ist of alternate
2040: 20 6e 61 6d 65 73 0a 20 2a 0a 20 2a 20 53 69 64   names. *. * Sid
2050: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
2060: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ne. *. *--------
2070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20b0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62  -----. */.Tcl_Ob
20c0: 6a 20 2a 54 6c 73 5f 78 35 30 39 4e 61 6d 65 73  j *Tls_x509Names
20d0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
20e0: 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c  erp, X509 *cert,
20f0: 20 69 6e 74 20 6e 69 64 2c 20 42 49 4f 20 2a 62   int nid, BIO *b
2100: 69 6f 29 20 7b 0a 20 20 20 20 53 54 41 43 4b 5f  io) {.    STACK_
2110: 4f 46 28 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 29  OF(GENERAL_NAME)
2120: 20 2a 6e 61 6d 65 73 3b 0a 20 20 20 20 54 63 6c   *names;.    Tcl
2130: 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20  _Obj *resultObj 
2140: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
2150: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54  (0, NULL);.    T
2160: 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20  cl_Size len;.   
2170: 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 30 32   char buffer[102
2180: 34 5d 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73  4];..    if (res
2190: 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20  ultObj == NULL) 
21a0: 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  {..return NULL;.
21b0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28      }..    if ((
21c0: 6e 61 6d 65 73 20 3d 20 28 53 54 41 43 4b 5f 4f  names = (STACK_O
21d0: 46 28 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 29 20  F(GENERAL_NAME) 
21e0: 2a 29 58 35 30 39 5f 67 65 74 5f 65 78 74 5f 64  *)X509_get_ext_d
21f0: 32 69 28 63 65 72 74 2c 20 6e 69 64 2c 20 4e 55  2i(cert, nid, NU
2200: 4c 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 4e 55  LL, NULL)) != NU
2210: 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20  LL) {..for (int 
2220: 69 3d 30 3b 20 69 20 3c 20 73 6b 5f 47 45 4e 45  i=0; i < sk_GENE
2230: 52 41 4c 5f 4e 41 4d 45 5f 6e 75 6d 28 6e 61 6d  RAL_NAME_num(nam
2240: 65 73 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20  es); i++) {..   
2250: 20 63 6f 6e 73 74 20 47 45 4e 45 52 41 4c 5f 4e   const GENERAL_N
2260: 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 47  AME *name = sk_G
2270: 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 76 61 6c 75  ENERAL_NAME_valu
2280: 65 28 6e 61 6d 65 73 2c 20 69 29 3b 0a 0a 09 20  e(names, i);... 
2290: 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f     len = BIO_to_
22a0: 42 75 66 66 65 72 28 6e 61 6d 65 20 26 26 20 47  Buffer(name && G
22b0: 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70 72 69 6e  ENERAL_NAME_prin
22c0: 74 28 62 69 6f 2c 20 28 47 45 4e 45 52 41 4c 5f  t(bio, (GENERAL_
22d0: 4e 41 4d 45 20 2a 29 20 6e 61 6d 65 29 2c 20 62  NAME *) name), b
22e0: 69 6f 2c 20 62 75 66 66 65 72 2c 20 31 30 32 34  io, buffer, 1024
22f0: 29 3b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f  );..    LAPPEND_
2300: 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75  STR(interp, resu
2310: 6c 74 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 62 75 66  ltObj, NULL, buf
2320: 66 65 72 2c 20 6c 65 6e 29 3b 0a 09 7d 0a 09 73  fer, len);..}..s
2330: 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70  k_GENERAL_NAME_p
2340: 6f 70 5f 66 72 65 65 28 6e 61 6d 65 73 2c 20 47  op_free(names, G
2350: 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 66 72 65 65  ENERAL_NAME_free
2360: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
2370: 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d  urn resultObj;.}
2380: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78  ----. *. * Tls_x
23e0: 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 20 2d  509ExtKeyUsage -
23f0: 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 61 20 6c 69  -. *. *.Get a li
2400: 73 74 20 6f 66 20 45 78 74 65 6e 64 65 64 20 4b  st of Extended K
2410: 65 79 20 55 73 61 67 65 73 0a 20 2a 0a 20 2a 20  ey Usages. *. * 
2420: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 63 6c 20  Returns:. *.Tcl 
2430: 6c 69 73 74 20 6f 66 20 75 73 61 67 65 73 0a 20  list of usages. 
2440: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
2450: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
2460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
24b0: 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78  /.Tcl_Obj *Tls_x
24c0: 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 28 54  509ExtKeyUsage(T
24d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
24e0: 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c 20 75  p, X509 *cert, u
24f0: 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 73 29 20  int32_t xflags) 
2500: 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 75  {.    uint32_t u
2510: 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 74 5f  sage = X509_get_
2520: 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74 29 3b  key_usage(cert);
2530: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65  .    Tcl_Obj *re
2540: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  sultObj = Tcl_Ne
2550: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
2560: 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75  );..    if (resu
2570: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ltObj == NULL) {
2580: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
2590: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 78     }..    if ((x
25a0: 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 58  flags & EXFLAG_X
25b0: 4b 55 53 41 47 45 29 20 26 26 20 75 73 61 67 65  KUSAGE) && usage
25c0: 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58 29 20 7b   < UINT32_MAX) {
25d0: 0a 09 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67  ..usage = X509_g
25e0: 65 74 5f 65 78 74 65 6e 64 65 64 5f 6b 65 79 5f  et_extended_key_
25f0: 75 73 61 67 65 28 63 65 72 74 29 3b 0a 0a 09 69  usage(cert);...i
2600: 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f 53  f (usage & XKU_S
2610: 53 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20  SL_SERVER) {..  
2620: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2630: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2640: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
2650: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
2660: 54 4c 53 20 57 65 62 20 53 65 72 76 65 72 20 41  TLS Web Server A
2670: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 22 2c 20  uthentication", 
2680: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73  -1));..}..if (us
2690: 61 67 65 20 26 20 58 4b 55 5f 53 53 4c 5f 43 4c  age & XKU_SSL_CL
26a0: 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 54 63 6c  IENT) {..    Tcl
26b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
26c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65  ement(interp, re
26d0: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77  sultObj, Tcl_New
26e0: 53 74 72 69 6e 67 4f 62 6a 28 22 54 4c 53 20 57  StringObj("TLS W
26f0: 65 62 20 43 6c 69 65 6e 74 20 41 75 74 68 65 6e  eb Client Authen
2700: 74 69 63 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b  tication", -1));
2710: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26  ..}..if (usage &
2720: 20 58 4b 55 5f 53 4d 49 4d 45 29 20 7b 0a 09 20   XKU_SMIME) {.. 
2730: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2740: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2750: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54  rp, resultObj, T
2760: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2770: 22 45 2d 6d 61 69 6c 20 50 72 6f 74 65 63 74 69  "E-mail Protecti
2780: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  on", -1));..}..i
2790: 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f 43  f (usage & XKU_C
27a0: 4f 44 45 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20  ODE_SIGN) {..   
27b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
27c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
27d0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c  , resultObj, Tcl
27e0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 43  _NewStringObj("C
27f0: 6f 64 65 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31  ode Signing", -1
2800: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67  ));..}..if (usag
2810: 65 20 26 20 58 4b 55 5f 53 47 43 29 20 7b 0a 09  e & XKU_SGC) {..
2820: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2830: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2840: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
2850: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2860: 28 22 53 47 43 22 2c 20 2d 31 29 29 3b 0a 09 7d  ("SGC", -1));..}
2870: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b  ..if (usage & XK
2880: 55 5f 4f 43 53 50 5f 53 49 47 4e 29 20 7b 0a 09  U_OCSP_SIGN) {..
2890: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
28a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
28b0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
28c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
28d0: 28 22 4f 43 53 50 20 53 69 67 6e 69 6e 67 22 2c  ("OCSP Signing",
28e0: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75   -1));..}..if (u
28f0: 73 61 67 65 20 26 20 58 4b 55 5f 54 49 4d 45 53  sage & XKU_TIMES
2900: 54 41 4d 50 29 20 7b 0a 09 20 20 20 20 54 63 6c  TAMP) {..    Tcl
2910: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2920: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65  ement(interp, re
2930: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77  sultObj, Tcl_New
2940: 53 74 72 69 6e 67 4f 62 6a 28 22 54 69 6d 65 20  StringObj("Time 
2950: 53 74 61 6d 70 69 6e 67 22 2c 20 2d 31 29 29 3b  Stamping", -1));
2960: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26  ..}..if (usage &
2970: 20 58 4b 55 5f 44 56 43 53 20 29 20 7b 0a 09 20   XKU_DVCS ) {.. 
2980: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2990: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
29a0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54  rp, resultObj, T
29b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
29c0: 22 44 56 43 53 22 2c 20 2d 31 29 29 3b 0a 09 7d  "DVCS", -1));..}
29d0: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b  ..if (usage & XK
29e0: 55 5f 41 4e 59 45 4b 55 29 20 7b 0a 09 20 20 20  U_ANYEKU) {..   
29f0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2a00: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2a10: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c  , resultObj, Tcl
2a20: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 41  _NewStringObj("A
2a30: 6e 79 20 45 78 74 65 6e 64 65 64 20 4b 65 79 20  ny Extended Key 
2a40: 55 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 09 7d  Usage", -1));..}
2a50: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20  .    } else {.. 
2a60: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2a70: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2a80: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54  rp, resultObj, T
2a90: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2aa0: 22 75 6e 72 65 73 74 72 69 63 74 65 64 22 2c 20  "unrestricted", 
2ab0: 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  -1));.    }.    
2ac0: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a  return resultObj
2ad0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
2ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
2b30: 73 5f 78 35 30 39 43 72 6c 44 70 20 2d 2d 0a 20  s_x509CrlDp --. 
2b40: 2a 0a 20 2a 09 47 65 74 20 6c 69 73 74 20 6f 66  *. *.Get list of
2b50: 20 43 52 4c 20 44 69 73 74 72 69 62 75 74 69 6f   CRL Distributio
2b60: 6e 20 50 6f 69 6e 74 73 0a 20 2a 0a 20 2a 20 52  n Points. *. * R
2b70: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 63 6c 20 6c  eturns:. *.Tcl l
2b80: 69 73 74 20 6f 66 20 55 52 49 73 20 61 6e 64 20  ist of URIs and 
2b90: 72 65 6c 61 74 69 76 65 2d 6e 61 6d 65 73 0a 20  relative-names. 
2ba0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
2bb0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
2bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2c10: 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78  /.Tcl_Obj *Tls_x
2c20: 35 30 39 43 72 6c 44 70 28 54 63 6c 5f 49 6e 74  509CrlDp(Tcl_Int
2c30: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30  erp *interp, X50
2c40: 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 53  9 *cert) {.    S
2c50: 54 41 43 4b 5f 4f 46 28 44 49 53 54 5f 50 4f 49  TACK_OF(DIST_POI
2c60: 4e 54 29 20 2a 64 70 73 3b 0a 20 20 20 20 54 63  NT) *dps;.    Tc
2c70: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a  l_Obj *resultObj
2c80: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
2c90: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20  j(0, NULL);..   
2ca0: 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d   if (resultObj =
2cb0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
2cc0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
2cd0: 20 20 20 69 66 20 28 28 64 70 73 20 3d 20 28 53     if ((dps = (S
2ce0: 54 41 43 4b 5f 4f 46 28 44 49 53 54 5f 50 4f 49  TACK_OF(DIST_POI
2cf0: 4e 54 29 20 2a 29 58 35 30 39 5f 67 65 74 5f 65  NT) *)X509_get_e
2d00: 78 74 5f 64 32 69 28 63 65 72 74 2c 20 4e 49 44  xt_d2i(cert, NID
2d10: 5f 63 72 6c 5f 64 69 73 74 72 69 62 75 74 69 6f  _crl_distributio
2d20: 6e 5f 70 6f 69 6e 74 73 2c 20 4e 55 4c 4c 2c 20  n_points, NULL, 
2d30: 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20  NULL)) != NULL) 
2d40: 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b  {..for (int i=0;
2d50: 20 69 20 3c 20 73 6b 5f 44 49 53 54 5f 50 4f 49   i < sk_DIST_POI
2d60: 4e 54 5f 6e 75 6d 28 64 70 73 29 3b 20 69 2b 2b  NT_num(dps); i++
2d70: 29 20 7b 0a 09 20 20 20 20 44 49 53 54 5f 50 4f  ) {..    DIST_PO
2d80: 49 4e 54 20 2a 64 70 20 3d 20 73 6b 5f 44 49 53  INT *dp = sk_DIS
2d90: 54 5f 50 4f 49 4e 54 5f 76 61 6c 75 65 28 64 70  T_POINT_value(dp
2da0: 73 2c 20 69 29 3b 0a 09 20 20 20 20 44 49 53 54  s, i);..    DIST
2db0: 5f 50 4f 49 4e 54 5f 4e 41 4d 45 20 2a 64 69 73  _POINT_NAME *dis
2dc0: 74 70 6f 69 6e 74 20 3d 20 64 70 2d 3e 64 69 73  tpoint = dp->dis
2dd0: 74 70 6f 69 6e 74 3b 0a 0a 09 20 20 20 20 69 66  tpoint;...    if
2de0: 20 28 64 69 73 74 70 6f 69 6e 74 2d 3e 74 79 70   (distpoint->typ
2df0: 65 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 66  e == 0) {.../* f
2e00: 75 6c 6c 2d 6e 61 6d 65 20 47 45 4e 45 52 41 4c  ull-name GENERAL
2e10: 49 5a 45 44 4e 41 4d 45 20 2a 2f 0a 09 09 66 6f  IZEDNAME */...fo
2e20: 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a 20  r (int j = 0; j 
2e30: 3c 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d  < sk_GENERAL_NAM
2e40: 45 5f 6e 75 6d 28 64 69 73 74 70 6f 69 6e 74 2d  E_num(distpoint-
2e50: 3e 6e 61 6d 65 2e 66 75 6c 6c 6e 61 6d 65 29 3b  >name.fullname);
2e60: 20 6a 2b 2b 29 20 7b 0a 09 09 20 20 20 20 47 45   j++) {...    GE
2e70: 4e 45 52 41 4c 5f 4e 41 4d 45 20 2a 67 65 6e 20  NERAL_NAME *gen 
2e80: 3d 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d  = sk_GENERAL_NAM
2e90: 45 5f 76 61 6c 75 65 28 64 69 73 74 70 6f 69 6e  E_value(distpoin
2ea0: 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c 6e 61 6d 65  t->name.fullname
2eb0: 2c 20 6a 29 3b 0a 09 09 20 20 20 20 69 6e 74 20  , j);...    int 
2ec0: 74 79 70 65 3b 0a 23 69 66 20 4f 50 45 4e 53 53  type;.#if OPENSS
2ed0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
2ee0: 20 3c 20 30 78 34 30 30 30 30 30 30 30 4c 0a 09   < 0x40000000L..
2ef0: 09 20 20 20 20 41 53 4e 31 5f 53 54 52 49 4e 47  .    ASN1_STRING
2f00: 20 2a 75 72 69 20 3d 20 28 41 53 4e 31 5f 53 54   *uri = (ASN1_ST
2f10: 52 49 4e 47 20 2a 29 47 45 4e 45 52 41 4c 5f 4e  RING *)GENERAL_N
2f20: 41 4d 45 5f 67 65 74 30 5f 76 61 6c 75 65 28 67  AME_get0_value(g
2f30: 65 6e 2c 20 26 74 79 70 65 29 3b 0a 23 65 6c 73  en, &type);.#els
2f40: 65 0a 09 09 20 20 20 20 63 6f 6e 73 74 20 41 53  e...    const AS
2f50: 4e 31 5f 53 54 52 49 4e 47 20 2a 75 72 69 20 3d  N1_STRING *uri =
2f60: 20 28 63 6f 6e 73 74 20 41 53 4e 31 5f 53 54 52   (const ASN1_STR
2f70: 49 4e 47 20 2a 29 47 45 4e 45 52 41 4c 5f 4e 41  ING *)GENERAL_NA
2f80: 4d 45 5f 67 65 74 30 5f 76 61 6c 75 65 28 67 65  ME_get0_value(ge
2f90: 6e 2c 20 26 74 79 70 65 29 3b 0a 23 65 6e 64 69  n, &type);.#endi
2fa0: 66 0a 09 09 20 20 20 20 69 66 20 28 74 79 70 65  f...    if (type
2fb0: 20 3d 3d 20 47 45 4e 5f 55 52 49 20 7c 7c 20 74   == GEN_URI || t
2fc0: 79 70 65 20 3d 3d 20 47 45 4e 5f 44 4e 53 29 20  ype == GEN_DNS) 
2fd0: 7b 0a 09 09 09 4c 41 50 50 45 4e 44 5f 53 54 52  {....LAPPEND_STR
2fe0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
2ff0: 62 6a 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  bj, (char *) NUL
3000: 4c 2c 0a 09 09 09 20 20 20 20 28 63 68 61 72 20  L,....    (char 
3010: 2a 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67  *) ASN1_STRING_g
3020: 65 74 30 5f 64 61 74 61 28 75 72 69 29 2c 20 28  et0_data(uri), (
3030: 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31 5f 53  Tcl_Size) ASN1_S
3040: 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 75 72 69  TRING_length(uri
3050: 29 29 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a  ));...    }...}.
3060: 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
3070: 64 69 73 74 70 6f 69 6e 74 2d 3e 74 79 70 65 20  distpoint->type 
3080: 3d 3d 20 31 29 20 7b 0a 09 09 2f 2a 20 72 65 6c  == 1) {.../* rel
3090: 61 74 69 76 65 2d 6e 61 6d 65 20 58 35 30 39 4e  ative-name X509N
30a0: 41 4d 45 20 2a 2f 0a 09 09 53 54 41 43 4b 5f 4f  AME */...STACK_O
30b0: 46 28 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52  F(X509_NAME_ENTR
30c0: 59 29 20 2a 73 6b 5f 72 65 6c 6e 61 6d 65 20 3d  Y) *sk_relname =
30d0: 20 64 69 73 74 70 6f 69 6e 74 2d 3e 6e 61 6d 65   distpoint->name
30e0: 2e 72 65 6c 61 74 69 76 65 6e 61 6d 65 3b 0a 09  .relativename;..
30f0: 09 66 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b  .for (int j = 0;
3100: 20 6a 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d   j < sk_X509_NAM
3110: 45 5f 45 4e 54 52 59 5f 6e 75 6d 28 73 6b 5f 72  E_ENTRY_num(sk_r
3120: 65 6c 6e 61 6d 65 29 3b 20 6a 2b 2b 29 20 7b 0a  elname); j++) {.
3130: 09 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 5f  ..    X509_NAME_
3140: 45 4e 54 52 59 20 2a 65 20 3d 20 73 6b 5f 58 35  ENTRY *e = sk_X5
3150: 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 5f 76 61  09_NAME_ENTRY_va
3160: 6c 75 65 28 73 6b 5f 72 65 6c 6e 61 6d 65 2c 20  lue(sk_relname, 
3170: 6a 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  j);.#if OPENSSL_
3180: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
3190: 20 30 78 34 30 30 30 30 30 30 30 4c 0a 09 09 20   0x40000000L... 
31a0: 20 20 20 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a     ASN1_STRING *
31b0: 64 20 3d 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e  d = X509_NAME_EN
31c0: 54 52 59 5f 67 65 74 5f 64 61 74 61 28 65 29 3b  TRY_get_data(e);
31d0: 0a 23 65 6c 73 65 0a 09 09 20 20 20 20 63 6f 6e  .#else...    con
31e0: 73 74 20 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a  st ASN1_STRING *
31f0: 64 20 3d 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e  d = X509_NAME_EN
3200: 54 52 59 5f 67 65 74 5f 64 61 74 61 28 65 29 3b  TRY_get_data(e);
3210: 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 4c 41  .#endif...    LA
3220: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
3230: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 28 63 68  , resultObj, (ch
3240: 61 72 20 2a 29 20 4e 55 4c 4c 2c 0a 09 09 09 28  ar *) NULL,....(
3250: 63 68 61 72 20 2a 29 20 41 53 4e 31 5f 53 54 52  char *) ASN1_STR
3260: 49 4e 47 5f 67 65 74 30 5f 64 61 74 61 28 64 29  ING_get0_data(d)
3270: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e  , (Tcl_Size) ASN
3280: 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28  1_STRING_length(
3290: 64 29 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a  d));...}..    }.
32a0: 09 7d 0a 09 43 52 4c 5f 44 49 53 54 5f 50 4f 49  .}..CRL_DIST_POI
32b0: 4e 54 53 5f 66 72 65 65 28 64 70 73 29 3b 0a 20  NTS_free(dps);. 
32c0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
32d0: 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a  resultObj;.}../*
32e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
32f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3330: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39 4f  . *. * Tls_x509O
3340: 73 63 70 0a 20 2a 0a 20 2a 09 47 65 74 20 6c 69  scp. *. *.Get li
3350: 73 74 20 6f 66 20 4f 6e 2d 6c 69 6e 65 20 43 65  st of On-line Ce
3360: 72 74 69 66 69 63 61 74 65 20 53 74 61 74 75 73  rtificate Status
3370: 20 50 72 6f 74 6f 63 6f 6c 20 28 4f 53 43 50 29   Protocol (OSCP)
3380: 20 55 52 49 73 0a 20 2a 0a 20 2a 20 52 65 73 75   URIs. *. * Resu
3390: 6c 74 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 74  lts:. *.Tcl list
33a0: 20 6f 66 20 55 52 49 73 0a 20 2a 0a 20 2a 20 53   of URIs. *. * S
33b0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
33c0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  None. *. *------
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 0a 20 2a 2f 0a 54 63 6c 5f  -------. */.Tcl_
3420: 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 4f 73 63  Obj *Tls_x509Osc
3430: 70 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  p(Tcl_Interp *in
3440: 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74  terp, X509 *cert
3450: 29 20 7b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46  ) {.    STACK_OF
3460: 28 4f 50 45 4e 53 53 4c 5f 53 54 52 49 4e 47 29  (OPENSSL_STRING)
3470: 20 2a 6f 63 73 70 3b 0a 20 20 20 20 54 63 6c 5f   *ocsp;.    Tcl_
3480: 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d  Obj *resultObj =
3490: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
34a0: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69  0, NULL);..    i
34b0: 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20  f (resultObj == 
34c0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
34d0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
34e0: 20 69 66 20 28 28 6f 63 73 70 20 3d 20 58 35 30   if ((ocsp = X50
34f0: 39 5f 67 65 74 31 5f 6f 63 73 70 28 63 65 72 74  9_get1_ocsp(cert
3500: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 66  )) != NULL) {..f
3510: 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69  or (int i = 0; i
3520: 20 3c 20 73 6b 5f 4f 50 45 4e 53 53 4c 5f 53 54   < sk_OPENSSL_ST
3530: 52 49 4e 47 5f 6e 75 6d 28 6f 63 73 70 29 3b 20  RING_num(ocsp); 
3540: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 4c 41 50 50  i++) {..    LAPP
3550: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
3560: 72 65 73 75 6c 74 4f 62 6a 2c 20 4e 55 4c 4c 2c  resultObj, NULL,
3570: 20 73 6b 5f 4f 50 45 4e 53 53 4c 5f 53 54 52 49   sk_OPENSSL_STRI
3580: 4e 47 5f 76 61 6c 75 65 28 6f 63 73 70 2c 20 69  NG_value(ocsp, i
3590: 29 2c 20 2d 31 29 3b 0a 09 7d 0a 09 58 35 30 39  ), -1);..}..X509
35a0: 5f 65 6d 61 69 6c 5f 66 72 65 65 28 6f 63 73 70  _email_free(ocsp
35b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
35c0: 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d  urn resultObj;.}
35d0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3620: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78  ----. *. * Tls_x
3630: 35 30 39 43 61 49 73 73 75 65 72 73 20 2d 2d 0a  509CaIssuers --.
3640: 20 2a 0a 20 2a 09 47 65 74 20 6c 69 73 74 20 6f   *. *.Get list o
3650: 66 20 43 65 72 74 69 66 69 63 61 74 65 20 41 75  f Certificate Au
3660: 74 68 6f 72 69 74 79 20 28 43 41 29 20 49 73 73  thority (CA) Iss
3670: 75 65 72 20 55 52 49 73 0a 20 2a 0a 20 2a 20 52  uer URIs. *. * R
3680: 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 6c 20 6c  esults:. *.Tcl l
3690: 69 73 74 20 6f 66 20 43 41 20 69 73 73 75 65 72  ist of CA issuer
36a0: 20 55 52 49 73 0a 20 2a 0a 20 2a 20 53 69 64 65   URIs. *. * Side
36b0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
36c0: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3710: 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a  ----. */.Tcl_Obj
3720: 20 2a 54 6c 73 5f 78 35 30 39 43 61 49 73 73 75   *Tls_x509CaIssu
3730: 65 72 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ers(Tcl_Interp *
3740: 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65  interp, X509 *ce
3750: 72 74 29 20 7b 0a 20 20 20 20 53 54 41 43 4b 5f  rt) {.    STACK_
3760: 4f 46 28 41 43 43 45 53 53 5f 44 45 53 43 52 49  OF(ACCESS_DESCRI
3770: 50 54 49 4f 4e 29 20 2a 61 64 73 3b 0a 20 20 20  PTION) *ads;.   
3780: 20 41 43 43 45 53 53 5f 44 45 53 43 52 49 50 54   ACCESS_DESCRIPT
3790: 49 4f 4e 20 2a 61 64 3b 0a 20 20 20 20 54 63 6c  ION *ad;.    Tcl
37a0: 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20  _Obj *resultObj 
37b0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
37c0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 75  (0, NULL);.    u
37d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
37e0: 66 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75  f;..    if (resu
37f0: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ltObj == NULL) {
3800: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
3810: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 61     }..    if ((a
3820: 64 73 20 3d 20 28 53 54 41 43 4b 5f 4f 46 28 41  ds = (STACK_OF(A
3830: 43 43 45 53 53 5f 44 45 53 43 52 49 50 54 49 4f  CCESS_DESCRIPTIO
3840: 4e 29 20 2a 29 58 35 30 39 5f 67 65 74 5f 65 78  N) *)X509_get_ex
3850: 74 5f 64 32 69 28 63 65 72 74 2c 20 4e 49 44 5f  t_d2i(cert, NID_
3860: 69 6e 66 6f 5f 61 63 63 65 73 73 2c 20 4e 55 4c  info_access, NUL
3870: 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c  L, NULL)) != NUL
3880: 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69  L) {..for (int i
3890: 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 41 43 43   = 0; i < sk_ACC
38a0: 45 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 5f  ESS_DESCRIPTION_
38b0: 6e 75 6d 28 61 64 73 29 3b 20 69 2b 2b 29 20 7b  num(ads); i++) {
38c0: 0a 09 20 20 20 20 61 64 20 3d 20 28 41 43 43 45  ..    ad = (ACCE
38d0: 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 20 2a  SS_DESCRIPTION *
38e0: 29 73 6b 5f 41 43 43 45 53 53 5f 44 45 53 43 52  )sk_ACCESS_DESCR
38f0: 49 50 54 49 4f 4e 5f 76 61 6c 75 65 28 61 64 73  IPTION_value(ads
3900: 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 4f  , i);..    if (O
3910: 42 4a 5f 6f 62 6a 32 6e 69 64 28 61 64 2d 3e 6d  BJ_obj2nid(ad->m
3920: 65 74 68 6f 64 29 20 3d 3d 20 4e 49 44 5f 61 64  ethod) == NID_ad
3930: 5f 63 61 5f 69 73 73 75 65 72 73 20 26 26 20 61  _ca_issuers && a
3940: 64 2d 3e 6c 6f 63 61 74 69 6f 6e 29 20 7b 0a 09  d->location) {..
3950: 09 69 66 20 28 61 64 2d 3e 6c 6f 63 61 74 69 6f  .if (ad->locatio
3960: 6e 2d 3e 74 79 70 65 20 3d 3d 20 47 45 4e 5f 55  n->type == GEN_U
3970: 52 49 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f  RI) {...    Tcl_
3980: 53 69 7a 65 20 6c 65 6e 20 3d 20 28 54 63 6c 5f  Size len = (Tcl_
3990: 53 69 7a 65 29 20 41 53 4e 31 5f 53 54 52 49 4e  Size) ASN1_STRIN
39a0: 47 5f 74 6f 5f 55 54 46 38 28 26 62 75 66 2c 20  G_to_UTF8(&buf, 
39b0: 61 64 2d 3e 6c 6f 63 61 74 69 6f 6e 2d 3e 64 2e  ad->location->d.
39c0: 75 6e 69 66 6f 72 6d 52 65 73 6f 75 72 63 65 49  uniformResourceI
39d0: 64 65 6e 74 69 66 69 65 72 29 3b 0a 09 09 20 20  dentifier);...  
39e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
39f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3a00: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
3a10: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
3a20: 63 68 61 72 20 2a 29 20 62 75 66 2c 20 6c 65 6e  char *) buf, len
3a30: 29 29 3b 0a 09 09 20 20 20 20 4f 50 45 4e 53 53  ));...    OPENSS
3a40: 4c 5f 66 72 65 65 28 62 75 66 29 3b 0a 09 09 20  L_free(buf);... 
3a50: 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 20     break;...}.. 
3a60: 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 73 6b 5f 41     }..}../* sk_A
3a70: 43 43 45 53 53 5f 44 45 53 43 52 49 50 54 49 4f  CCESS_DESCRIPTIO
3a80: 4e 5f 70 6f 70 5f 66 72 65 65 28 61 64 73 2c 20  N_pop_free(ads, 
3a90: 41 43 43 45 53 53 5f 44 45 53 43 52 49 50 54 49  ACCESS_DESCRIPTI
3aa0: 4f 4e 5f 66 72 65 65 29 3b 20 2a 2f 0a 09 41 55  ON_free); */..AU
3ab0: 54 48 4f 52 49 54 59 5f 49 4e 46 4f 5f 41 43 43  THORITY_INFO_ACC
3ac0: 45 53 53 5f 66 72 65 65 28 61 64 73 29 3b 0a 20  ESS_free(ads);. 
3ad0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
3ae0: 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0c 0a 2f  resultObj;.}.../
3af0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b40: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 4e 65 77 58  -. *. * Tls_NewX
3b50: 35 30 39 4f 62 6a 20 2d 2d 0a 20 2a 0a 20 2a 09  509Obj --. *. *.
3b60: 50 61 72 73 65 73 20 61 20 58 35 30 39 20 63 65  Parses a X509 ce
3b70: 72 74 69 66 69 63 61 74 65 20 61 6e 64 20 72 65  rtificate and re
3b80: 74 75 72 6e 73 20 63 6f 6e 74 65 6e 74 73 20 61  turns contents a
3b90: 73 20 61 20 6b 65 79 2d 76 61 6c 75 65 20 54 63  s a key-value Tc
3ba0: 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65  l list.. *. * Re
3bb0: 73 75 6c 74 3a 0a 20 2a 09 41 20 54 63 6c 20 4c  sult:. *.A Tcl L
3bc0: 69 73 74 20 77 69 74 68 20 74 68 65 20 58 35 30  ist with the X50
3bd0: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e  9 certificate in
3be0: 66 6f 20 61 73 20 61 20 6b 65 79 2d 76 61 6c 75  fo as a key-valu
3bf0: 65 20 6c 69 73 74 0a 20 2a 0a 20 2a 20 53 69 64  e list. *. * Sid
3c00: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
3c10: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ne. *. *--------
3c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c60: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62  -----. */.Tcl_Ob
3c70: 6a 20 2a 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62  j *Tls_NewX509Ob
3c80: 6a 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  j(Tcl_Interp *in
3c90: 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74  terp, X509 *cert
3ca0: 2c 20 69 6e 74 20 61 6c 6c 29 20 7b 0a 20 20 20  , int all) {.   
3cb0: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74   Tcl_Obj *result
3cc0: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Obj = Tcl_NewLis
3cd0: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20  tObj(0, NULL);. 
3ce0: 20 20 20 42 49 4f 20 2a 62 69 6f 20 3d 20 42 49     BIO *bio = BI
3cf0: 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
3d00: 29 29 3b 0a 20 20 20 20 69 6e 74 20 6d 64 6e 69  ));.    int mdni
3d10: 64 2c 20 70 6b 6e 69 64 2c 20 62 69 74 73 3b 0a  d, pknid, bits;.
3d20: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e      Tcl_Size len
3d30: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
3d40: 6e 74 20 75 6c 65 6e 3b 0a 20 20 20 20 75 69 6e  nt ulen;.    uin
3d50: 74 33 32 5f 74 20 78 66 6c 61 67 73 3b 0a 20 20  t32_t xflags;.  
3d60: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
3d70: 66 6c 61 67 73 20 3d 20 58 4e 5f 46 4c 41 47 5f  flags = XN_FLAG_
3d80: 52 46 43 32 32 35 33 20 7c 20 41 53 4e 31 5f 53  RFC2253 | ASN1_S
3d90: 54 52 46 4c 47 53 5f 55 54 46 38 5f 43 4f 4e 56  TRFLGS_UTF8_CONV
3da0: 45 52 54 3b 0a 20 20 20 20 66 6c 61 67 73 20 26  ERT;.    flags &
3db0: 3d 20 7e 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  = ~(unsigned lon
3dc0: 67 29 41 53 4e 31 5f 53 54 52 46 4c 47 53 5f 45  g)ASN1_STRFLGS_E
3dd0: 53 43 5f 4d 53 42 3b 0a 0a 20 20 20 20 63 68 61  SC_MSB;..    cha
3de0: 72 20 2a 62 75 66 66 65 72 20 3d 20 28 63 68 61  r *buffer = (cha
3df0: 72 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 42 55  r *)Tcl_Alloc(BU
3e00: 46 53 49 5a 20 3e 20 45 56 50 5f 4d 41 58 5f 4d  FSIZ > EVP_MAX_M
3e10: 44 5f 53 49 5a 45 20 3f 20 42 55 46 53 49 5a 20  D_SIZE ? BUFSIZ 
3e20: 3a 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a  : EVP_MAX_MD_SIZ
3e30: 45 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  E);..    dprintf
3e40: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
3e50: 20 69 66 20 28 69 6e 74 65 72 70 20 3d 3d 20 4e   if (interp == N
3e60: 55 4c 4c 20 7c 7c 20 63 65 72 74 20 3d 3d 20 4e  ULL || cert == N
3e70: 55 4c 4c 20 7c 7c 20 62 69 6f 20 3d 3d 20 4e 55  ULL || bio == NU
3e80: 4c 4c 20 7c 7c 20 72 65 73 75 6c 74 4f 62 6a 20  LL || resultObj 
3e90: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62 75 66 66 65  == NULL || buffe
3ea0: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  r == NULL) {..Tc
3eb0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 72  l_DecrRefCount(r
3ec0: 65 73 75 6c 74 4f 62 6a 29 3b 0a 09 42 49 4f 5f  esultObj);..BIO_
3ed0: 66 72 65 65 28 62 69 6f 29 3b 0a 09 69 66 20 28  free(bio);..if (
3ee0: 62 75 66 66 65 72 20 21 3d 20 4e 55 4c 4c 29 20  buffer != NULL) 
3ef0: 54 63 6c 5f 46 72 65 65 28 62 75 66 66 65 72 29  Tcl_Free(buffer)
3f00: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
3f10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 69      }..    /* Si
3f20: 67 6e 61 74 75 72 65 20 61 6c 67 6f 72 69 74 68  gnature algorith
3f30: 6d 20 61 6e 64 20 76 61 6c 75 65 20 2d 20 52 46  m and value - RF
3f40: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34  C 5280 section 4
3f50: 2e 31 2e 31 2e 32 20 61 6e 64 20 34 2e 31 2e 31  .1.1.2 and 4.1.1
3f60: 2e 33 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 69 67  .3 */.    /* sig
3f70: 6e 61 74 75 72 65 41 6c 67 6f 72 69 74 68 6d 20  natureAlgorithm 
3f80: 69 73 20 74 68 65 20 69 64 20 6f 66 20 74 68 65  is the id of the
3f90: 20 63 72 79 70 74 6f 67 72 61 70 68 69 63 20 61   cryptographic a
3fa0: 6c 67 6f 72 69 74 68 6d 20 75 73 65 64 20 62 79  lgorithm used by
3fb0: 20 74 68 65 0a 09 43 41 20 74 6f 20 73 69 67 6e   the..CA to sign
3fc0: 20 74 68 69 73 20 63 65 72 74 2e 20 73 69 67 6e   this cert. sign
3fd0: 61 74 75 72 65 56 61 6c 75 65 20 69 73 20 74 68  atureValue is th
3fe0: 65 20 64 69 67 69 74 61 6c 20 73 69 67 6e 61 74  e digital signat
3ff0: 75 72 65 20 63 6f 6d 70 75 74 65 64 0a 09 75 70  ure computed..up
4000: 6f 6e 20 74 68 65 20 41 53 4e 2e 31 20 44 45 52  on the ASN.1 DER
4010: 20 65 6e 63 6f 64 65 64 20 74 62 73 43 65 72 74   encoded tbsCert
4020: 69 66 69 63 61 74 65 2e 20 2a 2f 0a 20 20 20 20  ificate. */.    
4030: 7b 0a 09 63 6f 6e 73 74 20 58 35 30 39 5f 41 4c  {..const X509_AL
4040: 47 4f 52 20 2a 73 69 67 5f 61 6c 67 3b 0a 09 63  GOR *sig_alg;..c
4050: 6f 6e 73 74 20 41 53 4e 31 5f 42 49 54 5f 53 54  onst ASN1_BIT_ST
4060: 52 49 4e 47 20 2a 73 69 67 3b 0a 09 69 6e 74 20  RING *sig;..int 
4070: 73 69 67 5f 6e 69 64 3b 0a 0a 09 58 35 30 39 5f  sig_nid;...X509_
4080: 67 65 74 30 5f 73 69 67 6e 61 74 75 72 65 28 26  get0_signature(&
4090: 73 69 67 2c 20 26 73 69 67 5f 61 6c 67 2c 20 63  sig, &sig_alg, c
40a0: 65 72 74 29 3b 0a 09 2f 2a 20 73 69 67 5f 6e 69  ert);../* sig_ni
40b0: 64 20 3d 20 58 35 30 39 5f 67 65 74 5f 73 69 67  d = X509_get_sig
40c0: 6e 61 74 75 72 65 5f 6e 69 64 28 63 65 72 74 29  nature_nid(cert)
40d0: 20 2a 2f 0a 09 73 69 67 5f 6e 69 64 20 3d 20 4f   */..sig_nid = O
40e0: 42 4a 5f 6f 62 6a 32 6e 69 64 28 73 69 67 5f 61  BJ_obj2nid(sig_a
40f0: 6c 67 2d 3e 61 6c 67 6f 72 69 74 68 6d 29 3b 0a  lg->algorithm);.
4100: 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
4110: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
4120: 22 73 69 67 6e 61 74 75 72 65 41 6c 67 6f 72 69  "signatureAlgori
4130: 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e  thm", OBJ_nid2ln
4140: 28 73 69 67 5f 6e 69 64 29 2c 20 2d 31 29 3b 0a  (sig_nid), -1);.
4150: 09 69 66 20 28 73 69 67 5f 6e 69 64 20 21 3d 20  .if (sig_nid != 
4160: 4e 49 44 5f 75 6e 64 65 66 29 20 7b 0a 09 20 20  NID_undef) {..  
4170: 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e    LAPPEND_OBJ(in
4180: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
4190: 20 22 73 69 67 6e 61 74 75 72 65 56 61 6c 75 65   "signatureValue
41a0: 22 2c 0a 09 09 53 74 72 69 6e 67 5f 74 6f 5f 48  ",...String_to_H
41b0: 65 78 28 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67  ex(ASN1_STRING_g
41c0: 65 74 30 5f 64 61 74 61 28 73 69 67 29 2c 20 41  et0_data(sig), A
41d0: 53 4e 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74  SN1_STRING_lengt
41e0: 68 28 73 69 67 29 29 29 3b 0a 09 7d 20 65 6c 73  h(sig)));..} els
41f0: 65 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44  e {..    LAPPEND
4200: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73  _STR(interp, res
4210: 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75  ultObj, "signatu
4220: 72 65 56 61 6c 75 65 22 2c 20 22 22 2c 20 30 29  reValue", "", 0)
4230: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
4240: 2f 2a 20 56 65 72 73 69 6f 6e 20 6f 66 20 74 68  /* Version of th
4250: 65 20 65 6e 63 6f 64 65 64 20 63 65 72 74 69 66  e encoded certif
4260: 69 63 61 74 65 20 2d 20 52 46 43 20 35 32 38 30  icate - RFC 5280
4270: 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 31   section 4.1.2.1
4280: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
4290: 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 72 65 73  LONG(interp, res
42a0: 75 6c 74 4f 62 6a 2c 20 22 76 65 72 73 69 6f 6e  ultObj, "version
42b0: 22 2c 20 58 35 30 39 5f 67 65 74 5f 76 65 72 73  ", X509_get_vers
42c0: 69 6f 6e 28 63 65 72 74 29 2b 31 29 3b 0a 0a 20  ion(cert)+1);.. 
42d0: 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 6e 75 6d     /* Unique num
42e0: 62 65 72 20 61 73 73 69 67 6e 65 64 20 62 79 20  ber assigned by 
42f0: 43 41 20 74 6f 20 63 65 72 74 69 66 69 63 61 74  CA to certificat
4300: 65 20 2d 20 52 46 43 20 35 32 38 30 20 73 65 63  e - RFC 5280 sec
4310: 74 69 6f 6e 20 34 2e 31 2e 32 2e 32 20 2a 2f 0a  tion 4.1.2.2 */.
4320: 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f      len = BIO_to
4330: 5f 42 75 66 66 65 72 28 69 32 61 5f 41 53 4e 31  _Buffer(i2a_ASN1
4340: 5f 49 4e 54 45 47 45 52 28 62 69 6f 2c 20 58 35  _INTEGER(bio, X5
4350: 30 39 5f 67 65 74 30 5f 73 65 72 69 61 6c 4e 75  09_get0_serialNu
4360: 6d 62 65 72 28 63 65 72 74 29 29 2c 20 62 69 6f  mber(cert)), bio
4370: 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a  , buffer, BUFSIZ
4380: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  );.    LAPPEND_S
4390: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  TR(interp, resul
43a0: 74 4f 62 6a 2c 20 22 73 65 72 69 61 6c 4e 75 6d  tObj, "serialNum
43b0: 62 65 72 22 2c 20 62 75 66 66 65 72 2c 20 6c 65  ber", buffer, le
43c0: 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 69 67 6e  n);..    /* Sign
43d0: 61 74 75 72 65 20 61 6c 67 6f 72 69 74 68 6d 20  ature algorithm 
43e0: 75 73 65 64 20 62 79 20 74 68 65 20 43 41 20 74  used by the CA t
43f0: 6f 20 73 69 67 6e 20 74 68 65 20 63 65 72 74 69  o sign the certi
4400: 66 69 63 61 74 65 2e 20 4d 75 73 74 20 6d 61 74  ficate. Must mat
4410: 63 68 0a 09 73 69 67 6e 61 74 75 72 65 41 6c 67  ch..signatureAlg
4420: 6f 72 69 74 68 6d 2e 20 52 46 43 20 35 32 38 30  orithm. RFC 5280
4430: 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 33   section 4.1.2.3
4440: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
4450: 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75  STR(interp, resu
4460: 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75 72  ltObj, "signatur
4470: 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 58  e", OBJ_nid2ln(X
4480: 35 30 39 5f 67 65 74 5f 73 69 67 6e 61 74 75 72  509_get_signatur
4490: 65 5f 6e 69 64 28 63 65 72 74 29 29 2c 20 2d 31  e_nid(cert)), -1
44a0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 73 73 75 65  );..    /* Issue
44b0: 72 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65  r identifies the
44c0: 20 65 6e 74 69 74 79 20 74 68 61 74 20 73 69 67   entity that sig
44d0: 6e 65 64 20 61 6e 64 20 69 73 73 75 65 64 20 74  ned and issued t
44e0: 68 65 20 63 65 72 74 2e 20 52 46 43 20 35 32 38  he cert. RFC 528
44f0: 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e  0 section 4.1.2.
4500: 34 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42  4 */.    len = B
4510: 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 58 35 30  IO_to_Buffer(X50
4520: 39 5f 4e 41 4d 45 5f 70 72 69 6e 74 5f 65 78 28  9_NAME_print_ex(
4530: 62 69 6f 2c 20 58 35 30 39 5f 67 65 74 5f 69 73  bio, X509_get_is
4540: 73 75 65 72 5f 6e 61 6d 65 28 63 65 72 74 29 2c  suer_name(cert),
4550: 20 30 2c 20 66 6c 61 67 73 29 2c 20 62 69 6f 2c   0, flags), bio,
4560: 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29   buffer, BUFSIZ)
4570: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  ;.    LAPPEND_ST
4580: 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  R(interp, result
4590: 4f 62 6a 2c 20 22 69 73 73 75 65 72 22 2c 20 62  Obj, "issuer", b
45a0: 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a 20 20  uffer, len);..  
45b0: 20 20 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65    /* Certificate
45c0: 20 76 61 6c 69 64 69 74 79 20 70 65 72 69 6f 64   validity period
45d0: 20 69 73 20 74 68 65 20 69 6e 74 65 72 76 61 6c   is the interval
45e0: 20 74 68 65 20 43 41 20 77 61 72 72 61 6e 74 73   the CA warrants
45f0: 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 09 6d   that it will..m
4600: 61 69 6e 74 61 69 6e 20 69 6e 66 6f 20 6f 6e 20  aintain info on 
4610: 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 74 68  the status of th
4620: 65 20 63 65 72 74 69 66 69 63 61 74 65 2e 20 52  e certificate. R
4630: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20  FC 5280 section 
4640: 34 2e 31 2e 32 2e 35 20 2a 2f 0a 20 20 20 20 2f  4.1.2.5 */.    /
4650: 2a 20 47 65 74 20 56 61 6c 69 64 69 74 79 20 2d  * Get Validity -
4660: 20 4e 6f 74 20 42 65 66 6f 72 65 20 2a 2f 0a 20   Not Before */. 
4670: 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f     len = BIO_to_
4680: 42 75 66 66 65 72 28 41 53 4e 31 5f 54 49 4d 45  Buffer(ASN1_TIME
4690: 5f 70 72 69 6e 74 28 62 69 6f 2c 20 58 35 30 39  _print(bio, X509
46a0: 5f 67 65 74 30 5f 6e 6f 74 42 65 66 6f 72 65 28  _get0_notBefore(
46b0: 63 65 72 74 29 29 2c 20 62 69 6f 2c 20 62 75 66  cert)), bio, buf
46c0: 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 20 20  fer, BUFSIZ);.  
46d0: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
46e0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
46f0: 20 22 6e 6f 74 42 65 66 6f 72 65 22 2c 20 62 75   "notBefore", bu
4700: 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a 20 20 20  ffer, len);..   
4710: 20 2f 2a 20 47 65 74 20 56 61 6c 69 64 69 74 79   /* Get Validity
4720: 20 2d 20 4e 6f 74 20 41 66 74 65 72 20 2a 2f 0a   - Not After */.
4730: 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f      len = BIO_to
4740: 5f 42 75 66 66 65 72 28 41 53 4e 31 5f 54 49 4d  _Buffer(ASN1_TIM
4750: 45 5f 70 72 69 6e 74 28 62 69 6f 2c 20 58 35 30  E_print(bio, X50
4760: 39 5f 67 65 74 30 5f 6e 6f 74 41 66 74 65 72 28  9_get0_notAfter(
4770: 63 65 72 74 29 29 2c 20 62 69 6f 2c 20 62 75 66  cert)), bio, buf
4780: 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 20 20  fer, BUFSIZ);.  
4790: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
47a0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
47b0: 20 22 6e 6f 74 41 66 74 65 72 22 2c 20 62 75 66   "notAfter", buf
47c0: 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a 20 20 20 20  fer, len);..    
47d0: 2f 2a 20 53 75 62 6a 65 63 74 20 69 64 65 6e 74  /* Subject ident
47e0: 69 66 69 65 73 20 74 68 65 20 65 6e 74 69 74 79  ifies the entity
47f0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4800: 20 74 68 65 20 70 75 62 6c 69 63 20 6b 65 79 20   the public key 
4810: 73 74 6f 72 65 64 20 69 6e 0a 09 74 68 65 20 73  stored in..the s
4820: 75 62 6a 65 63 74 20 70 75 62 6c 69 63 20 6b 65  ubject public ke
4830: 79 20 66 69 65 6c 64 2e 20 52 46 43 20 35 32 38  y field. RFC 528
4840: 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e  0 section 4.1.2.
4850: 36 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42  6 */.    len = B
4860: 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 58 35 30  IO_to_Buffer(X50
4870: 39 5f 4e 41 4d 45 5f 70 72 69 6e 74 5f 65 78 28  9_NAME_print_ex(
4880: 62 69 6f 2c 20 58 35 30 39 5f 67 65 74 5f 73 75  bio, X509_get_su
4890: 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29  bject_name(cert)
48a0: 2c 20 30 2c 20 66 6c 61 67 73 29 2c 20 62 69 6f  , 0, flags), bio
48b0: 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a  , buffer, BUFSIZ
48c0: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  );.    LAPPEND_S
48d0: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  TR(interp, resul
48e0: 74 4f 62 6a 2c 20 22 73 75 62 6a 65 63 74 22 2c  tObj, "subject",
48f0: 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a   buffer, len);..
4900: 20 20 20 20 2f 2a 20 53 48 41 31 20 44 69 67 65      /* SHA1 Dige
4910: 73 74 20 28 46 69 6e 67 65 72 70 72 69 6e 74 29  st (Fingerprint)
4920: 20 6f 66 20 63 65 72 74 20 2d 20 44 45 52 20 72   of cert - DER r
4930: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f  epresentation */
4940: 0a 20 20 20 20 69 66 20 28 58 35 30 39 5f 64 69  .    if (X509_di
4950: 67 65 73 74 28 63 65 72 74 2c 20 45 56 50 5f 73  gest(cert, EVP_s
4960: 68 61 31 28 29 2c 20 28 75 6e 73 69 67 6e 65 64  ha1(), (unsigned
4970: 20 63 68 61 72 20 2a 29 62 75 66 66 65 72 2c 20   char *)buffer, 
4980: 26 75 6c 65 6e 29 29 20 7b 0a 09 4c 41 50 50 45  &ulen)) {..LAPPE
4990: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72  ND_OBJ(interp, r
49a0: 65 73 75 6c 74 4f 62 6a 2c 20 22 73 68 61 31 5f  esultObj, "sha1_
49b0: 68 61 73 68 22 2c 20 53 74 72 69 6e 67 5f 74 6f  hash", String_to
49c0: 5f 48 65 78 28 28 63 6f 6e 73 74 20 75 6e 73 69  _Hex((const unsi
49d0: 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66  gned char *)buff
49e0: 65 72 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29  er, (int) ulen))
49f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4a00: 53 48 41 32 35 36 20 44 69 67 65 73 74 20 28 46  SHA256 Digest (F
4a10: 69 6e 67 65 72 70 72 69 6e 74 29 20 6f 66 20 63  ingerprint) of c
4a20: 65 72 74 20 2d 20 44 45 52 20 72 65 70 72 65 73  ert - DER repres
4a30: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
4a40: 69 66 20 28 58 35 30 39 5f 64 69 67 65 73 74 28  if (X509_digest(
4a50: 63 65 72 74 2c 20 45 56 50 5f 73 68 61 32 35 36  cert, EVP_sha256
4a60: 28 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  (), (unsigned ch
4a70: 61 72 20 2a 29 62 75 66 66 65 72 2c 20 26 75 6c  ar *)buffer, &ul
4a80: 65 6e 29 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f  en)) {..LAPPEND_
4a90: 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75  OBJ(interp, resu
4aa0: 6c 74 4f 62 6a 2c 20 22 73 68 61 32 35 36 5f 68  ltObj, "sha256_h
4ab0: 61 73 68 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f  ash", String_to_
4ac0: 48 65 78 28 28 63 6f 6e 73 74 20 75 6e 73 69 67  Hex((const unsig
4ad0: 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 65  ned char *)buffe
4ae0: 72 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b  r, (int) ulen));
4af0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
4b00: 75 62 6a 65 63 74 20 50 75 62 6c 69 63 20 4b 65  ubject Public Ke
4b10: 79 20 49 6e 66 6f 20 73 70 65 63 69 66 69 65 73  y Info specifies
4b20: 20 74 68 65 20 70 75 62 6c 69 63 20 6b 65 79 20   the public key 
4b30: 61 6e 64 20 69 64 65 6e 74 69 66 69 65 73 20 74  and identifies t
4b40: 68 65 0a 09 61 6c 67 6f 72 69 74 68 6d 20 77 69  he..algorithm wi
4b50: 74 68 20 77 68 69 63 68 20 74 68 65 20 6b 65 79  th which the key
4b60: 20 69 73 20 75 73 65 64 2e 20 52 46 43 20 35 32   is used. RFC 52
4b70: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32  80 section 4.1.2
4b80: 2e 37 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35  .7 */.    if (X5
4b90: 30 39 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65  09_get_signature
4ba0: 5f 69 6e 66 6f 28 63 65 72 74 2c 20 26 6d 64 6e  _info(cert, &mdn
4bb0: 69 64 2c 20 26 70 6b 6e 69 64 2c 20 26 62 69 74  id, &pknid, &bit
4bc0: 73 2c 20 26 78 66 6c 61 67 73 29 29 20 7b 0a 23  s, &xflags)) {.#
4bd0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
4be0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 34 30  ON_NUMBER < 0x40
4bf0: 30 30 30 30 30 30 4c 0a 09 41 53 4e 31 5f 42 49  000000L..ASN1_BI
4c00: 54 5f 53 54 52 49 4e 47 20 2a 6b 65 79 3b 0a 23  T_STRING *key;.#
4c10: 65 6c 73 65 0a 09 63 6f 6e 73 74 20 41 53 4e 31  else..const ASN1
4c20: 5f 42 49 54 5f 53 54 52 49 4e 47 20 2a 6b 65 79  _BIT_STRING *key
4c30: 3b 0a 23 65 6e 64 69 66 0a 09 75 6e 73 69 67 6e  ;.#endif..unsign
4c40: 65 64 20 69 6e 74 20 6e 3b 0a 0a 09 4c 41 50 50  ed int n;...LAPP
4c50: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
4c60: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e  resultObj, "sign
4c70: 69 6e 67 44 69 67 65 73 74 22 2c 20 4f 42 4a 5f  ingDigest", OBJ_
4c80: 6e 69 64 32 6c 6e 28 6d 64 6e 69 64 29 2c 20 2d  nid2ln(mdnid), -
4c90: 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  1);..LAPPEND_STR
4ca0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
4cb0: 62 6a 2c 20 22 70 75 62 6c 69 63 4b 65 79 41 6c  bj, "publicKeyAl
4cc0: 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69  gorithm", OBJ_ni
4cd0: 64 32 6c 6e 28 70 6b 6e 69 64 29 2c 20 2d 31 29  d2ln(pknid), -1)
4ce0: 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69  ;..LAPPEND_INT(i
4cf0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
4d00: 2c 20 22 62 69 74 73 22 2c 20 62 69 74 73 29 3b  , "bits", bits);
4d10: 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 65   /* Effective se
4d20: 63 75 72 69 74 79 20 62 69 74 73 20 2a 2f 0a 0a  curity bits */..
4d30: 09 6b 65 79 20 3d 20 58 35 30 39 5f 67 65 74 30  .key = X509_get0
4d40: 5f 70 75 62 6b 65 79 5f 62 69 74 73 74 72 28 63  _pubkey_bitstr(c
4d50: 65 72 74 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 4f  ert);..LAPPEND_O
4d60: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  BJ(interp, resul
4d70: 74 4f 62 6a 2c 20 22 70 75 62 6c 69 63 4b 65 79  tObj, "publicKey
4d80: 22 2c 0a 09 20 20 20 20 53 74 72 69 6e 67 5f 74  ",..    String_t
4d90: 6f 5f 48 65 78 28 41 53 4e 31 5f 53 54 52 49 4e  o_Hex(ASN1_STRIN
4da0: 47 5f 67 65 74 30 5f 64 61 74 61 28 6b 65 79 29  G_get0_data(key)
4db0: 2c 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c 65  , ASN1_STRING_le
4dc0: 6e 67 74 68 28 6b 65 79 29 29 29 3b 0a 0a 09 69  ngth(key)));...i
4dd0: 66 20 28 58 35 30 39 5f 70 75 62 6b 65 79 5f 64  f (X509_pubkey_d
4de0: 69 67 65 73 74 28 63 65 72 74 2c 20 45 56 50 5f  igest(cert, EVP_
4df0: 67 65 74 5f 64 69 67 65 73 74 62 79 6e 69 64 28  get_digestbynid(
4e00: 70 6b 6e 69 64 29 2c 20 28 75 6e 73 69 67 6e 65  pknid), (unsigne
4e10: 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 72 2c  d char *)buffer,
4e20: 20 26 6e 29 29 20 7b 0a 09 20 20 20 20 4c 41 50   &n)) {..    LAP
4e30: 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c  PEND_OBJ(interp,
4e40: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 75 62   resultObj, "pub
4e50: 6c 69 63 4b 65 79 48 61 73 68 22 2c 20 53 74 72  licKeyHash", Str
4e60: 69 6e 67 5f 74 6f 5f 48 65 78 28 28 63 6f 6e 73  ing_to_Hex((cons
4e70: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4e80: 2a 29 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20  *)buffer, (int) 
4e90: 6e 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  n));..} else {..
4ea0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
4eb0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
4ec0: 6a 2c 20 22 70 75 62 6c 69 63 4b 65 79 48 61 73  j, "publicKeyHas
4ed0: 68 22 2c 20 22 22 2c 20 30 29 3b 0a 09 7d 0a 0a  h", "", 0);..}..
4ee0: 09 2f 2a 20 64 69 67 65 73 74 20 6f 66 20 74 68  ./* digest of th
4ef0: 65 20 44 45 52 20 72 65 70 72 65 73 65 6e 74 61  e DER representa
4f00: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 65 72 74  tion of the cert
4f10: 69 66 69 63 61 74 65 20 2a 2f 0a 09 69 66 20 28  ificate */..if (
4f20: 58 35 30 39 5f 64 69 67 65 73 74 28 63 65 72 74  X509_digest(cert
4f30: 2c 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74  , EVP_get_digest
4f40: 62 79 6e 69 64 28 6d 64 6e 69 64 29 2c 20 28 75  bynid(mdnid), (u
4f50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62  nsigned char *)b
4f60: 75 66 66 65 72 2c 20 26 6e 29 29 20 7b 0a 09 20  uffer, &n)) {.. 
4f70: 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69     LAPPEND_OBJ(i
4f80: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
4f90: 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68  , "signatureHash
4fa0: 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78  ", String_to_Hex
4fb0: 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  ((const unsigned
4fc0: 20 63 68 61 72 20 2a 29 62 75 66 66 65 72 2c 20   char *)buffer, 
4fd0: 28 69 6e 74 29 20 6e 29 29 3b 0a 09 7d 20 65 6c  (int) n));..} el
4fe0: 73 65 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e  se {..    LAPPEN
4ff0: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65  D_STR(interp, re
5000: 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74  sultObj, "signat
5010: 75 72 65 48 61 73 68 22 2c 20 22 22 2c 20 30 29  ureHash", "", 0)
5020: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
5030: 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65 20 50  /* Certificate P
5040: 75 72 70 6f 73 65 2e 20 43 61 6c 6c 20 62 65 66  urpose. Call bef
5050: 6f 72 65 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  ore checking for
5060: 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 2a 2f 0a   extensions. */.
5070: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
5080: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
5090: 6a 2c 20 22 70 75 72 70 6f 73 65 22 2c 20 54 6c  j, "purpose", Tl
50a0: 73 5f 78 35 30 39 50 75 72 70 6f 73 65 28 63 65  s_x509Purpose(ce
50b0: 72 74 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41  rt), -1);.    LA
50c0: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70  PPEND_OBJ(interp
50d0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 63 65  , resultObj, "ce
50e0: 72 74 69 66 69 63 61 74 65 50 75 72 70 6f 73 65  rtificatePurpose
50f0: 22 2c 20 54 6c 73 5f 78 35 30 39 50 75 72 70 6f  ", Tls_x509Purpo
5100: 73 65 73 28 69 6e 74 65 72 70 2c 20 63 65 72 74  ses(interp, cert
5110: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20  ));..    /* Get 
5120: 65 78 74 65 6e 73 69 6f 6e 73 20 66 6c 61 67 73  extensions flags
5130: 20 2a 2f 0a 20 20 20 20 78 66 6c 61 67 73 20 3d   */.    xflags =
5140: 20 58 35 30 39 5f 67 65 74 5f 65 78 74 65 6e 73   X509_get_extens
5150: 69 6f 6e 5f 66 6c 61 67 73 28 63 65 72 74 29 3b  ion_flags(cert);
5160: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54  .    LAPPEND_INT
5170: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
5180: 62 6a 2c 20 22 65 78 74 46 6c 61 67 73 22 2c 20  bj, "extFlags", 
5190: 78 66 6c 61 67 73 29 3b 0a 0a 09 2f 2a 20 43 68  xflags);.../* Ch
51a0: 65 63 6b 20 69 66 20 63 65 72 74 20 77 61 73 20  eck if cert was 
51b0: 69 73 73 75 65 64 20 62 79 20 43 41 20 63 65 72  issued by CA cer
51c0: 74 20 69 73 73 75 65 72 20 6f 72 20 73 65 6c 66  t issuer or self
51d0: 20 73 69 67 6e 65 64 20 2a 2f 0a 20 20 20 20 4c   signed */.    L
51e0: 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
51f0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
5200: 73 65 6c 66 49 73 73 75 65 64 22 2c 20 78 66 6c  selfIssued", xfl
5210: 61 67 73 20 26 20 45 58 46 4c 41 47 5f 53 49 29  ags & EXFLAG_SI)
5220: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f  ;.    LAPPEND_BO
5230: 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  OL(interp, resul
5240: 74 4f 62 6a 2c 20 22 73 65 6c 66 53 69 67 6e 65  tObj, "selfSigne
5250: 64 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58 46  d", xflags & EXF
5260: 4c 41 47 5f 53 53 29 3b 0a 20 20 20 20 4c 41 50  LAG_SS);.    LAP
5270: 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
5280: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 69 73  , resultObj, "is
5290: 50 72 6f 78 79 43 65 72 74 22 2c 20 78 66 6c 61  ProxyCert", xfla
52a0: 67 73 20 26 20 45 58 46 4c 41 47 5f 50 52 4f 58  gs & EXFLAG_PROX
52b0: 59 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  Y);.    LAPPEND_
52c0: 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65 73  BOOL(interp, res
52d0: 75 6c 74 4f 62 6a 2c 20 22 65 78 74 49 6e 76 61  ultObj, "extInva
52e0: 6c 69 64 22 2c 20 78 66 6c 61 67 73 20 26 20 45  lid", xflags & E
52f0: 58 46 4c 41 47 5f 49 4e 56 41 4c 49 44 29 3b 0a  XFLAG_INVALID);.
5300: 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c      LAPPEND_BOOL
5310: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
5320: 62 6a 2c 20 22 69 73 43 41 43 65 72 74 22 2c 20  bj, "isCACert", 
5330: 58 35 30 39 5f 63 68 65 63 6b 5f 63 61 28 63 65  X509_check_ca(ce
5340: 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  rt));..    /* Th
5350: 65 20 55 6e 69 71 75 65 20 49 64 73 20 61 72 65  e Unique Ids are
5360: 20 75 73 65 64 20 74 6f 20 68 61 6e 64 6c 65 20   used to handle 
5370: 74 68 65 20 70 6f 73 73 69 62 69 6c 69 74 79 20  the possibility 
5380: 6f 66 20 72 65 75 73 65 20 6f 66 20 73 75 62 6a  of reuse of subj
5390: 65 63 74 0a 09 61 6e 64 2f 6f 72 20 69 73 73 75  ect..and/or issu
53a0: 65 72 20 6e 61 6d 65 73 20 6f 76 65 72 20 74 69  er names over ti
53b0: 6d 65 2e 20 52 46 43 20 35 32 38 30 20 73 65 63  me. RFC 5280 sec
53c0: 74 69 6f 6e 20 34 2e 31 2e 32 2e 38 20 2a 2f 0a  tion 4.1.2.8 */.
53d0: 20 20 20 20 7b 0a 09 63 6f 6e 73 74 20 41 53 4e      {..const ASN
53e0: 31 5f 42 49 54 5f 53 54 52 49 4e 47 20 2a 69 75  1_BIT_STRING *iu
53f0: 69 64 2c 20 2a 73 75 69 64 3b 0a 09 58 35 30 39  id, *suid;..X509
5400: 5f 67 65 74 30 5f 75 69 64 73 28 63 65 72 74 2c  _get0_uids(cert,
5410: 20 26 69 75 69 64 2c 20 26 73 75 69 64 29 3b 0a   &iuid, &suid);.
5420: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
5430: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5440: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
5450: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
5460: 69 73 73 75 65 72 55 6e 69 71 75 65 49 64 22 2c  issuerUniqueId",
5470: 20 2d 31 29 29 3b 0a 09 69 66 20 28 69 75 69 64   -1));..if (iuid
5480: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
5490: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
54a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
54b0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 0a 09 09 54  , resultObj,...T
54c0: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
54d0: 62 6a 28 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67  bj(ASN1_STRING_g
54e0: 65 74 30 5f 64 61 74 61 28 69 75 69 64 29 2c 20  et0_data(iuid), 
54f0: 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31 5f  (Tcl_Size) ASN1_
5500: 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 69 75  STRING_length(iu
5510: 69 64 29 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  id)));..} else {
5520: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
5530: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
5540: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
5550: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5560: 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  bj("", -1));..}.
5570: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
5580: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5590: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
55a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
55b0: 73 75 62 6a 65 63 74 55 6e 69 71 75 65 49 64 22  subjectUniqueId"
55c0: 2c 20 2d 31 29 29 3b 0a 09 69 66 20 28 73 75 69  , -1));..if (sui
55d0: 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  d != NULL) {..  
55e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
55f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5600: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 0a 09 09  p, resultObj,...
5610: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
5620: 4f 62 6a 28 41 53 4e 31 5f 53 54 52 49 4e 47 5f  Obj(ASN1_STRING_
5630: 67 65 74 30 5f 64 61 74 61 28 73 75 69 64 29 2c  get0_data(suid),
5640: 20 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31   (Tcl_Size) ASN1
5650: 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 73  _STRING_length(s
5660: 75 69 64 29 29 29 3b 0a 09 7d 20 65 6c 73 65 20  uid)));..} else 
5670: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
5680: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5690: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
56a0: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  j, Tcl_NewString
56b0: 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 09 7d  Obj("", -1));..}
56c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 58  .    }..    /* X
56d0: 35 30 39 20 76 33 20 45 78 74 65 6e 73 69 6f 6e  509 v3 Extension
56e0: 73 20 2d 20 52 46 43 20 35 32 38 30 20 73 65 63  s - RFC 5280 sec
56f0: 74 69 6f 6e 20 34 2e 31 2e 32 2e 39 20 2a 2f 0a  tion 4.1.2.9 */.
5700: 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28      LAPPEND_INT(
5710: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
5720: 6a 2c 20 22 65 78 74 43 6f 75 6e 74 22 2c 20 58  j, "extCount", X
5730: 35 30 39 5f 67 65 74 5f 65 78 74 5f 63 6f 75 6e  509_get_ext_coun
5740: 74 28 63 65 72 74 29 29 3b 0a 20 20 20 20 4c 41  t(cert));.    LA
5750: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70  PPEND_OBJ(interp
5760: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78  , resultObj, "ex
5770: 74 65 6e 73 69 6f 6e 73 22 2c 20 54 6c 73 5f 78  tensions", Tls_x
5780: 35 30 39 45 78 74 65 6e 73 69 6f 6e 73 28 69 6e  509Extensions(in
5790: 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20  terp, cert));.. 
57a0: 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 74 79 20     /* Authority 
57b0: 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 20 28  Key Identifier (
57c0: 41 4b 49 29 20 69 73 20 74 68 65 20 53 75 62 6a  AKI) is the Subj
57d0: 65 63 74 20 4b 65 79 20 49 64 65 6e 74 69 66 69  ect Key Identifi
57e0: 65 72 20 28 53 4b 49 29 20 6f 66 0a 09 69 74 73  er (SKI) of..its
57f0: 20 73 69 67 6e 65 72 20 28 74 68 65 20 43 41 29   signer (the CA)
5800: 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69  . RFC 5280 secti
5810: 6f 6e 20 34 2e 32 2e 31 2e 31 2c 20 4e 49 44 5f  on 4.2.1.1, NID_
5820: 61 75 74 68 6f 72 69 74 79 5f 6b 65 79 5f 69 64  authority_key_id
5830: 65 6e 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20  entifier */.    
5840: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65  LAPPEND_OBJ(inte
5850: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
5860: 61 75 74 68 6f 72 69 74 79 4b 65 79 49 64 65 6e  authorityKeyIden
5870: 74 69 66 69 65 72 22 2c 0a 09 54 6c 73 5f 78 35  tifier",..Tls_x5
5880: 30 39 49 64 65 6e 74 69 66 69 65 72 28 58 35 30  09Identifier(X50
5890: 39 5f 67 65 74 30 5f 61 75 74 68 6f 72 69 74 79  9_get0_authority
58a0: 5f 6b 65 79 5f 69 64 28 63 65 72 74 29 29 29 3b  _key_id(cert)));
58b0: 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74  ..    /* Subject
58c0: 20 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 20   Key Identifier 
58d0: 28 53 4b 49 29 20 69 73 20 75 73 65 64 20 74 6f  (SKI) is used to
58e0: 20 69 64 65 6e 74 69 66 79 20 63 65 72 74 69 66   identify certif
58f0: 69 63 61 74 65 73 20 74 68 61 74 20 63 6f 6e 74  icates that cont
5900: 61 69 6e 0a 09 61 20 70 61 72 74 69 63 75 6c 61  ain..a particula
5910: 72 20 70 75 62 6c 69 63 20 6b 65 79 2e 20 52 46  r public key. RF
5920: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34  C 5280 section 4
5930: 2e 32 2e 31 2e 32 2c 20 4e 49 44 5f 73 75 62 6a  .2.1.2, NID_subj
5940: 65 63 74 5f 6b 65 79 5f 69 64 65 6e 74 69 66 69  ect_key_identifi
5950: 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  er */.    LAPPEN
5960: 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65  D_OBJ(interp, re
5970: 73 75 6c 74 4f 62 6a 2c 20 22 73 75 62 6a 65 63  sultObj, "subjec
5980: 74 4b 65 79 49 64 65 6e 74 69 66 69 65 72 22 2c  tKeyIdentifier",
5990: 0a 09 54 6c 73 5f 78 35 30 39 49 64 65 6e 74 69  ..Tls_x509Identi
59a0: 66 69 65 72 28 58 35 30 39 5f 67 65 74 30 5f 73  fier(X509_get0_s
59b0: 75 62 6a 65 63 74 5f 6b 65 79 5f 69 64 28 63 65  ubject_key_id(ce
59c0: 72 74 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4b  rt)));..    /* K
59d0: 65 79 20 75 73 61 67 65 20 65 78 74 65 6e 73 69  ey usage extensi
59e0: 6f 6e 20 64 65 66 69 6e 65 73 20 74 68 65 20 70  on defines the p
59f0: 75 72 70 6f 73 65 20 28 65 2e 67 2e 2c 20 65 6e  urpose (e.g., en
5a00: 63 69 70 68 65 72 6d 65 6e 74 2c 20 73 69 67 6e  cipherment, sign
5a10: 61 74 75 72 65 2c 20 63 65 72 74 69 66 69 63 61  ature, certifica
5a20: 74 65 0a 09 73 69 67 6e 69 6e 67 29 20 6f 66 20  te..signing) of 
5a30: 74 68 65 20 6b 65 79 20 69 6e 20 74 68 65 20 63  the key in the c
5a40: 65 72 74 69 66 69 63 61 74 65 2e 20 52 46 43 20  ertificate. RFC 
5a50: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32  5280 section 4.2
5a60: 2e 31 2e 33 2c 20 4e 49 44 5f 6b 65 79 5f 75 73  .1.3, NID_key_us
5a70: 61 67 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45  age */.    LAPPE
5a80: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72  ND_OBJ(interp, r
5a90: 65 73 75 6c 74 4f 62 6a 2c 20 22 6b 65 79 55 73  esultObj, "keyUs
5aa0: 61 67 65 22 2c 20 54 6c 73 5f 78 35 30 39 4b 65  age", Tls_x509Ke
5ab0: 79 55 73 61 67 65 28 69 6e 74 65 72 70 2c 20 63  yUsage(interp, c
5ac0: 65 72 74 2c 20 78 66 6c 61 67 73 29 29 3b 0a 0a  ert, xflags));..
5ad0: 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63 61      /* Certifica
5ae0: 74 65 20 50 6f 6c 69 63 69 65 73 20 2d 20 69 6e  te Policies - in
5af0: 64 69 63 61 74 65 73 20 74 68 65 20 69 73 73 75  dicates the issu
5b00: 69 6e 67 20 43 41 20 63 6f 6e 73 69 64 65 72 73  ing CA considers
5b10: 20 69 74 73 20 69 73 73 75 65 72 44 6f 6d 61 69   its issuerDomai
5b20: 6e 50 6f 6c 69 63 79 0a 09 65 71 75 69 76 61 6c  nPolicy..equival
5b30: 65 6e 74 20 74 6f 20 74 68 65 20 73 75 62 6a 65  ent to the subje
5b40: 63 74 20 43 41 27 73 20 73 75 62 6a 65 63 74 44  ct CA's subjectD
5b50: 6f 6d 61 69 6e 50 6f 6c 69 63 79 2e 20 52 46 43  omainPolicy. RFC
5b60: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
5b70: 32 2e 31 2e 34 2c 20 4e 49 44 5f 63 65 72 74 69  2.1.4, NID_certi
5b80: 66 69 63 61 74 65 5f 70 6f 6c 69 63 69 65 73 20  ficate_policies 
5b90: 2a 2f 0a 20 20 20 20 69 66 20 28 78 66 6c 61 67  */.    if (xflag
5ba0: 73 20 26 20 45 58 46 4c 41 47 5f 49 4e 56 41 4c  s & EXFLAG_INVAL
5bb0: 49 44 5f 50 4f 4c 49 43 59 29 20 7b 0a 09 2f 2a  ID_POLICY) {../*
5bc0: 20 52 65 6a 65 63 74 20 63 65 72 74 20 2a 2f 0a   Reject cert */.
5bd0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f      }..    /* Po
5be0: 6c 69 63 79 20 4d 61 70 70 69 6e 67 73 20 2d 20  licy Mappings - 
5bf0: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e  RFC 5280 section
5c00: 20 34 2e 32 2e 31 2e 35 2c 20 4e 49 44 5f 70 6f   4.2.1.5, NID_po
5c10: 6c 69 63 79 5f 6d 61 70 70 69 6e 67 73 20 2a 2f  licy_mappings */
5c20: 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74  ..    /* Subject
5c30: 20 41 6c 74 65 72 6e 61 74 69 76 65 20 4e 61 6d   Alternative Nam
5c40: 65 20 28 53 41 4e 29 20 63 6f 6e 74 61 69 6e 73  e (SAN) contains
5c50: 20 61 64 64 69 74 69 6f 6e 61 6c 20 55 52 4c 73   additional URLs
5c60: 2c 20 44 4e 53 20 6e 61 6d 65 73 2c 20 6f 72 20  , DNS names, or 
5c70: 49 50 0a 09 61 64 64 72 65 73 73 65 73 20 62 6f  IP..addresses bo
5c80: 75 6e 64 20 74 6f 20 63 65 72 74 69 66 69 63 61  und to certifica
5c90: 74 65 2e 20 52 46 43 20 35 32 38 30 20 73 65 63  te. RFC 5280 sec
5ca0: 74 69 6f 6e 20 34 2e 32 2e 31 2e 36 2c 20 4e 49  tion 4.2.1.6, NI
5cb0: 44 5f 73 75 62 6a 65 63 74 5f 61 6c 74 5f 6e 61  D_subject_alt_na
5cc0: 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  me */.    LAPPEN
5cd0: 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65  D_OBJ(interp, re
5ce0: 73 75 6c 74 4f 62 6a 2c 20 22 73 75 62 6a 65 63  sultObj, "subjec
5cf0: 74 41 6c 74 4e 61 6d 65 22 2c 20 54 6c 73 5f 78  tAltName", Tls_x
5d00: 35 30 39 4e 61 6d 65 73 28 69 6e 74 65 72 70 2c  509Names(interp,
5d10: 20 63 65 72 74 2c 20 4e 49 44 5f 73 75 62 6a 65   cert, NID_subje
5d20: 63 74 5f 61 6c 74 5f 6e 61 6d 65 2c 20 62 69 6f  ct_alt_name, bio
5d30: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 73 73 75  ));..    /* Issu
5d40: 65 72 20 41 6c 74 65 72 6e 61 74 69 76 65 20 4e  er Alternative N
5d50: 61 6d 65 20 69 73 20 75 73 65 64 20 74 6f 20 61  ame is used to a
5d60: 73 73 6f 63 69 61 74 65 20 49 6e 74 65 72 6e 65  ssociate Interne
5d70: 74 20 73 74 79 6c 65 20 69 64 65 6e 74 69 74 69  t style identiti
5d80: 65 73 0a 09 77 69 74 68 20 74 68 65 20 63 65 72  es..with the cer
5d90: 74 69 66 69 63 61 74 65 20 69 73 73 75 65 72 2e  tificate issuer.
5da0: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f   RFC 5280 sectio
5db0: 6e 20 34 2e 32 2e 31 2e 37 2c 20 4e 49 44 5f 69  n 4.2.1.7, NID_i
5dc0: 73 73 75 65 72 5f 61 6c 74 5f 6e 61 6d 65 20 2a  ssuer_alt_name *
5dd0: 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42  /.    LAPPEND_OB
5de0: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  J(interp, result
5df0: 4f 62 6a 2c 20 22 69 73 73 75 65 72 41 6c 74 4e  Obj, "issuerAltN
5e00: 61 6d 65 22 2c 20 54 6c 73 5f 78 35 30 39 4e 61  ame", Tls_x509Na
5e10: 6d 65 73 28 69 6e 74 65 72 70 2c 20 63 65 72 74  mes(interp, cert
5e20: 2c 20 4e 49 44 5f 69 73 73 75 65 72 5f 61 6c 74  , NID_issuer_alt
5e30: 5f 6e 61 6d 65 2c 20 62 69 6f 29 29 3b 0a 0a 20  _name, bio));.. 
5e40: 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 44 69     /* Subject Di
5e50: 72 65 63 74 6f 72 79 20 41 74 74 72 69 62 75 74  rectory Attribut
5e60: 65 73 20 70 72 6f 76 69 64 65 73 20 69 64 65 6e  es provides iden
5e70: 74 69 66 69 63 61 74 69 6f 6e 20 61 74 74 72 69  tification attri
5e80: 62 75 74 65 73 20 28 65 2e 67 2e 2c 20 6e 61 74  butes (e.g., nat
5e90: 69 6f 6e 61 6c 69 74 79 29 0a 09 6f 66 20 74 68  ionality)..of th
5ea0: 65 20 73 75 62 6a 65 63 74 2e 20 52 46 43 20 35  e subject. RFC 5
5eb0: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e  280 section 4.2.
5ec0: 31 2e 38 20 28 73 75 62 6a 65 63 74 44 69 72 65  1.8 (subjectDire
5ed0: 63 74 6f 72 79 41 74 74 72 69 62 75 74 65 73 29  ctoryAttributes)
5ee0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 42 61 73 69   */..    /* Basi
5ef0: 63 20 43 6f 6e 73 74 72 61 69 6e 74 73 20 69 64  c Constraints id
5f00: 65 6e 74 69 66 69 65 73 20 77 68 65 74 68 65 72  entifies whether
5f10: 20 74 68 65 20 73 75 62 6a 65 63 74 20 6f 66 20   the subject of 
5f20: 74 68 65 20 63 65 72 74 20 69 73 20 61 20 43 41  the cert is a CA
5f30: 20 61 6e 64 0a 09 74 68 65 20 6d 61 78 20 64 65   and..the max de
5f40: 70 74 68 20 6f 66 20 76 61 6c 69 64 20 63 65 72  pth of valid cer
5f50: 74 20 70 61 74 68 73 20 66 6f 72 20 74 68 69 73  t paths for this
5f60: 20 63 65 72 74 2e 20 52 46 43 20 35 32 38 30 20   cert. RFC 5280 
5f70: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 39 2c  section 4.2.1.9,
5f80: 20 4e 49 44 5f 62 61 73 69 63 5f 63 6f 6e 73 74   NID_basic_const
5f90: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 69 66  raints */.    if
5fa0: 20 28 21 28 78 66 6c 61 67 73 20 26 20 45 58 46   (!(xflags & EXF
5fb0: 4c 41 47 5f 50 52 4f 58 59 29 29 20 7b 0a 09 4c  LAG_PROXY)) {..L
5fc0: 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65  APPEND_LONG(inte
5fd0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
5fe0: 70 61 74 68 4c 65 6e 22 2c 20 58 35 30 39 5f 67  pathLen", X509_g
5ff0: 65 74 5f 70 61 74 68 6c 65 6e 28 63 65 72 74 29  et_pathlen(cert)
6000: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
6010: 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e  .LAPPEND_LONG(in
6020: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
6030: 20 22 70 61 74 68 4c 65 6e 22 2c 20 58 35 30 39   "pathLen", X509
6040: 5f 67 65 74 5f 70 72 6f 78 79 5f 70 61 74 68 6c  _get_proxy_pathl
6050: 65 6e 28 63 65 72 74 29 29 3b 0a 20 20 20 20 7d  en(cert));.    }
6060: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f  .    LAPPEND_BOO
6070: 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  L(interp, result
6080: 4f 62 6a 2c 20 22 62 61 73 69 63 43 6f 6e 73 74  Obj, "basicConst
6090: 72 61 69 6e 74 73 43 41 22 2c 20 78 66 6c 61 67  raintsCA", xflag
60a0: 73 20 26 20 45 58 46 4c 41 47 5f 43 41 29 3b 0a  s & EXFLAG_CA);.
60b0: 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 20 43 6f 6e  .    /* Name Con
60c0: 73 74 72 61 69 6e 74 73 20 69 73 20 6f 6e 6c 79  straints is only
60d0: 20 75 73 65 64 20 69 6e 20 43 41 20 63 65 72 74   used in CA cert
60e0: 73 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  s to indicate th
60f0: 65 20 6e 61 6d 65 20 73 70 61 63 65 20 66 6f 72  e name space for
6100: 0a 09 61 6c 6c 20 73 75 62 6a 65 63 74 20 6e 61  ..all subject na
6110: 6d 65 73 20 69 6e 20 73 75 62 73 65 71 75 65 6e  mes in subsequen
6120: 74 20 63 65 72 74 69 66 69 63 61 74 65 73 20 69  t certificates i
6130: 6e 20 61 20 63 65 72 74 69 66 69 63 61 74 69 6f  n a certificatio
6140: 6e 20 70 61 74 68 0a 09 4d 55 53 54 20 62 65 20  n path..MUST be 
6150: 6c 6f 63 61 74 65 64 2e 20 52 46 43 20 35 32 38  located. RFC 528
6160: 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e  0 section 4.2.1.
6170: 31 30 2c 20 4e 49 44 5f 6e 61 6d 65 5f 63 6f 6e  10, NID_name_con
6180: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20  straints */..   
6190: 20 2f 2a 20 50 6f 6c 69 63 79 20 43 6f 6e 73 74   /* Policy Const
61a0: 72 61 69 6e 74 73 20 69 73 20 6f 6e 6c 79 20 75  raints is only u
61b0: 73 65 64 20 69 6e 20 43 41 20 63 65 72 74 73 20  sed in CA certs 
61c0: 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6c 65 6e  to limit the len
61d0: 67 74 68 20 6f 66 20 61 0a 09 63 65 72 74 20 63  gth of a..cert c
61e0: 68 61 69 6e 20 66 6f 72 20 74 68 61 74 20 43 41  hain for that CA
61f0: 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69  . RFC 5280 secti
6200: 6f 6e 20 34 2e 32 2e 31 2e 31 31 2c 20 4e 49 44  on 4.2.1.11, NID
6210: 5f 70 6f 6c 69 63 79 5f 63 6f 6e 73 74 72 61 69  _policy_constrai
6220: 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45  nts */..    /* E
6230: 78 74 65 6e 64 65 64 20 4b 65 79 20 55 73 61 67  xtended Key Usag
6240: 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  e indicates the 
6250: 70 75 72 70 6f 73 65 73 20 74 68 65 20 63 65 72  purposes the cer
6260: 74 69 66 69 65 64 20 70 75 62 6c 69 63 20 6b 65  tified public ke
6270: 79 20 6d 61 79 20 62 65 0a 09 75 73 65 64 2c 20  y may be..used, 
6280: 62 65 79 6f 6e 64 20 74 68 65 20 62 61 73 69 63  beyond the basic
6290: 20 70 75 72 70 6f 73 65 73 2e 20 52 46 43 20 35   purposes. RFC 5
62a0: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e  280 section 4.2.
62b0: 31 2e 31 32 2c 20 4e 49 44 5f 65 78 74 5f 6b 65  1.12, NID_ext_ke
62c0: 79 5f 75 73 61 67 65 20 2a 2f 0a 20 20 20 20 4c  y_usage */.    L
62d0: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72  APPEND_OBJ(inter
62e0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65  p, resultObj, "e
62f0: 78 74 65 6e 64 65 64 4b 65 79 55 73 61 67 65 22  xtendedKeyUsage"
6300: 2c 20 54 6c 73 5f 78 35 30 39 45 78 74 4b 65 79  , Tls_x509ExtKey
6310: 55 73 61 67 65 28 69 6e 74 65 72 70 2c 20 63 65  Usage(interp, ce
6320: 72 74 2c 20 78 66 6c 61 67 73 29 29 3b 0a 0a 20  rt, xflags));.. 
6330: 20 20 20 2f 2a 20 43 52 4c 20 44 69 73 74 72 69     /* CRL Distri
6340: 62 75 74 69 6f 6e 20 50 6f 69 6e 74 73 20 69 64  bution Points id
6350: 65 6e 74 69 66 69 65 73 20 77 68 65 72 65 20 43  entifies where C
6360: 52 4c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  RL information c
6370: 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  an be obtained..
6380: 09 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f  .RFC 5280 sectio
6390: 6e 20 34 2e 32 2e 31 2e 31 33 2a 2f 0a 20 20 20  n 4.2.1.13*/.   
63a0: 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74   LAPPEND_OBJ(int
63b0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
63c0: 22 63 72 6c 44 69 73 74 72 69 62 75 74 69 6f 6e  "crlDistribution
63d0: 50 6f 69 6e 74 73 22 2c 20 54 6c 73 5f 78 35 30  Points", Tls_x50
63e0: 39 43 72 6c 44 70 28 69 6e 74 65 72 70 2c 20 63  9CrlDp(interp, c
63f0: 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  ert));..    /* F
6400: 72 65 73 68 65 73 74 20 43 52 4c 20 65 78 74 65  reshest CRL exte
6410: 6e 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20  nsion */.    if 
6420: 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47  (xflags & EXFLAG
6430: 5f 46 52 45 53 48 45 53 54 29 20 7b 0a 20 20 20  _FRESHEST) {.   
6440: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 75 74 68 6f   }..    /* Autho
6450: 72 69 74 79 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  rity Information
6460: 20 41 63 63 65 73 73 20 69 6e 64 69 63 61 74 65   Access indicate
6470: 73 20 68 6f 77 20 74 6f 20 61 63 63 65 73 73 20  s how to access 
6480: 69 6e 66 6f 20 61 6e 64 20 73 65 72 76 69 63 65  info and service
6490: 73 0a 09 66 6f 72 20 74 68 65 20 63 65 72 74 69  s..for the certi
64a0: 66 69 63 61 74 65 20 69 73 73 75 65 72 2e 20 52  ficate issuer. R
64b0: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20  FC 5280 section 
64c0: 34 2e 32 2e 32 2e 31 2c 20 4e 49 44 5f 69 6e 66  4.2.2.1, NID_inf
64d0: 6f 5f 61 63 63 65 73 73 20 2a 2f 0a 0a 20 20 20  o_access */..   
64e0: 20 2f 2a 20 4f 6e 2d 6c 69 6e 65 20 43 65 72 74   /* On-line Cert
64f0: 69 66 69 63 61 74 65 20 53 74 61 74 75 73 20 50  ificate Status P
6500: 72 6f 74 6f 63 6f 6c 20 28 4f 53 43 50 29 20 52  rotocol (OSCP) R
6510: 65 73 70 6f 6e 64 65 72 73 20 55 52 4c 20 2a 2f  esponders URL */
6520: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a  .    LAPPEND_OBJ
6530: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
6540: 62 6a 2c 20 22 6f 63 73 70 52 65 73 70 6f 6e 64  bj, "ocspRespond
6550: 65 72 73 22 2c 20 54 6c 73 5f 78 35 30 39 4f 73  ers", Tls_x509Os
6560: 63 70 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29  cp(interp, cert)
6570: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 69  );..    /* Certi
6580: 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 74 79  ficate Authority
6590: 20 28 43 41 29 20 49 73 73 75 65 72 73 20 55 52   (CA) Issuers UR
65a0: 4c 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44  L */.    LAPPEND
65b0: 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73  _OBJ(interp, res
65c0: 75 6c 74 4f 62 6a 2c 20 22 63 61 49 73 73 75 65  ultObj, "caIssue
65d0: 72 73 22 2c 20 54 6c 73 5f 78 35 30 39 43 61 49  rs", Tls_x509CaI
65e0: 73 73 75 65 72 73 28 69 6e 74 65 72 70 2c 20 63  ssuers(interp, c
65f0: 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  ert));..    /* S
6600: 75 62 6a 65 63 74 20 49 6e 66 6f 72 6d 61 74 69  ubject Informati
6610: 6f 6e 20 41 63 63 65 73 73 20 2d 20 52 46 43 20  on Access - RFC 
6620: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32  5280 section 4.2
6630: 2e 32 2e 32 2c 20 4e 49 44 5f 73 69 6e 66 6f 5f  .2.2, NID_sinfo_
6640: 61 63 63 65 73 73 20 2a 2f 0a 0a 20 20 20 20 2f  access */..    /
6650: 2a 20 43 65 72 74 69 66 69 63 61 74 65 20 41 6c  * Certificate Al
6660: 69 61 73 2e 20 49 66 20 75 73 65 73 20 61 20 50  ias. If uses a P
6670: 4b 43 53 23 31 32 20 73 74 72 75 63 74 75 72 65  KCS#12 structure
6680: 2c 20 61 6c 69 61 73 20 77 69 6c 6c 20 72 65 66  , alias will ref
6690: 6c 65 63 74 20 74 68 65 0a 09 66 72 69 65 6e 64  lect the..friend
66a0: 6c 79 4e 61 6d 65 20 61 74 74 72 69 62 75 74 65  lyName attribute
66b0: 20 28 52 46 43 20 32 39 38 35 29 2e 20 2a 2f 0a   (RFC 2985). */.
66c0: 20 20 20 20 7b 0a 09 69 6e 74 20 69 6c 65 6e 20      {..int ilen 
66d0: 3d 20 30 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  = 0;.#if OPENSSL
66e0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
66f0: 3c 20 30 78 34 30 30 30 30 30 30 30 4c 0a 09 75  < 0x40000000L..u
6700: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 74  nsigned char *st
6710: 72 69 6e 67 20 3d 20 58 35 30 39 5f 61 6c 69 61  ring = X509_alia
6720: 73 5f 67 65 74 30 28 63 65 72 74 2c 20 26 69 6c  s_get0(cert, &il
6730: 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 63 6f 6e 73  en);.#else..cons
6740: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
6750: 2a 73 74 72 69 6e 67 20 3d 20 58 35 30 39 5f 61  *string = X509_a
6760: 6c 69 61 73 5f 67 65 74 30 28 63 65 72 74 2c 20  lias_get0(cert, 
6770: 26 69 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 09  &ilen);.#endif..
6780: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
6790: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
67a0: 61 6c 69 61 73 22 2c 20 28 63 68 61 72 20 2a 29  alias", (char *)
67b0: 20 73 74 72 69 6e 67 2c 20 28 54 63 6c 5f 53 69   string, (Tcl_Si
67c0: 7a 65 29 20 69 6c 65 6e 29 3b 0a 09 73 74 72 69  ze) ilen);..stri
67d0: 6e 67 20 3d 20 58 35 30 39 5f 6b 65 79 69 64 5f  ng = X509_keyid_
67e0: 67 65 74 30 28 63 65 72 74 2c 20 26 69 6c 65 6e  get0(cert, &ilen
67f0: 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
6800: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
6810: 6a 2c 20 22 6b 65 79 49 64 22 2c 20 28 63 68 61  j, "keyId", (cha
6820: 72 20 2a 29 20 73 74 72 69 6e 67 2c 20 28 54 63  r *) string, (Tc
6830: 6c 5f 53 69 7a 65 29 20 69 6c 65 6e 29 3b 0a 20  l_Size) ilen);. 
6840: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 65 72     }..    /* Cer
6850: 74 69 66 69 63 61 74 65 20 61 6e 64 20 64 75 6d  tificate and dum
6860: 70 20 61 6c 6c 20 64 61 74 61 20 2a 2f 0a 20 20  p all data */.  
6870: 20 20 69 66 20 28 61 6c 6c 29 20 7b 0a 09 54 63    if (all) {..Tc
6880: 6c 5f 4f 62 6a 20 2a 61 6c 6c 4f 62 6a 20 3d 20  l_Obj *allObj = 
6890: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
68a0: 4f 62 6a 28 4e 55 4c 4c 2c 20 30 29 3b 0a 09 54  Obj(NULL, 0);..T
68b0: 63 6c 5f 4f 62 6a 20 2a 63 65 72 74 4f 62 6a 20  cl_Obj *certObj 
68c0: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
68d0: 61 79 4f 62 6a 28 4e 55 4c 4c 2c 20 30 29 3b 0a  ayObj(NULL, 0);.
68e0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
68f0: 61 6c 6c 53 74 72 2c 20 2a 63 65 72 74 53 74 72  allStr, *certStr
6900: 3b 0a 0a 09 69 66 20 28 61 6c 6c 4f 62 6a 20 3d  ;...if (allObj =
6910: 3d 20 4e 55 4c 4c 20 7c 7c 20 63 65 72 74 4f 62  = NULL || certOb
6920: 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  j == NULL) {..  
6930: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
6940: 6e 74 28 61 6c 6c 4f 62 6a 29 3b 0a 09 20 20 20  nt(allObj);..   
6950: 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a   BIO_free(bio);.
6960: 09 20 20 20 20 54 63 6c 5f 46 72 65 65 28 62 75  .    Tcl_Free(bu
6970: 66 66 65 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ffer);..    retu
6980: 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 09 7d  rn resultObj;..}
6990: 0a 0a 09 2f 2a 20 47 65 74 20 63 65 72 74 69 66  .../* Get certif
69a0: 69 63 61 74 65 20 2a 2f 0a 09 63 65 72 74 53 74  icate */..certSt
69b0: 72 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41  r = Tcl_SetByteA
69c0: 72 72 61 79 4c 65 6e 67 74 68 28 63 65 72 74 4f  rrayLength(certO
69d0: 62 6a 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 5a  bj, CERT_STR_SIZ
69e0: 45 29 3b 0a 09 6c 65 6e 20 3d 20 42 49 4f 5f 74  E);..len = BIO_t
69f0: 6f 5f 42 75 66 66 65 72 28 50 45 4d 5f 77 72 69  o_Buffer(PEM_wri
6a00: 74 65 5f 62 69 6f 5f 58 35 30 39 28 62 69 6f 2c  te_bio_X509(bio,
6a10: 20 63 65 72 74 29 2c 20 62 69 6f 2c 20 63 65 72   cert), bio, cer
6a20: 74 53 74 72 2c 20 43 45 52 54 5f 53 54 52 5f 53  tStr, CERT_STR_S
6a30: 49 5a 45 29 3b 0a 09 54 63 6c 5f 53 65 74 42 79  IZE);..Tcl_SetBy
6a40: 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 63 65  teArrayLength(ce
6a50: 72 74 4f 62 6a 2c 20 6c 65 6e 29 3b 0a 09 4c 41  rtObj, len);..LA
6a60: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70  PPEND_OBJ(interp
6a70: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 63 65  , resultObj, "ce
6a80: 72 74 69 66 69 63 61 74 65 22 2c 20 63 65 72 74  rtificate", cert
6a90: 4f 62 6a 29 0a 0a 09 2f 2a 20 47 65 74 20 61 6c  Obj).../* Get al
6aa0: 6c 20 69 6e 66 6f 20 6f 6e 20 63 65 72 74 69 66  l info on certif
6ab0: 69 63 61 74 65 20 2a 2f 0a 09 61 6c 6c 53 74 72  icate */..allStr
6ac0: 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72   = Tcl_SetByteAr
6ad0: 72 61 79 4c 65 6e 67 74 68 28 61 6c 6c 4f 62 6a  rayLength(allObj
6ae0: 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 20  , CERT_STR_SIZE 
6af0: 2a 20 32 29 3b 0a 09 6c 65 6e 20 3d 20 42 49 4f  * 2);..len = BIO
6b00: 5f 74 6f 5f 42 75 66 66 65 72 28 58 35 30 39 5f  _to_Buffer(X509_
6b10: 70 72 69 6e 74 5f 65 78 28 62 69 6f 2c 20 63 65  print_ex(bio, ce
6b20: 72 74 2c 20 66 6c 61 67 73 2c 20 30 29 2c 20 62  rt, flags, 0), b
6b30: 69 6f 2c 20 61 6c 6c 53 74 72 2c 20 43 45 52 54  io, allStr, CERT
6b40: 5f 53 54 52 5f 53 49 5a 45 20 2a 20 32 29 3b 0a  _STR_SIZE * 2);.
6b50: 09 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61  .Tcl_SetByteArra
6b60: 79 4c 65 6e 67 74 68 28 61 6c 6c 4f 62 6a 2c 20  yLength(allObj, 
6b70: 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 4f  len);..LAPPEND_O
6b80: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  BJ(interp, resul
6b90: 74 4f 62 6a 2c 20 22 61 6c 6c 22 2c 20 61 6c 6c  tObj, "all", all
6ba0: 4f 62 6a 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Obj).    }..    
6bb0: 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20  BIO_free(bio);. 
6bc0: 20 20 20 54 63 6c 5f 46 72 65 65 28 62 75 66 66     Tcl_Free(buff
6bd0: 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
6be0: 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a           resultObj;.}.