Hex Artifact Content

Artifact 8da6be024c79bf281d7998af02586ebd52f5956f9f348fbc4b40d83aeaba3eac:


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 23 69 66  g != NULL) {.#if
0e50: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
0e60: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 34 30 31 30  _NUMBER < 0x4010
0e70: 30 30 30 30 4c 0a 09 72 65 73 75 6c 74 4f 62 6a  0000L..resultObj
0e80: 20 3d 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78   = String_to_Hex
0e90: 28 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74  (ASN1_STRING_get
0ea0: 30 5f 64 61 74 61 28 61 73 74 72 69 6e 67 29 2c  0_data(astring),
0eb0: 0a 09 20 20 20 20 41 53 4e 31 5f 53 54 52 49 4e  ..    ASN1_STRIN
0ec0: 47 5f 6c 65 6e 67 74 68 28 61 73 74 72 69 6e 67  G_length(astring
0ed0: 29 29 3b 0a 23 65 6c 73 65 0a 09 72 65 73 75 6c  ));.#else..resul
0ee0: 74 4f 62 6a 20 3d 20 53 74 72 69 6e 67 5f 74 6f  tObj = String_to
0ef0: 5f 48 65 78 28 41 53 4e 31 5f 53 54 52 49 4e 47  _Hex(ASN1_STRING
0f00: 5f 67 65 74 30 5f 64 61 74 61 28 61 73 74 72 69  _get0_data(astri
0f10: 6e 67 29 2c 0a 09 20 20 20 20 28 69 6e 74 29 20  ng),..    (int) 
0f20: 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74 5f  ASN1_STRING_get_
0f30: 6c 65 6e 67 74 68 28 61 73 74 72 69 6e 67 29 29  length(astring))
0f40: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
0f50: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74     return result
0f60: 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  Obj;.}../*. *---
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
0fc0: 20 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67   Tls_x509KeyUsag
0fd0: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 58  e --. *. *.Get X
0fe0: 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
0ff0: 20 6b 65 79 20 75 73 61 67 65 20 74 79 70 65 73   key usage types
1000: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
1010: 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 74   *.Tcl list of t
1020: 79 70 65 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ypes. *. * Side 
1030: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
1040: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1090: 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20  ---. */.Tcl_Obj 
10a0: 2a 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67  *Tls_x509KeyUsag
10b0: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  e(Tcl_Interp *in
10c0: 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74  terp, X509 *cert
10d0: 2c 20 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67  , uint32_t xflag
10e0: 73 29 20 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f  s) {.    uint32_
10f0: 74 20 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67  t usage = X509_g
1100: 65 74 5f 6b 65 79 5f 75 73 61 67 65 28 63 65 72  et_key_usage(cer
1110: 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  t);.    Tcl_Obj 
1120: 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c  *resultObj = Tcl
1130: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
1140: 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72  ULL);..    if (r
1150: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c  esultObj == NULL
1160: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  ) {..return NULL
1170: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
1180: 28 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41  ((xflags & EXFLA
1190: 47 5f 4b 55 53 41 47 45 29 20 26 26 20 75 73 61  G_KUSAGE) && usa
11a0: 67 65 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58 29  ge < UINT32_MAX)
11b0: 20 7b 0a 09 69 66 20 28 75 73 61 67 65 20 26 20   {..if (usage & 
11c0: 4b 55 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41  KU_DIGITAL_SIGNA
11d0: 54 55 52 45 29 20 7b 0a 09 20 20 20 20 54 63 6c  TURE) {..    Tcl
11e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65  ement(interp, re
1200: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77  sultObj, Tcl_New
1210: 53 74 72 69 6e 67 4f 62 6a 28 22 44 69 67 69 74  StringObj("Digit
1220: 61 6c 20 53 69 67 6e 61 74 75 72 65 22 2c 20 2d  al Signature", -
1230: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61  1));..}..if (usa
1240: 67 65 20 26 20 4b 55 5f 4e 4f 4e 5f 52 45 50 55  ge & KU_NON_REPU
1250: 44 49 41 54 49 4f 4e 29 20 7b 0a 09 20 20 20 20  DIATION) {..    
1260: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1270: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1280: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f   resultObj, Tcl_
1290: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 6f  NewStringObj("No
12a0: 6e 2d 52 65 70 75 64 69 61 74 69 6f 6e 22 2c 20  n-Repudiation", 
12b0: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73  -1));..}..if (us
12c0: 61 67 65 20 26 20 4b 55 5f 4b 45 59 5f 45 4e 43  age & KU_KEY_ENC
12d0: 49 50 48 45 52 4d 45 4e 54 29 20 7b 0a 09 20 20  IPHERMENT) {..  
12e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
12f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1300: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
1310: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
1320: 4b 65 79 20 45 6e 63 69 70 68 65 72 6d 65 6e 74  Key Encipherment
1330: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
1340: 28 75 73 61 67 65 20 26 20 4b 55 5f 44 41 54 41  (usage & KU_DATA
1350: 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 29 20 7b  _ENCIPHERMENT) {
1360: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
1370: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1380: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
1390: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
13a0: 62 6a 28 22 44 61 74 61 20 45 6e 63 69 70 68 65  bj("Data Enciphe
13b0: 72 6d 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d  rment", -1));..}
13c0: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55  ..if (usage & KU
13d0: 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 29 20  _KEY_AGREEMENT) 
13e0: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
13f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1400: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
1410: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  j, Tcl_NewString
1420: 4f 62 6a 28 22 4b 65 79 20 41 67 72 65 65 6d 65  Obj("Key Agreeme
1430: 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  nt", -1));..}..i
1440: 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f 4b 45  f (usage & KU_KE
1450: 59 5f 43 45 52 54 5f 53 49 47 4e 29 20 7b 0a 09  Y_CERT_SIGN) {..
1460: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1470: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1480: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
1490: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
14a0: 28 22 43 65 72 74 69 66 69 63 61 74 65 20 53 69  ("Certificate Si
14b0: 67 6e 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d  gning", -1));..}
14c0: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55  ..if (usage & KU
14d0: 5f 43 52 4c 5f 53 49 47 4e 29 20 7b 0a 09 20 20  _CRL_SIGN) {..  
14e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
14f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1500: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
1510: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
1520: 43 52 4c 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31  CRL Signing", -1
1530: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67  ));..}..if (usag
1540: 65 20 26 20 4b 55 5f 45 4e 43 49 50 48 45 52 5f  e & KU_ENCIPHER_
1550: 4f 4e 4c 59 29 20 7b 0a 09 20 20 20 20 54 63 6c  ONLY) {..    Tcl
1560: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1570: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65  ement(interp, re
1580: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77  sultObj, Tcl_New
1590: 53 74 72 69 6e 67 4f 62 6a 28 22 45 6e 63 69 70  StringObj("Encip
15a0: 68 65 72 20 4f 6e 6c 79 22 2c 20 2d 31 29 29 3b  her Only", -1));
15b0: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26  ..}..if (usage &
15c0: 20 4b 55 5f 44 45 43 49 50 48 45 52 5f 4f 4e 4c   KU_DECIPHER_ONL
15d0: 59 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  Y) {..    Tcl_Li
15e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
15f0: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  nt(interp, resul
1600: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tObj, Tcl_NewStr
1610: 69 6e 67 4f 62 6a 28 22 44 65 63 69 70 68 65 72  ingObj("Decipher
1620: 20 4f 6e 6c 79 22 2c 20 2d 31 29 29 3b 0a 09 7d   Only", -1));..}
1630: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20  .    } else {.. 
1640: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1650: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1660: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54  rp, resultObj, T
1670: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1680: 22 75 6e 72 65 73 74 72 69 63 74 65 64 22 2c 20  "unrestricted", 
1690: 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  -1));.    }.    
16a0: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a  return resultObj
16b0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
16c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e0: 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
1710: 73 5f 78 35 30 39 50 75 72 70 6f 73 65 20 2d 2d  s_x509Purpose --
1720: 0a 20 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30 39  . *. *.Get X.509
1730: 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75 72   certificate pur
1740: 70 6f 73 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  pose. *. * Resul
1750: 74 73 3a 0a 20 2a 09 50 75 72 70 6f 73 65 20 73  ts:. *.Purpose s
1760: 74 72 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65  tring. *. * Side
1770: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
1780: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
1790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d0: 2d 2d 2d 2d 0a 20 2a 2f 0a 63 6f 6e 73 74 20 63  ----. */.const c
17e0: 68 61 72 20 2a 54 6c 73 5f 78 35 30 39 50 75 72  har *Tls_x509Pur
17f0: 70 6f 73 65 28 58 35 30 39 20 2a 63 65 72 74 29  pose(X509 *cert)
1800: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
1810: 72 20 2a 70 75 72 70 6f 73 65 20 3d 20 4e 55 4c  r *purpose = NUL
1820: 4c 3b 0a 0a 20 20 20 20 69 66 20 28 58 35 30 39  L;..    if (X509
1830: 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63  _check_purpose(c
1840: 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53  ert, X509_PURPOS
1850: 45 5f 53 53 4c 5f 43 4c 49 45 4e 54 2c 20 30 29  E_SSL_CLIENT, 0)
1860: 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65   > 0) {..purpose
1870: 20 3d 20 22 53 53 4c 20 43 6c 69 65 6e 74 22 3b   = "SSL Client";
1880: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
1890: 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f  X509_check_purpo
18a0: 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55  se(cert, X509_PU
18b0: 52 50 4f 53 45 5f 53 53 4c 5f 53 45 52 56 45 52  RPOSE_SSL_SERVER
18c0: 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72  , 0) > 0) {..pur
18d0: 70 6f 73 65 20 3d 20 22 53 53 4c 20 53 65 72 76  pose = "SSL Serv
18e0: 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  er";.    } else 
18f0: 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70  if (X509_check_p
1900: 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30  urpose(cert, X50
1910: 39 5f 50 55 52 50 4f 53 45 5f 4e 53 5f 53 53 4c  9_PURPOSE_NS_SSL
1920: 5f 53 45 52 56 45 52 2c 20 30 29 20 3e 20 30 29  _SERVER, 0) > 0)
1930: 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 4d   {..purpose = "M
1940: 53 53 20 53 53 4c 20 53 65 72 76 65 72 22 3b 0a  SS SSL Server";.
1950: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 58      } else if (X
1960: 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73  509_check_purpos
1970: 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52  e(cert, X509_PUR
1980: 50 4f 53 45 5f 53 4d 49 4d 45 5f 53 49 47 4e 2c  POSE_SMIME_SIGN,
1990: 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70   0) > 0) {..purp
19a0: 6f 73 65 20 3d 20 22 53 4d 49 4d 45 20 53 69 67  ose = "SMIME Sig
19b0: 6e 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73  ning";.    } els
19c0: 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b  e if (X509_check
19d0: 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58  _purpose(cert, X
19e0: 35 30 39 5f 50 55 52 50 4f 53 45 5f 53 4d 49 4d  509_PURPOSE_SMIM
19f0: 45 5f 45 4e 43 52 59 50 54 2c 20 30 29 20 3e 20  E_ENCRYPT, 0) > 
1a00: 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20  0) {..purpose = 
1a10: 22 53 4d 49 4d 45 20 45 6e 63 72 79 70 74 69 6f  "SMIME Encryptio
1a20: 6e 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  n";.    } else i
1a30: 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75  f (X509_check_pu
1a40: 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39  rpose(cert, X509
1a50: 5f 50 55 52 50 4f 53 45 5f 43 52 4c 5f 53 49 47  _PURPOSE_CRL_SIG
1a60: 4e 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75  N, 0) > 0) {..pu
1a70: 72 70 6f 73 65 20 3d 20 22 43 52 4c 20 53 69 67  rpose = "CRL Sig
1a80: 6e 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73  ning";.    } els
1a90: 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b  e if (X509_check
1aa0: 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58  _purpose(cert, X
1ab0: 35 30 39 5f 50 55 52 50 4f 53 45 5f 41 4e 59 2c  509_PURPOSE_ANY,
1ac0: 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70   0) > 0) {..purp
1ad0: 6f 73 65 20 3d 20 22 41 6e 79 22 3b 0a 20 20 20  ose = "Any";.   
1ae0: 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39   } else if (X509
1af0: 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63  _check_purpose(c
1b00: 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53  ert, X509_PURPOS
1b10: 45 5f 4f 43 53 50 5f 48 45 4c 50 45 52 2c 20 30  E_OCSP_HELPER, 0
1b20: 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73  ) > 0) {..purpos
1b30: 65 20 3d 20 22 4f 43 53 50 20 48 65 6c 70 65 72  e = "OCSP Helper
1b40: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ";.    } else if
1b50: 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72   (X509_check_pur
1b60: 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f  pose(cert, X509_
1b70: 50 55 52 50 4f 53 45 5f 54 49 4d 45 53 54 41 4d  PURPOSE_TIMESTAM
1b80: 50 5f 53 49 47 4e 2c 20 30 29 20 3e 20 30 29 20  P_SIGN, 0) > 0) 
1b90: 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 54 69  {..purpose = "Ti
1ba0: 6d 65 73 74 61 6d 70 20 53 69 67 6e 69 6e 67 22  mestamp Signing"
1bb0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
1bc0: 70 75 72 70 6f 73 65 20 3d 20 22 22 3b 0a 20 20  purpose = "";.  
1bd0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
1be0: 75 72 70 6f 73 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  urpose;.}../*. *
1bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
1c40: 0a 20 2a 20 54 6c 73 5f 78 35 30 39 50 75 72 70  . * Tls_x509Purp
1c50: 6f 73 65 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65  oses --. *. *.Ge
1c60: 74 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63  t X.509 certific
1c70: 61 74 65 20 70 75 72 70 6f 73 65 20 74 79 70 65  ate purpose type
1c80: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  s. *. * Results:
1c90: 0a 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20  . *.Tcl list of 
1ca0: 65 61 63 68 20 70 75 72 70 6f 73 65 20 61 6e 64  each purpose and
1cb0: 20 77 68 65 74 68 65 72 20 69 74 20 69 73 20 43   whether it is C
1cc0: 41 20 6f 72 20 6e 6f 6e 2d 43 41 0a 20 2a 0a 20  A or non-CA. *. 
1cd0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
1ce0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.None. *. *---
1cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54  ----------. */.T
1d40: 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39  cl_Obj *Tls_x509
1d50: 50 75 72 70 6f 73 65 73 28 54 63 6c 5f 49 6e 74  Purposes(Tcl_Int
1d60: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30  erp *interp, X50
1d70: 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 54  9 *cert) {.    T
1d80: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62  cl_Obj *resultOb
1d90: 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  j = Tcl_NewListO
1da0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  bj(0, NULL);.   
1db0: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 20 2a 70   X509_PURPOSE *p
1dc0: 74 6d 70 3b 0a 0a 20 20 20 20 69 66 20 28 72 65  tmp;..    if (re
1dd0: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29  sultObj == NULL)
1de0: 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b   {..return NULL;
1df0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20  .    }..    for 
1e00: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (int i = 0; i < 
1e10: 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74  X509_PURPOSE_get
1e20: 5f 63 6f 75 6e 74 28 29 3b 20 69 2b 2b 29 20 7b  _count(); i++) {
1e30: 0a 09 70 74 6d 70 20 3d 20 58 35 30 39 5f 50 55  ..ptmp = X509_PU
1e40: 52 50 4f 53 45 5f 67 65 74 30 28 69 29 3b 0a 09  RPOSE_get0(i);..
1e50: 54 63 6c 5f 4f 62 6a 20 2a 74 6d 70 50 74 72 20  Tcl_Obj *tmpPtr 
1e60: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
1e70: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 66 6f 72  (0, NULL);...for
1e80: 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 3c   (int j = 0; j <
1e90: 20 32 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20   2; j++) {..    
1ea0: 69 6e 74 20 69 64 72 65 74 20 3d 20 58 35 30 39  int idret = X509
1eb0: 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63  _check_purpose(c
1ec0: 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53  ert, X509_PURPOS
1ed0: 45 5f 67 65 74 5f 69 64 28 70 74 6d 70 29 2c 20  E_get_id(ptmp), 
1ee0: 6a 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  j);..    Tcl_Lis
1ef0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1f00: 74 28 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 72  t(interp, tmpPtr
1f10: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1f20: 62 6a 28 6a 20 3f 20 22 43 41 22 20 3a 20 22 6e  bj(j ? "CA" : "n
1f30: 6f 6e 43 41 22 2c 20 2d 31 29 29 3b 0a 09 20 20  onCA", -1));..  
1f40: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1f50: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1f60: 70 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c 5f 4e  p, tmpPtr, Tcl_N
1f70: 65 77 53 74 72 69 6e 67 4f 62 6a 28 69 64 72 65  ewStringObj(idre
1f80: 74 20 3d 3d 20 31 20 3f 20 22 59 65 73 22 20 3a  t == 1 ? "Yes" :
1f90: 20 22 4e 6f 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a   "No", -1));..}.
1fa0: 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74  .LAPPEND_OBJ(int
1fb0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
1fc0: 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74  X509_PURPOSE_get
1fd0: 30 5f 6e 61 6d 65 28 70 74 6d 70 29 2c 20 74 6d  0_name(ptmp), tm
1fe0: 70 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pPtr);.    }.   
1ff0: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62   return resultOb
2000: 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  j;.}../*. *-----
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2050: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
2060: 6c 73 5f 78 35 30 39 4e 61 6d 65 73 20 2d 2d 0a  ls_x509Names --.
2070: 20 2a 0a 20 2a 09 47 65 74 20 61 20 6c 69 73 74   *. *.Get a list
2080: 20 6f 66 20 53 75 62 6a 65 63 74 20 41 6c 74 65   of Subject Alte
2090: 72 6e 61 74 65 20 4e 61 6d 65 73 20 28 53 41 4e  rnate Names (SAN
20a0: 29 20 6f 72 20 49 73 73 75 65 72 20 41 6c 74 65  ) or Issuer Alte
20b0: 72 6e 61 74 65 20 4e 61 6d 65 73 0a 20 2a 0a 20  rnate Names. *. 
20c0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63  * Results:. *.Tc
20d0: 6c 20 6c 69 73 74 20 6f 66 20 61 6c 74 65 72 6e  l list of altern
20e0: 61 74 65 20 6e 61 6d 65 73 0a 20 2a 0a 20 2a 20  ate names. *. * 
20f0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
2100: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .None. *. *-----
2110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2150: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c  --------. */.Tcl
2160: 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 4e 61  _Obj *Tls_x509Na
2170: 6d 65 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  mes(Tcl_Interp *
2180: 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65  interp, X509 *ce
2190: 72 74 2c 20 69 6e 74 20 6e 69 64 2c 20 42 49 4f  rt, int nid, BIO
21a0: 20 2a 62 69 6f 29 20 7b 0a 20 20 20 20 53 54 41   *bio) {.    STA
21b0: 43 4b 5f 4f 46 28 47 45 4e 45 52 41 4c 5f 4e 41  CK_OF(GENERAL_NA
21c0: 4d 45 29 20 2a 6e 61 6d 65 73 3b 0a 20 20 20 20  ME) *names;.    
21d0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f  Tcl_Obj *resultO
21e0: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  bj = Tcl_NewList
21f0: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20  Obj(0, NULL);.  
2200: 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a    Tcl_Size len;.
2210: 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b      char buffer[
2220: 31 30 32 34 5d 3b 0a 0a 20 20 20 20 69 66 20 28  1024];..    if (
2230: 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c  resultObj == NUL
2240: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  L) {..return NUL
2250: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  L;.    }..    if
2260: 20 28 28 6e 61 6d 65 73 20 3d 20 28 53 54 41 43   ((names = (STAC
2270: 4b 5f 4f 46 28 47 45 4e 45 52 41 4c 5f 4e 41 4d  K_OF(GENERAL_NAM
2280: 45 29 20 2a 29 58 35 30 39 5f 67 65 74 5f 65 78  E) *)X509_get_ex
2290: 74 5f 64 32 69 28 63 65 72 74 2c 20 6e 69 64 2c  t_d2i(cert, nid,
22a0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d   NULL, NULL)) !=
22b0: 20 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69   NULL) {..for (i
22c0: 6e 74 20 69 3d 30 3b 20 69 20 3c 20 73 6b 5f 47  nt i=0; i < sk_G
22d0: 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 6e 75 6d 28  ENERAL_NAME_num(
22e0: 6e 61 6d 65 73 29 3b 20 69 2b 2b 29 20 7b 0a 09  names); i++) {..
22f0: 20 20 20 20 63 6f 6e 73 74 20 47 45 4e 45 52 41      const GENERA
2300: 4c 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73  L_NAME *name = s
2310: 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 76  k_GENERAL_NAME_v
2320: 61 6c 75 65 28 6e 61 6d 65 73 2c 20 69 29 3b 0a  alue(names, i);.
2330: 0a 09 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f  ..    len = BIO_
2340: 74 6f 5f 42 75 66 66 65 72 28 6e 61 6d 65 20 26  to_Buffer(name &
2350: 26 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70  & GENERAL_NAME_p
2360: 72 69 6e 74 28 62 69 6f 2c 20 28 47 45 4e 45 52  rint(bio, (GENER
2370: 41 4c 5f 4e 41 4d 45 20 2a 29 20 6e 61 6d 65 29  AL_NAME *) name)
2380: 2c 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 31  , bio, buffer, 1
2390: 30 32 34 29 3b 0a 09 20 20 20 20 4c 41 50 50 45  024);..    LAPPE
23a0: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72  ND_STR(interp, r
23b0: 65 73 75 6c 74 4f 62 6a 2c 20 4e 55 4c 4c 2c 20  esultObj, NULL, 
23c0: 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 09 7d  buffer, len);..}
23d0: 0a 09 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d  ..sk_GENERAL_NAM
23e0: 45 5f 70 6f 70 5f 66 72 65 65 28 6e 61 6d 65 73  E_pop_free(names
23f0: 2c 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 66  , GENERAL_NAME_f
2400: 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ree);.    }.    
2410: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a  return resultObj
2420: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
2430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
2480: 73 5f 78 35 30 39 45 78 74 4b 65 79 55 73 61 67  s_x509ExtKeyUsag
2490: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 61  e --. *. *.Get a
24a0: 20 6c 69 73 74 20 6f 66 20 45 78 74 65 6e 64 65   list of Extende
24b0: 64 20 4b 65 79 20 55 73 61 67 65 73 0a 20 2a 0a  d Key Usages. *.
24c0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
24d0: 63 6c 20 6c 69 73 74 20 6f 66 20 75 73 61 67 65  cl list of usage
24e0: 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  s. *. * Side eff
24f0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ects:. *.None. *
2500: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2550: 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c  . */.Tcl_Obj *Tl
2560: 73 5f 78 35 30 39 45 78 74 4b 65 79 55 73 61 67  s_x509ExtKeyUsag
2570: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  e(Tcl_Interp *in
2580: 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74  terp, X509 *cert
2590: 2c 20 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67  , uint32_t xflag
25a0: 73 29 20 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f  s) {.    uint32_
25b0: 74 20 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67  t usage = X509_g
25c0: 65 74 5f 6b 65 79 5f 75 73 61 67 65 28 63 65 72  et_key_usage(cer
25d0: 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  t);.    Tcl_Obj 
25e0: 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c  *resultObj = Tcl
25f0: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
2600: 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72  ULL);..    if (r
2610: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c  esultObj == NULL
2620: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  ) {..return NULL
2630: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
2640: 28 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41  ((xflags & EXFLA
2650: 47 5f 58 4b 55 53 41 47 45 29 20 26 26 20 75 73  G_XKUSAGE) && us
2660: 61 67 65 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58  age < UINT32_MAX
2670: 29 20 7b 0a 09 75 73 61 67 65 20 3d 20 58 35 30  ) {..usage = X50
2680: 39 5f 67 65 74 5f 65 78 74 65 6e 64 65 64 5f 6b  9_get_extended_k
2690: 65 79 5f 75 73 61 67 65 28 63 65 72 74 29 3b 0a  ey_usage(cert);.
26a0: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b  ..if (usage & XK
26b0: 55 5f 53 53 4c 5f 53 45 52 56 45 52 29 20 7b 0a  U_SSL_SERVER) {.
26c0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
26d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
26e0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
26f0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2700: 6a 28 22 54 4c 53 20 57 65 62 20 53 65 72 76 65  j("TLS Web Serve
2710: 72 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  r Authentication
2720: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
2730: 28 75 73 61 67 65 20 26 20 58 4b 55 5f 53 53 4c  (usage & XKU_SSL
2740: 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20  _CLIENT) {..    
2750: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2760: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2770: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f   resultObj, Tcl_
2780: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 4c  NewStringObj("TL
2790: 53 20 57 65 62 20 43 6c 69 65 6e 74 20 41 75 74  S Web Client Aut
27a0: 68 65 6e 74 69 63 61 74 69 6f 6e 22 2c 20 2d 31  hentication", -1
27b0: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67  ));..}..if (usag
27c0: 65 20 26 20 58 4b 55 5f 53 4d 49 4d 45 29 20 7b  e & XKU_SMIME) {
27d0: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
27e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
27f0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
2800: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2810: 62 6a 28 22 45 2d 6d 61 69 6c 20 50 72 6f 74 65  bj("E-mail Prote
2820: 63 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d  ction", -1));..}
2830: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b  ..if (usage & XK
2840: 55 5f 43 4f 44 45 5f 53 49 47 4e 29 20 7b 0a 09  U_CODE_SIGN) {..
2850: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2860: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2870: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
2880: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2890: 28 22 43 6f 64 65 20 53 69 67 6e 69 6e 67 22 2c  ("Code Signing",
28a0: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75   -1));..}..if (u
28b0: 73 61 67 65 20 26 20 58 4b 55 5f 53 47 43 29 20  sage & XKU_SGC) 
28c0: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
28d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
28e0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
28f0: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  j, Tcl_NewString
2900: 4f 62 6a 28 22 53 47 43 22 2c 20 2d 31 29 29 3b  Obj("SGC", -1));
2910: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26  ..}..if (usage &
2920: 20 58 4b 55 5f 4f 43 53 50 5f 53 49 47 4e 29 20   XKU_OCSP_SIGN) 
2930: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
2940: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2950: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
2960: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  j, Tcl_NewString
2970: 4f 62 6a 28 22 4f 43 53 50 20 53 69 67 6e 69 6e  Obj("OCSP Signin
2980: 67 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66  g", -1));..}..if
2990: 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f 54 49   (usage & XKU_TI
29a0: 4d 45 53 54 41 4d 50 29 20 7b 0a 09 20 20 20 20  MESTAMP) {..    
29b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
29c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
29d0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f   resultObj, Tcl_
29e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 69  NewStringObj("Ti
29f0: 6d 65 20 53 74 61 6d 70 69 6e 67 22 2c 20 2d 31  me Stamping", -1
2a00: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67  ));..}..if (usag
2a10: 65 20 26 20 58 4b 55 5f 44 56 43 53 20 29 20 7b  e & XKU_DVCS ) {
2a20: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
2a30: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2a40: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
2a50: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2a60: 62 6a 28 22 44 56 43 53 22 2c 20 2d 31 29 29 3b  bj("DVCS", -1));
2a70: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26  ..}..if (usage &
2a80: 20 58 4b 55 5f 41 4e 59 45 4b 55 29 20 7b 0a 09   XKU_ANYEKU) {..
2a90: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2aa0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2ab0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
2ac0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2ad0: 28 22 41 6e 79 20 45 78 74 65 6e 64 65 64 20 4b  ("Any Extended K
2ae0: 65 79 20 55 73 61 67 65 22 2c 20 2d 31 29 29 3b  ey Usage", -1));
2af0: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..}.    } else {
2b00: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
2b10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2b20: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
2b30: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2b40: 62 6a 28 22 75 6e 72 65 73 74 72 69 63 74 65 64  bj("unrestricted
2b50: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20  ", -1));.    }. 
2b60: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74     return result
2b70: 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  Obj;.}../*. *---
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
2bd0: 20 54 6c 73 5f 78 35 30 39 43 72 6c 44 70 20 2d   Tls_x509CrlDp -
2be0: 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 6c 69 73 74  -. *. *.Get list
2bf0: 20 6f 66 20 43 52 4c 20 44 69 73 74 72 69 62 75   of CRL Distribu
2c00: 74 69 6f 6e 20 50 6f 69 6e 74 73 0a 20 2a 0a 20  tion Points. *. 
2c10: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 63  * Returns:. *.Tc
2c20: 6c 20 6c 69 73 74 20 6f 66 20 55 52 49 73 20 61  l list of URIs a
2c30: 6e 64 20 72 65 6c 61 74 69 76 65 2d 6e 61 6d 65  nd relative-name
2c40: 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  s. *. * Side eff
2c50: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ects:. *.None. *
2c60: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cb0: 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c  . */.Tcl_Obj *Tl
2cc0: 73 5f 78 35 30 39 43 72 6c 44 70 28 54 63 6c 5f  s_x509CrlDp(Tcl_
2cd0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2ce0: 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20  X509 *cert) {.  
2cf0: 20 20 53 54 41 43 4b 5f 4f 46 28 44 49 53 54 5f    STACK_OF(DIST_
2d00: 50 4f 49 4e 54 29 20 2a 64 70 73 3b 0a 20 20 20  POINT) *dps;.   
2d10: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74   Tcl_Obj *result
2d20: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Obj = Tcl_NewLis
2d30: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a  tObj(0, NULL);..
2d40: 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62      if (resultOb
2d50: 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  j == NULL) {..re
2d60: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
2d70: 0a 0a 20 20 20 20 69 66 20 28 28 64 70 73 20 3d  ..    if ((dps =
2d80: 20 28 53 54 41 43 4b 5f 4f 46 28 44 49 53 54 5f   (STACK_OF(DIST_
2d90: 50 4f 49 4e 54 29 20 2a 29 58 35 30 39 5f 67 65  POINT) *)X509_ge
2da0: 74 5f 65 78 74 5f 64 32 69 28 63 65 72 74 2c 20  t_ext_d2i(cert, 
2db0: 4e 49 44 5f 63 72 6c 5f 64 69 73 74 72 69 62 75  NID_crl_distribu
2dc0: 74 69 6f 6e 5f 70 6f 69 6e 74 73 2c 20 4e 55 4c  tion_points, NUL
2dd0: 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c  L, NULL)) != NUL
2de0: 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69  L) {..for (int i
2df0: 3d 30 3b 20 69 20 3c 20 73 6b 5f 44 49 53 54 5f  =0; i < sk_DIST_
2e00: 50 4f 49 4e 54 5f 6e 75 6d 28 64 70 73 29 3b 20  POINT_num(dps); 
2e10: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 44 49 53 54  i++) {..    DIST
2e20: 5f 50 4f 49 4e 54 20 2a 64 70 20 3d 20 73 6b 5f  _POINT *dp = sk_
2e30: 44 49 53 54 5f 50 4f 49 4e 54 5f 76 61 6c 75 65  DIST_POINT_value
2e40: 28 64 70 73 2c 20 69 29 3b 0a 09 20 20 20 20 44  (dps, i);..    D
2e50: 49 53 54 5f 50 4f 49 4e 54 5f 4e 41 4d 45 20 2a  IST_POINT_NAME *
2e60: 64 69 73 74 70 6f 69 6e 74 20 3d 20 64 70 2d 3e  distpoint = dp->
2e70: 64 69 73 74 70 6f 69 6e 74 3b 0a 0a 09 20 20 20  distpoint;...   
2e80: 20 69 66 20 28 64 69 73 74 70 6f 69 6e 74 2d 3e   if (distpoint->
2e90: 74 79 70 65 20 3d 3d 20 30 29 20 7b 0a 09 09 2f  type == 0) {.../
2ea0: 2a 20 66 75 6c 6c 2d 6e 61 6d 65 20 47 45 4e 45  * full-name GENE
2eb0: 52 41 4c 49 5a 45 44 4e 41 4d 45 20 2a 2f 0a 09  RALIZEDNAME */..
2ec0: 09 66 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b  .for (int j = 0;
2ed0: 20 6a 20 3c 20 73 6b 5f 47 45 4e 45 52 41 4c 5f   j < sk_GENERAL_
2ee0: 4e 41 4d 45 5f 6e 75 6d 28 64 69 73 74 70 6f 69  NAME_num(distpoi
2ef0: 6e 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c 6e 61 6d  nt->name.fullnam
2f00: 65 29 3b 20 6a 2b 2b 29 20 7b 0a 09 09 20 20 20  e); j++) {...   
2f10: 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 20 2a 67   GENERAL_NAME *g
2f20: 65 6e 20 3d 20 73 6b 5f 47 45 4e 45 52 41 4c 5f  en = sk_GENERAL_
2f30: 4e 41 4d 45 5f 76 61 6c 75 65 28 64 69 73 74 70  NAME_value(distp
2f40: 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c 6e  oint->name.fulln
2f50: 61 6d 65 2c 20 6a 29 3b 0a 09 09 20 20 20 20 69  ame, j);...    i
2f60: 6e 74 20 74 79 70 65 3b 0a 23 69 66 20 4f 50 45  nt type;.#if OPE
2f70: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
2f80: 42 45 52 20 3c 20 30 78 34 30 30 30 30 30 30 30  BER < 0x40000000
2f90: 4c 0a 09 09 20 20 20 20 41 53 4e 31 5f 53 54 52  L...    ASN1_STR
2fa0: 49 4e 47 20 2a 75 72 69 20 3d 20 28 41 53 4e 31  ING *uri = (ASN1
2fb0: 5f 53 54 52 49 4e 47 20 2a 29 47 45 4e 45 52 41  _STRING *)GENERA
2fc0: 4c 5f 4e 41 4d 45 5f 67 65 74 30 5f 76 61 6c 75  L_NAME_get0_valu
2fd0: 65 28 67 65 6e 2c 20 26 74 79 70 65 29 3b 0a 23  e(gen, &type);.#
2fe0: 65 6c 73 65 0a 09 09 20 20 20 20 63 6f 6e 73 74  else...    const
2ff0: 20 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 75 72   ASN1_STRING *ur
3000: 69 20 3d 20 28 63 6f 6e 73 74 20 41 53 4e 31 5f  i = (const ASN1_
3010: 53 54 52 49 4e 47 20 2a 29 47 45 4e 45 52 41 4c  STRING *)GENERAL
3020: 5f 4e 41 4d 45 5f 67 65 74 30 5f 76 61 6c 75 65  _NAME_get0_value
3030: 28 67 65 6e 2c 20 26 74 79 70 65 29 3b 0a 23 65  (gen, &type);.#e
3040: 6e 64 69 66 0a 09 09 20 20 20 20 69 66 20 28 74  ndif...    if (t
3050: 79 70 65 20 3d 3d 20 47 45 4e 5f 55 52 49 20 7c  ype == GEN_URI |
3060: 7c 20 74 79 70 65 20 3d 3d 20 47 45 4e 5f 44 4e  | type == GEN_DN
3070: 53 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  S) {.#if OPENSSL
3080: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
3090: 3c 20 30 78 34 30 31 30 30 30 30 30 4c 0a 09 09  < 0x40100000L...
30a0: 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
30b0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
30c0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 0a 09  (char *) NULL,..
30d0: 09 09 20 20 20 20 28 63 68 61 72 20 2a 29 20 41  ..    (char *) A
30e0: 53 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74 30 5f  SN1_STRING_get0_
30f0: 64 61 74 61 28 75 72 69 29 2c 0a 09 09 09 20 20  data(uri),....  
3100: 20 20 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e    (Tcl_Size) ASN
3110: 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28  1_STRING_length(
3120: 75 72 69 29 29 3b 0a 23 65 6c 73 65 0a 09 09 09  uri));.#else....
3130: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
3140: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 28  rp, resultObj, (
3150: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 0a 09 09  char *) NULL,...
3160: 09 20 20 20 20 28 63 68 61 72 20 2a 29 20 41 53  .    (char *) AS
3170: 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74 30 5f 64  N1_STRING_get0_d
3180: 61 74 61 28 75 72 69 29 2c 0a 09 09 09 20 20 20  ata(uri),....   
3190: 20 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31   (Tcl_Size) ASN1
31a0: 5f 53 54 52 49 4e 47 5f 67 65 74 5f 6c 65 6e 67  _STRING_get_leng
31b0: 74 68 28 75 72 69 29 29 3b 0a 23 65 6e 64 69 66  th(uri));.#endif
31c0: 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20  ...    }...}..  
31d0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 69 73    } else if (dis
31e0: 74 70 6f 69 6e 74 2d 3e 74 79 70 65 20 3d 3d 20  tpoint->type == 
31f0: 31 29 20 7b 0a 09 09 2f 2a 20 72 65 6c 61 74 69  1) {.../* relati
3200: 76 65 2d 6e 61 6d 65 20 58 35 30 39 4e 41 4d 45  ve-name X509NAME
3210: 20 2a 2f 0a 09 09 53 54 41 43 4b 5f 4f 46 28 58   */...STACK_OF(X
3220: 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 29 20  509_NAME_ENTRY) 
3230: 2a 73 6b 5f 72 65 6c 6e 61 6d 65 20 3d 20 64 69  *sk_relname = di
3240: 73 74 70 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 72 65  stpoint->name.re
3250: 6c 61 74 69 76 65 6e 61 6d 65 3b 0a 09 09 66 6f  lativename;...fo
3260: 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a 20  r (int j = 0; j 
3270: 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 45  < sk_X509_NAME_E
3280: 4e 54 52 59 5f 6e 75 6d 28 73 6b 5f 72 65 6c 6e  NTRY_num(sk_reln
3290: 61 6d 65 29 3b 20 6a 2b 2b 29 20 7b 0a 09 09 20  ame); j++) {... 
32a0: 20 20 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54     X509_NAME_ENT
32b0: 52 59 20 2a 65 20 3d 20 73 6b 5f 58 35 30 39 5f  RY *e = sk_X509_
32c0: 4e 41 4d 45 5f 45 4e 54 52 59 5f 76 61 6c 75 65  NAME_ENTRY_value
32d0: 28 73 6b 5f 72 65 6c 6e 61 6d 65 2c 20 6a 29 3b  (sk_relname, j);
32e0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
32f0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
3300: 34 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20  40000000L...    
3310: 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 64 20 3d  ASN1_STRING *d =
3320: 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59   X509_NAME_ENTRY
3330: 5f 67 65 74 5f 64 61 74 61 28 65 29 3b 0a 23 65  _get_data(e);.#e
3340: 6c 73 65 0a 09 09 20 20 20 20 63 6f 6e 73 74 20  lse...    const 
3350: 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 64 20 3d  ASN1_STRING *d =
3360: 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59   X509_NAME_ENTRY
3370: 5f 67 65 74 5f 64 61 74 61 28 65 29 3b 0a 23 65  _get_data(e);.#e
3380: 6e 64 69 66 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ndif.#if OPENSSL
3390: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
33a0: 3c 20 30 78 34 30 31 30 30 30 30 30 4c 0a 09 09  < 0x40100000L...
33b0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
33c0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
33d0: 6a 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  j, (char *) NULL
33e0: 2c 0a 09 09 20 20 20 20 20 20 20 20 28 63 68 61  ,...        (cha
33f0: 72 20 2a 29 20 41 53 4e 31 5f 53 54 52 49 4e 47  r *) ASN1_STRING
3400: 5f 67 65 74 30 5f 64 61 74 61 28 64 29 2c 0a 09  _get0_data(d),..
3410: 09 09 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e  ..(Tcl_Size) ASN
3420: 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28  1_STRING_length(
3430: 64 29 29 3b 0a 23 65 6c 73 65 0a 09 09 20 20 20  d));.#else...   
3440: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
3450: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
3460: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 0a 09  (char *) NULL,..
3470: 09 20 20 20 20 20 20 20 20 28 63 68 61 72 20 2a  .        (char *
3480: 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67 65  ) ASN1_STRING_ge
3490: 74 30 5f 64 61 74 61 28 64 29 2c 0a 09 09 09 28  t0_data(d),....(
34a0: 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31 5f 53  Tcl_Size) ASN1_S
34b0: 54 52 49 4e 47 5f 67 65 74 5f 6c 65 6e 67 74 68  TRING_get_length
34c0: 28 64 29 29 3b 0a 23 65 6e 64 69 66 0a 09 09 7d  (d));.#endif...}
34d0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 43 52 4c 5f  ..    }..}..CRL_
34e0: 44 49 53 54 5f 50 4f 49 4e 54 53 5f 66 72 65 65  DIST_POINTS_free
34f0: 28 64 70 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (dps);.    }.   
3500: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62   return resultOb
3510: 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  j;.}../*. *-----
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
3570: 6c 73 5f 78 35 30 39 4f 73 63 70 0a 20 2a 0a 20  ls_x509Oscp. *. 
3580: 2a 09 47 65 74 20 6c 69 73 74 20 6f 66 20 4f 6e  *.Get list of On
3590: 2d 6c 69 6e 65 20 43 65 72 74 69 66 69 63 61 74  -line Certificat
35a0: 65 20 53 74 61 74 75 73 20 50 72 6f 74 6f 63 6f  e Status Protoco
35b0: 6c 20 28 4f 53 43 50 29 20 55 52 49 73 0a 20 2a  l (OSCP) URIs. *
35c0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
35d0: 54 63 6c 20 6c 69 73 74 20 6f 66 20 55 52 49 73  Tcl list of URIs
35e0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
35f0: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  cts:. *.None. *.
3600: 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3650: 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73   */.Tcl_Obj *Tls
3660: 5f 78 35 30 39 4f 73 63 70 28 54 63 6c 5f 49 6e  _x509Oscp(Tcl_In
3670: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35  terp *interp, X5
3680: 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20  09 *cert) {.    
3690: 53 54 41 43 4b 5f 4f 46 28 4f 50 45 4e 53 53 4c  STACK_OF(OPENSSL
36a0: 5f 53 54 52 49 4e 47 29 20 2a 6f 63 73 70 3b 0a  _STRING) *ocsp;.
36b0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73      Tcl_Obj *res
36c0: 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77  ultObj = Tcl_New
36d0: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
36e0: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c  ;..    if (resul
36f0: 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tObj == NULL) {.
3700: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
3710: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 6f 63    }..    if ((oc
3720: 73 70 20 3d 20 58 35 30 39 5f 67 65 74 31 5f 6f  sp = X509_get1_o
3730: 63 73 70 28 63 65 72 74 29 29 20 21 3d 20 4e 55  csp(cert)) != NU
3740: 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20  LL) {..for (int 
3750: 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 4f 50  i = 0; i < sk_OP
3760: 45 4e 53 53 4c 5f 53 54 52 49 4e 47 5f 6e 75 6d  ENSSL_STRING_num
3770: 28 6f 63 73 70 29 3b 20 69 2b 2b 29 20 7b 0a 09  (ocsp); i++) {..
3780: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
3790: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
37a0: 6a 2c 20 4e 55 4c 4c 2c 20 73 6b 5f 4f 50 45 4e  j, NULL, sk_OPEN
37b0: 53 53 4c 5f 53 54 52 49 4e 47 5f 76 61 6c 75 65  SSL_STRING_value
37c0: 28 6f 63 73 70 2c 20 69 29 2c 20 2d 31 29 3b 0a  (ocsp, i), -1);.
37d0: 09 7d 0a 09 58 35 30 39 5f 65 6d 61 69 6c 5f 66  .}..X509_email_f
37e0: 72 65 65 28 6f 63 73 70 29 3b 0a 20 20 20 20 7d  ree(ocsp);.    }
37f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75  .    return resu
3800: 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  ltObj;.}../*. *-
3810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
3860: 20 2a 20 54 6c 73 5f 78 35 30 39 43 61 49 73 73   * Tls_x509CaIss
3870: 75 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65  uers --. *. *.Ge
3880: 74 20 6c 69 73 74 20 6f 66 20 43 65 72 74 69 66  t list of Certif
3890: 69 63 61 74 65 20 41 75 74 68 6f 72 69 74 79 20  icate Authority 
38a0: 28 43 41 29 20 49 73 73 75 65 72 20 55 52 49 73  (CA) Issuer URIs
38b0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
38c0: 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 43   *.Tcl list of C
38d0: 41 20 69 73 73 75 65 72 20 55 52 49 73 0a 20 2a  A issuer URIs. *
38e0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
38f0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d  :. *.None. *. *-
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3950: 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35  .Tcl_Obj *Tls_x5
3960: 30 39 43 61 49 73 73 75 65 72 73 28 54 63 6c 5f  09CaIssuers(Tcl_
3970: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
3980: 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20  X509 *cert) {.  
3990: 20 20 53 54 41 43 4b 5f 4f 46 28 41 43 43 45 53    STACK_OF(ACCES
39a0: 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 29 20 2a  S_DESCRIPTION) *
39b0: 61 64 73 3b 0a 20 20 20 20 41 43 43 45 53 53 5f  ads;.    ACCESS_
39c0: 44 45 53 43 52 49 50 54 49 4f 4e 20 2a 61 64 3b  DESCRIPTION *ad;
39d0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65  .    Tcl_Obj *re
39e0: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  sultObj = Tcl_Ne
39f0: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
3a00: 29 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  );.    unsigned 
3a10: 63 68 61 72 20 2a 62 75 66 3b 0a 0a 20 20 20 20  char *buf;..    
3a20: 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d  if (resultObj ==
3a30: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
3a40: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
3a50: 20 20 69 66 20 28 28 61 64 73 20 3d 20 28 53 54    if ((ads = (ST
3a60: 41 43 4b 5f 4f 46 28 41 43 43 45 53 53 5f 44 45  ACK_OF(ACCESS_DE
3a70: 53 43 52 49 50 54 49 4f 4e 29 20 2a 29 58 35 30  SCRIPTION) *)X50
3a80: 39 5f 67 65 74 5f 65 78 74 5f 64 32 69 28 63 65  9_get_ext_d2i(ce
3a90: 72 74 2c 20 4e 49 44 5f 69 6e 66 6f 5f 61 63 63  rt, NID_info_acc
3aa0: 65 73 73 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ess, NULL, NULL)
3ab0: 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 66 6f  ) != NULL) {..fo
3ac0: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20  r (int i = 0; i 
3ad0: 3c 20 73 6b 5f 41 43 43 45 53 53 5f 44 45 53 43  < sk_ACCESS_DESC
3ae0: 52 49 50 54 49 4f 4e 5f 6e 75 6d 28 61 64 73 29  RIPTION_num(ads)
3af0: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 61 64  ; i++) {..    ad
3b00: 20 3d 20 28 41 43 43 45 53 53 5f 44 45 53 43 52   = (ACCESS_DESCR
3b10: 49 50 54 49 4f 4e 20 2a 29 73 6b 5f 41 43 43 45  IPTION *)sk_ACCE
3b20: 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 5f 76  SS_DESCRIPTION_v
3b30: 61 6c 75 65 28 61 64 73 2c 20 69 29 3b 0a 09 20  alue(ads, i);.. 
3b40: 20 20 20 69 66 20 28 4f 42 4a 5f 6f 62 6a 32 6e     if (OBJ_obj2n
3b50: 69 64 28 61 64 2d 3e 6d 65 74 68 6f 64 29 20 3d  id(ad->method) =
3b60: 3d 20 4e 49 44 5f 61 64 5f 63 61 5f 69 73 73 75  = NID_ad_ca_issu
3b70: 65 72 73 20 26 26 20 61 64 2d 3e 6c 6f 63 61 74  ers && ad->locat
3b80: 69 6f 6e 29 20 7b 0a 09 09 69 66 20 28 61 64 2d  ion) {...if (ad-
3b90: 3e 6c 6f 63 61 74 69 6f 6e 2d 3e 74 79 70 65 20  >location->type 
3ba0: 3d 3d 20 47 45 4e 5f 55 52 49 29 20 7b 0a 09 09  == GEN_URI) {...
3bb0: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e      Tcl_Size len
3bc0: 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 41 53   = (Tcl_Size) AS
3bd0: 4e 31 5f 53 54 52 49 4e 47 5f 74 6f 5f 55 54 46  N1_STRING_to_UTF
3be0: 38 28 26 62 75 66 2c 20 61 64 2d 3e 6c 6f 63 61  8(&buf, ad->loca
3bf0: 74 69 6f 6e 2d 3e 64 2e 75 6e 69 66 6f 72 6d 52  tion->d.uniformR
3c00: 65 73 6f 75 72 63 65 49 64 65 6e 74 69 66 69 65  esourceIdentifie
3c10: 72 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f 4c 69  r);...    Tcl_Li
3c20: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
3c30: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  nt(interp, resul
3c40: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tObj, Tcl_NewStr
3c50: 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 20  ingObj((char *) 
3c60: 62 75 66 2c 20 6c 65 6e 29 29 3b 0a 09 09 20 20  buf, len));...  
3c70: 20 20 4f 50 45 4e 53 53 4c 5f 66 72 65 65 28 62    OPENSSL_free(b
3c80: 75 66 29 3b 0a 09 09 20 20 20 20 62 72 65 61 6b  uf);...    break
3c90: 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a  ;...}..    }..}.
3ca0: 09 2f 2a 20 73 6b 5f 41 43 43 45 53 53 5f 44 45  ./* sk_ACCESS_DE
3cb0: 53 43 52 49 50 54 49 4f 4e 5f 70 6f 70 5f 66 72  SCRIPTION_pop_fr
3cc0: 65 65 28 61 64 73 2c 20 41 43 43 45 53 53 5f 44  ee(ads, ACCESS_D
3cd0: 45 53 43 52 49 50 54 49 4f 4e 5f 66 72 65 65 29  ESCRIPTION_free)
3ce0: 3b 20 2a 2f 0a 09 41 55 54 48 4f 52 49 54 59 5f  ; */..AUTHORITY_
3cf0: 49 4e 46 4f 5f 41 43 43 45 53 53 5f 66 72 65 65  INFO_ACCESS_free
3d00: 28 61 64 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (ads);.    }.   
3d10: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62   return resultOb
3d20: 6a 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  j;.}.../*. *----
3d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
3d80: 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 20 2d  Tls_NewX509Obj -
3d90: 2d 0a 20 2a 0a 20 2a 09 50 61 72 73 65 73 20 61  -. *. *.Parses a
3da0: 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74   X509 certificat
3db0: 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 63 6f  e and returns co
3dc0: 6e 74 65 6e 74 73 20 61 73 20 61 20 6b 65 79 2d  ntents as a key-
3dd0: 76 61 6c 75 65 20 54 63 6c 20 6c 69 73 74 2e 0a  value Tcl list..
3de0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 3a 0a 20 2a   *. * Result:. *
3df0: 09 41 20 54 63 6c 20 4c 69 73 74 20 77 69 74 68  .A Tcl List with
3e00: 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66   the X509 certif
3e10: 69 63 61 74 65 20 69 6e 66 6f 20 61 73 20 61 20  icate info as a 
3e20: 6b 65 79 2d 76 61 6c 75 65 20 6c 69 73 74 0a 20  key-value list. 
3e30: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
3e40: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
3e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
3ea0: 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 4e  /.Tcl_Obj *Tls_N
3eb0: 65 77 58 35 30 39 4f 62 6a 28 54 63 6c 5f 49 6e  ewX509Obj(Tcl_In
3ec0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35  terp *interp, X5
3ed0: 30 39 20 2a 63 65 72 74 2c 20 69 6e 74 20 61 6c  09 *cert, int al
3ee0: 6c 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  l) {.    Tcl_Obj
3ef0: 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63   *resultObj = Tc
3f00: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
3f10: 4e 55 4c 4c 29 3b 0a 20 20 20 20 42 49 4f 20 2a  NULL);.    BIO *
3f20: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49  bio = BIO_new(BI
3f30: 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 20 20 20 20  O_s_mem());.    
3f40: 69 6e 74 20 6d 64 6e 69 64 2c 20 70 6b 6e 69 64  int mdnid, pknid
3f50: 2c 20 62 69 74 73 3b 0a 20 20 20 20 54 63 6c 5f  , bits;.    Tcl_
3f60: 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 75 6e  Size len;.    un
3f70: 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b  signed int ulen;
3f80: 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 78 66  .    uint32_t xf
3f90: 6c 61 67 73 3b 0a 20 20 20 20 75 6e 73 69 67 6e  lags;.    unsign
3fa0: 65 64 20 6c 6f 6e 67 20 66 6c 61 67 73 20 3d 20  ed long flags = 
3fb0: 58 4e 5f 46 4c 41 47 5f 52 46 43 32 32 35 33 20  XN_FLAG_RFC2253 
3fc0: 7c 20 41 53 4e 31 5f 53 54 52 46 4c 47 53 5f 55  | ASN1_STRFLGS_U
3fd0: 54 46 38 5f 43 4f 4e 56 45 52 54 3b 0a 20 20 20  TF8_CONVERT;.   
3fe0: 20 66 6c 61 67 73 20 26 3d 20 7e 28 75 6e 73 69   flags &= ~(unsi
3ff0: 67 6e 65 64 20 6c 6f 6e 67 29 41 53 4e 31 5f 53  gned long)ASN1_S
4000: 54 52 46 4c 47 53 5f 45 53 43 5f 4d 53 42 3b 0a  TRFLGS_ESC_MSB;.
4010: 0a 20 20 20 20 63 68 61 72 20 2a 62 75 66 66 65  .    char *buffe
4020: 72 20 3d 20 28 63 68 61 72 20 2a 29 54 63 6c 5f  r = (char *)Tcl_
4030: 41 6c 6c 6f 63 28 42 55 46 53 49 5a 20 3e 20 45  Alloc(BUFSIZ > E
4040: 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 20 3f  VP_MAX_MD_SIZE ?
4050: 20 42 55 46 53 49 5a 20 3a 20 45 56 50 5f 4d 41   BUFSIZ : EVP_MA
4060: 58 5f 4d 44 5f 53 49 5a 45 29 3b 0a 0a 20 20 20  X_MD_SIZE);..   
4070: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
4080: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74  ");..    if (int
4090: 65 72 70 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63  erp == NULL || c
40a0: 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62  ert == NULL || b
40b0: 69 6f 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 65  io == NULL || re
40c0: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 20  sultObj == NULL 
40d0: 7c 7c 20 62 75 66 66 65 72 20 3d 3d 20 4e 55 4c  || buffer == NUL
40e0: 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65  L) {..Tcl_DecrRe
40f0: 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 4f 62 6a  fCount(resultObj
4100: 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28 62 69 6f  );..BIO_free(bio
4110: 29 3b 0a 09 69 66 20 28 62 75 66 66 65 72 20 21  );..if (buffer !
4120: 3d 20 4e 55 4c 4c 29 20 54 63 6c 5f 46 72 65 65  = NULL) Tcl_Free
4130: 28 62 75 66 66 65 72 29 3b 0a 09 72 65 74 75 72  (buffer);..retur
4140: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
4150: 20 20 20 2f 2a 20 53 69 67 6e 61 74 75 72 65 20     /* Signature 
4160: 61 6c 67 6f 72 69 74 68 6d 20 61 6e 64 20 76 61  algorithm and va
4170: 6c 75 65 20 2d 20 52 46 43 20 35 32 38 30 20 73  lue - RFC 5280 s
4180: 65 63 74 69 6f 6e 20 34 2e 31 2e 31 2e 32 20 61  ection 4.1.1.2 a
4190: 6e 64 20 34 2e 31 2e 31 2e 33 20 2a 2f 0a 20 20  nd 4.1.1.3 */.  
41a0: 20 20 2f 2a 20 73 69 67 6e 61 74 75 72 65 41 6c    /* signatureAl
41b0: 67 6f 72 69 74 68 6d 20 69 73 20 74 68 65 20 69  gorithm is the i
41c0: 64 20 6f 66 20 74 68 65 20 63 72 79 70 74 6f 67  d of the cryptog
41d0: 72 61 70 68 69 63 20 61 6c 67 6f 72 69 74 68 6d  raphic algorithm
41e0: 20 75 73 65 64 20 62 79 20 74 68 65 0a 09 43 41   used by the..CA
41f0: 20 74 6f 20 73 69 67 6e 20 74 68 69 73 20 63 65   to sign this ce
4200: 72 74 2e 20 73 69 67 6e 61 74 75 72 65 56 61 6c  rt. signatureVal
4210: 75 65 20 69 73 20 74 68 65 20 64 69 67 69 74 61  ue is the digita
4220: 6c 20 73 69 67 6e 61 74 75 72 65 20 63 6f 6d 70  l signature comp
4230: 75 74 65 64 0a 09 75 70 6f 6e 20 74 68 65 20 41  uted..upon the A
4240: 53 4e 2e 31 20 44 45 52 20 65 6e 63 6f 64 65 64  SN.1 DER encoded
4250: 20 74 62 73 43 65 72 74 69 66 69 63 61 74 65 2e   tbsCertificate.
4260: 20 2a 2f 0a 20 20 20 20 7b 0a 09 63 6f 6e 73 74   */.    {..const
4270: 20 58 35 30 39 5f 41 4c 47 4f 52 20 2a 73 69 67   X509_ALGOR *sig
4280: 5f 61 6c 67 3b 0a 09 63 6f 6e 73 74 20 41 53 4e  _alg;..const ASN
4290: 31 5f 42 49 54 5f 53 54 52 49 4e 47 20 2a 73 69  1_BIT_STRING *si
42a0: 67 3b 0a 09 69 6e 74 20 73 69 67 5f 6e 69 64 3b  g;..int sig_nid;
42b0: 0a 0a 09 58 35 30 39 5f 67 65 74 30 5f 73 69 67  ...X509_get0_sig
42c0: 6e 61 74 75 72 65 28 26 73 69 67 2c 20 26 73 69  nature(&sig, &si
42d0: 67 5f 61 6c 67 2c 20 63 65 72 74 29 3b 0a 09 2f  g_alg, cert);../
42e0: 2a 20 73 69 67 5f 6e 69 64 20 3d 20 58 35 30 39  * sig_nid = X509
42f0: 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e  _get_signature_n
4300: 69 64 28 63 65 72 74 29 20 2a 2f 0a 09 73 69 67  id(cert) */..sig
4310: 5f 6e 69 64 20 3d 20 4f 42 4a 5f 6f 62 6a 32 6e  _nid = OBJ_obj2n
4320: 69 64 28 73 69 67 5f 61 6c 67 2d 3e 61 6c 67 6f  id(sig_alg->algo
4330: 72 69 74 68 6d 29 3b 0a 09 4c 41 50 50 45 4e 44  rithm);..LAPPEND
4340: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73  _STR(interp, res
4350: 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75  ultObj, "signatu
4360: 72 65 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42  reAlgorithm", OB
4370: 4a 5f 6e 69 64 32 6c 6e 28 73 69 67 5f 6e 69 64  J_nid2ln(sig_nid
4380: 29 2c 20 2d 31 29 3b 0a 09 69 66 20 28 73 69 67  ), -1);..if (sig
4390: 5f 6e 69 64 20 21 3d 20 4e 49 44 5f 75 6e 64 65  _nid != NID_unde
43a0: 66 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  f) {.#if OPENSSL
43b0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
43c0: 3c 20 30 78 34 30 31 30 30 30 30 30 4c 0a 09 20  < 0x40100000L.. 
43d0: 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69     LAPPEND_OBJ(i
43e0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
43f0: 2c 20 22 73 69 67 6e 61 74 75 72 65 56 61 6c 75  , "signatureValu
4400: 65 22 2c 0a 09 09 53 74 72 69 6e 67 5f 74 6f 5f  e",...String_to_
4410: 48 65 78 28 41 53 4e 31 5f 53 54 52 49 4e 47 5f  Hex(ASN1_STRING_
4420: 67 65 74 30 5f 64 61 74 61 28 73 69 67 29 2c 20  get0_data(sig), 
4430: 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67  ASN1_STRING_leng
4440: 74 68 28 73 69 67 29 29 29 3b 0a 23 65 6c 73 65  th(sig)));.#else
4450: 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42  ..    LAPPEND_OB
4460: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  J(interp, result
4470: 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75 72 65 56  Obj, "signatureV
4480: 61 6c 75 65 22 2c 0a 09 09 53 74 72 69 6e 67 5f  alue",...String_
4490: 74 6f 5f 48 65 78 28 41 53 4e 31 5f 53 54 52 49  to_Hex(ASN1_STRI
44a0: 4e 47 5f 67 65 74 30 5f 64 61 74 61 28 73 69 67  NG_get0_data(sig
44b0: 29 2c 20 28 69 6e 74 29 41 53 4e 31 5f 53 54 52  ), (int)ASN1_STR
44c0: 49 4e 47 5f 67 65 74 5f 6c 65 6e 67 74 68 28 73  ING_get_length(s
44d0: 69 67 29 29 29 3b 0a 23 65 6e 64 69 66 0a 09 7d  ig)));.#endif..}
44e0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 4c 41 50   else {..    LAP
44f0: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
4500: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67   resultObj, "sig
4510: 6e 61 74 75 72 65 56 61 6c 75 65 22 2c 20 22 22  natureValue", ""
4520: 2c 20 30 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  , 0);..}.    }..
4530: 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 20 6f      /* Version o
4540: 66 20 74 68 65 20 65 6e 63 6f 64 65 64 20 63 65  f the encoded ce
4550: 72 74 69 66 69 63 61 74 65 20 2d 20 52 46 43 20  rtificate - RFC 
4560: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31  5280 section 4.1
4570: 2e 32 2e 31 20 2a 2f 0a 20 20 20 20 4c 41 50 50  .2.1 */.    LAPP
4580: 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c  END_LONG(interp,
4590: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 76 65 72   resultObj, "ver
45a0: 73 69 6f 6e 22 2c 20 58 35 30 39 5f 67 65 74 5f  sion", X509_get_
45b0: 76 65 72 73 69 6f 6e 28 63 65 72 74 29 2b 31 29  version(cert)+1)
45c0: 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 69 71 75 65  ;..    /* Unique
45d0: 20 6e 75 6d 62 65 72 20 61 73 73 69 67 6e 65 64   number assigned
45e0: 20 62 79 20 43 41 20 74 6f 20 63 65 72 74 69 66   by CA to certif
45f0: 69 63 61 74 65 20 2d 20 52 46 43 20 35 32 38 30  icate - RFC 5280
4600: 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 32   section 4.1.2.2
4610: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49   */.    len = BI
4620: 4f 5f 74 6f 5f 42 75 66 66 65 72 28 69 32 61 5f  O_to_Buffer(i2a_
4630: 41 53 4e 31 5f 49 4e 54 45 47 45 52 28 62 69 6f  ASN1_INTEGER(bio
4640: 2c 20 58 35 30 39 5f 67 65 74 30 5f 73 65 72 69  , X509_get0_seri
4650: 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 29 2c  alNumber(cert)),
4660: 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55   bio, buffer, BU
4670: 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45  FSIZ);.    LAPPE
4680: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72  ND_STR(interp, r
4690: 65 73 75 6c 74 4f 62 6a 2c 20 22 73 65 72 69 61  esultObj, "seria
46a0: 6c 4e 75 6d 62 65 72 22 2c 20 62 75 66 66 65 72  lNumber", buffer
46b0: 2c 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  , len);..    /* 
46c0: 53 69 67 6e 61 74 75 72 65 20 61 6c 67 6f 72 69  Signature algori
46d0: 74 68 6d 20 75 73 65 64 20 62 79 20 74 68 65 20  thm used by the 
46e0: 43 41 20 74 6f 20 73 69 67 6e 20 74 68 65 20 63  CA to sign the c
46f0: 65 72 74 69 66 69 63 61 74 65 2e 20 4d 75 73 74  ertificate. Must
4700: 20 6d 61 74 63 68 0a 09 73 69 67 6e 61 74 75 72   match..signatur
4710: 65 41 6c 67 6f 72 69 74 68 6d 2e 20 52 46 43 20  eAlgorithm. RFC 
4720: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31  5280 section 4.1
4730: 2e 32 2e 33 20 2a 2f 0a 20 20 20 20 4c 41 50 50  .2.3 */.    LAPP
4740: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
4750: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e  resultObj, "sign
4760: 61 74 75 72 65 22 2c 20 4f 42 4a 5f 6e 69 64 32  ature", OBJ_nid2
4770: 6c 6e 28 58 35 30 39 5f 67 65 74 5f 73 69 67 6e  ln(X509_get_sign
4780: 61 74 75 72 65 5f 6e 69 64 28 63 65 72 74 29 29  ature_nid(cert))
4790: 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  , -1);..    /* I
47a0: 73 73 75 65 72 20 69 64 65 6e 74 69 66 69 65 73  ssuer identifies
47b0: 20 74 68 65 20 65 6e 74 69 74 79 20 74 68 61 74   the entity that
47c0: 20 73 69 67 6e 65 64 20 61 6e 64 20 69 73 73 75   signed and issu
47d0: 65 64 20 74 68 65 20 63 65 72 74 2e 20 52 46 43  ed the cert. RFC
47e0: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
47f0: 31 2e 32 2e 34 20 2a 2f 0a 20 20 20 20 6c 65 6e  1.2.4 */.    len
4800: 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72   = BIO_to_Buffer
4810: 28 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e 74  (X509_NAME_print
4820: 5f 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67 65  _ex(bio, X509_ge
4830: 74 5f 69 73 73 75 65 72 5f 6e 61 6d 65 28 63 65  t_issuer_name(ce
4840: 72 74 29 2c 20 30 2c 20 66 6c 61 67 73 29 2c 20  rt), 0, flags), 
4850: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46  bio, buffer, BUF
4860: 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  SIZ);.    LAPPEN
4870: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65  D_STR(interp, re
4880: 73 75 6c 74 4f 62 6a 2c 20 22 69 73 73 75 65 72  sultObj, "issuer
4890: 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b  ", buffer, len);
48a0: 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69  ..    /* Certifi
48b0: 63 61 74 65 20 76 61 6c 69 64 69 74 79 20 70 65  cate validity pe
48c0: 72 69 6f 64 20 69 73 20 74 68 65 20 69 6e 74 65  riod is the inte
48d0: 72 76 61 6c 20 74 68 65 20 43 41 20 77 61 72 72  rval the CA warr
48e0: 61 6e 74 73 20 74 68 61 74 20 69 74 20 77 69 6c  ants that it wil
48f0: 6c 0a 09 6d 61 69 6e 74 61 69 6e 20 69 6e 66 6f  l..maintain info
4900: 20 6f 6e 20 74 68 65 20 73 74 61 74 75 73 20 6f   on the status o
4910: 66 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  f the certificat
4920: 65 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74  e. RFC 5280 sect
4930: 69 6f 6e 20 34 2e 31 2e 32 2e 35 20 2a 2f 0a 20  ion 4.1.2.5 */. 
4940: 20 20 20 2f 2a 20 47 65 74 20 56 61 6c 69 64 69     /* Get Validi
4950: 74 79 20 2d 20 4e 6f 74 20 42 65 66 6f 72 65 20  ty - Not Before 
4960: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f  */.    len = BIO
4970: 5f 74 6f 5f 42 75 66 66 65 72 28 41 53 4e 31 5f  _to_Buffer(ASN1_
4980: 54 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c 20  TIME_print(bio, 
4990: 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74 42 65 66  X509_get0_notBef
49a0: 6f 72 65 28 63 65 72 74 29 29 2c 20 62 69 6f 2c  ore(cert)), bio,
49b0: 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29   buffer, BUFSIZ)
49c0: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  ;.    LAPPEND_ST
49d0: 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  R(interp, result
49e0: 4f 62 6a 2c 20 22 6e 6f 74 42 65 66 6f 72 65 22  Obj, "notBefore"
49f0: 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a  , buffer, len);.
4a00: 0a 20 20 20 20 2f 2a 20 47 65 74 20 56 61 6c 69  .    /* Get Vali
4a10: 64 69 74 79 20 2d 20 4e 6f 74 20 41 66 74 65 72  dity - Not After
4a20: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49   */.    len = BI
4a30: 4f 5f 74 6f 5f 42 75 66 66 65 72 28 41 53 4e 31  O_to_Buffer(ASN1
4a40: 5f 54 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c  _TIME_print(bio,
4a50: 20 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74 41 66   X509_get0_notAf
4a60: 74 65 72 28 63 65 72 74 29 29 2c 20 62 69 6f 2c  ter(cert)), bio,
4a70: 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29   buffer, BUFSIZ)
4a80: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  ;.    LAPPEND_ST
4a90: 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  R(interp, result
4aa0: 4f 62 6a 2c 20 22 6e 6f 74 41 66 74 65 72 22 2c  Obj, "notAfter",
4ab0: 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a   buffer, len);..
4ac0: 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 69      /* Subject i
4ad0: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 65 6e  dentifies the en
4ae0: 74 69 74 79 20 61 73 73 6f 63 69 61 74 65 64 20  tity associated 
4af0: 77 69 74 68 20 74 68 65 20 70 75 62 6c 69 63 20  with the public 
4b00: 6b 65 79 20 73 74 6f 72 65 64 20 69 6e 0a 09 74  key stored in..t
4b10: 68 65 20 73 75 62 6a 65 63 74 20 70 75 62 6c 69  he subject publi
4b20: 63 20 6b 65 79 20 66 69 65 6c 64 2e 20 52 46 43  c key field. RFC
4b30: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
4b40: 31 2e 32 2e 36 20 2a 2f 0a 20 20 20 20 6c 65 6e  1.2.6 */.    len
4b50: 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72   = BIO_to_Buffer
4b60: 28 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e 74  (X509_NAME_print
4b70: 5f 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67 65  _ex(bio, X509_ge
4b80: 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63  t_subject_name(c
4b90: 65 72 74 29 2c 20 30 2c 20 66 6c 61 67 73 29 2c  ert), 0, flags),
4ba0: 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55   bio, buffer, BU
4bb0: 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45  FSIZ);.    LAPPE
4bc0: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72  ND_STR(interp, r
4bd0: 65 73 75 6c 74 4f 62 6a 2c 20 22 73 75 62 6a 65  esultObj, "subje
4be0: 63 74 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e  ct", buffer, len
4bf0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 48 41 31 20  );..    /* SHA1 
4c00: 44 69 67 65 73 74 20 28 46 69 6e 67 65 72 70 72  Digest (Fingerpr
4c10: 69 6e 74 29 20 6f 66 20 63 65 72 74 20 2d 20 44  int) of cert - D
4c20: 45 52 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ER representatio
4c30: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35 30  n */.    if (X50
4c40: 39 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 45  9_digest(cert, E
4c50: 56 50 5f 73 68 61 31 28 29 2c 20 28 75 6e 73 69  VP_sha1(), (unsi
4c60: 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66  gned char *)buff
4c70: 65 72 2c 20 26 75 6c 65 6e 29 29 20 7b 0a 09 4c  er, &ulen)) {..L
4c80: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72  APPEND_OBJ(inter
4c90: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73  p, resultObj, "s
4ca0: 68 61 31 5f 68 61 73 68 22 2c 20 53 74 72 69 6e  ha1_hash", Strin
4cb0: 67 5f 74 6f 5f 48 65 78 28 28 63 6f 6e 73 74 20  g_to_Hex((const 
4cc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
4cd0: 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20 75 6c  buffer, (int) ul
4ce0: 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  en));.    }..   
4cf0: 20 2f 2a 20 53 48 41 32 35 36 20 44 69 67 65 73   /* SHA256 Diges
4d00: 74 20 28 46 69 6e 67 65 72 70 72 69 6e 74 29 20  t (Fingerprint) 
4d10: 6f 66 20 63 65 72 74 20 2d 20 44 45 52 20 72 65  of cert - DER re
4d20: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  presentation */.
4d30: 20 20 20 20 69 66 20 28 58 35 30 39 5f 64 69 67      if (X509_dig
4d40: 65 73 74 28 63 65 72 74 2c 20 45 56 50 5f 73 68  est(cert, EVP_sh
4d50: 61 32 35 36 28 29 2c 20 28 75 6e 73 69 67 6e 65  a256(), (unsigne
4d60: 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 72 2c  d char *)buffer,
4d70: 20 26 75 6c 65 6e 29 29 20 7b 0a 09 4c 41 50 50   &ulen)) {..LAPP
4d80: 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20  END_OBJ(interp, 
4d90: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 68 61 32  resultObj, "sha2
4da0: 35 36 5f 68 61 73 68 22 2c 20 53 74 72 69 6e 67  56_hash", String
4db0: 5f 74 6f 5f 48 65 78 28 28 63 6f 6e 73 74 20 75  _to_Hex((const u
4dc0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62  nsigned char *)b
4dd0: 75 66 66 65 72 2c 20 28 69 6e 74 29 20 75 6c 65  uffer, (int) ule
4de0: 6e 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n));.    }..    
4df0: 2f 2a 20 53 75 62 6a 65 63 74 20 50 75 62 6c 69  /* Subject Publi
4e00: 63 20 4b 65 79 20 49 6e 66 6f 20 73 70 65 63 69  c Key Info speci
4e10: 66 69 65 73 20 74 68 65 20 70 75 62 6c 69 63 20  fies the public 
4e20: 6b 65 79 20 61 6e 64 20 69 64 65 6e 74 69 66 69  key and identifi
4e30: 65 73 20 74 68 65 0a 09 61 6c 67 6f 72 69 74 68  es the..algorith
4e40: 6d 20 77 69 74 68 20 77 68 69 63 68 20 74 68 65  m with which the
4e50: 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 52 46   key is used. RF
4e60: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34  C 5280 section 4
4e70: 2e 31 2e 32 2e 37 20 2a 2f 0a 20 20 20 20 69 66  .1.2.7 */.    if
4e80: 20 28 58 35 30 39 5f 67 65 74 5f 73 69 67 6e 61   (X509_get_signa
4e90: 74 75 72 65 5f 69 6e 66 6f 28 63 65 72 74 2c 20  ture_info(cert, 
4ea0: 26 6d 64 6e 69 64 2c 20 26 70 6b 6e 69 64 2c 20  &mdnid, &pknid, 
4eb0: 26 62 69 74 73 2c 20 26 78 66 6c 61 67 73 29 29  &bits, &xflags))
4ec0: 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56   {.#if OPENSSL_V
4ed0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
4ee0: 30 78 34 30 30 30 30 30 30 30 4c 0a 09 41 53 4e  0x40000000L..ASN
4ef0: 31 5f 42 49 54 5f 53 54 52 49 4e 47 20 2a 6b 65  1_BIT_STRING *ke
4f00: 79 3b 0a 23 65 6c 73 65 0a 09 63 6f 6e 73 74 20  y;.#else..const 
4f10: 41 53 4e 31 5f 42 49 54 5f 53 54 52 49 4e 47 20  ASN1_BIT_STRING 
4f20: 2a 6b 65 79 3b 0a 23 65 6e 64 69 66 0a 09 75 6e  *key;.#endif..un
4f30: 73 69 67 6e 65 64 20 69 6e 74 20 6e 3b 0a 0a 09  signed int n;...
4f40: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
4f50: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
4f60: 73 69 67 6e 69 6e 67 44 69 67 65 73 74 22 2c 20  signingDigest", 
4f70: 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6d 64 6e 69 64  OBJ_nid2ln(mdnid
4f80: 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44  ), -1);..LAPPEND
4f90: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73  _STR(interp, res
4fa0: 75 6c 74 4f 62 6a 2c 20 22 70 75 62 6c 69 63 4b  ultObj, "publicK
4fb0: 65 79 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42  eyAlgorithm", OB
4fc0: 4a 5f 6e 69 64 32 6c 6e 28 70 6b 6e 69 64 29 2c  J_nid2ln(pknid),
4fd0: 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49   -1);..LAPPEND_I
4fe0: 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  NT(interp, resul
4ff0: 74 4f 62 6a 2c 20 22 62 69 74 73 22 2c 20 62 69  tObj, "bits", bi
5000: 74 73 29 3b 20 2f 2a 20 45 66 66 65 63 74 69 76  ts); /* Effectiv
5010: 65 20 73 65 63 75 72 69 74 79 20 62 69 74 73 20  e security bits 
5020: 2a 2f 0a 0a 09 6b 65 79 20 3d 20 58 35 30 39 5f  */...key = X509_
5030: 67 65 74 30 5f 70 75 62 6b 65 79 5f 62 69 74 73  get0_pubkey_bits
5040: 74 72 28 63 65 72 74 29 3b 0a 23 69 66 20 4f 50  tr(cert);.#if OP
5050: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
5060: 4d 42 45 52 20 3c 20 30 78 34 30 31 30 30 30 30  MBER < 0x4010000
5070: 30 4c 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28  0L..LAPPEND_OBJ(
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 62 6c 69 63 4b 65 79 22 2c 0a  j, "publicKey",.
50a0: 09 20 20 20 20 53 74 72 69 6e 67 5f 74 6f 5f 48  .    String_to_H
50b0: 65 78 28 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67  ex(ASN1_STRING_g
50c0: 65 74 30 5f 64 61 74 61 28 6b 65 79 29 2c 0a 09  et0_data(key),..
50d0: 20 20 20 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f      ASN1_STRING_
50e0: 6c 65 6e 67 74 68 28 6b 65 79 29 29 29 3b 0a 23  length(key)));.#
50f0: 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f 4f 42  else..LAPPEND_OB
5100: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  J(interp, result
5110: 4f 62 6a 2c 20 22 70 75 62 6c 69 63 4b 65 79 22  Obj, "publicKey"
5120: 2c 0a 09 20 20 20 20 53 74 72 69 6e 67 5f 74 6f  ,..    String_to
5130: 5f 48 65 78 28 41 53 4e 31 5f 53 54 52 49 4e 47  _Hex(ASN1_STRING
5140: 5f 67 65 74 30 5f 64 61 74 61 28 6b 65 79 29 2c  _get0_data(key),
5150: 0a 09 20 20 20 20 28 69 6e 74 29 41 53 4e 31 5f  ..    (int)ASN1_
5160: 53 54 52 49 4e 47 5f 67 65 74 5f 6c 65 6e 67 74  STRING_get_lengt
5170: 68 28 6b 65 79 29 29 29 3b 0a 23 65 6e 64 69 66  h(key)));.#endif
5180: 0a 0a 09 69 66 20 28 58 35 30 39 5f 70 75 62 6b  ...if (X509_pubk
5190: 65 79 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20  ey_digest(cert, 
51a0: 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74 62 79  EVP_get_digestby
51b0: 6e 69 64 28 70 6b 6e 69 64 29 2c 20 28 75 6e 73  nid(pknid), (uns
51c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66  igned char *)buf
51d0: 66 65 72 2c 20 26 6e 29 29 20 7b 0a 09 20 20 20  fer, &n)) {..   
51e0: 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74   LAPPEND_OBJ(int
51f0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
5200: 22 70 75 62 6c 69 63 4b 65 79 48 61 73 68 22 2c  "publicKeyHash",
5210: 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 28   String_to_Hex((
5220: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
5230: 68 61 72 20 2a 29 62 75 66 66 65 72 2c 20 28 69  har *)buffer, (i
5240: 6e 74 29 20 6e 29 29 3b 0a 09 7d 20 65 6c 73 65  nt) n));..} else
5250: 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f   {..    LAPPEND_
5260: 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75  STR(interp, resu
5270: 6c 74 4f 62 6a 2c 20 22 70 75 62 6c 69 63 4b 65  ltObj, "publicKe
5280: 79 48 61 73 68 22 2c 20 22 22 2c 20 30 29 3b 0a  yHash", "", 0);.
5290: 09 7d 0a 0a 09 2f 2a 20 64 69 67 65 73 74 20 6f  .}.../* digest o
52a0: 66 20 74 68 65 20 44 45 52 20 72 65 70 72 65 73  f the DER repres
52b0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
52c0: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
52d0: 69 66 20 28 58 35 30 39 5f 64 69 67 65 73 74 28  if (X509_digest(
52e0: 63 65 72 74 2c 20 45 56 50 5f 67 65 74 5f 64 69  cert, EVP_get_di
52f0: 67 65 73 74 62 79 6e 69 64 28 6d 64 6e 69 64 29  gestbynid(mdnid)
5300: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
5310: 20 2a 29 62 75 66 66 65 72 2c 20 26 6e 29 29 20   *)buffer, &n)) 
5320: 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f  {..    LAPPEND_O
5330: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  BJ(interp, resul
5340: 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75 72 65  tObj, "signature
5350: 48 61 73 68 22 2c 20 53 74 72 69 6e 67 5f 74 6f  Hash", String_to
5360: 5f 48 65 78 28 28 63 6f 6e 73 74 20 75 6e 73 69  _Hex((const unsi
5370: 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66  gned char *)buff
5380: 65 72 2c 20 28 69 6e 74 29 20 6e 29 29 3b 0a 09  er, (int) n));..
5390: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 4c 41  } else {..    LA
53a0: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
53b0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69  , resultObj, "si
53c0: 67 6e 61 74 75 72 65 48 61 73 68 22 2c 20 22 22  gnatureHash", ""
53d0: 2c 20 30 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  , 0);..}.    }..
53e0: 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63 61      /* Certifica
53f0: 74 65 20 50 75 72 70 6f 73 65 2e 20 43 61 6c 6c  te Purpose. Call
5400: 20 62 65 66 6f 72 65 20 63 68 65 63 6b 69 6e 67   before checking
5410: 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e   for extensions.
5420: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
5430: 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75  STR(interp, resu
5440: 6c 74 4f 62 6a 2c 20 22 70 75 72 70 6f 73 65 22  ltObj, "purpose"
5450: 2c 20 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73  , Tls_x509Purpos
5460: 65 28 63 65 72 74 29 2c 20 2d 31 29 3b 0a 20 20  e(cert), -1);.  
5470: 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e    LAPPEND_OBJ(in
5480: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
5490: 20 22 63 65 72 74 69 66 69 63 61 74 65 50 75 72   "certificatePur
54a0: 70 6f 73 65 22 2c 20 54 6c 73 5f 78 35 30 39 50  pose", Tls_x509P
54b0: 75 72 70 6f 73 65 73 28 69 6e 74 65 72 70 2c 20  urposes(interp, 
54c0: 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  cert));..    /* 
54d0: 47 65 74 20 65 78 74 65 6e 73 69 6f 6e 73 20 66  Get extensions f
54e0: 6c 61 67 73 20 2a 2f 0a 20 20 20 20 78 66 6c 61  lags */.    xfla
54f0: 67 73 20 3d 20 58 35 30 39 5f 67 65 74 5f 65 78  gs = X509_get_ex
5500: 74 65 6e 73 69 6f 6e 5f 66 6c 61 67 73 28 63 65  tension_flags(ce
5510: 72 74 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  rt);.    LAPPEND
5520: 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 73  _INT(interp, res
5530: 75 6c 74 4f 62 6a 2c 20 22 65 78 74 46 6c 61 67  ultObj, "extFlag
5540: 73 22 2c 20 78 66 6c 61 67 73 29 3b 0a 0a 09 2f  s", xflags);.../
5550: 2a 20 43 68 65 63 6b 20 69 66 20 63 65 72 74 20  * Check if cert 
5560: 77 61 73 20 69 73 73 75 65 64 20 62 79 20 43 41  was issued by CA
5570: 20 63 65 72 74 20 69 73 73 75 65 72 20 6f 72 20   cert issuer or 
5580: 73 65 6c 66 20 73 69 67 6e 65 64 20 2a 2f 0a 20  self signed */. 
5590: 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28     LAPPEND_BOOL(
55a0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
55b0: 6a 2c 20 22 73 65 6c 66 49 73 73 75 65 64 22 2c  j, "selfIssued",
55c0: 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47   xflags & EXFLAG
55d0: 5f 53 49 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  _SI);.    LAPPEN
55e0: 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72  D_BOOL(interp, r
55f0: 65 73 75 6c 74 4f 62 6a 2c 20 22 73 65 6c 66 53  esultObj, "selfS
5600: 69 67 6e 65 64 22 2c 20 78 66 6c 61 67 73 20 26  igned", xflags &
5610: 20 45 58 46 4c 41 47 5f 53 53 29 3b 0a 20 20 20   EXFLAG_SS);.   
5620: 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e   LAPPEND_BOOL(in
5630: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
5640: 20 22 69 73 50 72 6f 78 79 43 65 72 74 22 2c 20   "isProxyCert", 
5650: 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f  xflags & EXFLAG_
5660: 50 52 4f 58 59 29 3b 0a 20 20 20 20 4c 41 50 50  PROXY);.    LAPP
5670: 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
5680: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74   resultObj, "ext
5690: 49 6e 76 61 6c 69 64 22 2c 20 78 66 6c 61 67 73  Invalid", xflags
56a0: 20 26 20 45 58 46 4c 41 47 5f 49 4e 56 41 4c 49   & EXFLAG_INVALI
56b0: 44 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  D);.    LAPPEND_
56c0: 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65 73  BOOL(interp, res
56d0: 75 6c 74 4f 62 6a 2c 20 22 69 73 43 41 43 65 72  ultObj, "isCACer
56e0: 74 22 2c 20 58 35 30 39 5f 63 68 65 63 6b 5f 63  t", X509_check_c
56f0: 61 28 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f  a(cert));..    /
5700: 2a 20 54 68 65 20 55 6e 69 71 75 65 20 49 64 73  * The Unique Ids
5710: 20 61 72 65 20 75 73 65 64 20 74 6f 20 68 61 6e   are used to han
5720: 64 6c 65 20 74 68 65 20 70 6f 73 73 69 62 69 6c  dle the possibil
5730: 69 74 79 20 6f 66 20 72 65 75 73 65 20 6f 66 20  ity of reuse of 
5740: 73 75 62 6a 65 63 74 0a 09 61 6e 64 2f 6f 72 20  subject..and/or 
5750: 69 73 73 75 65 72 20 6e 61 6d 65 73 20 6f 76 65  issuer names ove
5760: 72 20 74 69 6d 65 2e 20 52 46 43 20 35 32 38 30  r time. RFC 5280
5770: 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 38   section 4.1.2.8
5780: 20 2a 2f 0a 20 20 20 20 7b 0a 09 63 6f 6e 73 74   */.    {..const
5790: 20 41 53 4e 31 5f 42 49 54 5f 53 54 52 49 4e 47   ASN1_BIT_STRING
57a0: 20 2a 69 75 69 64 2c 20 2a 73 75 69 64 3b 0a 09   *iuid, *suid;..
57b0: 58 35 30 39 5f 67 65 74 30 5f 75 69 64 73 28 63  X509_get0_uids(c
57c0: 65 72 74 2c 20 26 69 75 69 64 2c 20 26 73 75 69  ert, &iuid, &sui
57d0: 64 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  d);...Tcl_ListOb
57e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
57f0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
5800: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5810: 62 6a 28 22 69 73 73 75 65 72 55 6e 69 71 75 65  bj("issuerUnique
5820: 49 64 22 2c 20 2d 31 29 29 3b 0a 09 69 66 20 28  Id", -1));..if (
5830: 69 75 69 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  iuid != NULL) {.
5840: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
5850: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 34  ION_NUMBER < 0x4
5860: 30 31 30 30 30 30 30 4c 0a 09 20 20 20 20 54 63  0100000L..    Tc
5870: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5880: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
5890: 65 73 75 6c 74 4f 62 6a 2c 0a 09 09 54 63 6c 5f  esultObj,...Tcl_
58a0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
58b0: 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74 30  ASN1_STRING_get0
58c0: 5f 64 61 74 61 28 69 75 69 64 29 2c 0a 09 09 28  _data(iuid),...(
58d0: 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31 5f 53  Tcl_Size) ASN1_S
58e0: 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 69 75 69  TRING_length(iui
58f0: 64 29 29 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20  d)));.#else..   
5900: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5910: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5920: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 0a 09 09 54  , resultObj,...T
5930: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
5940: 62 6a 28 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67  bj(ASN1_STRING_g
5950: 65 74 30 5f 64 61 74 61 28 69 75 69 64 29 2c 0a  et0_data(iuid),.
5960: 09 09 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e  ..(Tcl_Size) ASN
5970: 31 5f 53 54 52 49 4e 47 5f 67 65 74 5f 6c 65 6e  1_STRING_get_len
5980: 67 74 68 28 69 75 69 64 29 29 29 3b 0a 23 65 6e  gth(iuid)));.#en
5990: 64 69 66 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  dif..} else {.. 
59a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
59b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
59c0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54  rp, resultObj, T
59d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
59e0: 22 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 0a 09 54  "", -1));..}...T
59f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5a00: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
5a10: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e  resultObj, Tcl_N
5a20: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 75 62  ewStringObj("sub
5a30: 6a 65 63 74 55 6e 69 71 75 65 49 64 22 2c 20 2d  jectUniqueId", -
5a40: 31 29 29 3b 0a 09 69 66 20 28 73 75 69 64 20 21  1));..if (suid !
5a50: 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 20 4f 50  = NULL) {.#if OP
5a60: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
5a70: 4d 42 45 52 20 3c 20 30 78 34 30 31 30 30 30 30  MBER < 0x4010000
5a80: 30 4c 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74  0L..    Tcl_List
5a90: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5aa0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
5ab0: 62 6a 2c 0a 09 09 54 63 6c 5f 4e 65 77 42 79 74  bj,...Tcl_NewByt
5ac0: 65 41 72 72 61 79 4f 62 6a 28 41 53 4e 31 5f 53  eArrayObj(ASN1_S
5ad0: 54 52 49 4e 47 5f 67 65 74 30 5f 64 61 74 61 28  TRING_get0_data(
5ae0: 73 75 69 64 29 2c 0a 09 09 28 54 63 6c 5f 53 69  suid),...(Tcl_Si
5af0: 7a 65 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f  ze) ASN1_STRING_
5b00: 6c 65 6e 67 74 68 28 73 75 69 64 29 29 29 3b 0a  length(suid)));.
5b10: 23 65 6c 73 65 0a 09 20 20 20 20 54 63 6c 5f 4c  #else..    Tcl_L
5b20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5b30: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ent(interp, resu
5b40: 6c 74 4f 62 6a 2c 0a 09 09 54 63 6c 5f 4e 65 77  ltObj,...Tcl_New
5b50: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 41 53 4e  ByteArrayObj(ASN
5b60: 31 5f 53 54 52 49 4e 47 5f 67 65 74 30 5f 64 61  1_STRING_get0_da
5b70: 74 61 28 73 75 69 64 29 2c 0a 09 09 28 54 63 6c  ta(suid),...(Tcl
5b80: 5f 53 69 7a 65 29 20 41 53 4e 31 5f 53 54 52 49  _Size) ASN1_STRI
5b90: 4e 47 5f 67 65 74 5f 6c 65 6e 67 74 68 28 73 75  NG_get_length(su
5ba0: 69 64 29 29 29 3b 0a 23 65 6e 64 69 66 0a 09 7d  id)));.#endif..}
5bb0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c   else {..    Tcl
5bc0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5bd0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65  ement(interp, re
5be0: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77  sultObj, Tcl_New
5bf0: 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31  StringObj("", -1
5c00: 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  ));..}.    }..  
5c10: 20 20 2f 2a 20 58 35 30 39 20 76 33 20 45 78 74    /* X509 v3 Ext
5c20: 65 6e 73 69 6f 6e 73 20 2d 20 52 46 43 20 35 32  ensions - RFC 52
5c30: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32  80 section 4.1.2
5c40: 2e 39 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  .9 */.    LAPPEN
5c50: 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 65  D_INT(interp, re
5c60: 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74 43 6f 75  sultObj, "extCou
5c70: 6e 74 22 2c 20 58 35 30 39 5f 67 65 74 5f 65 78  nt", X509_get_ex
5c80: 74 5f 63 6f 75 6e 74 28 63 65 72 74 29 29 3b 0a  t_count(cert));.
5c90: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28      LAPPEND_OBJ(
5ca0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
5cb0: 6a 2c 20 22 65 78 74 65 6e 73 69 6f 6e 73 22 2c  j, "extensions",
5cc0: 20 54 6c 73 5f 78 35 30 39 45 78 74 65 6e 73 69   Tls_x509Extensi
5cd0: 6f 6e 73 28 69 6e 74 65 72 70 2c 20 63 65 72 74  ons(interp, cert
5ce0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 75 74 68  ));..    /* Auth
5cf0: 6f 72 69 74 79 20 4b 65 79 20 49 64 65 6e 74 69  ority Key Identi
5d00: 66 69 65 72 20 28 41 4b 49 29 20 69 73 20 74 68  fier (AKI) is th
5d10: 65 20 53 75 62 6a 65 63 74 20 4b 65 79 20 49 64  e Subject Key Id
5d20: 65 6e 74 69 66 69 65 72 20 28 53 4b 49 29 20 6f  entifier (SKI) o
5d30: 66 0a 09 69 74 73 20 73 69 67 6e 65 72 20 28 74  f..its signer (t
5d40: 68 65 20 43 41 29 2e 20 52 46 43 20 35 32 38 30  he CA). RFC 5280
5d50: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31   section 4.2.1.1
5d60: 2c 20 4e 49 44 5f 61 75 74 68 6f 72 69 74 79 5f  , NID_authority_
5d70: 6b 65 79 5f 69 64 65 6e 74 69 66 69 65 72 20 2a  key_identifier *
5d80: 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42  /.    LAPPEND_OB
5d90: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  J(interp, result
5da0: 4f 62 6a 2c 20 22 61 75 74 68 6f 72 69 74 79 4b  Obj, "authorityK
5db0: 65 79 49 64 65 6e 74 69 66 69 65 72 22 2c 0a 09  eyIdentifier",..
5dc0: 54 6c 73 5f 78 35 30 39 49 64 65 6e 74 69 66 69  Tls_x509Identifi
5dd0: 65 72 28 58 35 30 39 5f 67 65 74 30 5f 61 75 74  er(X509_get0_aut
5de0: 68 6f 72 69 74 79 5f 6b 65 79 5f 69 64 28 63 65  hority_key_id(ce
5df0: 72 74 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  rt)));..    /* S
5e00: 75 62 6a 65 63 74 20 4b 65 79 20 49 64 65 6e 74  ubject Key Ident
5e10: 69 66 69 65 72 20 28 53 4b 49 29 20 69 73 20 75  ifier (SKI) is u
5e20: 73 65 64 20 74 6f 20 69 64 65 6e 74 69 66 79 20  sed to identify 
5e30: 63 65 72 74 69 66 69 63 61 74 65 73 20 74 68 61  certificates tha
5e40: 74 20 63 6f 6e 74 61 69 6e 0a 09 61 20 70 61 72  t contain..a par
5e50: 74 69 63 75 6c 61 72 20 70 75 62 6c 69 63 20 6b  ticular public k
5e60: 65 79 2e 20 52 46 43 20 35 32 38 30 20 73 65 63  ey. RFC 5280 sec
5e70: 74 69 6f 6e 20 34 2e 32 2e 31 2e 32 2c 20 4e 49  tion 4.2.1.2, NI
5e80: 44 5f 73 75 62 6a 65 63 74 5f 6b 65 79 5f 69 64  D_subject_key_id
5e90: 65 6e 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20  entifier */.    
5ea0: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65  LAPPEND_OBJ(inte
5eb0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
5ec0: 73 75 62 6a 65 63 74 4b 65 79 49 64 65 6e 74 69  subjectKeyIdenti
5ed0: 66 69 65 72 22 2c 0a 09 54 6c 73 5f 78 35 30 39  fier",..Tls_x509
5ee0: 49 64 65 6e 74 69 66 69 65 72 28 58 35 30 39 5f  Identifier(X509_
5ef0: 67 65 74 30 5f 73 75 62 6a 65 63 74 5f 6b 65 79  get0_subject_key
5f00: 5f 69 64 28 63 65 72 74 29 29 29 3b 0a 0a 20 20  _id(cert)));..  
5f10: 20 20 2f 2a 20 4b 65 79 20 75 73 61 67 65 20 65    /* Key usage e
5f20: 78 74 65 6e 73 69 6f 6e 20 64 65 66 69 6e 65 73  xtension defines
5f30: 20 74 68 65 20 70 75 72 70 6f 73 65 20 28 65 2e   the purpose (e.
5f40: 67 2e 2c 20 65 6e 63 69 70 68 65 72 6d 65 6e 74  g., encipherment
5f50: 2c 20 73 69 67 6e 61 74 75 72 65 2c 20 63 65 72  , signature, cer
5f60: 74 69 66 69 63 61 74 65 0a 09 73 69 67 6e 69 6e  tificate..signin
5f70: 67 29 20 6f 66 20 74 68 65 20 6b 65 79 20 69 6e  g) of the key in
5f80: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
5f90: 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69  . RFC 5280 secti
5fa0: 6f 6e 20 34 2e 32 2e 31 2e 33 2c 20 4e 49 44 5f  on 4.2.1.3, NID_
5fb0: 6b 65 79 5f 75 73 61 67 65 20 2a 2f 0a 20 20 20  key_usage */.   
5fc0: 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74   LAPPEND_OBJ(int
5fd0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
5fe0: 22 6b 65 79 55 73 61 67 65 22 2c 20 54 6c 73 5f  "keyUsage", Tls_
5ff0: 78 35 30 39 4b 65 79 55 73 61 67 65 28 69 6e 74  x509KeyUsage(int
6000: 65 72 70 2c 20 63 65 72 74 2c 20 78 66 6c 61 67  erp, cert, xflag
6010: 73 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 65 72  s));..    /* Cer
6020: 74 69 66 69 63 61 74 65 20 50 6f 6c 69 63 69 65  tificate Policie
6030: 73 20 2d 20 69 6e 64 69 63 61 74 65 73 20 74 68  s - indicates th
6040: 65 20 69 73 73 75 69 6e 67 20 43 41 20 63 6f 6e  e issuing CA con
6050: 73 69 64 65 72 73 20 69 74 73 20 69 73 73 75 65  siders its issue
6060: 72 44 6f 6d 61 69 6e 50 6f 6c 69 63 79 0a 09 65  rDomainPolicy..e
6070: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
6080: 20 73 75 62 6a 65 63 74 20 43 41 27 73 20 73 75   subject CA's su
6090: 62 6a 65 63 74 44 6f 6d 61 69 6e 50 6f 6c 69 63  bjectDomainPolic
60a0: 79 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74  y. RFC 5280 sect
60b0: 69 6f 6e 20 34 2e 32 2e 31 2e 34 2c 20 4e 49 44  ion 4.2.1.4, NID
60c0: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 70 6f 6c  _certificate_pol
60d0: 69 63 69 65 73 20 2a 2f 0a 20 20 20 20 69 66 20  icies */.    if 
60e0: 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47  (xflags & EXFLAG
60f0: 5f 49 4e 56 41 4c 49 44 5f 50 4f 4c 49 43 59 29  _INVALID_POLICY)
6100: 20 7b 0a 09 2f 2a 20 52 65 6a 65 63 74 20 63 65   {../* Reject ce
6110: 72 74 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  rt */.    }..   
6120: 20 2f 2a 20 50 6f 6c 69 63 79 20 4d 61 70 70 69   /* Policy Mappi
6130: 6e 67 73 20 2d 20 52 46 43 20 35 32 38 30 20 73  ngs - RFC 5280 s
6140: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 35 2c 20  ection 4.2.1.5, 
6150: 4e 49 44 5f 70 6f 6c 69 63 79 5f 6d 61 70 70 69  NID_policy_mappi
6160: 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ngs */..    /* S
6170: 75 62 6a 65 63 74 20 41 6c 74 65 72 6e 61 74 69  ubject Alternati
6180: 76 65 20 4e 61 6d 65 20 28 53 41 4e 29 20 63 6f  ve Name (SAN) co
6190: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
61a0: 6c 20 55 52 4c 73 2c 20 44 4e 53 20 6e 61 6d 65  l URLs, DNS name
61b0: 73 2c 20 6f 72 20 49 50 0a 09 61 64 64 72 65 73  s, or IP..addres
61c0: 73 65 73 20 62 6f 75 6e 64 20 74 6f 20 63 65 72  ses bound to cer
61d0: 74 69 66 69 63 61 74 65 2e 20 52 46 43 20 35 32  tificate. RFC 52
61e0: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31  80 section 4.2.1
61f0: 2e 36 2c 20 4e 49 44 5f 73 75 62 6a 65 63 74 5f  .6, NID_subject_
6200: 61 6c 74 5f 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  alt_name */.    
6210: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65  LAPPEND_OBJ(inte
6220: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
6230: 73 75 62 6a 65 63 74 41 6c 74 4e 61 6d 65 22 2c  subjectAltName",
6240: 20 54 6c 73 5f 78 35 30 39 4e 61 6d 65 73 28 69   Tls_x509Names(i
6250: 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 4e 49 44  nterp, cert, NID
6260: 5f 73 75 62 6a 65 63 74 5f 61 6c 74 5f 6e 61 6d  _subject_alt_nam
6270: 65 2c 20 62 69 6f 29 29 3b 0a 0a 20 20 20 20 2f  e, bio));..    /
6280: 2a 20 49 73 73 75 65 72 20 41 6c 74 65 72 6e 61  * Issuer Alterna
6290: 74 69 76 65 20 4e 61 6d 65 20 69 73 20 75 73 65  tive Name is use
62a0: 64 20 74 6f 20 61 73 73 6f 63 69 61 74 65 20 49  d to associate I
62b0: 6e 74 65 72 6e 65 74 20 73 74 79 6c 65 20 69 64  nternet style id
62c0: 65 6e 74 69 74 69 65 73 0a 09 77 69 74 68 20 74  entities..with t
62d0: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69  he certificate i
62e0: 73 73 75 65 72 2e 20 52 46 43 20 35 32 38 30 20  ssuer. RFC 5280 
62f0: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 37 2c  section 4.2.1.7,
6300: 20 4e 49 44 5f 69 73 73 75 65 72 5f 61 6c 74 5f   NID_issuer_alt_
6310: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50  name */.    LAPP
6320: 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20  END_OBJ(interp, 
6330: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 69 73 73 75  resultObj, "issu
6340: 65 72 41 6c 74 4e 61 6d 65 22 2c 20 54 6c 73 5f  erAltName", Tls_
6350: 78 35 30 39 4e 61 6d 65 73 28 69 6e 74 65 72 70  x509Names(interp
6360: 2c 20 63 65 72 74 2c 20 4e 49 44 5f 69 73 73 75  , cert, NID_issu
6370: 65 72 5f 61 6c 74 5f 6e 61 6d 65 2c 20 62 69 6f  er_alt_name, bio
6380: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a  ));..    /* Subj
6390: 65 63 74 20 44 69 72 65 63 74 6f 72 79 20 41 74  ect Directory At
63a0: 74 72 69 62 75 74 65 73 20 70 72 6f 76 69 64 65  tributes provide
63b0: 73 20 69 64 65 6e 74 69 66 69 63 61 74 69 6f 6e  s identification
63c0: 20 61 74 74 72 69 62 75 74 65 73 20 28 65 2e 67   attributes (e.g
63d0: 2e 2c 20 6e 61 74 69 6f 6e 61 6c 69 74 79 29 0a  ., nationality).
63e0: 09 6f 66 20 74 68 65 20 73 75 62 6a 65 63 74 2e  .of the subject.
63f0: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f   RFC 5280 sectio
6400: 6e 20 34 2e 32 2e 31 2e 38 20 28 73 75 62 6a 65  n 4.2.1.8 (subje
6410: 63 74 44 69 72 65 63 74 6f 72 79 41 74 74 72 69  ctDirectoryAttri
6420: 62 75 74 65 73 29 20 2a 2f 0a 0a 20 20 20 20 2f  butes) */..    /
6430: 2a 20 42 61 73 69 63 20 43 6f 6e 73 74 72 61 69  * Basic Constrai
6440: 6e 74 73 20 69 64 65 6e 74 69 66 69 65 73 20 77  nts identifies w
6450: 68 65 74 68 65 72 20 74 68 65 20 73 75 62 6a 65  hether the subje
6460: 63 74 20 6f 66 20 74 68 65 20 63 65 72 74 20 69  ct of the cert i
6470: 73 20 61 20 43 41 20 61 6e 64 0a 09 74 68 65 20  s a CA and..the 
6480: 6d 61 78 20 64 65 70 74 68 20 6f 66 20 76 61 6c  max depth of val
6490: 69 64 20 63 65 72 74 20 70 61 74 68 73 20 66 6f  id cert paths fo
64a0: 72 20 74 68 69 73 20 63 65 72 74 2e 20 52 46 43  r this cert. RFC
64b0: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
64c0: 32 2e 31 2e 39 2c 20 4e 49 44 5f 62 61 73 69 63  2.1.9, NID_basic
64d0: 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a  _constraints */.
64e0: 20 20 20 20 69 66 20 28 21 28 78 66 6c 61 67 73      if (!(xflags
64f0: 20 26 20 45 58 46 4c 41 47 5f 50 52 4f 58 59 29   & EXFLAG_PROXY)
6500: 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e  ) {..LAPPEND_LON
6510: 47 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  G(interp, result
6520: 4f 62 6a 2c 20 22 70 61 74 68 4c 65 6e 22 2c 20  Obj, "pathLen", 
6530: 58 35 30 39 5f 67 65 74 5f 70 61 74 68 6c 65 6e  X509_get_pathlen
6540: 28 63 65 72 74 29 29 3b 0a 20 20 20 20 7d 20 65  (cert));.    } e
6550: 6c 73 65 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 4c  lse {..LAPPEND_L
6560: 4f 4e 47 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ONG(interp, resu
6570: 6c 74 4f 62 6a 2c 20 22 70 61 74 68 4c 65 6e 22  ltObj, "pathLen"
6580: 2c 20 58 35 30 39 5f 67 65 74 5f 70 72 6f 78 79  , X509_get_proxy
6590: 5f 70 61 74 68 6c 65 6e 28 63 65 72 74 29 29 3b  _pathlen(cert));
65a0: 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45  .    }.    LAPPE
65b0: 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
65c0: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 62 61 73 69  resultObj, "basi
65d0: 63 43 6f 6e 73 74 72 61 69 6e 74 73 43 41 22 2c  cConstraintsCA",
65e0: 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47   xflags & EXFLAG
65f0: 5f 43 41 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 61  _CA);..    /* Na
6600: 6d 65 20 43 6f 6e 73 74 72 61 69 6e 74 73 20 69  me Constraints i
6610: 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 43  s only used in C
6620: 41 20 63 65 72 74 73 20 74 6f 20 69 6e 64 69 63  A certs to indic
6630: 61 74 65 20 74 68 65 20 6e 61 6d 65 20 73 70 61  ate the name spa
6640: 63 65 20 66 6f 72 0a 09 61 6c 6c 20 73 75 62 6a  ce for..all subj
6650: 65 63 74 20 6e 61 6d 65 73 20 69 6e 20 73 75 62  ect names in sub
6660: 73 65 71 75 65 6e 74 20 63 65 72 74 69 66 69 63  sequent certific
6670: 61 74 65 73 20 69 6e 20 61 20 63 65 72 74 69 66  ates in a certif
6680: 69 63 61 74 69 6f 6e 20 70 61 74 68 0a 09 4d 55  ication path..MU
6690: 53 54 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 52  ST be located. R
66a0: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20  FC 5280 section 
66b0: 34 2e 32 2e 31 2e 31 30 2c 20 4e 49 44 5f 6e 61  4.2.1.10, NID_na
66c0: 6d 65 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  me_constraints *
66d0: 2f 0a 0a 20 20 20 20 2f 2a 20 50 6f 6c 69 63 79  /..    /* Policy
66e0: 20 43 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20   Constraints is 
66f0: 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 43 41 20  only used in CA 
6700: 63 65 72 74 73 20 74 6f 20 6c 69 6d 69 74 20 74  certs to limit t
6710: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 0a 09  he length of a..
6720: 63 65 72 74 20 63 68 61 69 6e 20 66 6f 72 20 74  cert chain for t
6730: 68 61 74 20 43 41 2e 20 52 46 43 20 35 32 38 30  hat CA. RFC 5280
6740: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31   section 4.2.1.1
6750: 31 2c 20 4e 49 44 5f 70 6f 6c 69 63 79 5f 63 6f  1, NID_policy_co
6760: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20  nstraints */..  
6770: 20 20 2f 2a 20 45 78 74 65 6e 64 65 64 20 4b 65    /* Extended Ke
6780: 79 20 55 73 61 67 65 20 69 6e 64 69 63 61 74 65  y Usage indicate
6790: 73 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 74  s the purposes t
67a0: 68 65 20 63 65 72 74 69 66 69 65 64 20 70 75 62  he certified pub
67b0: 6c 69 63 20 6b 65 79 20 6d 61 79 20 62 65 0a 09  lic key may be..
67c0: 75 73 65 64 2c 20 62 65 79 6f 6e 64 20 74 68 65  used, beyond the
67d0: 20 62 61 73 69 63 20 70 75 72 70 6f 73 65 73 2e   basic purposes.
67e0: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f   RFC 5280 sectio
67f0: 6e 20 34 2e 32 2e 31 2e 31 32 2c 20 4e 49 44 5f  n 4.2.1.12, NID_
6800: 65 78 74 5f 6b 65 79 5f 75 73 61 67 65 20 2a 2f  ext_key_usage */
6810: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a  .    LAPPEND_OBJ
6820: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
6830: 62 6a 2c 20 22 65 78 74 65 6e 64 65 64 4b 65 79  bj, "extendedKey
6840: 55 73 61 67 65 22 2c 20 54 6c 73 5f 78 35 30 39  Usage", Tls_x509
6850: 45 78 74 4b 65 79 55 73 61 67 65 28 69 6e 74 65  ExtKeyUsage(inte
6860: 72 70 2c 20 63 65 72 74 2c 20 78 66 6c 61 67 73  rp, cert, xflags
6870: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 52 4c 20  ));..    /* CRL 
6880: 44 69 73 74 72 69 62 75 74 69 6f 6e 20 50 6f 69  Distribution Poi
6890: 6e 74 73 20 69 64 65 6e 74 69 66 69 65 73 20 77  nts identifies w
68a0: 68 65 72 65 20 43 52 4c 20 69 6e 66 6f 72 6d 61  here CRL informa
68b0: 74 69 6f 6e 20 63 61 6e 20 62 65 20 6f 62 74 61  tion can be obta
68c0: 69 6e 65 64 2e 0a 09 52 46 43 20 35 32 38 30 20  ined...RFC 5280 
68d0: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 33  section 4.2.1.13
68e0: 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f  */.    LAPPEND_O
68f0: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  BJ(interp, resul
6900: 74 4f 62 6a 2c 20 22 63 72 6c 44 69 73 74 72 69  tObj, "crlDistri
6910: 62 75 74 69 6f 6e 50 6f 69 6e 74 73 22 2c 20 54  butionPoints", T
6920: 6c 73 5f 78 35 30 39 43 72 6c 44 70 28 69 6e 74  ls_x509CrlDp(int
6930: 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20  erp, cert));..  
6940: 20 20 2f 2a 20 46 72 65 73 68 65 73 74 20 43 52    /* Freshest CR
6950: 4c 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 20  L extension */. 
6960: 20 20 20 69 66 20 28 78 66 6c 61 67 73 20 26 20     if (xflags & 
6970: 45 58 46 4c 41 47 5f 46 52 45 53 48 45 53 54 29  EXFLAG_FRESHEST)
6980: 20 7b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   {.    }..    /*
6990: 20 41 75 74 68 6f 72 69 74 79 20 49 6e 66 6f 72   Authority Infor
69a0: 6d 61 74 69 6f 6e 20 41 63 63 65 73 73 20 69 6e  mation Access in
69b0: 64 69 63 61 74 65 73 20 68 6f 77 20 74 6f 20 61  dicates how to a
69c0: 63 63 65 73 73 20 69 6e 66 6f 20 61 6e 64 20 73  ccess info and s
69d0: 65 72 76 69 63 65 73 0a 09 66 6f 72 20 74 68 65  ervices..for the
69e0: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73   certificate iss
69f0: 75 65 72 2e 20 52 46 43 20 35 32 38 30 20 73 65  uer. RFC 5280 se
6a00: 63 74 69 6f 6e 20 34 2e 32 2e 32 2e 31 2c 20 4e  ction 4.2.2.1, N
6a10: 49 44 5f 69 6e 66 6f 5f 61 63 63 65 73 73 20 2a  ID_info_access *
6a20: 2f 0a 0a 20 20 20 20 2f 2a 20 4f 6e 2d 6c 69 6e  /..    /* On-lin
6a30: 65 20 43 65 72 74 69 66 69 63 61 74 65 20 53 74  e Certificate St
6a40: 61 74 75 73 20 50 72 6f 74 6f 63 6f 6c 20 28 4f  atus Protocol (O
6a50: 53 43 50 29 20 52 65 73 70 6f 6e 64 65 72 73 20  SCP) Responders 
6a60: 55 52 4c 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45  URL */.    LAPPE
6a70: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72  ND_OBJ(interp, r
6a80: 65 73 75 6c 74 4f 62 6a 2c 20 22 6f 63 73 70 52  esultObj, "ocspR
6a90: 65 73 70 6f 6e 64 65 72 73 22 2c 20 54 6c 73 5f  esponders", Tls_
6aa0: 78 35 30 39 4f 73 63 70 28 69 6e 74 65 72 70 2c  x509Oscp(interp,
6ab0: 20 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a   cert));..    /*
6ac0: 20 43 65 72 74 69 66 69 63 61 74 65 20 41 75 74   Certificate Aut
6ad0: 68 6f 72 69 74 79 20 28 43 41 29 20 49 73 73 75  hority (CA) Issu
6ae0: 65 72 73 20 55 52 4c 20 2a 2f 0a 20 20 20 20 4c  ers URL */.    L
6af0: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72  APPEND_OBJ(inter
6b00: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 63  p, resultObj, "c
6b10: 61 49 73 73 75 65 72 73 22 2c 20 54 6c 73 5f 78  aIssuers", Tls_x
6b20: 35 30 39 43 61 49 73 73 75 65 72 73 28 69 6e 74  509CaIssuers(int
6b30: 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20  erp, cert));..  
6b40: 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 49 6e 66    /* Subject Inf
6b50: 6f 72 6d 61 74 69 6f 6e 20 41 63 63 65 73 73 20  ormation Access 
6b60: 2d 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69  - RFC 5280 secti
6b70: 6f 6e 20 34 2e 32 2e 32 2e 32 2c 20 4e 49 44 5f  on 4.2.2.2, NID_
6b80: 73 69 6e 66 6f 5f 61 63 63 65 73 73 20 2a 2f 0a  sinfo_access */.
6b90: 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63  .    /* Certific
6ba0: 61 74 65 20 41 6c 69 61 73 2e 20 49 66 20 75 73  ate Alias. If us
6bb0: 65 73 20 61 20 50 4b 43 53 23 31 32 20 73 74 72  es a PKCS#12 str
6bc0: 75 63 74 75 72 65 2c 20 61 6c 69 61 73 20 77 69  ucture, alias wi
6bd0: 6c 6c 20 72 65 66 6c 65 63 74 20 74 68 65 0a 09  ll reflect the..
6be0: 66 72 69 65 6e 64 6c 79 4e 61 6d 65 20 61 74 74  friendlyName att
6bf0: 72 69 62 75 74 65 20 28 52 46 43 20 32 39 38 35  ribute (RFC 2985
6c00: 29 2e 20 2a 2f 0a 20 20 20 20 7b 0a 09 69 6e 74  ). */.    {..int
6c10: 20 69 6c 65 6e 20 3d 20 30 3b 0a 23 69 66 20 4f   ilen = 0;.#if O
6c20: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
6c30: 55 4d 42 45 52 20 3c 20 30 78 34 30 30 30 30 30  UMBER < 0x400000
6c40: 30 30 4c 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  00L..unsigned ch
6c50: 61 72 20 2a 73 74 72 69 6e 67 20 3d 20 58 35 30  ar *string = X50
6c60: 39 5f 61 6c 69 61 73 5f 67 65 74 30 28 63 65 72  9_alias_get0(cer
6c70: 74 2c 20 26 69 6c 65 6e 29 3b 0a 23 65 6c 73 65  t, &ilen);.#else
6c80: 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  ..const unsigned
6c90: 20 63 68 61 72 20 2a 73 74 72 69 6e 67 20 3d 20   char *string = 
6ca0: 58 35 30 39 5f 61 6c 69 61 73 5f 67 65 74 30 28  X509_alias_get0(
6cb0: 63 65 72 74 2c 20 26 69 6c 65 6e 29 3b 0a 23 65  cert, &ilen);.#e
6cc0: 6e 64 69 66 0a 09 4c 41 50 50 45 4e 44 5f 53 54  ndif..LAPPEND_ST
6cd0: 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  R(interp, result
6ce0: 4f 62 6a 2c 20 22 61 6c 69 61 73 22 2c 20 28 63  Obj, "alias", (c
6cf0: 68 61 72 20 2a 29 20 73 74 72 69 6e 67 2c 20 28  har *) string, (
6d00: 54 63 6c 5f 53 69 7a 65 29 20 69 6c 65 6e 29 3b  Tcl_Size) ilen);
6d10: 0a 09 73 74 72 69 6e 67 20 3d 20 58 35 30 39 5f  ..string = X509_
6d20: 6b 65 79 69 64 5f 67 65 74 30 28 63 65 72 74 2c  keyid_get0(cert,
6d30: 20 26 69 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e   &ilen);..LAPPEN
6d40: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65  D_STR(interp, re
6d50: 73 75 6c 74 4f 62 6a 2c 20 22 6b 65 79 49 64 22  sultObj, "keyId"
6d60: 2c 20 28 63 68 61 72 20 2a 29 20 73 74 72 69 6e  , (char *) strin
6d70: 67 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 69 6c  g, (Tcl_Size) il
6d80: 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  en);.    }..    
6d90: 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65 20 61  /* Certificate a
6da0: 6e 64 20 64 75 6d 70 20 61 6c 6c 20 64 61 74 61  nd dump all data
6db0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 6c 29   */.    if (all)
6dc0: 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 61 6c 6c   {..Tcl_Obj *all
6dd0: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74  Obj = Tcl_NewByt
6de0: 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c 2c 20  eArrayObj(NULL, 
6df0: 30 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 65  0);..Tcl_Obj *ce
6e00: 72 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42  rtObj = Tcl_NewB
6e10: 79 74 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c  yteArrayObj(NULL
6e20: 2c 20 30 29 3b 0a 09 75 6e 73 69 67 6e 65 64 20  , 0);..unsigned 
6e30: 63 68 61 72 20 2a 61 6c 6c 53 74 72 2c 20 2a 63  char *allStr, *c
6e40: 65 72 74 53 74 72 3b 0a 0a 09 69 66 20 28 61 6c  ertStr;...if (al
6e50: 6c 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  lObj == NULL || 
6e60: 63 65 72 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29  certObj == NULL)
6e70: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72   {..    Tcl_Decr
6e80: 52 65 66 43 6f 75 6e 74 28 61 6c 6c 4f 62 6a 29  RefCount(allObj)
6e90: 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28  ;..    BIO_free(
6ea0: 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 46  bio);..    Tcl_F
6eb0: 72 65 65 28 62 75 66 66 65 72 29 3b 0a 09 20 20  ree(buffer);..  
6ec0: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f    return resultO
6ed0: 62 6a 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20  bj;..}.../* Get 
6ee0: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
6ef0: 63 65 72 74 53 74 72 20 3d 20 54 63 6c 5f 53 65  certStr = Tcl_Se
6f00: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68  tByteArrayLength
6f10: 28 63 65 72 74 4f 62 6a 2c 20 43 45 52 54 5f 53  (certObj, CERT_S
6f20: 54 52 5f 53 49 5a 45 29 3b 0a 09 6c 65 6e 20 3d  TR_SIZE);..len =
6f30: 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 50   BIO_to_Buffer(P
6f40: 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30  EM_write_bio_X50
6f50: 39 28 62 69 6f 2c 20 63 65 72 74 29 2c 20 62 69  9(bio, cert), bi
6f60: 6f 2c 20 63 65 72 74 53 74 72 2c 20 43 45 52 54  o, certStr, CERT
6f70: 5f 53 54 52 5f 53 49 5a 45 29 3b 0a 09 54 63 6c  _STR_SIZE);..Tcl
6f80: 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e  _SetByteArrayLen
6f90: 67 74 68 28 63 65 72 74 4f 62 6a 2c 20 6c 65 6e  gth(certObj, len
6fa0: 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28  );..LAPPEND_OBJ(
6fb0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
6fc0: 6a 2c 20 22 63 65 72 74 69 66 69 63 61 74 65 22  j, "certificate"
6fd0: 2c 20 63 65 72 74 4f 62 6a 29 0a 0a 09 2f 2a 20  , certObj).../* 
6fe0: 47 65 74 20 61 6c 6c 20 69 6e 66 6f 20 6f 6e 20  Get all info on 
6ff0: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
7000: 61 6c 6c 53 74 72 20 3d 20 54 63 6c 5f 53 65 74  allStr = Tcl_Set
7010: 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28  ByteArrayLength(
7020: 61 6c 6c 4f 62 6a 2c 20 43 45 52 54 5f 53 54 52  allObj, CERT_STR
7030: 5f 53 49 5a 45 20 2a 20 32 29 3b 0a 09 6c 65 6e  _SIZE * 2);..len
7040: 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72   = BIO_to_Buffer
7050: 28 58 35 30 39 5f 70 72 69 6e 74 5f 65 78 28 62  (X509_print_ex(b
7060: 69 6f 2c 20 63 65 72 74 2c 20 66 6c 61 67 73 2c  io, cert, flags,
7070: 20 30 29 2c 20 62 69 6f 2c 20 61 6c 6c 53 74 72   0), bio, allStr
7080: 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 20  , CERT_STR_SIZE 
7090: 2a 20 32 29 3b 0a 09 54 63 6c 5f 53 65 74 42 79  * 2);..Tcl_SetBy
70a0: 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 61 6c  teArrayLength(al
70b0: 6c 4f 62 6a 2c 20 6c 65 6e 29 3b 0a 09 4c 41 50  lObj, len);..LAP
70c0: 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c  PEND_OBJ(interp,
70d0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 61 6c 6c   resultObj, "all
70e0: 22 2c 20 61 6c 6c 4f 62 6a 29 0a 20 20 20 20 7d  ", allObj).    }
70f0: 0a 0a 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62  ..    BIO_free(b
7100: 69 6f 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65  io);.    Tcl_Fre
7110: 65 28 62 75 66 66 65 72 29 3b 0a 20 20 20 20 72  e(buffer);.    r
7120: 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b  eturn resultObj;
7130: 0a 7d 0a                                         .}.