Hex Artifact Content

Artifact 9f6686e000ad0228b7f898dfe2441d2731477f98a2e791616e0ee7bc7bfb8b50:


0000: 2f 2a 0a 20 2a 20 50 61 72 73 65 20 58 2e 35 30  /*. * Parse X.50
0010: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61 6e  9 certificate an
0020: 64 20 72 65 74 75 72 6e 20 63 6f 6e 74 65 6e 74  d return content
0030: 73 20 61 73 20 61 20 54 43 4c 20 6b 65 79 2d 76  s as a TCL key-v
0040: 61 6c 75 65 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a  alue list.. *. *
0050: 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31   Copyright (C) 1
0060: 39 39 37 2d 32 30 30 30 20 53 65 6e 73 75 73 20  997-2000 Sensus 
0070: 43 6f 6e 73 75 6c 74 69 6e 67 20 4c 74 64 2e 0a  Consulting Ltd..
0080: 20 2a 20 4d 61 74 74 20 4e 65 77 6d 61 6e 20 3c   * Matt Newman <
0090: 6d 61 74 74 40 73 65 6e 73 75 73 2e 6f 72 67 3e  matt@sensus.org>
00a0: 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 43  . * Copyright (C
00b0: 29 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48  ) 2023 Brian O'H
00c0: 61 67 61 6e 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64  agan. */.#includ
00d0: 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e 63 6c 75  e <tcl.h>.#inclu
00e0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
00f0: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 62  clude <openssl/b
0100: 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  io.h>.#include <
0110: 6f 70 65 6e 73 73 6c 2f 73 68 61 2e 68 3e 0a 23  openssl/sha.h>.#
0120: 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c  include <openssl
0130: 2f 78 35 30 39 2e 68 3e 0a 23 69 6e 63 6c 75 64  /x509.h>.#includ
0140: 65 20 3c 6f 70 65 6e 73 73 6c 2f 78 35 30 39 76  e <openssl/x509v
0150: 33 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f  3.h>.#include <o
0160: 70 65 6e 73 73 6c 2f 78 35 30 39 5f 76 66 79 2e  penssl/x509_vfy.
0170: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
0180: 6e 73 73 6c 2f 61 73 6e 31 2e 68 3e 0a 23 69 6e  nssl/asn1.h>.#in
0190: 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 22  clude "tlsInt.h"
01a0: 0a 0a 2f 2a 20 44 65 66 69 6e 65 20 6d 61 78 69  ../* Define maxi
01b0: 6d 75 6d 20 63 65 72 74 69 66 69 63 61 74 65 20  mum certificate 
01c0: 73 69 7a 65 2e 20 4d 61 78 20 50 45 4d 20 73 69  size. Max PEM si
01d0: 7a 65 20 31 30 30 6b 42 20 61 6e 64 20 44 45 52  ze 100kB and DER
01e0: 20 73 69 7a 65 20 69 73 20 32 34 6b 42 2e 20 2a   size is 24kB. *
01f0: 2f 0a 23 64 65 66 69 6e 65 20 43 45 52 54 5f 53  /.#define CERT_S
0200: 54 52 5f 53 49 5a 45 20 32 34 35 37 36 0a 0a 0c  TR_SIZE 24576...
0210: 0a 2f 2a 0a 20 2a 2d 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 0a 20 2a 0a 20 2a 20 53 74 72 69 6e 67  ---. *. * String
0270: 5f 74 6f 5f 48 65 78 20 2d 2d 0a 20 2a 0a 20 2a  _to_Hex --. *. *
0280: 09 46 6f 72 6d 61 74 20 63 6f 6e 74 65 6e 74 73  .Format contents
0290: 20 6f 66 20 61 20 62 69 6e 61 72 79 20 73 74 72   of a binary str
02a0: 69 6e 67 20 61 73 20 61 20 68 65 78 20 73 74 72  ing as a hex str
02b0: 69 6e 67 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ing. *. * Result
02c0: 73 3a 0a 20 2a 09 54 43 4c 20 62 79 74 65 20 61  s:. *.TCL byte a
02d0: 72 72 61 79 20 6f 62 6a 65 63 74 20 77 69 74 68  rray object with
02e0: 20 78 35 30 39 20 69 64 65 6e 74 69 66 69 65 72   x509 identifier
02f0: 20 61 73 20 61 20 68 65 78 20 73 74 72 69 6e 67   as a hex string
0300: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 45 66 66 65  . *. * Side Effe
0310: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  cts:. *.None. *.
0320: 20 2a 2d 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 0a  ---------------.
0370: 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 53 74 72   */.Tcl_Obj *Str
0380: 69 6e 67 5f 74 6f 5f 48 65 78 28 75 6e 73 69 67  ing_to_Hex(unsig
0390: 6e 65 64 20 63 68 61 72 2a 20 69 6e 70 75 74 2c  ned char* input,
03a0: 20 69 6e 74 20 69 6c 65 6e 29 20 7b 0a 20 20 20   int ilen) {.   
03b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
03c0: 69 70 74 72 20 3d 20 69 6e 70 75 74 3b 0a 20 20  iptr = input;.  
03d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c    Tcl_Obj *resul
03e0: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79  tObj = Tcl_NewBy
03f0: 74 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c 2c  teArrayObj(NULL,
0400: 20 30 29 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65   0);.    unsigne
0410: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 54  d char *data = T
0420: 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c  cl_SetByteArrayL
0430: 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c  ength(resultObj,
0440: 20 28 54 63 6c 5f 53 69 7a 65 29 69 6c 65 6e 2a   (Tcl_Size)ilen*
0450: 32 29 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  2);.    unsigned
0460: 20 63 68 61 72 20 2a 64 70 74 72 20 3d 20 26 64   char *dptr = &d
0470: 61 74 61 5b 30 5d 3b 0a 20 20 20 20 63 6f 6e 73  ata[0];.    cons
0480: 74 20 63 68 61 72 20 2a 68 65 78 20 3d 20 22 30  t char *hex = "0
0490: 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22  123456789abcdef"
04a0: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c  ;..    if (resul
04b0: 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tObj == NULL) {.
04c0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
04d0: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 69 6e    }..    for (in
04e0: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 69 6c 65  t i = 0; i < ile
04f0: 6e 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20  n; i++) {.      
0500: 20 20 2a 64 70 74 72 2b 2b 20 3d 20 68 65 78 5b    *dptr++ = hex[
0510: 28 2a 69 70 74 72 3e 3e 34 29 26 30 78 46 5d 3b  (*iptr>>4)&0xF];
0520: 0a 20 20 20 20 20 20 20 20 2a 64 70 74 72 2b 2b  .        *dptr++
0530: 20 3d 20 68 65 78 5b 28 2a 69 70 74 72 2b 2b 29   = hex[(*iptr++)
0540: 26 30 78 46 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  &0xF];.    }.   
0550: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62   return resultOb
0560: 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  j;.}../*. *-----
0570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 42  --------. *. * B
05c0: 49 4f 5f 74 6f 5f 42 75 66 66 65 72 20 2d 2d 0a  IO_to_Buffer --.
05d0: 20 2a 0a 20 2a 09 4f 75 74 70 75 74 20 63 6f 6e   *. *.Output con
05e0: 74 65 6e 74 73 20 6f 66 20 61 20 42 49 4f 20 74  tents of a BIO t
05f0: 6f 20 61 20 62 75 66 66 65 72 0a 20 2a 0a 20 2a  o a buffer. *. *
0600: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74   Results:. *.Ret
0610: 75 72 6e 73 20 6c 65 6e 67 74 68 20 6f 66 20 73  urns length of s
0620: 74 72 69 6e 67 20 69 6e 20 62 75 66 66 65 72 0a  tring in buffer.
0630: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
0640: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
0650: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
06a0: 2a 2f 0a 54 63 6c 5f 53 69 7a 65 20 42 49 4f 5f  */.Tcl_Size BIO_
06b0: 74 6f 5f 42 75 66 66 65 72 28 69 6e 74 20 72 65  to_Buffer(int re
06c0: 73 75 6c 74 2c 20 42 49 4f 20 2a 62 69 6f 2c 20  sult, BIO *bio, 
06d0: 76 6f 69 64 20 2a 6f 75 74 70 75 74 2c 20 69 6e  void *output, in
06e0: 74 20 6f 6c 65 6e 29 20 7b 0a 20 20 20 20 54 63  t olen) {.    Tc
06f0: 6c 5f 53 69 7a 65 20 6c 65 6e 20 3d 20 30 3b 0a  l_Size len = 0;.
0700: 20 20 20 20 69 6e 74 20 70 65 6e 64 69 6e 67 20      int pending 
0710: 3d 20 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69  = BIO_pending(bi
0720: 6f 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73  o);..    if (res
0730: 75 6c 74 29 20 7b 0a 09 6c 65 6e 20 3d 20 28 54  ult) {..len = (T
0740: 63 6c 5f 53 69 7a 65 29 20 42 49 4f 5f 72 65 61  cl_Size) BIO_rea
0750: 64 28 62 69 6f 2c 20 6f 75 74 70 75 74 2c 20 28  d(bio, output, (
0760: 70 65 6e 64 69 6e 67 20 3c 20 6f 6c 65 6e 29 20  pending < olen) 
0770: 3f 20 70 65 6e 64 69 6e 67 20 3a 20 6f 6c 65 6e  ? pending : olen
0780: 29 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f 66 6c  );..(void)BIO_fl
0790: 75 73 68 28 62 69 6f 29 3b 0a 09 69 66 20 28 6c  ush(bio);..if (l
07a0: 65 6e 20 3c 20 30 29 20 7b 0a 09 20 20 20 20 6c  en < 0) {..    l
07b0: 65 6e 20 3d 20 30 3b 0a 09 7d 0a 20 20 20 20 7d  en = 0;..}.    }
07c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
07d0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
0830: 73 5f 78 35 30 39 45 78 74 65 6e 73 69 6f 6e 73  s_x509Extensions
0840: 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 6c 69   --. *. *.Get li
0850: 73 74 20 6f 66 20 58 2e 35 30 39 20 43 65 72 74  st of X.509 Cert
0860: 69 66 69 63 61 74 65 20 45 78 74 65 6e 73 69 6f  ificate Extensio
0870: 6e 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  ns. *. * Results
0880: 3a 0a 20 2a 09 54 43 4c 20 6c 69 73 74 20 6f 66  :. *.TCL list of
0890: 20 65 78 74 65 6e 73 69 6f 6e 73 20 61 6e 64 20   extensions and 
08a0: 62 6f 6f 6c 65 61 6e 20 63 72 69 74 69 63 61 6c  boolean critical
08b0: 20 73 74 61 74 75 73 0a 20 2a 0a 20 2a 20 53 69   status. *. * Si
08c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
08d0: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  one. *. *-------
08e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f  ------. */.Tcl_O
0930: 62 6a 20 2a 54 6c 73 5f 78 35 30 39 45 78 74 65  bj *Tls_x509Exte
0940: 6e 73 69 6f 6e 73 28 54 63 6c 5f 49 6e 74 65 72  nsions(Tcl_Inter
0950: 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20  p *interp, X509 
0960: 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 63 6f 6e  *cert) {.    con
0970: 73 74 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39  st STACK_OF(X509
0980: 5f 45 58 54 45 4e 53 49 4f 4e 29 20 2a 65 78 74  _EXTENSION) *ext
0990: 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  s;.    Tcl_Obj *
09a0: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f  resultObj = Tcl_
09b0: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
09c0: 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65  LL);..    if (re
09d0: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29  sultObj == NULL)
09e0: 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b   {..return NULL;
09f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
0a00: 28 65 78 74 73 20 3d 20 58 35 30 39 5f 67 65 74  (exts = X509_get
0a10: 30 5f 65 78 74 65 6e 73 69 6f 6e 73 28 63 65 72  0_extensions(cer
0a20: 74 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  t)) != NULL) {..
0a30: 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b 20 69 20  for (int i=0; i 
0a40: 3c 20 58 35 30 39 5f 67 65 74 5f 65 78 74 5f 63  < X509_get_ext_c
0a50: 6f 75 6e 74 28 63 65 72 74 29 3b 20 69 2b 2b 29  ount(cert); i++)
0a60: 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 45 58 54   {..    X509_EXT
0a70: 45 4e 53 49 4f 4e 20 2a 65 78 20 3d 20 73 6b 5f  ENSION *ex = sk_
0a80: 58 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 76  X509_EXTENSION_v
0a90: 61 6c 75 65 28 65 78 74 73 2c 20 69 29 3b 0a 09  alue(exts, i);..
0aa0: 20 20 20 20 41 53 4e 31 5f 4f 42 4a 45 43 54 20      ASN1_OBJECT 
0ab0: 2a 6f 62 6a 20 3d 20 58 35 30 39 5f 45 58 54 45  *obj = X509_EXTE
0ac0: 4e 53 49 4f 4e 5f 67 65 74 5f 6f 62 6a 65 63 74  NSION_get_object
0ad0: 28 65 78 29 3b 0a 09 20 20 20 20 2f 2a 20 41 53  (ex);..    /* AS
0ae0: 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49 4e 47 20  N1_OCTET_STRING 
0af0: 2a 64 61 74 61 20 3d 20 58 35 30 39 5f 45 58 54  *data = X509_EXT
0b00: 45 4e 53 49 4f 4e 5f 67 65 74 5f 64 61 74 61 28  ENSION_get_data(
0b10: 65 78 29 3b 20 2a 2f 0a 09 20 20 20 20 69 6e 74  ex); */..    int
0b20: 20 63 72 69 74 69 63 61 6c 20 3d 20 58 35 30 39   critical = X509
0b30: 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74 5f 63  _EXTENSION_get_c
0b40: 72 69 74 69 63 61 6c 28 65 78 29 3b 0a 09 20 20  ritical(ex);..  
0b50: 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69    LAPPEND_BOOL(i
0b60: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
0b70: 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 4f 42 4a  , OBJ_nid2ln(OBJ
0b80: 5f 6f 62 6a 32 6e 69 64 28 6f 62 6a 29 29 2c 20  _obj2nid(obj)), 
0b90: 63 72 69 74 69 63 61 6c 29 3b 0a 09 7d 0a 20 20  critical);..}.  
0ba0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
0bb0: 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a  esultObj;.}../*.
0bc0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
0bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0c10: 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39 49 64   *. * Tls_x509Id
0c20: 65 6e 74 69 66 69 65 72 20 2d 2d 0a 20 2a 0a 20  entifier --. *. 
0c30: 2a 09 47 65 74 20 58 2e 35 30 39 20 63 65 72 74  *.Get X.509 cert
0c40: 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 74  ificate Authorit
0c50: 79 20 6f 72 20 53 75 62 6a 65 63 74 20 4b 65 79  y or Subject Key
0c60: 20 49 64 65 6e 74 69 66 69 65 72 73 0a 20 2a 0a   Identifiers. *.
0c70: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54   * Results:. *.T
0c80: 43 4c 20 62 79 74 65 20 61 72 72 61 79 20 6f 62  CL byte array ob
0c90: 6a 65 63 74 20 77 69 74 68 20 78 35 30 39 20 69  ject with x509 i
0ca0: 64 65 6e 74 69 66 69 65 72 20 61 73 20 61 20 68  dentifier as a h
0cb0: 65 78 20 73 74 72 69 6e 67 0a 20 2a 0a 20 2a 20  ex string. *. * 
0cc0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
0cd0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .None. *. *-----
0ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d20: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c  --------. */.Tcl
0d30: 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 49 64  _Obj *Tls_x509Id
0d40: 65 6e 74 69 66 69 65 72 28 63 6f 6e 73 74 20 41  entifier(const A
0d50: 53 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49 4e 47  SN1_OCTET_STRING
0d60: 20 2a 61 73 74 72 69 6e 67 29 20 7b 0a 20 20 20   *astring) {.   
0d70: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74   Tcl_Obj *result
0d80: 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20  Obj = NULL;..   
0d90: 20 69 66 20 28 61 73 74 72 69 6e 67 20 21 3d 20   if (astring != 
0da0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 75 6c 74 4f  NULL) {..resultO
0db0: 62 6a 20 3d 20 53 74 72 69 6e 67 5f 74 6f 5f 48  bj = String_to_H
0dc0: 65 78 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ex((unsigned cha
0dd0: 72 20 2a 29 41 53 4e 31 5f 53 54 52 49 4e 47 5f  r *)ASN1_STRING_
0de0: 67 65 74 30 5f 64 61 74 61 28 61 73 74 72 69 6e  get0_data(astrin
0df0: 67 29 2c 0a 09 20 20 20 20 41 53 4e 31 5f 53 54  g),..    ASN1_ST
0e00: 52 49 4e 47 5f 6c 65 6e 67 74 68 28 61 73 74 72  RING_length(astr
0e10: 69 6e 67 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ing));.    }.   
0e20: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62   return resultOb
0e30: 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  j;.}../*. *-----
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
0e90: 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65 20  ls_x509KeyUsage 
0ea0: 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 58 2e 35  --. *. *.Get X.5
0eb0: 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 6b  09 certificate k
0ec0: 65 79 20 75 73 61 67 65 20 74 79 70 65 73 0a 20  ey usage types. 
0ed0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
0ee0: 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 74 79 70  .Tcl list of typ
0ef0: 65 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  es. *. * Side ef
0f00: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  fects:. *.None. 
0f10: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54  -. */.Tcl_Obj *T
0f70: 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65 28  ls_x509KeyUsage(
0f80: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0f90: 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c 20  rp, X509 *cert, 
0fa0: 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 73 29  uint32_t xflags)
0fb0: 20 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20   {.    uint32_t 
0fc0: 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 74  usage = X509_get
0fd0: 5f 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74 29  _key_usage(cert)
0fe0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72  ;.    Tcl_Obj *r
0ff0: 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e  esultObj = Tcl_N
1000: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
1010: 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73  L);..    if (res
1020: 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20  ultObj == NULL) 
1030: 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  {..return NULL;.
1040: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28      }..    if ((
1050: 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f  xflags & EXFLAG_
1060: 4b 55 53 41 47 45 29 20 26 26 20 75 73 61 67 65  KUSAGE) && usage
1070: 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58 29 20 7b   < UINT32_MAX) {
1080: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55  ..if (usage & KU
1090: 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 54 55  _DIGITAL_SIGNATU
10a0: 52 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  RE) {..    Tcl_L
10b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
10c0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ent(interp, resu
10d0: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74  ltObj, Tcl_NewSt
10e0: 72 69 6e 67 4f 62 6a 28 22 44 69 67 69 74 61 6c  ringObj("Digital
10f0: 20 53 69 67 6e 61 74 75 72 65 22 2c 20 2d 31 29   Signature", -1)
1100: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65  );..}..if (usage
1110: 20 26 20 4b 55 5f 4e 4f 4e 5f 52 45 50 55 44 49   & KU_NON_REPUDI
1120: 41 54 49 4f 4e 29 20 7b 0a 09 20 20 20 20 54 63  ATION) {..    Tc
1130: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1140: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
1150: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
1160: 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 6f 6e 2d  wStringObj("Non-
1170: 52 65 70 75 64 69 61 74 69 6f 6e 22 2c 20 2d 31  Repudiation", -1
1180: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67  ));..}..if (usag
1190: 65 20 26 20 4b 55 5f 4b 45 59 5f 45 4e 43 49 50  e & KU_KEY_ENCIP
11a0: 48 45 52 4d 45 4e 54 29 20 7b 0a 09 20 20 20 20  HERMENT) {..    
11b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
11c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
11d0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f   resultObj, Tcl_
11e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4b 65  NewStringObj("Ke
11f0: 79 20 45 6e 63 69 70 68 65 72 6d 65 6e 74 22 2c  y Encipherment",
1200: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75   -1));..}..if (u
1210: 73 61 67 65 20 26 20 4b 55 5f 44 41 54 41 5f 45  sage & KU_DATA_E
1220: 4e 43 49 50 48 45 52 4d 45 4e 54 29 20 7b 0a 09  NCIPHERMENT) {..
1230: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1240: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1250: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
1260: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1270: 28 22 44 61 74 61 20 45 6e 63 69 70 68 65 72 6d  ("Data Encipherm
1280: 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  ent", -1));..}..
1290: 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f 4b  if (usage & KU_K
12a0: 45 59 5f 41 47 52 45 45 4d 45 4e 54 29 20 7b 0a  EY_AGREEMENT) {.
12b0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
12c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
12d0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
12e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
12f0: 6a 28 22 4b 65 79 20 41 67 72 65 65 6d 65 6e 74  j("Key Agreement
1300: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
1310: 28 75 73 61 67 65 20 26 20 4b 55 5f 4b 45 59 5f  (usage & KU_KEY_
1320: 43 45 52 54 5f 53 49 47 4e 29 20 7b 0a 09 20 20  CERT_SIGN) {..  
1330: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1340: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1350: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
1360: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
1370: 43 65 72 74 69 66 69 63 61 74 65 20 53 69 67 6e  Certificate Sign
1380: 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  ing", -1));..}..
1390: 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f 43  if (usage & KU_C
13a0: 52 4c 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 20  RL_SIGN) {..    
13b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
13c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
13d0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f   resultObj, Tcl_
13e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 43 52  NewStringObj("CR
13f0: 4c 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29  L Signing", -1))
1400: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20  ;..}..if (usage 
1410: 26 20 4b 55 5f 45 4e 43 49 50 48 45 52 5f 4f 4e  & KU_ENCIPHER_ON
1420: 4c 59 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  LY) {..    Tcl_L
1430: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1440: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ent(interp, resu
1450: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74  ltObj, Tcl_NewSt
1460: 72 69 6e 67 4f 62 6a 28 22 45 6e 63 69 70 68 65  ringObj("Enciphe
1470: 72 20 4f 6e 6c 79 22 2c 20 2d 31 29 29 3b 0a 09  r Only", -1));..
1480: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b  }..if (usage & K
1490: 55 5f 44 45 43 49 50 48 45 52 5f 4f 4e 4c 59 29  U_DECIPHER_ONLY)
14a0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
14b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
14c0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
14d0: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  bj, Tcl_NewStrin
14e0: 67 4f 62 6a 28 22 44 65 63 69 70 68 65 72 20 4f  gObj("Decipher O
14f0: 6e 6c 79 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20  nly", -1));..}. 
1500: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20     } else {..   
1510: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1520: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1530: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c  , resultObj, Tcl
1540: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75  _NewStringObj("u
1550: 6e 72 65 73 74 72 69 63 74 65 64 22 2c 20 2d 31  nrestricted", -1
1560: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ));.    }.    re
1570: 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a  turn resultObj;.
1580: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
1590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
15e0: 78 35 30 39 50 75 72 70 6f 73 65 20 2d 2d 0a 20  x509Purpose --. 
15f0: 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30 39 20 63  *. *.Get X.509 c
1600: 65 72 74 69 66 69 63 61 74 65 20 70 75 72 70 6f  ertificate purpo
1610: 73 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  se. *. * Results
1620: 3a 0a 20 2a 09 50 75 72 70 6f 73 65 20 73 74 72  :. *.Purpose str
1630: 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ing. *. * Side e
1640: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  ffects:. *.None.
1650: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
1660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a0: 2d 2d 0a 20 2a 2f 0a 63 68 61 72 20 2a 54 6c 73  --. */.char *Tls
16b0: 5f 78 35 30 39 50 75 72 70 6f 73 65 28 58 35 30  _x509Purpose(X50
16c0: 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 63  9 *cert) {.    c
16d0: 68 61 72 20 2a 70 75 72 70 6f 73 65 20 3d 20 4e  har *purpose = N
16e0: 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 28 58 35  ULL;..    if (X5
16f0: 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65  09_check_purpose
1700: 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50  (cert, X509_PURP
1710: 4f 53 45 5f 53 53 4c 5f 43 4c 49 45 4e 54 2c 20  OSE_SSL_CLIENT, 
1720: 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f  0) > 0) {..purpo
1730: 73 65 20 3d 20 22 53 53 4c 20 43 6c 69 65 6e 74  se = "SSL Client
1740: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ";.    } else if
1750: 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72   (X509_check_pur
1760: 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f  pose(cert, X509_
1770: 50 55 52 50 4f 53 45 5f 53 53 4c 5f 53 45 52 56  PURPOSE_SSL_SERV
1780: 45 52 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70  ER, 0) > 0) {..p
1790: 75 72 70 6f 73 65 20 3d 20 22 53 53 4c 20 53 65  urpose = "SSL Se
17a0: 72 76 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73  rver";.    } els
17b0: 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b  e if (X509_check
17c0: 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58  _purpose(cert, X
17d0: 35 30 39 5f 50 55 52 50 4f 53 45 5f 4e 53 5f 53  509_PURPOSE_NS_S
17e0: 53 4c 5f 53 45 52 56 45 52 2c 20 30 29 20 3e 20  SL_SERVER, 0) > 
17f0: 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20  0) {..purpose = 
1800: 22 4d 53 53 20 53 53 4c 20 53 65 72 76 65 72 22  "MSS SSL Server"
1810: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
1820: 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70  (X509_check_purp
1830: 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50  ose(cert, X509_P
1840: 55 52 50 4f 53 45 5f 53 4d 49 4d 45 5f 53 49 47  URPOSE_SMIME_SIG
1850: 4e 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75  N, 0) > 0) {..pu
1860: 72 70 6f 73 65 20 3d 20 22 53 4d 49 4d 45 20 53  rpose = "SMIME S
1870: 69 67 6e 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65  igning";.    } e
1880: 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65  lse if (X509_che
1890: 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c  ck_purpose(cert,
18a0: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 53 4d   X509_PURPOSE_SM
18b0: 49 4d 45 5f 45 4e 43 52 59 50 54 2c 20 30 29 20  IME_ENCRYPT, 0) 
18c0: 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20  > 0) {..purpose 
18d0: 3d 20 22 53 4d 49 4d 45 20 45 6e 63 72 79 70 74  = "SMIME Encrypt
18e0: 69 6f 6e 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ion";.    } else
18f0: 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f   if (X509_check_
1900: 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35  purpose(cert, X5
1910: 30 39 5f 50 55 52 50 4f 53 45 5f 43 52 4c 5f 53  09_PURPOSE_CRL_S
1920: 49 47 4e 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09  IGN, 0) > 0) {..
1930: 70 75 72 70 6f 73 65 20 3d 20 22 43 52 4c 20 53  purpose = "CRL S
1940: 69 67 6e 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65  igning";.    } e
1950: 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65  lse if (X509_che
1960: 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c  ck_purpose(cert,
1970: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 41 4e   X509_PURPOSE_AN
1980: 59 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75  Y, 0) > 0) {..pu
1990: 72 70 6f 73 65 20 3d 20 22 41 6e 79 22 3b 0a 20  rpose = "Any";. 
19a0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35     } else if (X5
19b0: 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65  09_check_purpose
19c0: 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50  (cert, X509_PURP
19d0: 4f 53 45 5f 4f 43 53 50 5f 48 45 4c 50 45 52 2c  OSE_OCSP_HELPER,
19e0: 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70   0) > 0) {..purp
19f0: 6f 73 65 20 3d 20 22 4f 43 53 50 20 48 65 6c 70  ose = "OCSP Help
1a00: 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  er";.    } else 
1a10: 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70  if (X509_check_p
1a20: 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30  urpose(cert, X50
1a30: 39 5f 50 55 52 50 4f 53 45 5f 54 49 4d 45 53 54  9_PURPOSE_TIMEST
1a40: 41 4d 50 5f 53 49 47 4e 2c 20 30 29 20 3e 20 30  AMP_SIGN, 0) > 0
1a50: 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22  ) {..purpose = "
1a60: 54 69 6d 65 73 74 61 6d 70 20 53 69 67 6e 69 6e  Timestamp Signin
1a70: 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  g";.    } else {
1a80: 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 22 3b 0a  ..purpose = "";.
1a90: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1aa0: 20 70 75 72 70 6f 73 65 3b 0a 7d 0a 0a 2f 2a 0a   purpose;.}../*.
1ab0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1b00: 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39 50 75   *. * Tls_x509Pu
1b10: 72 70 6f 73 65 73 20 2d 2d 0a 20 2a 0a 20 2a 09  rposes --. *. *.
1b20: 47 65 74 20 58 2e 35 30 39 20 63 65 72 74 69 66  Get X.509 certif
1b30: 69 63 61 74 65 20 70 75 72 70 6f 73 65 20 74 79  icate purpose ty
1b40: 70 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  pes. *. * Result
1b50: 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f  s:. *.Tcl list o
1b60: 66 20 65 61 63 68 20 70 75 72 70 6f 73 65 20 61  f each purpose a
1b70: 6e 64 20 77 68 65 74 68 65 72 20 69 74 20 69 73  nd whether it is
1b80: 20 43 41 20 6f 72 20 6e 6f 6e 2d 43 41 0a 20 2a   CA or non-CA. *
1b90: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
1ba0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d  :. *.None. *. *-
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
1c00: 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35  .Tcl_Obj *Tls_x5
1c10: 30 39 50 75 72 70 6f 73 65 73 28 54 63 6c 5f 49  09Purposes(Tcl_I
1c20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58  nterp *interp, X
1c30: 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20  509 *cert) {.   
1c40: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74   Tcl_Obj *result
1c50: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Obj = Tcl_NewLis
1c60: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20  tObj(0, NULL);. 
1c70: 20 20 20 58 35 30 39 5f 50 55 52 50 4f 53 45 20     X509_PURPOSE 
1c80: 2a 70 74 6d 70 3b 0a 0a 20 20 20 20 69 66 20 28  *ptmp;..    if (
1c90: 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c  resultObj == NUL
1ca0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  L) {..return NUL
1cb0: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f  L;.    }..    fo
1cc0: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20  r (int i = 0; i 
1cd0: 3c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67  < X509_PURPOSE_g
1ce0: 65 74 5f 63 6f 75 6e 74 28 29 3b 20 69 2b 2b 29  et_count(); i++)
1cf0: 20 7b 0a 09 70 74 6d 70 20 3d 20 58 35 30 39 5f   {..ptmp = X509_
1d00: 50 55 52 50 4f 53 45 5f 67 65 74 30 28 69 29 3b  PURPOSE_get0(i);
1d10: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 74 6d 70 50 74  ..Tcl_Obj *tmpPt
1d20: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
1d30: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 66  bj(0, NULL);...f
1d40: 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a  or (int j = 0; j
1d50: 20 3c 20 32 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20   < 2; j++) {..  
1d60: 20 20 69 6e 74 20 69 64 72 65 74 20 3d 20 58 35    int idret = X5
1d70: 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65  09_check_purpose
1d80: 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50  (cert, X509_PURP
1d90: 4f 53 45 5f 67 65 74 5f 69 64 28 70 74 6d 70 29  OSE_get_id(ptmp)
1da0: 2c 20 6a 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c  , j);..    Tcl_L
1db0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1dc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 74 6d 70 50  ent(interp, tmpP
1dd0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1de0: 67 4f 62 6a 28 6a 20 3f 20 22 43 41 22 20 3a 20  gObj(j ? "CA" : 
1df0: 22 6e 6f 6e 43 41 22 2c 20 2d 31 29 29 3b 0a 09  "nonCA", -1));..
1e00: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1e10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1e20: 65 72 70 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c  erp, tmpPtr, Tcl
1e30: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 69 64  _NewStringObj(id
1e40: 72 65 74 20 3d 3d 20 31 20 3f 20 22 59 65 73 22  ret == 1 ? "Yes"
1e50: 20 3a 20 22 4e 6f 22 2c 20 2d 31 29 29 3b 0a 09   : "No", -1));..
1e60: 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69  }..LAPPEND_OBJ(i
1e70: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
1e80: 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67  , X509_PURPOSE_g
1e90: 65 74 30 5f 6e 61 6d 65 28 70 74 6d 70 29 2c 20  et0_name(ptmp), 
1ea0: 74 6d 70 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20  tmpPtr);.    }. 
1eb0: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74     return result
1ec0: 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  Obj;.}../*. *---
1ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
1f20: 20 54 6c 73 5f 78 35 30 39 4e 61 6d 65 73 20 2d   Tls_x509Names -
1f30: 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 61 20 6c 69  -. *. *.Get a li
1f40: 73 74 20 6f 66 20 53 75 62 6a 65 63 74 20 41 6c  st of Subject Al
1f50: 74 65 72 6e 61 74 65 20 4e 61 6d 65 73 20 28 53  ternate Names (S
1f60: 41 4e 29 20 6f 72 20 49 73 73 75 65 72 20 41 6c  AN) or Issuer Al
1f70: 74 65 72 6e 61 74 65 20 4e 61 6d 65 73 0a 20 2a  ternate Names. *
1f80: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
1f90: 54 63 6c 20 6c 69 73 74 20 6f 66 20 61 6c 74 65  Tcl list of alte
1fa0: 72 6e 61 74 65 20 6e 61 6d 65 73 0a 20 2a 0a 20  rnate names. *. 
1fb0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
1fc0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.None. *. *---
1fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54  ----------. */.T
2020: 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39  cl_Obj *Tls_x509
2030: 4e 61 6d 65 73 28 54 63 6c 5f 49 6e 74 65 72 70  Names(Tcl_Interp
2040: 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a   *interp, X509 *
2050: 63 65 72 74 2c 20 69 6e 74 20 6e 69 64 2c 20 42  cert, int nid, B
2060: 49 4f 20 2a 62 69 6f 29 20 7b 0a 20 20 20 20 53  IO *bio) {.    S
2070: 54 41 43 4b 5f 4f 46 28 47 45 4e 45 52 41 4c 5f  TACK_OF(GENERAL_
2080: 4e 41 4d 45 29 20 2a 6e 61 6d 65 73 3b 0a 20 20  NAME) *names;.  
2090: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c    Tcl_Obj *resul
20a0: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  tObj = Tcl_NewLi
20b0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
20c0: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e      Tcl_Size len
20d0: 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 65  ;.    char buffe
20e0: 72 5b 31 30 32 34 5d 3b 0a 0a 20 20 20 20 69 66  r[1024];..    if
20f0: 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e   (resultObj == N
2100: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e  ULL) {..return N
2110: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
2120: 69 66 20 28 28 6e 61 6d 65 73 20 3d 20 58 35 30  if ((names = X50
2130: 39 5f 67 65 74 5f 65 78 74 5f 64 32 69 28 63 65  9_get_ext_d2i(ce
2140: 72 74 2c 20 6e 69 64 2c 20 4e 55 4c 4c 2c 20 4e  rt, nid, NULL, N
2150: 55 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  ULL)) != NULL) {
2160: 0a 09 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b 20  ..for (int i=0; 
2170: 69 20 3c 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e  i < sk_GENERAL_N
2180: 41 4d 45 5f 6e 75 6d 28 6e 61 6d 65 73 29 3b 20  AME_num(names); 
2190: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 63 6f 6e 73  i++) {..    cons
21a0: 74 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 20 2a  t GENERAL_NAME *
21b0: 6e 61 6d 65 20 3d 20 73 6b 5f 47 45 4e 45 52 41  name = sk_GENERA
21c0: 4c 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 6e 61 6d  L_NAME_value(nam
21d0: 65 73 2c 20 69 29 3b 0a 0a 09 20 20 20 20 6c 65  es, i);...    le
21e0: 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65  n = BIO_to_Buffe
21f0: 72 28 6e 61 6d 65 20 26 26 20 47 45 4e 45 52 41  r(name && GENERA
2200: 4c 5f 4e 41 4d 45 5f 70 72 69 6e 74 28 62 69 6f  L_NAME_print(bio
2210: 2c 20 28 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 20  , (GENERAL_NAME 
2220: 2a 29 20 6e 61 6d 65 29 2c 20 62 69 6f 2c 20 62  *) name), bio, b
2230: 75 66 66 65 72 2c 20 31 30 32 34 29 3b 0a 09 20  uffer, 1024);.. 
2240: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
2250: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
2260: 2c 20 4e 55 4c 4c 2c 20 62 75 66 66 65 72 2c 20  , NULL, buffer, 
2270: 6c 65 6e 29 3b 0a 09 7d 0a 09 73 6b 5f 47 45 4e  len);..}..sk_GEN
2280: 45 52 41 4c 5f 4e 41 4d 45 5f 70 6f 70 5f 66 72  ERAL_NAME_pop_fr
2290: 65 65 28 6e 61 6d 65 73 2c 20 47 45 4e 45 52 41  ee(names, GENERA
22a0: 4c 5f 4e 41 4d 45 5f 66 72 65 65 29 3b 0a 20 20  L_NAME_free);.  
22b0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
22c0: 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a  esultObj;.}../*.
22d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2320: 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39 45 78   *. * Tls_x509Ex
2330: 74 4b 65 79 55 73 61 67 65 20 2d 2d 0a 20 2a 0a  tKeyUsage --. *.
2340: 20 2a 09 47 65 74 20 61 20 6c 69 73 74 20 6f 66   *.Get a list of
2350: 20 45 78 74 65 6e 64 65 64 20 4b 65 79 20 55 73   Extended Key Us
2360: 61 67 65 73 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ages. *. * Retur
2370: 6e 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 74 20  ns:. *.Tcl list 
2380: 6f 66 20 75 73 61 67 65 73 0a 20 2a 0a 20 2a 20  of usages. *. * 
2390: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
23a0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .None. *. *-----
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c  --------. */.Tcl
2400: 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 45 78  _Obj *Tls_x509Ex
2410: 74 4b 65 79 55 73 61 67 65 28 54 63 6c 5f 49 6e  tKeyUsage(Tcl_In
2420: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35  terp *interp, X5
2430: 30 39 20 2a 63 65 72 74 2c 20 75 69 6e 74 33 32  09 *cert, uint32
2440: 5f 74 20 78 66 6c 61 67 73 29 20 7b 0a 20 20 20  _t xflags) {.   
2450: 20 75 69 6e 74 33 32 5f 74 20 75 73 61 67 65 20   uint32_t usage 
2460: 3d 20 58 35 30 39 5f 67 65 74 5f 6b 65 79 5f 75  = X509_get_key_u
2470: 73 61 67 65 28 63 65 72 74 29 3b 0a 20 20 20 20  sage(cert);.    
2480: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f  Tcl_Obj *resultO
2490: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  bj = Tcl_NewList
24a0: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20  Obj(0, NULL);.. 
24b0: 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a     if (resultObj
24c0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
24d0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
24e0: 0a 20 20 20 20 69 66 20 28 28 78 66 6c 61 67 73  .    if ((xflags
24f0: 20 26 20 45 58 46 4c 41 47 5f 58 4b 55 53 41 47   & EXFLAG_XKUSAG
2500: 45 29 20 26 26 20 75 73 61 67 65 20 3c 20 55 49  E) && usage < UI
2510: 4e 54 33 32 5f 4d 41 58 29 20 7b 0a 09 75 73 61  NT32_MAX) {..usa
2520: 67 65 20 3d 20 58 35 30 39 5f 67 65 74 5f 65 78  ge = X509_get_ex
2530: 74 65 6e 64 65 64 5f 6b 65 79 5f 75 73 61 67 65  tended_key_usage
2540: 28 63 65 72 74 29 3b 0a 0a 09 69 66 20 28 75 73  (cert);...if (us
2550: 61 67 65 20 26 20 58 4b 55 5f 53 53 4c 5f 53 45  age & XKU_SSL_SE
2560: 52 56 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c  RVER) {..    Tcl
2570: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2580: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65  ement(interp, re
2590: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77  sultObj, Tcl_New
25a0: 53 74 72 69 6e 67 4f 62 6a 28 22 54 4c 53 20 57  StringObj("TLS W
25b0: 65 62 20 53 65 72 76 65 72 20 41 75 74 68 65 6e  eb Server Authen
25c0: 74 69 63 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b  tication", -1));
25d0: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26  ..}..if (usage &
25e0: 20 58 4b 55 5f 53 53 4c 5f 43 4c 49 45 4e 54 29   XKU_SSL_CLIENT)
25f0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
2600: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2610: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
2620: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  bj, Tcl_NewStrin
2630: 67 4f 62 6a 28 22 54 4c 53 20 57 65 62 20 43 6c  gObj("TLS Web Cl
2640: 69 65 6e 74 20 41 75 74 68 65 6e 74 69 63 61 74  ient Authenticat
2650: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  ion", -1));..}..
2660: 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f  if (usage & XKU_
2670: 53 4d 49 4d 45 29 20 7b 0a 09 20 20 20 20 54 63  SMIME) {..    Tc
2680: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2690: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
26a0: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
26b0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 45 2d 6d 61  wStringObj("E-ma
26c0: 69 6c 20 50 72 6f 74 65 63 74 69 6f 6e 22 2c 20  il Protection", 
26d0: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73  -1));..}..if (us
26e0: 61 67 65 20 26 20 58 4b 55 5f 43 4f 44 45 5f 53  age & XKU_CODE_S
26f0: 49 47 4e 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  IGN) {..    Tcl_
2700: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2710: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73  ment(interp, res
2720: 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53  ultObj, Tcl_NewS
2730: 74 72 69 6e 67 4f 62 6a 28 22 43 6f 64 65 20 53  tringObj("Code S
2740: 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09  igning", -1));..
2750: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58  }..if (usage & X
2760: 4b 55 5f 53 47 43 29 20 7b 0a 09 20 20 20 20 54  KU_SGC) {..    T
2770: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2780: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2790: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e  resultObj, Tcl_N
27a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 53 47 43  ewStringObj("SGC
27b0: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
27c0: 28 75 73 61 67 65 20 26 20 58 4b 55 5f 4f 43 53  (usage & XKU_OCS
27d0: 50 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 20 54  P_SIGN) {..    T
27e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
27f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2800: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e  resultObj, Tcl_N
2810: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4f 43 53  ewStringObj("OCS
2820: 50 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29  P Signing", -1))
2830: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20  ;..}..if (usage 
2840: 26 20 58 4b 55 5f 54 49 4d 45 53 54 41 4d 50 29  & XKU_TIMESTAMP)
2850: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
2860: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2870: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
2880: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  bj, Tcl_NewStrin
2890: 67 4f 62 6a 28 22 54 69 6d 65 20 53 74 61 6d 70  gObj("Time Stamp
28a0: 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  ing", -1));..}..
28b0: 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f  if (usage & XKU_
28c0: 44 56 43 53 20 29 20 7b 0a 09 20 20 20 20 54 63  DVCS ) {..    Tc
28d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
28e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
28f0: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
2900: 77 53 74 72 69 6e 67 4f 62 6a 28 22 44 56 43 53  wStringObj("DVCS
2910: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
2920: 28 75 73 61 67 65 20 26 20 58 4b 55 5f 41 4e 59  (usage & XKU_ANY
2930: 45 4b 55 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  EKU) {..    Tcl_
2940: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2950: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73  ment(interp, res
2960: 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53  ultObj, Tcl_NewS
2970: 74 72 69 6e 67 4f 62 6a 28 22 41 6e 79 20 45 78  tringObj("Any Ex
2980: 74 65 6e 64 65 64 20 4b 65 79 20 55 73 61 67 65  tended Key Usage
2990: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20  ", -1));..}.    
29a0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63  } else {..    Tc
29b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
29c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
29d0: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
29e0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e 72 65  wStringObj("unre
29f0: 73 74 72 69 63 74 65 64 22 2c 20 2d 31 29 29 3b  stricted", -1));
2a00: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
2a10: 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a  n resultObj;.}..
2a20: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
2a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a70: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30  --. *. * Tls_x50
2a80: 39 43 72 6c 44 70 20 2d 2d 0a 20 2a 0a 20 2a 09  9CrlDp --. *. *.
2a90: 47 65 74 20 6c 69 73 74 20 6f 66 20 43 52 4c 20  Get list of CRL 
2aa0: 44 69 73 74 72 69 62 75 74 69 6f 6e 20 50 6f 69  Distribution Poi
2ab0: 6e 74 73 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  nts. *. * Return
2ac0: 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f  s:. *.Tcl list o
2ad0: 66 20 55 52 49 73 20 61 6e 64 20 72 65 6c 61 74  f URIs and relat
2ae0: 69 76 65 2d 6e 61 6d 65 73 0a 20 2a 0a 20 2a 20  ive-names. *. * 
2af0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
2b00: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .None. *. *-----
2b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b50: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c  --------. */.Tcl
2b60: 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 43 72  _Obj *Tls_x509Cr
2b70: 6c 44 70 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  lDp(Tcl_Interp *
2b80: 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65  interp, X509 *ce
2b90: 72 74 29 20 7b 0a 20 20 20 20 53 54 41 43 4b 5f  rt) {.    STACK_
2ba0: 4f 46 28 44 49 53 54 5f 50 4f 49 4e 54 29 20 2a  OF(DIST_POINT) *
2bb0: 63 72 6c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  crl;.    Tcl_Obj
2bc0: 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63   *resultObj = Tc
2bd0: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
2be0: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28  NULL);..    if (
2bf0: 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c  resultObj == NUL
2c00: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  L) {..return NUL
2c10: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  L;.    }..    if
2c20: 20 28 28 63 72 6c 20 3d 20 58 35 30 39 5f 67 65   ((crl = X509_ge
2c30: 74 5f 65 78 74 5f 64 32 69 28 63 65 72 74 2c 20  t_ext_d2i(cert, 
2c40: 4e 49 44 5f 63 72 6c 5f 64 69 73 74 72 69 62 75  NID_crl_distribu
2c50: 74 69 6f 6e 5f 70 6f 69 6e 74 73 2c 20 4e 55 4c  tion_points, NUL
2c60: 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c  L, NULL)) != NUL
2c70: 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69  L) {..for (int i
2c80: 3d 30 3b 20 69 20 3c 20 73 6b 5f 44 49 53 54 5f  =0; i < sk_DIST_
2c90: 50 4f 49 4e 54 5f 6e 75 6d 28 63 72 6c 29 3b 20  POINT_num(crl); 
2ca0: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 44 49 53 54  i++) {..    DIST
2cb0: 5f 50 4f 49 4e 54 20 2a 64 70 20 3d 20 73 6b 5f  _POINT *dp = sk_
2cc0: 44 49 53 54 5f 50 4f 49 4e 54 5f 76 61 6c 75 65  DIST_POINT_value
2cd0: 28 63 72 6c 2c 20 69 29 3b 0a 09 20 20 20 20 44  (crl, i);..    D
2ce0: 49 53 54 5f 50 4f 49 4e 54 5f 4e 41 4d 45 20 2a  IST_POINT_NAME *
2cf0: 64 69 73 74 70 6f 69 6e 74 20 3d 20 64 70 2d 3e  distpoint = dp->
2d00: 64 69 73 74 70 6f 69 6e 74 3b 0a 0a 09 20 20 20  distpoint;...   
2d10: 20 69 66 20 28 64 69 73 74 70 6f 69 6e 74 2d 3e   if (distpoint->
2d20: 74 79 70 65 20 3d 3d 20 30 29 20 7b 0a 09 09 2f  type == 0) {.../
2d30: 2a 20 66 75 6c 6c 2d 6e 61 6d 65 20 47 45 4e 45  * full-name GENE
2d40: 52 41 4c 49 5a 45 44 4e 41 4d 45 20 2a 2f 0a 09  RALIZEDNAME */..
2d50: 09 66 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b  .for (int j = 0;
2d60: 20 6a 20 3c 20 73 6b 5f 47 45 4e 45 52 41 4c 5f   j < sk_GENERAL_
2d70: 4e 41 4d 45 5f 6e 75 6d 28 64 69 73 74 70 6f 69  NAME_num(distpoi
2d80: 6e 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c 6e 61 6d  nt->name.fullnam
2d90: 65 29 3b 20 6a 2b 2b 29 20 7b 0a 09 09 20 20 20  e); j++) {...   
2da0: 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 20 2a 67   GENERAL_NAME *g
2db0: 65 6e 20 3d 20 73 6b 5f 47 45 4e 45 52 41 4c 5f  en = sk_GENERAL_
2dc0: 4e 41 4d 45 5f 76 61 6c 75 65 28 64 69 73 74 70  NAME_value(distp
2dd0: 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c 6e  oint->name.fulln
2de0: 61 6d 65 2c 20 6a 29 3b 0a 09 09 20 20 20 20 69  ame, j);...    i
2df0: 6e 74 20 74 79 70 65 3b 0a 09 09 20 20 20 20 41  nt type;...    A
2e00: 53 4e 31 5f 53 54 52 49 4e 47 20 2a 75 72 69 20  SN1_STRING *uri 
2e10: 3d 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 67  = GENERAL_NAME_g
2e20: 65 74 30 5f 76 61 6c 75 65 28 67 65 6e 2c 20 26  et0_value(gen, &
2e30: 74 79 70 65 29 3b 0a 09 09 20 20 20 20 69 66 20  type);...    if 
2e40: 28 74 79 70 65 20 3d 3d 20 47 45 4e 5f 55 52 49  (type == GEN_URI
2e50: 29 20 7b 0a 09 09 09 4c 41 50 50 45 4e 44 5f 53  ) {....LAPPEND_S
2e60: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  TR(interp, resul
2e70: 74 4f 62 6a 2c 20 28 63 68 61 72 20 2a 29 20 4e  tObj, (char *) N
2e80: 55 4c 4c 2c 20 28 63 68 61 72 20 2a 29 20 41 53  ULL, (char *) AS
2e90: 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74 30 5f 64  N1_STRING_get0_d
2ea0: 61 74 61 28 75 72 69 29 2c 20 28 54 63 6c 5f 53  ata(uri), (Tcl_S
2eb0: 69 7a 65 29 20 41 53 4e 31 5f 53 54 52 49 4e 47  ize) ASN1_STRING
2ec0: 5f 6c 65 6e 67 74 68 28 75 72 69 29 29 3b 0a 09  _length(uri));..
2ed0: 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20  .    }...}..    
2ee0: 7d 20 65 6c 73 65 20 69 66 20 28 64 69 73 74 70  } else if (distp
2ef0: 6f 69 6e 74 2d 3e 74 79 70 65 20 3d 3d 20 31 29  oint->type == 1)
2f00: 20 7b 0a 09 09 2f 2a 20 72 65 6c 61 74 69 76 65   {.../* relative
2f10: 2d 6e 61 6d 65 20 58 35 30 39 4e 41 4d 45 20 2a  -name X509NAME *
2f20: 2f 0a 09 09 53 54 41 43 4b 5f 4f 46 28 58 35 30  /...STACK_OF(X50
2f30: 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 29 20 2a 73  9_NAME_ENTRY) *s
2f40: 6b 5f 72 65 6c 6e 61 6d 65 20 3d 20 64 69 73 74  k_relname = dist
2f50: 70 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 72 65 6c 61  point->name.rela
2f60: 74 69 76 65 6e 61 6d 65 3b 0a 09 09 66 6f 72 20  tivename;...for 
2f70: 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 3c 20  (int j = 0; j < 
2f80: 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54  sk_X509_NAME_ENT
2f90: 52 59 5f 6e 75 6d 28 73 6b 5f 72 65 6c 6e 61 6d  RY_num(sk_relnam
2fa0: 65 29 3b 20 6a 2b 2b 29 20 7b 0a 09 09 20 20 20  e); j++) {...   
2fb0: 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59   X509_NAME_ENTRY
2fc0: 20 2a 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41   *e = sk_X509_NA
2fd0: 4d 45 5f 45 4e 54 52 59 5f 76 61 6c 75 65 28 73  ME_ENTRY_value(s
2fe0: 6b 5f 72 65 6c 6e 61 6d 65 2c 20 6a 29 3b 0a 09  k_relname, j);..
2ff0: 09 20 20 20 20 41 53 4e 31 5f 53 54 52 49 4e 47  .    ASN1_STRING
3000: 20 2a 64 20 3d 20 58 35 30 39 5f 4e 41 4d 45 5f   *d = X509_NAME_
3010: 45 4e 54 52 59 5f 67 65 74 5f 64 61 74 61 28 65  ENTRY_get_data(e
3020: 29 3b 0a 09 09 20 20 20 20 4c 41 50 50 45 4e 44  );...    LAPPEND
3030: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73  _STR(interp, res
3040: 75 6c 74 4f 62 6a 2c 20 28 63 68 61 72 20 2a 29  ultObj, (char *)
3050: 20 4e 55 4c 4c 2c 20 28 63 68 61 72 20 2a 29 20   NULL, (char *) 
3060: 41 53 4e 31 5f 53 54 52 49 4e 47 5f 64 61 74 61  ASN1_STRING_data
3070: 28 64 29 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  (d), (Tcl_Size) 
3080: 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67  ASN1_STRING_leng
3090: 74 68 28 64 29 29 3b 0a 09 09 7d 0a 09 20 20 20  th(d));...}..   
30a0: 20 7d 0a 09 7d 0a 09 43 52 4c 5f 44 49 53 54 5f   }..}..CRL_DIST_
30b0: 50 4f 49 4e 54 53 5f 66 72 65 65 28 63 72 6c 29  POINTS_free(crl)
30c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
30d0: 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a  rn resultObj;.}.
30e0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3130: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35  ---. *. * Tls_x5
3140: 30 39 4f 73 63 70 0a 20 2a 0a 20 2a 09 47 65 74  09Oscp. *. *.Get
3150: 20 6c 69 73 74 20 6f 66 20 4f 6e 2d 6c 69 6e 65   list of On-line
3160: 20 43 65 72 74 69 66 69 63 61 74 65 20 53 74 61   Certificate Sta
3170: 74 75 73 20 50 72 6f 74 6f 63 6f 6c 20 28 4f 53  tus Protocol (OS
3180: 43 50 29 20 55 52 49 73 0a 20 2a 0a 20 2a 20 52  CP) URIs. *. * R
3190: 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 6c 20 6c  esults:. *.Tcl l
31a0: 69 73 74 20 6f 66 20 55 52 49 73 0a 20 2a 0a 20  ist of URIs. *. 
31b0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
31c0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.None. *. *---
31d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54  ----------. */.T
3220: 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39  cl_Obj *Tls_x509
3230: 4f 73 63 70 28 54 63 6c 5f 49 6e 74 65 72 70 20  Oscp(Tcl_Interp 
3240: 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a 63  *interp, X509 *c
3250: 65 72 74 29 20 7b 0a 20 20 20 20 53 54 41 43 4b  ert) {.    STACK
3260: 5f 4f 46 28 4f 50 45 4e 53 53 4c 5f 53 54 52 49  _OF(OPENSSL_STRI
3270: 4e 47 29 20 2a 6f 63 73 70 3b 0a 20 20 20 20 54  NG) *ocsp;.    T
3280: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62  cl_Obj *resultOb
3290: 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  j = Tcl_NewListO
32a0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20  bj(0, NULL);..  
32b0: 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20    if (resultObj 
32c0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
32d0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
32e0: 20 20 20 20 69 66 20 28 28 6f 63 73 70 20 3d 20      if ((ocsp = 
32f0: 58 35 30 39 5f 67 65 74 31 5f 6f 63 73 70 28 63  X509_get1_ocsp(c
3300: 65 72 74 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  ert)) != NULL) {
3310: 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30  ..for (int i = 0
3320: 3b 20 69 20 3c 20 73 6b 5f 4f 50 45 4e 53 53 4c  ; i < sk_OPENSSL
3330: 5f 53 54 52 49 4e 47 5f 6e 75 6d 28 6f 63 73 70  _STRING_num(ocsp
3340: 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 4c  ); i++) {..    L
3350: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
3360: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 4e 55  p, resultObj, NU
3370: 4c 4c 2c 20 73 6b 5f 4f 50 45 4e 53 53 4c 5f 53  LL, sk_OPENSSL_S
3380: 54 52 49 4e 47 5f 76 61 6c 75 65 28 6f 63 73 70  TRING_value(ocsp
3390: 2c 20 69 29 2c 20 2d 31 29 3b 0a 09 7d 0a 09 58  , i), -1);..}..X
33a0: 35 30 39 5f 65 6d 61 69 6c 5f 66 72 65 65 28 6f  509_email_free(o
33b0: 63 73 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  csp);.    }.    
33c0: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a  return resultObj
33d0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
3430: 73 5f 78 35 30 39 43 61 49 73 73 75 65 72 73 20  s_x509CaIssuers 
3440: 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 6c 69 73  --. *. *.Get lis
3450: 74 20 6f 66 20 43 65 72 74 69 66 69 63 61 74 65  t of Certificate
3460: 20 41 75 74 68 6f 72 69 74 79 20 28 43 41 29 20   Authority (CA) 
3470: 49 73 73 75 65 72 20 55 52 49 73 0a 20 2a 0a 20  Issuer URIs. *. 
3480: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63  * Results:. *.Tc
3490: 6c 20 6c 69 73 74 20 6f 66 20 43 41 20 69 73 73  l list of CA iss
34a0: 75 65 72 20 55 52 49 73 0a 20 2a 0a 20 2a 20 53  uer URIs. *. * S
34b0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
34c0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  None. *. *------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f  -------. */.Tcl_
3520: 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 43 61 49  Obj *Tls_x509CaI
3530: 73 73 75 65 72 73 28 54 63 6c 5f 49 6e 74 65 72  ssuers(Tcl_Inter
3540: 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20  p *interp, X509 
3550: 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 53 54 41  *cert) {.    STA
3560: 43 4b 5f 4f 46 28 41 43 43 45 53 53 5f 44 45 53  CK_OF(ACCESS_DES
3570: 43 52 49 50 54 49 4f 4e 29 20 2a 61 64 73 3b 0a  CRIPTION) *ads;.
3580: 20 20 20 20 41 43 43 45 53 53 5f 44 45 53 43 52      ACCESS_DESCR
3590: 49 50 54 49 4f 4e 20 2a 61 64 3b 0a 20 20 20 20  IPTION *ad;.    
35a0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f  Tcl_Obj *resultO
35b0: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  bj = Tcl_NewList
35c0: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20  Obj(0, NULL);.  
35d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
35e0: 2a 62 75 66 3b 0a 0a 20 20 20 20 69 66 20 28 72  *buf;..    if (r
35f0: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c  esultObj == NULL
3600: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  ) {..return NULL
3610: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
3620: 28 28 61 64 73 20 3d 20 58 35 30 39 5f 67 65 74  ((ads = X509_get
3630: 5f 65 78 74 5f 64 32 69 28 63 65 72 74 2c 20 4e  _ext_d2i(cert, N
3640: 49 44 5f 69 6e 66 6f 5f 61 63 63 65 73 73 2c 20  ID_info_access, 
3650: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20  NULL, NULL)) != 
3660: 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e  NULL) {..for (in
3670: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f  t i = 0; i < sk_
3680: 41 43 43 45 53 53 5f 44 45 53 43 52 49 50 54 49  ACCESS_DESCRIPTI
3690: 4f 4e 5f 6e 75 6d 28 61 64 73 29 3b 20 69 2b 2b  ON_num(ads); i++
36a0: 29 20 7b 0a 09 20 20 20 20 61 64 20 3d 20 73 6b  ) {..    ad = sk
36b0: 5f 41 43 43 45 53 53 5f 44 45 53 43 52 49 50 54  _ACCESS_DESCRIPT
36c0: 49 4f 4e 5f 76 61 6c 75 65 28 61 64 73 2c 20 69  ION_value(ads, i
36d0: 29 3b 0a 09 20 20 20 20 69 66 20 28 4f 42 4a 5f  );..    if (OBJ_
36e0: 6f 62 6a 32 6e 69 64 28 61 64 2d 3e 6d 65 74 68  obj2nid(ad->meth
36f0: 6f 64 29 20 3d 3d 20 4e 49 44 5f 61 64 5f 63 61  od) == NID_ad_ca
3700: 5f 69 73 73 75 65 72 73 20 26 26 20 61 64 2d 3e  _issuers && ad->
3710: 6c 6f 63 61 74 69 6f 6e 29 20 7b 0a 09 09 69 66  location) {...if
3720: 20 28 61 64 2d 3e 6c 6f 63 61 74 69 6f 6e 2d 3e   (ad->location->
3730: 74 79 70 65 20 3d 3d 20 47 45 4e 5f 55 52 49 29  type == GEN_URI)
3740: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 69 7a   {...    Tcl_Siz
3750: 65 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a  e len = (Tcl_Siz
3760: 65 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 74  e) ASN1_STRING_t
3770: 6f 5f 55 54 46 38 28 26 62 75 66 2c 20 61 64 2d  o_UTF8(&buf, ad-
3780: 3e 6c 6f 63 61 74 69 6f 6e 2d 3e 64 2e 75 6e 69  >location->d.uni
3790: 66 6f 72 6d 52 65 73 6f 75 72 63 65 49 64 65 6e  formResourceIden
37a0: 74 69 66 69 65 72 29 3b 0a 09 09 20 20 20 20 54  tifier);...    T
37b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
37c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
37d0: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e  resultObj, Tcl_N
37e0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
37f0: 72 20 2a 29 20 62 75 66 2c 20 6c 65 6e 29 29 3b  r *) buf, len));
3800: 0a 09 09 20 20 20 20 4f 50 45 4e 53 53 4c 5f 66  ...    OPENSSL_f
3810: 72 65 65 28 62 75 66 29 3b 0a 09 09 20 20 20 20  ree(buf);...    
3820: 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 20 20 20 20  break;...}..    
3830: 7d 0a 09 7d 0a 09 2f 2a 20 73 6b 5f 41 43 43 45  }..}../* sk_ACCE
3840: 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 5f 70  SS_DESCRIPTION_p
3850: 6f 70 5f 66 72 65 65 28 61 64 73 2c 20 41 43 43  op_free(ads, ACC
3860: 45 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 5f  ESS_DESCRIPTION_
3870: 66 72 65 65 29 3b 20 2a 2f 0a 09 41 55 54 48 4f  free); */..AUTHO
3880: 52 49 54 59 5f 49 4e 46 4f 5f 41 43 43 45 53 53  RITY_INFO_ACCESS
3890: 5f 66 72 65 65 28 61 64 73 29 3b 0a 20 20 20 20  _free(ads);.    
38a0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  }.    return res
38b0: 75 6c 74 4f 62 6a 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ultObj;.}.../*. 
38c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
38d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3910: 2a 0a 20 2a 20 54 6c 73 5f 4e 65 77 58 35 30 39  *. * Tls_NewX509
3920: 4f 62 6a 20 2d 2d 0a 20 2a 0a 20 2a 09 50 61 72  Obj --. *. *.Par
3930: 73 65 73 20 61 20 58 35 30 39 20 63 65 72 74 69  ses a X509 certi
3940: 66 69 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  ficate and retur
3950: 6e 73 20 63 6f 6e 74 65 6e 74 73 20 61 73 20 61  ns contents as a
3960: 20 6b 65 79 2d 76 61 6c 75 65 20 54 63 6c 20 6c   key-value Tcl l
3970: 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ist.. *. * Resul
3980: 74 3a 0a 20 2a 09 41 20 54 63 6c 20 4c 69 73 74  t:. *.A Tcl List
3990: 20 77 69 74 68 20 74 68 65 20 58 35 30 39 20 63   with the X509 c
39a0: 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20  ertificate info 
39b0: 61 73 20 61 20 6b 65 79 2d 76 61 6c 75 65 20 6c  as a key-value l
39c0: 69 73 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ist. *. * Side e
39d0: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  ffects:. *.None.
39e0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a30: 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a  --. */.Tcl_Obj *
3a40: 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 54  Tls_NewX509Obj(T
3a50: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3a60: 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c 20 69  p, X509 *cert, i
3a70: 6e 74 20 61 6c 6c 29 20 7b 0a 20 20 20 20 54 63  nt all) {.    Tc
3a80: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a  l_Obj *resultObj
3a90: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
3aa0: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  j(0, NULL);.    
3ab0: 42 49 4f 20 2a 62 69 6f 20 3d 20 42 49 4f 5f 6e  BIO *bio = BIO_n
3ac0: 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b  ew(BIO_s_mem());
3ad0: 0a 20 20 20 20 69 6e 74 20 6d 64 6e 69 64 2c 20  .    int mdnid, 
3ae0: 70 6b 6e 69 64 2c 20 62 69 74 73 3b 0a 20 20 20  pknid, bits;.   
3af0: 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20   Tcl_Size len;. 
3b00: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
3b10: 75 6c 65 6e 3b 0a 20 20 20 20 75 69 6e 74 33 32  ulen;.    uint32
3b20: 5f 74 20 78 66 6c 61 67 73 3b 0a 20 20 20 20 75  _t xflags;.    u
3b30: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 66 6c 61  nsigned long fla
3b40: 67 73 20 3d 20 58 4e 5f 46 4c 41 47 5f 52 46 43  gs = XN_FLAG_RFC
3b50: 32 32 35 33 20 7c 20 41 53 4e 31 5f 53 54 52 46  2253 | ASN1_STRF
3b60: 4c 47 53 5f 55 54 46 38 5f 43 4f 4e 56 45 52 54  LGS_UTF8_CONVERT
3b70: 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e  ;.    flags &= ~
3b80: 41 53 4e 31 5f 53 54 52 46 4c 47 53 5f 45 53 43  ASN1_STRFLGS_ESC
3b90: 5f 4d 53 42 3b 0a 0a 20 20 20 20 63 68 61 72 20  _MSB;..    char 
3ba0: 2a 62 75 66 66 65 72 20 3d 20 63 6b 61 6c 6c 6f  *buffer = ckallo
3bb0: 63 28 42 55 46 53 49 5a 20 3e 20 45 56 50 5f 4d  c(BUFSIZ > EVP_M
3bc0: 41 58 5f 4d 44 5f 53 49 5a 45 20 3f 20 42 55 46  AX_MD_SIZE ? BUF
3bd0: 53 49 5a 20 3a 20 45 56 50 5f 4d 41 58 5f 4d 44  SIZ : EVP_MAX_MD
3be0: 5f 53 49 5a 45 29 3b 0a 0a 20 20 20 20 64 70 72  _SIZE);..    dpr
3bf0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
3c00: 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 20  .    if (interp 
3c10: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 65 72 74 20  == NULL || cert 
3c20: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62 69 6f 20 3d  == NULL || bio =
3c30: 3d 20 4e 55 4c 4c 20 7c 7c 20 72 65 73 75 6c 74  = NULL || result
3c40: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62  Obj == NULL || b
3c50: 75 66 66 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b  uffer == NULL) {
3c60: 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
3c70: 6e 74 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 09  nt(resultObj);..
3c80: 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09  BIO_free(bio);..
3c90: 69 66 20 28 62 75 66 66 65 72 20 21 3d 20 4e 55  if (buffer != NU
3ca0: 4c 4c 29 20 63 6b 66 72 65 65 28 62 75 66 66 65  LL) ckfree(buffe
3cb0: 72 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  r);..return NULL
3cc0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
3cd0: 53 69 67 6e 61 74 75 72 65 20 61 6c 67 6f 72 69  Signature algori
3ce0: 74 68 6d 20 61 6e 64 20 76 61 6c 75 65 20 2d 20  thm and value - 
3cf0: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e  RFC 5280 section
3d00: 20 34 2e 31 2e 31 2e 32 20 61 6e 64 20 34 2e 31   4.1.1.2 and 4.1
3d10: 2e 31 2e 33 20 2a 2f 0a 20 20 20 20 2f 2a 20 73  .1.3 */.    /* s
3d20: 69 67 6e 61 74 75 72 65 41 6c 67 6f 72 69 74 68  ignatureAlgorith
3d30: 6d 20 69 73 20 74 68 65 20 69 64 20 6f 66 20 74  m is the id of t
3d40: 68 65 20 63 72 79 70 74 6f 67 72 61 70 68 69 63  he cryptographic
3d50: 20 61 6c 67 6f 72 69 74 68 6d 20 75 73 65 64 20   algorithm used 
3d60: 62 79 20 74 68 65 0a 09 43 41 20 74 6f 20 73 69  by the..CA to si
3d70: 67 6e 20 74 68 69 73 20 63 65 72 74 2e 20 73 69  gn this cert. si
3d80: 67 6e 61 74 75 72 65 56 61 6c 75 65 20 69 73 20  gnatureValue is 
3d90: 74 68 65 20 64 69 67 69 74 61 6c 20 73 69 67 6e  the digital sign
3da0: 61 74 75 72 65 20 63 6f 6d 70 75 74 65 64 0a 09  ature computed..
3db0: 75 70 6f 6e 20 74 68 65 20 41 53 4e 2e 31 20 44  upon the ASN.1 D
3dc0: 45 52 20 65 6e 63 6f 64 65 64 20 74 62 73 43 65  ER encoded tbsCe
3dd0: 72 74 69 66 69 63 61 74 65 2e 20 2a 2f 0a 20 20  rtificate. */.  
3de0: 20 20 7b 0a 09 63 6f 6e 73 74 20 58 35 30 39 5f    {..const X509_
3df0: 41 4c 47 4f 52 20 2a 73 69 67 5f 61 6c 67 3b 0a  ALGOR *sig_alg;.
3e00: 09 63 6f 6e 73 74 20 41 53 4e 31 5f 42 49 54 5f  .const ASN1_BIT_
3e10: 53 54 52 49 4e 47 20 2a 73 69 67 3b 0a 09 69 6e  STRING *sig;..in
3e20: 74 20 73 69 67 5f 6e 69 64 3b 0a 0a 09 58 35 30  t sig_nid;...X50
3e30: 39 5f 67 65 74 30 5f 73 69 67 6e 61 74 75 72 65  9_get0_signature
3e40: 28 26 73 69 67 2c 20 26 73 69 67 5f 61 6c 67 2c  (&sig, &sig_alg,
3e50: 20 63 65 72 74 29 3b 0a 09 2f 2a 20 73 69 67 5f   cert);../* sig_
3e60: 6e 69 64 20 3d 20 58 35 30 39 5f 67 65 74 5f 73  nid = X509_get_s
3e70: 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 63 65 72  ignature_nid(cer
3e80: 74 29 20 2a 2f 0a 09 73 69 67 5f 6e 69 64 20 3d  t) */..sig_nid =
3e90: 20 4f 42 4a 5f 6f 62 6a 32 6e 69 64 28 73 69 67   OBJ_obj2nid(sig
3ea0: 5f 61 6c 67 2d 3e 61 6c 67 6f 72 69 74 68 6d 29  _alg->algorithm)
3eb0: 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
3ec0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
3ed0: 2c 20 22 73 69 67 6e 61 74 75 72 65 41 6c 67 6f  , "signatureAlgo
3ee0: 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32  rithm", OBJ_nid2
3ef0: 6c 6e 28 73 69 67 5f 6e 69 64 29 2c 20 2d 31 29  ln(sig_nid), -1)
3f00: 3b 0a 09 69 66 20 28 73 69 67 5f 6e 69 64 20 21  ;..if (sig_nid !
3f10: 3d 20 4e 49 44 5f 75 6e 64 65 66 29 20 7b 0a 09  = NID_undef) {..
3f20: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28      LAPPEND_OBJ(
3f30: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
3f40: 6a 2c 20 22 73 69 67 6e 61 74 75 72 65 56 61 6c  j, "signatureVal
3f50: 75 65 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f 48  ue", String_to_H
3f60: 65 78 28 73 69 67 2d 3e 64 61 74 61 2c 20 73 69  ex(sig->data, si
3f70: 67 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a 09 7d 20  g->length));..} 
3f80: 65 6c 73 65 20 7b 0a 09 20 20 20 20 4c 41 50 50  else {..    LAPP
3f90: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
3fa0: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e  resultObj, "sign
3fb0: 61 74 75 72 65 56 61 6c 75 65 22 2c 20 22 22 2c  atureValue", "",
3fc0: 20 30 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20   0);..}.    }.. 
3fd0: 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 20 6f 66     /* Version of
3fe0: 20 74 68 65 20 65 6e 63 6f 64 65 64 20 63 65 72   the encoded cer
3ff0: 74 69 66 69 63 61 74 65 20 2d 20 52 46 43 20 35  tificate - RFC 5
4000: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e  280 section 4.1.
4010: 32 2e 31 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45  2.1 */.    LAPPE
4020: 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20  ND_LONG(interp, 
4030: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 76 65 72 73  resultObj, "vers
4040: 69 6f 6e 22 2c 20 58 35 30 39 5f 67 65 74 5f 76  ion", X509_get_v
4050: 65 72 73 69 6f 6e 28 63 65 72 74 29 2b 31 29 3b  ersion(cert)+1);
4060: 0a 0a 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20  ..    /* Unique 
4070: 6e 75 6d 62 65 72 20 61 73 73 69 67 6e 65 64 20  number assigned 
4080: 62 79 20 43 41 20 74 6f 20 63 65 72 74 69 66 69  by CA to certifi
4090: 63 61 74 65 20 2d 20 52 46 43 20 35 32 38 30 20  cate - RFC 5280 
40a0: 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 32 20  section 4.1.2.2 
40b0: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f  */.    len = BIO
40c0: 5f 74 6f 5f 42 75 66 66 65 72 28 69 32 61 5f 41  _to_Buffer(i2a_A
40d0: 53 4e 31 5f 49 4e 54 45 47 45 52 28 62 69 6f 2c  SN1_INTEGER(bio,
40e0: 20 58 35 30 39 5f 67 65 74 30 5f 73 65 72 69 61   X509_get0_seria
40f0: 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 29 2c 20  lNumber(cert)), 
4100: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46  bio, buffer, BUF
4110: 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  SIZ);.    LAPPEN
4120: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65  D_STR(interp, re
4130: 73 75 6c 74 4f 62 6a 2c 20 22 73 65 72 69 61 6c  sultObj, "serial
4140: 4e 75 6d 62 65 72 22 2c 20 62 75 66 66 65 72 2c  Number", buffer,
4150: 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 53   len);..    /* S
4160: 69 67 6e 61 74 75 72 65 20 61 6c 67 6f 72 69 74  ignature algorit
4170: 68 6d 20 75 73 65 64 20 62 79 20 74 68 65 20 43  hm used by the C
4180: 41 20 74 6f 20 73 69 67 6e 20 74 68 65 20 63 65  A to sign the ce
4190: 72 74 69 66 69 63 61 74 65 2e 20 4d 75 73 74 20  rtificate. Must 
41a0: 6d 61 74 63 68 0a 09 73 69 67 6e 61 74 75 72 65  match..signature
41b0: 41 6c 67 6f 72 69 74 68 6d 2e 20 52 46 43 20 35  Algorithm. RFC 5
41c0: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e  280 section 4.1.
41d0: 32 2e 33 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45  2.3 */.    LAPPE
41e0: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72  ND_STR(interp, r
41f0: 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61  esultObj, "signa
4200: 74 75 72 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c  ture", OBJ_nid2l
4210: 6e 28 58 35 30 39 5f 67 65 74 5f 73 69 67 6e 61  n(X509_get_signa
4220: 74 75 72 65 5f 6e 69 64 28 63 65 72 74 29 29 2c  ture_nid(cert)),
4230: 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 73   -1);..    /* Is
4240: 73 75 65 72 20 69 64 65 6e 74 69 66 69 65 73 20  suer identifies 
4250: 74 68 65 20 65 6e 74 69 74 79 20 74 68 61 74 20  the entity that 
4260: 73 69 67 6e 65 64 20 61 6e 64 20 69 73 73 75 65  signed and issue
4270: 64 20 74 68 65 20 63 65 72 74 2e 20 52 46 43 20  d the cert. RFC 
4280: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31  5280 section 4.1
4290: 2e 32 2e 34 20 2a 2f 0a 20 20 20 20 6c 65 6e 20  .2.4 */.    len 
42a0: 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28  = BIO_to_Buffer(
42b0: 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e 74 5f  X509_NAME_print_
42c0: 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 74  ex(bio, X509_get
42d0: 5f 69 73 73 75 65 72 5f 6e 61 6d 65 28 63 65 72  _issuer_name(cer
42e0: 74 29 2c 20 30 2c 20 66 6c 61 67 73 29 2c 20 62  t), 0, flags), b
42f0: 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53  io, buffer, BUFS
4300: 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  IZ);.    LAPPEND
4310: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73  _STR(interp, res
4320: 75 6c 74 4f 62 6a 2c 20 22 69 73 73 75 65 72 22  ultObj, "issuer"
4330: 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a  , buffer, len);.
4340: 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63  .    /* Certific
4350: 61 74 65 20 76 61 6c 69 64 69 74 79 20 70 65 72  ate validity per
4360: 69 6f 64 20 69 73 20 74 68 65 20 69 6e 74 65 72  iod is the inter
4370: 76 61 6c 20 74 68 65 20 43 41 20 77 61 72 72 61  val the CA warra
4380: 6e 74 73 20 74 68 61 74 20 69 74 20 77 69 6c 6c  nts that it will
4390: 0a 09 6d 61 69 6e 74 61 69 6e 20 69 6e 66 6f 20  ..maintain info 
43a0: 6f 6e 20 74 68 65 20 73 74 61 74 75 73 20 6f 66  on the status of
43b0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
43c0: 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69  . RFC 5280 secti
43d0: 6f 6e 20 34 2e 31 2e 32 2e 35 20 2a 2f 0a 20 20  on 4.1.2.5 */.  
43e0: 20 20 2f 2a 20 47 65 74 20 56 61 6c 69 64 69 74    /* Get Validit
43f0: 79 20 2d 20 4e 6f 74 20 42 65 66 6f 72 65 20 2a  y - Not Before *
4400: 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f  /.    len = BIO_
4410: 74 6f 5f 42 75 66 66 65 72 28 41 53 4e 31 5f 54  to_Buffer(ASN1_T
4420: 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c 20 58  IME_print(bio, X
4430: 35 30 39 5f 67 65 74 30 5f 6e 6f 74 42 65 66 6f  509_get0_notBefo
4440: 72 65 28 63 65 72 74 29 29 2c 20 62 69 6f 2c 20  re(cert)), bio, 
4450: 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b  buffer, BUFSIZ);
4460: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
4470: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
4480: 62 6a 2c 20 22 6e 6f 74 42 65 66 6f 72 65 22 2c  bj, "notBefore",
4490: 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a   buffer, len);..
44a0: 20 20 20 20 2f 2a 20 47 65 74 20 56 61 6c 69 64      /* Get Valid
44b0: 69 74 79 20 2d 20 4e 6f 74 20 41 66 74 65 72 20  ity - Not After 
44c0: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f  */.    len = BIO
44d0: 5f 74 6f 5f 42 75 66 66 65 72 28 41 53 4e 31 5f  _to_Buffer(ASN1_
44e0: 54 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c 20  TIME_print(bio, 
44f0: 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74 41 66 74  X509_get0_notAft
4500: 65 72 28 63 65 72 74 29 29 2c 20 62 69 6f 2c 20  er(cert)), bio, 
4510: 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b  buffer, BUFSIZ);
4520: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
4530: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
4540: 62 6a 2c 20 22 6e 6f 74 41 66 74 65 72 22 2c 20  bj, "notAfter", 
4550: 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a 20  buffer, len);.. 
4560: 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 69 64     /* Subject id
4570: 65 6e 74 69 66 69 65 73 20 74 68 65 20 65 6e 74  entifies the ent
4580: 69 74 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ity associated w
4590: 69 74 68 20 74 68 65 20 70 75 62 6c 69 63 20 6b  ith the public k
45a0: 65 79 20 73 74 6f 72 65 64 20 69 6e 0a 09 74 68  ey stored in..th
45b0: 65 20 73 75 62 6a 65 63 74 20 70 75 62 6c 69 63  e subject public
45c0: 20 6b 65 79 20 66 69 65 6c 64 2e 20 52 46 43 20   key field. RFC 
45d0: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31  5280 section 4.1
45e0: 2e 32 2e 36 20 2a 2f 0a 20 20 20 20 6c 65 6e 20  .2.6 */.    len 
45f0: 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28  = BIO_to_Buffer(
4600: 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e 74 5f  X509_NAME_print_
4610: 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 74  ex(bio, X509_get
4620: 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65  _subject_name(ce
4630: 72 74 29 2c 20 30 2c 20 66 6c 61 67 73 29 2c 20  rt), 0, flags), 
4640: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46  bio, buffer, BUF
4650: 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  SIZ);.    LAPPEN
4660: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65  D_STR(interp, re
4670: 73 75 6c 74 4f 62 6a 2c 20 22 73 75 62 6a 65 63  sultObj, "subjec
4680: 74 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29  t", buffer, len)
4690: 3b 0a 0a 20 20 20 20 2f 2a 20 53 48 41 31 20 44  ;..    /* SHA1 D
46a0: 69 67 65 73 74 20 28 46 69 6e 67 65 72 70 72 69  igest (Fingerpri
46b0: 6e 74 29 20 6f 66 20 63 65 72 74 20 2d 20 44 45  nt) of cert - DE
46c0: 52 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  R representation
46d0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35 30 39   */.    if (X509
46e0: 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 45 56  _digest(cert, EV
46f0: 50 5f 73 68 61 31 28 29 2c 20 28 75 6e 73 69 67  P_sha1(), (unsig
4700: 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 65  ned char *)buffe
4710: 72 2c 20 26 75 6c 65 6e 29 29 20 7b 0a 09 4c 41  r, &ulen)) {..LA
4720: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70  PPEND_OBJ(interp
4730: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 68  , resultObj, "sh
4740: 61 31 5f 68 61 73 68 22 2c 20 53 74 72 69 6e 67  a1_hash", String
4750: 5f 74 6f 5f 48 65 78 28 28 75 6e 73 69 67 6e 65  _to_Hex((unsigne
4760: 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 72 2c  d char *)buffer,
4770: 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 20   (int) ulen));. 
4780: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 48 41     }..    /* SHA
4790: 32 35 36 20 44 69 67 65 73 74 20 28 46 69 6e 67  256 Digest (Fing
47a0: 65 72 70 72 69 6e 74 29 20 6f 66 20 63 65 72 74  erprint) of cert
47b0: 20 2d 20 44 45 52 20 72 65 70 72 65 73 65 6e 74   - DER represent
47c0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20  ation */.    if 
47d0: 28 58 35 30 39 5f 64 69 67 65 73 74 28 63 65 72  (X509_digest(cer
47e0: 74 2c 20 45 56 50 5f 73 68 61 32 35 36 28 29 2c  t, EVP_sha256(),
47f0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
4800: 2a 29 62 75 66 66 65 72 2c 20 26 75 6c 65 6e 29  *)buffer, &ulen)
4810: 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a  ) {..LAPPEND_OBJ
4820: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
4830: 62 6a 2c 20 22 73 68 61 32 35 36 5f 68 61 73 68  bj, "sha256_hash
4840: 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78  ", String_to_Hex
4850: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ((unsigned char 
4860: 2a 29 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20  *)buffer, (int) 
4870: 75 6c 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ulen));.    }.. 
4880: 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 50 75     /* Subject Pu
4890: 62 6c 69 63 20 4b 65 79 20 49 6e 66 6f 20 73 70  blic Key Info sp
48a0: 65 63 69 66 69 65 73 20 74 68 65 20 70 75 62 6c  ecifies the publ
48b0: 69 63 20 6b 65 79 20 61 6e 64 20 69 64 65 6e 74  ic key and ident
48c0: 69 66 69 65 73 20 74 68 65 0a 09 61 6c 67 6f 72  ifies the..algor
48d0: 69 74 68 6d 20 77 69 74 68 20 77 68 69 63 68 20  ithm with which 
48e0: 74 68 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e  the key is used.
48f0: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f   RFC 5280 sectio
4900: 6e 20 34 2e 31 2e 32 2e 37 20 2a 2f 0a 20 20 20  n 4.1.2.7 */.   
4910: 20 69 66 20 28 58 35 30 39 5f 67 65 74 5f 73 69   if (X509_get_si
4920: 67 6e 61 74 75 72 65 5f 69 6e 66 6f 28 63 65 72  gnature_info(cer
4930: 74 2c 20 26 6d 64 6e 69 64 2c 20 26 70 6b 6e 69  t, &mdnid, &pkni
4940: 64 2c 20 26 62 69 74 73 2c 20 26 78 66 6c 61 67  d, &bits, &xflag
4950: 73 29 29 20 7b 0a 09 41 53 4e 31 5f 42 49 54 5f  s)) {..ASN1_BIT_
4960: 53 54 52 49 4e 47 20 2a 6b 65 79 3b 0a 09 75 6e  STRING *key;..un
4970: 73 69 67 6e 65 64 20 69 6e 74 20 6e 3b 0a 0a 09  signed int n;...
4980: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
4990: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
49a0: 73 69 67 6e 69 6e 67 44 69 67 65 73 74 22 2c 20  signingDigest", 
49b0: 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6d 64 6e 69 64  OBJ_nid2ln(mdnid
49c0: 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44  ), -1);..LAPPEND
49d0: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73  _STR(interp, res
49e0: 75 6c 74 4f 62 6a 2c 20 22 70 75 62 6c 69 63 4b  ultObj, "publicK
49f0: 65 79 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42  eyAlgorithm", OB
4a00: 4a 5f 6e 69 64 32 6c 6e 28 70 6b 6e 69 64 29 2c  J_nid2ln(pknid),
4a10: 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49   -1);..LAPPEND_I
4a20: 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  NT(interp, resul
4a30: 74 4f 62 6a 2c 20 22 62 69 74 73 22 2c 20 62 69  tObj, "bits", bi
4a40: 74 73 29 3b 20 2f 2a 20 45 66 66 65 63 74 69 76  ts); /* Effectiv
4a50: 65 20 73 65 63 75 72 69 74 79 20 62 69 74 73 20  e security bits 
4a60: 2a 2f 0a 0a 09 6b 65 79 20 3d 20 58 35 30 39 5f  */...key = X509_
4a70: 67 65 74 30 5f 70 75 62 6b 65 79 5f 62 69 74 73  get0_pubkey_bits
4a80: 74 72 28 63 65 72 74 29 3b 0a 09 4c 41 50 50 45  tr(cert);..LAPPE
4a90: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72  ND_OBJ(interp, r
4aa0: 65 73 75 6c 74 4f 62 6a 2c 20 22 70 75 62 6c 69  esultObj, "publi
4ab0: 63 4b 65 79 22 2c 20 53 74 72 69 6e 67 5f 74 6f  cKey", String_to
4ac0: 5f 48 65 78 28 6b 65 79 2d 3e 64 61 74 61 2c 20  _Hex(key->data, 
4ad0: 6b 65 79 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a 0a  key->length));..
4ae0: 09 69 66 20 28 58 35 30 39 5f 70 75 62 6b 65 79  .if (X509_pubkey
4af0: 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 45 56  _digest(cert, EV
4b00: 50 5f 67 65 74 5f 64 69 67 65 73 74 62 79 6e 69  P_get_digestbyni
4b10: 64 28 70 6b 6e 69 64 29 2c 20 28 75 6e 73 69 67  d(pknid), (unsig
4b20: 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 65  ned char *)buffe
4b30: 72 2c 20 26 6e 29 29 20 7b 0a 09 20 20 20 20 4c  r, &n)) {..    L
4b40: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72  APPEND_OBJ(inter
4b50: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70  p, resultObj, "p
4b60: 75 62 6c 69 63 4b 65 79 48 61 73 68 22 2c 20 53  ublicKeyHash", S
4b70: 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 28 75 6e  tring_to_Hex((un
4b80: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75  signed char *)bu
4b90: 66 66 65 72 2c 20 28 69 6e 74 29 20 6e 29 29 3b  ffer, (int) n));
4ba0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
4bb0: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
4bc0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
4bd0: 70 75 62 6c 69 63 4b 65 79 48 61 73 68 22 2c 20  publicKeyHash", 
4be0: 22 22 2c 20 30 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  "", 0);..}.../* 
4bf0: 64 69 67 65 73 74 20 6f 66 20 74 68 65 20 44 45  digest of the DE
4c00: 52 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  R representation
4c10: 20 6f 66 20 74 68 65 20 63 65 72 74 69 66 69 63   of the certific
4c20: 61 74 65 20 2a 2f 0a 09 69 66 20 28 58 35 30 39  ate */..if (X509
4c30: 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 45 56  _digest(cert, EV
4c40: 50 5f 67 65 74 5f 64 69 67 65 73 74 62 79 6e 69  P_get_digestbyni
4c50: 64 28 6d 64 6e 69 64 29 2c 20 28 75 6e 73 69 67  d(mdnid), (unsig
4c60: 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 65  ned char *)buffe
4c70: 72 2c 20 26 6e 29 29 20 7b 0a 09 20 20 20 20 4c  r, &n)) {..    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: 69 67 6e 61 74 75 72 65 48 61 73 68 22 2c 20 53  ignatureHash", S
4cb0: 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 28 75 6e  tring_to_Hex((un
4cc0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75  signed char *)bu
4cd0: 66 66 65 72 2c 20 28 69 6e 74 29 20 6e 29 29 3b  ffer, (int) n));
4ce0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
4cf0: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
4d00: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
4d10: 73 69 67 6e 61 74 75 72 65 48 61 73 68 22 2c 20  signatureHash", 
4d20: 22 22 2c 20 30 29 3b 0a 09 7d 0a 20 20 20 20 7d  "", 0);..}.    }
4d30: 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69  ..    /* Certifi
4d40: 63 61 74 65 20 50 75 72 70 6f 73 65 2e 20 43 61  cate Purpose. Ca
4d50: 6c 6c 20 62 65 66 6f 72 65 20 63 68 65 63 6b 69  ll before checki
4d60: 6e 67 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e  ng for extension
4d70: 73 2e 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  s. */.    LAPPEN
4d80: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65  D_STR(interp, re
4d90: 73 75 6c 74 4f 62 6a 2c 20 22 70 75 72 70 6f 73  sultObj, "purpos
4da0: 65 22 2c 20 54 6c 73 5f 78 35 30 39 50 75 72 70  e", Tls_x509Purp
4db0: 6f 73 65 28 63 65 72 74 29 2c 20 2d 31 29 3b 0a  ose(cert), -1);.
4dc0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28      LAPPEND_OBJ(
4dd0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
4de0: 6a 2c 20 22 63 65 72 74 69 66 69 63 61 74 65 50  j, "certificateP
4df0: 75 72 70 6f 73 65 22 2c 20 54 6c 73 5f 78 35 30  urpose", Tls_x50
4e00: 39 50 75 72 70 6f 73 65 73 28 69 6e 74 65 72 70  9Purposes(interp
4e10: 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f  , cert));..    /
4e20: 2a 20 47 65 74 20 65 78 74 65 6e 73 69 6f 6e 73  * Get extensions
4e30: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20 78 66   flags */.    xf
4e40: 6c 61 67 73 20 3d 20 58 35 30 39 5f 67 65 74 5f  lags = X509_get_
4e50: 65 78 74 65 6e 73 69 6f 6e 5f 66 6c 61 67 73 28  extension_flags(
4e60: 63 65 72 74 29 3b 0a 20 20 20 20 4c 41 50 50 45  cert);.    LAPPE
4e70: 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 72  ND_INT(interp, r
4e80: 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74 46 6c  esultObj, "extFl
4e90: 61 67 73 22 2c 20 78 66 6c 61 67 73 29 3b 0a 0a  ags", xflags);..
4ea0: 09 2f 2a 20 43 68 65 63 6b 20 69 66 20 63 65 72  ./* Check if cer
4eb0: 74 20 77 61 73 20 69 73 73 75 65 64 20 62 79 20  t was issued by 
4ec0: 43 41 20 63 65 72 74 20 69 73 73 75 65 72 20 6f  CA cert issuer o
4ed0: 72 20 73 65 6c 66 20 73 69 67 6e 65 64 20 2a 2f  r self signed */
4ee0: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f  .    LAPPEND_BOO
4ef0: 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  L(interp, result
4f00: 4f 62 6a 2c 20 22 73 65 6c 66 49 73 73 75 65 64  Obj, "selfIssued
4f10: 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c  ", xflags & EXFL
4f20: 41 47 5f 53 49 29 3b 0a 20 20 20 20 4c 41 50 50  AG_SI);.    LAPP
4f30: 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
4f40: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 65 6c   resultObj, "sel
4f50: 66 53 69 67 6e 65 64 22 2c 20 78 66 6c 61 67 73  fSigned", xflags
4f60: 20 26 20 45 58 46 4c 41 47 5f 53 53 29 3b 0a 20   & EXFLAG_SS);. 
4f70: 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28     LAPPEND_BOOL(
4f80: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
4f90: 6a 2c 20 22 69 73 50 72 6f 78 79 43 65 72 74 22  j, "isProxyCert"
4fa0: 2c 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41  , xflags & EXFLA
4fb0: 47 5f 50 52 4f 58 59 29 3b 0a 20 20 20 20 4c 41  G_PROXY);.    LA
4fc0: 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
4fd0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65  p, resultObj, "e
4fe0: 78 74 49 6e 76 61 6c 69 64 22 2c 20 78 66 6c 61  xtInvalid", xfla
4ff0: 67 73 20 26 20 45 58 46 4c 41 47 5f 49 4e 56 41  gs & EXFLAG_INVA
5000: 4c 49 44 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  LID);.    LAPPEN
5010: 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72  D_BOOL(interp, r
5020: 65 73 75 6c 74 4f 62 6a 2c 20 22 69 73 43 41 43  esultObj, "isCAC
5030: 65 72 74 22 2c 20 58 35 30 39 5f 63 68 65 63 6b  ert", X509_check
5040: 5f 63 61 28 63 65 72 74 29 29 3b 0a 0a 20 20 20  _ca(cert));..   
5050: 20 2f 2a 20 54 68 65 20 55 6e 69 71 75 65 20 49   /* The Unique I
5060: 64 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 68  ds are used to h
5070: 61 6e 64 6c 65 20 74 68 65 20 70 6f 73 73 69 62  andle the possib
5080: 69 6c 69 74 79 20 6f 66 20 72 65 75 73 65 20 6f  ility of reuse o
5090: 66 20 73 75 62 6a 65 63 74 0a 09 61 6e 64 2f 6f  f subject..and/o
50a0: 72 20 69 73 73 75 65 72 20 6e 61 6d 65 73 20 6f  r issuer names o
50b0: 76 65 72 20 74 69 6d 65 2e 20 52 46 43 20 35 32  ver time. RFC 52
50c0: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32  80 section 4.1.2
50d0: 2e 38 20 2a 2f 0a 20 20 20 20 7b 0a 09 63 6f 6e  .8 */.    {..con
50e0: 73 74 20 41 53 4e 31 5f 42 49 54 5f 53 54 52 49  st ASN1_BIT_STRI
50f0: 4e 47 20 2a 69 75 69 64 2c 20 2a 73 75 69 64 3b  NG *iuid, *suid;
5100: 0a 20 20 20 20 20 20 20 20 58 35 30 39 5f 67 65  .        X509_ge
5110: 74 30 5f 75 69 64 73 28 63 65 72 74 2c 20 26 69  t0_uids(cert, &i
5120: 75 69 64 2c 20 26 73 75 69 64 29 3b 0a 0a 09 54  uid, &suid);...T
5130: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5140: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
5150: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e  resultObj, Tcl_N
5160: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 73 73  ewStringObj("iss
5170: 75 65 72 55 6e 69 71 75 65 49 64 22 2c 20 2d 31  uerUniqueId", -1
5180: 29 29 3b 0a 09 69 66 20 28 69 75 69 64 20 21 3d  ));..if (iuid !=
5190: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63   NULL) {..    Tc
51a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
51b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
51c0: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
51d0: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 63  wByteArrayObj((c
51e0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
51f0: 61 72 20 2a 29 69 75 69 64 2d 3e 64 61 74 61 2c  ar *)iuid->data,
5200: 20 28 54 63 6c 5f 53 69 7a 65 29 20 69 75 69 64   (Tcl_Size) iuid
5210: 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a 09 7d 20 65  ->length));..} e
5220: 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  lse {..    Tcl_L
5230: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5240: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ent(interp, resu
5250: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74  ltObj, Tcl_NewSt
5260: 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29  ringObj("", -1))
5270: 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f  ;..}...Tcl_ListO
5280: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5290: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
52a0: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  j, Tcl_NewString
52b0: 4f 62 6a 28 22 73 75 62 6a 65 63 74 55 6e 69 71  Obj("subjectUniq
52c0: 75 65 49 64 22 2c 20 2d 31 29 29 3b 0a 09 69 66  ueId", -1));..if
52d0: 20 28 73 75 69 64 20 21 3d 20 4e 55 4c 4c 29 20   (suid != NULL) 
52e0: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
52f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5300: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
5310: 6a 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  j, Tcl_NewByteAr
5320: 72 61 79 4f 62 6a 28 28 63 6f 6e 73 74 20 75 6e  rayObj((const un
5330: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 75  signed char *)su
5340: 69 64 2d 3e 64 61 74 61 2c 20 28 54 63 6c 5f 53  id->data, (Tcl_S
5350: 69 7a 65 29 20 73 75 69 64 2d 3e 6c 65 6e 67 74  ize) suid->lengt
5360: 68 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  h));..} else {..
5370: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
5380: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
5390: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
53a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
53b0: 28 22 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 20  ("", -1));..}.  
53c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 58 35 30 39    }..    /* X509
53d0: 20 76 33 20 45 78 74 65 6e 73 69 6f 6e 73 20 2d   v3 Extensions -
53e0: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f   RFC 5280 sectio
53f0: 6e 20 34 2e 31 2e 32 2e 39 20 2a 2f 0a 20 20 20  n 4.1.2.9 */.   
5400: 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74   LAPPEND_INT(int
5410: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
5420: 22 65 78 74 43 6f 75 6e 74 22 2c 20 58 35 30 39  "extCount", X509
5430: 5f 67 65 74 5f 65 78 74 5f 63 6f 75 6e 74 28 63  _get_ext_count(c
5440: 65 72 74 29 29 3b 0a 20 20 20 20 4c 41 50 50 45  ert));.    LAPPE
5450: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72  ND_OBJ(interp, r
5460: 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74 65 6e  esultObj, "exten
5470: 73 69 6f 6e 73 22 2c 20 54 6c 73 5f 78 35 30 39  sions", Tls_x509
5480: 45 78 74 65 6e 73 69 6f 6e 73 28 69 6e 74 65 72  Extensions(inter
5490: 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 20 20  p, cert));..    
54a0: 2f 2a 20 41 75 74 68 6f 72 69 74 79 20 4b 65 79  /* Authority Key
54b0: 20 49 64 65 6e 74 69 66 69 65 72 20 28 41 4b 49   Identifier (AKI
54c0: 29 20 69 73 20 74 68 65 20 53 75 62 6a 65 63 74  ) is the Subject
54d0: 20 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 20   Key Identifier 
54e0: 28 53 4b 49 29 20 6f 66 0a 09 69 74 73 20 73 69  (SKI) of..its si
54f0: 67 6e 65 72 20 28 74 68 65 20 43 41 29 2e 20 52  gner (the CA). R
5500: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20  FC 5280 section 
5510: 34 2e 32 2e 31 2e 31 2c 20 4e 49 44 5f 61 75 74  4.2.1.1, NID_aut
5520: 68 6f 72 69 74 79 5f 6b 65 79 5f 69 64 65 6e 74  hority_key_ident
5530: 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50  ifier */.    LAP
5540: 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c  PEND_OBJ(interp,
5550: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 61 75 74   resultObj, "aut
5560: 68 6f 72 69 74 79 4b 65 79 49 64 65 6e 74 69 66  horityKeyIdentif
5570: 69 65 72 22 2c 0a 09 54 6c 73 5f 78 35 30 39 49  ier",..Tls_x509I
5580: 64 65 6e 74 69 66 69 65 72 28 58 35 30 39 5f 67  dentifier(X509_g
5590: 65 74 30 5f 61 75 74 68 6f 72 69 74 79 5f 6b 65  et0_authority_ke
55a0: 79 5f 69 64 28 63 65 72 74 29 29 29 3b 0a 0a 20  y_id(cert)));.. 
55b0: 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 4b 65     /* Subject Ke
55c0: 79 20 49 64 65 6e 74 69 66 69 65 72 20 28 53 4b  y Identifier (SK
55d0: 49 29 20 69 73 20 75 73 65 64 20 74 6f 20 69 64  I) is used to id
55e0: 65 6e 74 69 66 79 20 63 65 72 74 69 66 69 63 61  entify certifica
55f0: 74 65 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  tes that contain
5600: 0a 09 61 20 70 61 72 74 69 63 75 6c 61 72 20 70  ..a particular p
5610: 75 62 6c 69 63 20 6b 65 79 2e 20 52 46 43 20 35  ublic key. RFC 5
5620: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e  280 section 4.2.
5630: 31 2e 32 2c 20 4e 49 44 5f 73 75 62 6a 65 63 74  1.2, NID_subject
5640: 5f 6b 65 79 5f 69 64 65 6e 74 69 66 69 65 72 20  _key_identifier 
5650: 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f  */.    LAPPEND_O
5660: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  BJ(interp, resul
5670: 74 4f 62 6a 2c 20 22 73 75 62 6a 65 63 74 4b 65  tObj, "subjectKe
5680: 79 49 64 65 6e 74 69 66 69 65 72 22 2c 0a 09 54  yIdentifier",..T
5690: 6c 73 5f 78 35 30 39 49 64 65 6e 74 69 66 69 65  ls_x509Identifie
56a0: 72 28 58 35 30 39 5f 67 65 74 30 5f 73 75 62 6a  r(X509_get0_subj
56b0: 65 63 74 5f 6b 65 79 5f 69 64 28 63 65 72 74 29  ect_key_id(cert)
56c0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4b 65 79 20  ));..    /* Key 
56d0: 75 73 61 67 65 20 65 78 74 65 6e 73 69 6f 6e 20  usage extension 
56e0: 64 65 66 69 6e 65 73 20 74 68 65 20 70 75 72 70  defines the purp
56f0: 6f 73 65 20 28 65 2e 67 2e 2c 20 65 6e 63 69 70  ose (e.g., encip
5700: 68 65 72 6d 65 6e 74 2c 20 73 69 67 6e 61 74 75  herment, signatu
5710: 72 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 0a  re, certificate.
5720: 09 73 69 67 6e 69 6e 67 29 20 6f 66 20 74 68 65  .signing) of the
5730: 20 6b 65 79 20 69 6e 20 74 68 65 20 63 65 72 74   key in the cert
5740: 69 66 69 63 61 74 65 2e 20 52 46 43 20 35 32 38  ificate. RFC 528
5750: 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e  0 section 4.2.1.
5760: 33 2c 20 4e 49 44 5f 6b 65 79 5f 75 73 61 67 65  3, NID_key_usage
5770: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
5780: 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75  OBJ(interp, resu
5790: 6c 74 4f 62 6a 2c 20 22 6b 65 79 55 73 61 67 65  ltObj, "keyUsage
57a0: 22 2c 20 54 6c 73 5f 78 35 30 39 4b 65 79 55 73  ", Tls_x509KeyUs
57b0: 61 67 65 28 69 6e 74 65 72 70 2c 20 63 65 72 74  age(interp, cert
57c0: 2c 20 78 66 6c 61 67 73 29 29 3b 0a 0a 20 20 20  , xflags));..   
57d0: 20 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65 20   /* Certificate 
57e0: 50 6f 6c 69 63 69 65 73 20 2d 20 69 6e 64 69 63  Policies - indic
57f0: 61 74 65 73 20 74 68 65 20 69 73 73 75 69 6e 67  ates the issuing
5800: 20 43 41 20 63 6f 6e 73 69 64 65 72 73 20 69 74   CA considers it
5810: 73 20 69 73 73 75 65 72 44 6f 6d 61 69 6e 50 6f  s issuerDomainPo
5820: 6c 69 63 79 0a 09 65 71 75 69 76 61 6c 65 6e 74  licy..equivalent
5830: 20 74 6f 20 74 68 65 20 73 75 62 6a 65 63 74 20   to the subject 
5840: 43 41 27 73 20 73 75 62 6a 65 63 74 44 6f 6d 61  CA's subjectDoma
5850: 69 6e 50 6f 6c 69 63 79 2e 20 52 46 43 20 35 32  inPolicy. RFC 52
5860: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31  80 section 4.2.1
5870: 2e 34 2c 20 4e 49 44 5f 63 65 72 74 69 66 69 63  .4, NID_certific
5880: 61 74 65 5f 70 6f 6c 69 63 69 65 73 20 2a 2f 0a  ate_policies */.
5890: 20 20 20 20 69 66 20 28 78 66 6c 61 67 73 20 26      if (xflags &
58a0: 20 45 58 46 4c 41 47 5f 49 4e 56 41 4c 49 44 5f   EXFLAG_INVALID_
58b0: 50 4f 4c 49 43 59 29 20 7b 0a 09 2f 2a 20 52 65  POLICY) {../* Re
58c0: 6a 65 63 74 20 63 65 72 74 20 2a 2f 0a 20 20 20  ject cert */.   
58d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 6c 69 63   }..    /* Polic
58e0: 79 20 4d 61 70 70 69 6e 67 73 20 2d 20 52 46 43  y Mappings - RFC
58f0: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
5900: 32 2e 31 2e 35 2c 20 4e 49 44 5f 70 6f 6c 69 63  2.1.5, NID_polic
5910: 79 5f 6d 61 70 70 69 6e 67 73 20 2a 2f 0a 0a 20  y_mappings */.. 
5920: 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 41 6c     /* Subject Al
5930: 74 65 72 6e 61 74 69 76 65 20 4e 61 6d 65 20 28  ternative Name (
5940: 53 41 4e 29 20 63 6f 6e 74 61 69 6e 73 20 61 64  SAN) contains ad
5950: 64 69 74 69 6f 6e 61 6c 20 55 52 4c 73 2c 20 44  ditional URLs, D
5960: 4e 53 20 6e 61 6d 65 73 2c 20 6f 72 20 49 50 0a  NS names, or IP.
5970: 09 61 64 64 72 65 73 73 65 73 20 62 6f 75 6e 64  .addresses bound
5980: 20 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 2e   to certificate.
5990: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f   RFC 5280 sectio
59a0: 6e 20 34 2e 32 2e 31 2e 36 2c 20 4e 49 44 5f 73  n 4.2.1.6, NID_s
59b0: 75 62 6a 65 63 74 5f 61 6c 74 5f 6e 61 6d 65 20  ubject_alt_name 
59c0: 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f  */.    LAPPEND_O
59d0: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  BJ(interp, resul
59e0: 74 4f 62 6a 2c 20 22 73 75 62 6a 65 63 74 41 6c  tObj, "subjectAl
59f0: 74 4e 61 6d 65 22 2c 20 54 6c 73 5f 78 35 30 39  tName", Tls_x509
5a00: 4e 61 6d 65 73 28 69 6e 74 65 72 70 2c 20 63 65  Names(interp, ce
5a10: 72 74 2c 20 4e 49 44 5f 73 75 62 6a 65 63 74 5f  rt, NID_subject_
5a20: 61 6c 74 5f 6e 61 6d 65 2c 20 62 69 6f 29 29 3b  alt_name, bio));
5a30: 0a 0a 20 20 20 20 2f 2a 20 49 73 73 75 65 72 20  ..    /* Issuer 
5a40: 41 6c 74 65 72 6e 61 74 69 76 65 20 4e 61 6d 65  Alternative Name
5a50: 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 6f   is used to asso
5a60: 63 69 61 74 65 20 49 6e 74 65 72 6e 65 74 20 73  ciate Internet s
5a70: 74 79 6c 65 20 69 64 65 6e 74 69 74 69 65 73 0a  tyle identities.
5a80: 09 77 69 74 68 20 74 68 65 20 63 65 72 74 69 66  .with the certif
5a90: 69 63 61 74 65 20 69 73 73 75 65 72 2e 20 52 46  icate issuer. RF
5aa0: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34  C 5280 section 4
5ab0: 2e 32 2e 31 2e 37 2c 20 4e 49 44 5f 69 73 73 75  .2.1.7, NID_issu
5ac0: 65 72 5f 61 6c 74 5f 6e 61 6d 65 20 2a 2f 0a 20  er_alt_name */. 
5ad0: 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69     LAPPEND_OBJ(i
5ae0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
5af0: 2c 20 22 69 73 73 75 65 72 41 6c 74 4e 61 6d 65  , "issuerAltName
5b00: 22 2c 20 54 6c 73 5f 78 35 30 39 4e 61 6d 65 73  ", Tls_x509Names
5b10: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 4e  (interp, cert, N
5b20: 49 44 5f 69 73 73 75 65 72 5f 61 6c 74 5f 6e 61  ID_issuer_alt_na
5b30: 6d 65 2c 20 62 69 6f 29 29 3b 0a 0a 20 20 20 20  me, bio));..    
5b40: 2f 2a 20 53 75 62 6a 65 63 74 20 44 69 72 65 63  /* Subject Direc
5b50: 74 6f 72 79 20 41 74 74 72 69 62 75 74 65 73 20  tory Attributes 
5b60: 70 72 6f 76 69 64 65 73 20 69 64 65 6e 74 69 66  provides identif
5b70: 69 63 61 74 69 6f 6e 20 61 74 74 72 69 62 75 74  ication attribut
5b80: 65 73 20 28 65 2e 67 2e 2c 20 6e 61 74 69 6f 6e  es (e.g., nation
5b90: 61 6c 69 74 79 29 0a 09 6f 66 20 74 68 65 20 73  ality)..of the s
5ba0: 75 62 6a 65 63 74 2e 20 52 46 43 20 35 32 38 30  ubject. RFC 5280
5bb0: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 38   section 4.2.1.8
5bc0: 20 28 73 75 62 6a 65 63 74 44 69 72 65 63 74 6f   (subjectDirecto
5bd0: 72 79 41 74 74 72 69 62 75 74 65 73 29 20 2a 2f  ryAttributes) */
5be0: 0a 0a 20 20 20 20 2f 2a 20 42 61 73 69 63 20 43  ..    /* Basic C
5bf0: 6f 6e 73 74 72 61 69 6e 74 73 20 69 64 65 6e 74  onstraints ident
5c00: 69 66 69 65 73 20 77 68 65 74 68 65 72 20 74 68  ifies whether th
5c10: 65 20 73 75 62 6a 65 63 74 20 6f 66 20 74 68 65  e subject of the
5c20: 20 63 65 72 74 20 69 73 20 61 20 43 41 20 61 6e   cert is a CA an
5c30: 64 0a 09 74 68 65 20 6d 61 78 20 64 65 70 74 68  d..the max depth
5c40: 20 6f 66 20 76 61 6c 69 64 20 63 65 72 74 20 70   of valid cert p
5c50: 61 74 68 73 20 66 6f 72 20 74 68 69 73 20 63 65  aths for this ce
5c60: 72 74 2e 20 52 46 43 20 35 32 38 30 20 73 65 63  rt. RFC 5280 sec
5c70: 74 69 6f 6e 20 34 2e 32 2e 31 2e 39 2c 20 4e 49  tion 4.2.1.9, NI
5c80: 44 5f 62 61 73 69 63 5f 63 6f 6e 73 74 72 61 69  D_basic_constrai
5c90: 6e 74 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21  nts */.    if (!
5ca0: 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47  (xflags & EXFLAG
5cb0: 5f 50 52 4f 58 59 29 29 20 7b 0a 09 4c 41 50 50  _PROXY)) {..LAPP
5cc0: 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c  END_LONG(interp,
5cd0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 61 74   resultObj, "pat
5ce0: 68 4c 65 6e 22 2c 20 58 35 30 39 5f 67 65 74 5f  hLen", X509_get_
5cf0: 70 61 74 68 6c 65 6e 28 63 65 72 74 29 29 3b 0a  pathlen(cert));.
5d00: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 4c 41      } else {..LA
5d10: 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72  PPEND_LONG(inter
5d20: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70  p, resultObj, "p
5d30: 61 74 68 4c 65 6e 22 2c 20 58 35 30 39 5f 67 65  athLen", X509_ge
5d40: 74 5f 70 72 6f 78 79 5f 70 61 74 68 6c 65 6e 28  t_proxy_pathlen(
5d50: 63 65 72 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  cert));.    }.  
5d60: 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69    LAPPEND_BOOL(i
5d70: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
5d80: 2c 20 22 62 61 73 69 63 43 6f 6e 73 74 72 61 69  , "basicConstrai
5d90: 6e 74 73 43 41 22 2c 20 78 66 6c 61 67 73 20 26  ntsCA", xflags &
5da0: 20 45 58 46 4c 41 47 5f 43 41 29 3b 0a 0a 20 20   EXFLAG_CA);..  
5db0: 20 20 2f 2a 20 4e 61 6d 65 20 43 6f 6e 73 74 72    /* Name Constr
5dc0: 61 69 6e 74 73 20 69 73 20 6f 6e 6c 79 20 75 73  aints is only us
5dd0: 65 64 20 69 6e 20 43 41 20 63 65 72 74 73 20 74  ed in CA certs t
5de0: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 6e  o indicate the n
5df0: 61 6d 65 20 73 70 61 63 65 20 66 6f 72 0a 09 61  ame space for..a
5e00: 6c 6c 20 73 75 62 6a 65 63 74 20 6e 61 6d 65 73  ll subject names
5e10: 20 69 6e 20 73 75 62 73 65 71 75 65 6e 74 20 63   in subsequent c
5e20: 65 72 74 69 66 69 63 61 74 65 73 20 69 6e 20 61  ertificates in a
5e30: 20 63 65 72 74 69 66 69 63 61 74 69 6f 6e 20 70   certification p
5e40: 61 74 68 0a 09 4d 55 53 54 20 62 65 20 6c 6f 63  ath..MUST be loc
5e50: 61 74 65 64 2e 20 52 46 43 20 35 32 38 30 20 73  ated. RFC 5280 s
5e60: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 30 2c  ection 4.2.1.10,
5e70: 20 4e 49 44 5f 6e 61 6d 65 5f 63 6f 6e 73 74 72   NID_name_constr
5e80: 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  aints */..    /*
5e90: 20 50 6f 6c 69 63 79 20 43 6f 6e 73 74 72 61 69   Policy Constrai
5ea0: 6e 74 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  nts is only used
5eb0: 20 69 6e 20 43 41 20 63 65 72 74 73 20 74 6f 20   in CA certs to 
5ec0: 6c 69 6d 69 74 20 74 68 65 20 6c 65 6e 67 74 68  limit the length
5ed0: 20 6f 66 20 61 0a 09 63 65 72 74 20 63 68 61 69   of a..cert chai
5ee0: 6e 20 66 6f 72 20 74 68 61 74 20 43 41 2e 20 52  n for that CA. R
5ef0: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20  FC 5280 section 
5f00: 34 2e 32 2e 31 2e 31 31 2c 20 4e 49 44 5f 70 6f  4.2.1.11, NID_po
5f10: 6c 69 63 79 5f 63 6f 6e 73 74 72 61 69 6e 74 73  licy_constraints
5f20: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65   */..    /* Exte
5f30: 6e 64 65 64 20 4b 65 79 20 55 73 61 67 65 20 69  nded Key Usage i
5f40: 6e 64 69 63 61 74 65 73 20 74 68 65 20 70 75 72  ndicates the pur
5f50: 70 6f 73 65 73 20 74 68 65 20 63 65 72 74 69 66  poses the certif
5f60: 69 65 64 20 70 75 62 6c 69 63 20 6b 65 79 20 6d  ied public key m
5f70: 61 79 20 62 65 0a 09 75 73 65 64 2c 20 62 65 79  ay be..used, bey
5f80: 6f 6e 64 20 74 68 65 20 62 61 73 69 63 20 70 75  ond the basic pu
5f90: 72 70 6f 73 65 73 2e 20 52 46 43 20 35 32 38 30  rposes. RFC 5280
5fa0: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31   section 4.2.1.1
5fb0: 32 2c 20 4e 49 44 5f 65 78 74 5f 6b 65 79 5f 75  2, NID_ext_key_u
5fc0: 73 61 67 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50  sage */.    LAPP
5fd0: 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20  END_OBJ(interp, 
5fe0: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74 65  resultObj, "exte
5ff0: 6e 64 65 64 4b 65 79 55 73 61 67 65 22 2c 20 54  ndedKeyUsage", T
6000: 6c 73 5f 78 35 30 39 45 78 74 4b 65 79 55 73 61  ls_x509ExtKeyUsa
6010: 67 65 28 69 6e 74 65 72 70 2c 20 63 65 72 74 2c  ge(interp, cert,
6020: 20 78 66 6c 61 67 73 29 29 3b 0a 0a 20 20 20 20   xflags));..    
6030: 2f 2a 20 43 52 4c 20 44 69 73 74 72 69 62 75 74  /* CRL Distribut
6040: 69 6f 6e 20 50 6f 69 6e 74 73 20 69 64 65 6e 74  ion Points ident
6050: 69 66 69 65 73 20 77 68 65 72 65 20 43 52 4c 20  ifies where CRL 
6060: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 61 6e 20  information can 
6070: 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 09 52 46  be obtained...RF
6080: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34  C 5280 section 4
6090: 2e 32 2e 31 2e 31 33 2a 2f 0a 20 20 20 20 4c 41  .2.1.13*/.    LA
60a0: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70  PPEND_OBJ(interp
60b0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 63 72  , resultObj, "cr
60c0: 6c 44 69 73 74 72 69 62 75 74 69 6f 6e 50 6f 69  lDistributionPoi
60d0: 6e 74 73 22 2c 20 54 6c 73 5f 78 35 30 39 43 72  nts", Tls_x509Cr
60e0: 6c 44 70 28 69 6e 74 65 72 70 2c 20 63 65 72 74  lDp(interp, cert
60f0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 72 65 73  ));..    /* Fres
6100: 68 65 73 74 20 43 52 4c 20 65 78 74 65 6e 73 69  hest CRL extensi
6110: 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 78 66  on */.    if (xf
6120: 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 46 52  lags & EXFLAG_FR
6130: 45 53 48 45 53 54 29 20 7b 0a 20 20 20 20 7d 0a  ESHEST) {.    }.
6140: 0a 20 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 74  .    /* Authorit
6150: 79 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 41 63  y Information Ac
6160: 63 65 73 73 20 69 6e 64 69 63 61 74 65 73 20 68  cess indicates h
6170: 6f 77 20 74 6f 20 61 63 63 65 73 73 20 69 6e 66  ow to access inf
6180: 6f 20 61 6e 64 20 73 65 72 76 69 63 65 73 0a 09  o and services..
6190: 66 6f 72 20 74 68 65 20 63 65 72 74 69 66 69 63  for the certific
61a0: 61 74 65 20 69 73 73 75 65 72 2e 20 52 46 43 20  ate issuer. RFC 
61b0: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32  5280 section 4.2
61c0: 2e 32 2e 31 2c 20 4e 49 44 5f 69 6e 66 6f 5f 61  .2.1, NID_info_a
61d0: 63 63 65 73 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  ccess */..    /*
61e0: 20 4f 6e 2d 6c 69 6e 65 20 43 65 72 74 69 66 69   On-line Certifi
61f0: 63 61 74 65 20 53 74 61 74 75 73 20 50 72 6f 74  cate Status Prot
6200: 6f 63 6f 6c 20 28 4f 53 43 50 29 20 52 65 73 70  ocol (OSCP) Resp
6210: 6f 6e 64 65 72 73 20 55 52 4c 20 2a 2f 0a 20 20  onders URL */.  
6220: 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e    LAPPEND_OBJ(in
6230: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
6240: 20 22 6f 63 73 70 52 65 73 70 6f 6e 64 65 72 73   "ocspResponders
6250: 22 2c 20 54 6c 73 5f 78 35 30 39 4f 73 63 70 28  ", Tls_x509Oscp(
6260: 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a  interp, cert));.
6270: 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63  .    /* Certific
6280: 61 74 65 20 41 75 74 68 6f 72 69 74 79 20 28 43  ate Authority (C
6290: 41 29 20 49 73 73 75 65 72 73 20 55 52 4c 20 2a  A) Issuers URL *
62a0: 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42  /.    LAPPEND_OB
62b0: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  J(interp, result
62c0: 4f 62 6a 2c 20 22 63 61 49 73 73 75 65 72 73 22  Obj, "caIssuers"
62d0: 2c 20 54 6c 73 5f 78 35 30 39 43 61 49 73 73 75  , Tls_x509CaIssu
62e0: 65 72 73 28 69 6e 74 65 72 70 2c 20 63 65 72 74  ers(interp, cert
62f0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a  ));..    /* Subj
6300: 65 63 74 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  ect Information 
6310: 41 63 63 65 73 73 20 2d 20 52 46 43 20 35 32 38  Access - RFC 528
6320: 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 32 2e  0 section 4.2.2.
6330: 32 2c 20 4e 49 44 5f 73 69 6e 66 6f 5f 61 63 63  2, NID_sinfo_acc
6340: 65 73 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43  ess */..    /* C
6350: 65 72 74 69 66 69 63 61 74 65 20 41 6c 69 61 73  ertificate Alias
6360: 2e 20 49 66 20 75 73 65 73 20 61 20 50 4b 43 53  . If uses a PKCS
6370: 23 31 32 20 73 74 72 75 63 74 75 72 65 2c 20 61  #12 structure, a
6380: 6c 69 61 73 20 77 69 6c 6c 20 72 65 66 6c 65 63  lias will reflec
6390: 74 20 74 68 65 0a 09 66 72 69 65 6e 64 6c 79 4e  t the..friendlyN
63a0: 61 6d 65 20 61 74 74 72 69 62 75 74 65 20 28 52  ame attribute (R
63b0: 46 43 20 32 39 38 35 29 2e 20 2a 2f 0a 20 20 20  FC 2985). */.   
63c0: 20 7b 0a 09 69 6e 74 20 69 6c 65 6e 20 3d 20 30   {..int ilen = 0
63d0: 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
63e0: 65 64 20 63 68 61 72 20 2a 73 74 72 69 6e 67 20  ed char *string 
63f0: 3d 20 58 35 30 39 5f 61 6c 69 61 73 5f 67 65 74  = X509_alias_get
6400: 30 28 63 65 72 74 2c 20 26 69 6c 65 6e 29 3b 0a  0(cert, &ilen);.
6410: 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
6420: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
6430: 22 61 6c 69 61 73 22 2c 20 28 63 68 61 72 20 2a  "alias", (char *
6440: 29 20 73 74 72 69 6e 67 2c 20 28 54 63 6c 5f 53  ) string, (Tcl_S
6450: 69 7a 65 29 20 69 6c 65 6e 29 3b 0a 20 20 20 20  ize) ilen);.    
6460: 20 20 20 20 73 74 72 69 6e 67 20 3d 20 58 35 30      string = X50
6470: 39 5f 6b 65 79 69 64 5f 67 65 74 30 28 63 65 72  9_keyid_get0(cer
6480: 74 2c 20 26 69 6c 65 6e 29 3b 0a 09 4c 41 50 50  t, &ilen);..LAPP
6490: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
64a0: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6b 65 79 49  resultObj, "keyI
64b0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 73 74 72  d", (char *) str
64c0: 69 6e 67 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  ing, (Tcl_Size) 
64d0: 69 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ilen);.    }..  
64e0: 20 20 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65    /* Certificate
64f0: 20 61 6e 64 20 64 75 6d 70 20 61 6c 6c 20 64 61   and dump all da
6500: 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c  ta */.    if (al
6510: 6c 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 61  l) {..Tcl_Obj *a
6520: 6c 6c 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42  llObj = Tcl_NewB
6530: 79 74 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c  yteArrayObj(NULL
6540: 2c 20 30 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a  , 0);..Tcl_Obj *
6550: 63 65 72 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  certObj = Tcl_Ne
6560: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 4e 55  wByteArrayObj(NU
6570: 4c 4c 2c 20 30 29 3b 0a 09 75 6e 73 69 67 6e 65  LL, 0);..unsigne
6580: 64 20 63 68 61 72 20 2a 61 6c 6c 53 74 72 2c 20  d char *allStr, 
6590: 2a 63 65 72 74 53 74 72 3b 0a 0a 09 69 66 20 28  *certStr;...if (
65a0: 61 6c 6c 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 20 7c  allObj == NULL |
65b0: 7c 20 63 65 72 74 4f 62 6a 20 3d 3d 20 4e 55 4c  | certObj == NUL
65c0: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65  L) {..    Tcl_De
65d0: 63 72 52 65 66 43 6f 75 6e 74 28 61 6c 6c 4f 62  crRefCount(allOb
65e0: 6a 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65  j);..    BIO_fre
65f0: 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 63 6b 66  e(bio);..    ckf
6600: 72 65 65 28 62 75 66 66 65 72 29 3b 0a 09 20 20  ree(buffer);..  
6610: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f    return resultO
6620: 62 6a 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20  bj;..}.../* Get 
6630: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
6640: 63 65 72 74 53 74 72 20 3d 20 54 63 6c 5f 53 65  certStr = Tcl_Se
6650: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68  tByteArrayLength
6660: 28 63 65 72 74 4f 62 6a 2c 20 43 45 52 54 5f 53  (certObj, CERT_S
6670: 54 52 5f 53 49 5a 45 29 3b 0a 09 6c 65 6e 20 3d  TR_SIZE);..len =
6680: 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 50   BIO_to_Buffer(P
6690: 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30  EM_write_bio_X50
66a0: 39 28 62 69 6f 2c 20 63 65 72 74 29 2c 20 62 69  9(bio, cert), bi
66b0: 6f 2c 20 63 65 72 74 53 74 72 2c 20 43 45 52 54  o, certStr, CERT
66c0: 5f 53 54 52 5f 53 49 5a 45 29 3b 0a 09 54 63 6c  _STR_SIZE);..Tcl
66d0: 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e  _SetByteArrayLen
66e0: 67 74 68 28 63 65 72 74 4f 62 6a 2c 20 6c 65 6e  gth(certObj, len
66f0: 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28  );..LAPPEND_OBJ(
6700: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
6710: 6a 2c 20 22 63 65 72 74 69 66 69 63 61 74 65 22  j, "certificate"
6720: 2c 20 63 65 72 74 4f 62 6a 29 0a 0a 09 2f 2a 20  , certObj).../* 
6730: 47 65 74 20 61 6c 6c 20 69 6e 66 6f 20 6f 6e 20  Get all info on 
6740: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
6750: 61 6c 6c 53 74 72 20 3d 20 54 63 6c 5f 53 65 74  allStr = Tcl_Set
6760: 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28  ByteArrayLength(
6770: 61 6c 6c 4f 62 6a 2c 20 43 45 52 54 5f 53 54 52  allObj, CERT_STR
6780: 5f 53 49 5a 45 20 2a 20 32 29 3b 0a 09 6c 65 6e  _SIZE * 2);..len
6790: 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72   = BIO_to_Buffer
67a0: 28 58 35 30 39 5f 70 72 69 6e 74 5f 65 78 28 62  (X509_print_ex(b
67b0: 69 6f 2c 20 63 65 72 74 2c 20 66 6c 61 67 73 2c  io, cert, flags,
67c0: 20 30 29 2c 20 62 69 6f 2c 20 61 6c 6c 53 74 72   0), bio, allStr
67d0: 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 20  , CERT_STR_SIZE 
67e0: 2a 20 32 29 3b 0a 09 54 63 6c 5f 53 65 74 42 79  * 2);..Tcl_SetBy
67f0: 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 61 6c  teArrayLength(al
6800: 6c 4f 62 6a 2c 20 6c 65 6e 29 3b 0a 09 4c 41 50  lObj, len);..LAP
6810: 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c  PEND_OBJ(interp,
6820: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 61 6c 6c   resultObj, "all
6830: 22 2c 20 61 6c 6c 4f 62 6a 29 0a 20 20 20 20 7d  ", allObj).    }
6840: 0a 0a 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62  ..    BIO_free(b
6850: 69 6f 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28  io);.    ckfree(
6860: 62 75 66 66 65 72 29 3b 0a 20 20 20 20 72 65 74  buffer);.    ret
6870: 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d  urn resultObj;.}
6880: 0a                                               .