Hex Artifact Content

Artifact 3dbab2388593d911b15af9720989dd9d42c875823b02aea3dd363db8ad88e85b:


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 69 6c 65 6e 2a 32 29 3b 0a 20 20 20 20 75 6e   ilen*2);.    un
0450: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 70 74  signed char *dpt
0460: 72 20 3d 20 26 64 61 74 61 5b 30 5d 3b 0a 20 20  r = &data[0];.  
0470: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 65    const char *he
0480: 78 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61  x = "0123456789a
0490: 62 63 64 65 66 22 3b 0a 0a 20 20 20 20 69 66 20  bcdef";..    if 
04a0: 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55  (resultObj == NU
04b0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55  LL) {..return NU
04c0: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  LL;.    }..    f
04d0: 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69  or (int i = 0; i
04e0: 20 3c 20 69 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a   < ilen; i++) {.
04f0: 20 20 20 20 20 20 20 20 2a 64 70 74 72 2b 2b 20          *dptr++ 
0500: 3d 20 68 65 78 5b 28 2a 69 70 74 72 3e 3e 34 29  = hex[(*iptr>>4)
0510: 26 30 78 46 5d 3b 0a 20 20 20 20 20 20 20 20 2a  &0xF];.        *
0520: 64 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 2a 69  dptr++ = hex[(*i
0530: 70 74 72 2b 2b 29 26 30 78 46 5d 3b 0a 20 20 20  ptr++)&0xF];.   
0540: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65   }.    return re
0550: 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20  sultObj;.}../*. 
0560: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
05b0: 2a 0a 20 2a 20 42 49 4f 5f 74 6f 5f 42 75 66 66  *. * BIO_to_Buff
05c0: 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 4f 75 74 70  er --. *. *.Outp
05d0: 75 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  ut contents of a
05e0: 20 42 49 4f 20 74 6f 20 61 20 62 75 66 66 65 72   BIO to a buffer
05f0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
0600: 20 2a 09 52 65 74 75 72 6e 73 20 6c 65 6e 67 74   *.Returns lengt
0610: 68 20 6f 66 20 73 74 72 69 6e 67 20 69 6e 20 62  h of string in b
0620: 75 66 66 65 72 0a 20 2a 0a 20 2a 20 53 69 64 65  uffer. *. * Side
0630: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
0640: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
0650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0690: 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 53 69 7a  ----. */.Tcl_Siz
06a0: 65 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28  e BIO_to_Buffer(
06b0: 69 6e 74 20 72 65 73 75 6c 74 2c 20 42 49 4f 20  int result, BIO 
06c0: 2a 62 69 6f 2c 20 76 6f 69 64 20 2a 6f 75 74 70  *bio, void *outp
06d0: 75 74 2c 20 69 6e 74 20 6f 6c 65 6e 29 20 7b 0a  ut, int olen) {.
06e0: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e      Tcl_Size len
06f0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 70 65   = 0;.    int pe
0700: 6e 64 69 6e 67 20 3d 20 42 49 4f 5f 70 65 6e 64  nding = BIO_pend
0710: 69 6e 67 28 62 69 6f 29 3b 0a 0a 20 20 20 20 69  ing(bio);..    i
0720: 66 20 28 72 65 73 75 6c 74 29 20 7b 0a 09 6c 65  f (result) {..le
0730: 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 42  n = (Tcl_Size) B
0740: 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 6f 75 74  IO_read(bio, out
0750: 70 75 74 2c 20 28 70 65 6e 64 69 6e 67 20 3c 20  put, (pending < 
0760: 6f 6c 65 6e 29 20 3f 20 70 65 6e 64 69 6e 67 20  olen) ? pending 
0770: 3a 20 6f 6c 65 6e 29 3b 0a 09 28 76 6f 69 64 29  : olen);..(void)
0780: 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a  BIO_flush(bio);.
0790: 09 69 66 20 28 6c 65 6e 20 3c 20 30 29 20 7b 0a  .if (len < 0) {.
07a0: 09 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 09 7d  .    len = 0;..}
07b0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
07c0: 6e 20 6c 65 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  n len;.}.../*. *
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
0820: 0a 20 2a 20 54 6c 73 5f 78 35 30 39 45 78 74 65  . * Tls_x509Exte
0830: 6e 73 69 6f 6e 73 20 2d 2d 0a 20 2a 0a 20 2a 09  nsions --. *. *.
0840: 47 65 74 20 6c 69 73 74 20 6f 66 20 58 2e 35 30  Get list of X.50
0850: 39 20 43 65 72 74 69 66 69 63 61 74 65 20 45 78  9 Certificate Ex
0860: 74 65 6e 73 69 6f 6e 73 0a 20 2a 0a 20 2a 20 52  tensions. *. * R
0870: 65 73 75 6c 74 73 3a 0a 20 2a 09 54 43 4c 20 6c  esults:. *.TCL l
0880: 69 73 74 20 6f 66 20 65 78 74 65 6e 73 69 6f 6e  ist of extension
0890: 73 20 61 6e 64 20 62 6f 6f 6c 65 61 6e 20 63 72  s and boolean cr
08a0: 69 74 69 63 61 6c 20 73 74 61 74 75 73 0a 20 2a  itical status. *
08b0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
08c0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d  :. *.None. *. *-
08d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
0920: 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35  .Tcl_Obj *Tls_x5
0930: 30 39 45 78 74 65 6e 73 69 6f 6e 73 28 54 63 6c  09Extensions(Tcl
0940: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0950: 20 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20   X509 *cert) {. 
0960: 20 20 20 63 6f 6e 73 74 20 53 54 41 43 4b 5f 4f     const STACK_O
0970: 46 28 58 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e  F(X509_EXTENSION
0980: 29 20 2a 65 78 74 73 3b 0a 20 20 20 20 54 63 6c  ) *exts;.    Tcl
0990: 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20  _Obj *resultObj 
09a0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
09b0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20  (0, NULL);..    
09c0: 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d  if (resultObj ==
09d0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
09e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
09f0: 20 20 69 66 20 28 28 65 78 74 73 20 3d 20 58 35    if ((exts = X5
0a00: 30 39 5f 67 65 74 30 5f 65 78 74 65 6e 73 69 6f  09_get0_extensio
0a10: 6e 73 28 63 65 72 74 29 29 20 21 3d 20 4e 55 4c  ns(cert)) != NUL
0a20: 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69  L) {..for (int i
0a30: 3d 30 3b 20 69 20 3c 20 58 35 30 39 5f 67 65 74  =0; i < X509_get
0a40: 5f 65 78 74 5f 63 6f 75 6e 74 28 63 65 72 74 29  _ext_count(cert)
0a50: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35  ; i++) {..    X5
0a60: 30 39 5f 45 58 54 45 4e 53 49 4f 4e 20 2a 65 78  09_EXTENSION *ex
0a70: 20 3d 20 73 6b 5f 58 35 30 39 5f 45 58 54 45 4e   = sk_X509_EXTEN
0a80: 53 49 4f 4e 5f 76 61 6c 75 65 28 65 78 74 73 2c  SION_value(exts,
0a90: 20 69 29 3b 0a 09 20 20 20 20 41 53 4e 31 5f 4f   i);..    ASN1_O
0aa0: 42 4a 45 43 54 20 2a 6f 62 6a 20 3d 20 58 35 30  BJECT *obj = X50
0ab0: 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74 5f  9_EXTENSION_get_
0ac0: 6f 62 6a 65 63 74 28 65 78 29 3b 0a 09 20 20 20  object(ex);..   
0ad0: 20 2f 2a 20 41 53 4e 31 5f 4f 43 54 45 54 5f 53   /* ASN1_OCTET_S
0ae0: 54 52 49 4e 47 20 2a 64 61 74 61 20 3d 20 58 35  TRING *data = X5
0af0: 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74  09_EXTENSION_get
0b00: 5f 64 61 74 61 28 65 78 29 3b 20 2a 2f 0a 09 20  _data(ex); */.. 
0b10: 20 20 20 69 6e 74 20 63 72 69 74 69 63 61 6c 20     int critical 
0b20: 3d 20 58 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e  = X509_EXTENSION
0b30: 5f 67 65 74 5f 63 72 69 74 69 63 61 6c 28 65 78  _get_critical(ex
0b40: 29 3b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f  );..    LAPPEND_
0b50: 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65 73  BOOL(interp, res
0b60: 75 6c 74 4f 62 6a 2c 20 4f 42 4a 5f 6e 69 64 32  ultObj, OBJ_nid2
0b70: 6c 6e 28 4f 42 4a 5f 6f 62 6a 32 6e 69 64 28 6f  ln(OBJ_obj2nid(o
0b80: 62 6a 29 29 2c 20 63 72 69 74 69 63 61 6c 29 3b  bj)), critical);
0b90: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ..}.    }.    re
0ba0: 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a  turn resultObj;.
0bb0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
0bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c00: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
0c10: 78 35 30 39 49 64 65 6e 74 69 66 69 65 72 20 2d  x509Identifier -
0c20: 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30  -. *. *.Get X.50
0c30: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 41 75  9 certificate Au
0c40: 74 68 6f 72 69 74 79 20 6f 72 20 53 75 62 6a 65  thority or Subje
0c50: 63 74 20 4b 65 79 20 49 64 65 6e 74 69 66 69 65  ct Key Identifie
0c60: 72 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  rs. *. * Results
0c70: 3a 0a 20 2a 09 54 43 4c 20 62 79 74 65 20 61 72  :. *.TCL byte ar
0c80: 72 61 79 20 6f 62 6a 65 63 74 20 77 69 74 68 20  ray object with 
0c90: 78 35 30 39 20 69 64 65 6e 74 69 66 69 65 72 20  x509 identifier 
0ca0: 61 73 20 61 20 68 65 78 20 73 74 72 69 6e 67 0a  as a hex string.
0cb0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
0cc0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
0cd0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0d20: 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f  */.Tcl_Obj *Tls_
0d30: 78 35 30 39 49 64 65 6e 74 69 66 69 65 72 28 63  x509Identifier(c
0d40: 6f 6e 73 74 20 41 53 4e 31 5f 4f 43 54 45 54 5f  onst ASN1_OCTET_
0d50: 53 54 52 49 4e 47 20 2a 61 73 74 72 69 6e 67 29  STRING *astring)
0d60: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
0d70: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 4e 55 4c 4c  resultObj = NULL
0d80: 3b 0a 0a 20 20 20 20 69 66 20 28 61 73 74 72 69  ;..    if (astri
0d90: 6e 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  ng != NULL) {..r
0da0: 65 73 75 6c 74 4f 62 6a 20 3d 20 53 74 72 69 6e  esultObj = Strin
0db0: 67 5f 74 6f 5f 48 65 78 28 28 75 6e 73 69 67 6e  g_to_Hex((unsign
0dc0: 65 64 20 63 68 61 72 20 2a 29 41 53 4e 31 5f 53  ed char *)ASN1_S
0dd0: 54 52 49 4e 47 5f 67 65 74 30 5f 64 61 74 61 28  TRING_get0_data(
0de0: 61 73 74 72 69 6e 67 29 2c 0a 09 20 20 20 20 41  astring),..    A
0df0: 53 4e 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74  SN1_STRING_lengt
0e00: 68 28 61 73 74 72 69 6e 67 29 29 3b 0a 20 20 20  h(astring));.   
0e10: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65   }.    return re
0e20: 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20  sultObj;.}../*. 
0e30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0e80: 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39 4b 65 79  *. * Tls_x509Key
0e90: 55 73 61 67 65 20 2d 2d 0a 20 2a 0a 20 2a 09 47  Usage --. *. *.G
0ea0: 65 74 20 58 2e 35 30 39 20 63 65 72 74 69 66 69  et X.509 certifi
0eb0: 63 61 74 65 20 6b 65 79 20 75 73 61 67 65 20 74  cate key usage t
0ec0: 79 70 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ypes. *. * Resul
0ed0: 74 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 74 20  ts:. *.Tcl list 
0ee0: 6f 66 20 74 79 70 65 73 0a 20 2a 0a 20 2a 20 53  of types. *. * S
0ef0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
0f00: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  None. *. *------
0f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f  -------. */.Tcl_
0f60: 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 4b 65 79  Obj *Tls_x509Key
0f70: 55 73 61 67 65 28 54 63 6c 5f 49 6e 74 65 72 70  Usage(Tcl_Interp
0f80: 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a   *interp, X509 *
0f90: 63 65 72 74 2c 20 75 69 6e 74 33 32 5f 74 20 78  cert, uint32_t x
0fa0: 66 6c 61 67 73 29 20 7b 0a 20 20 20 20 75 69 6e  flags) {.    uin
0fb0: 74 33 32 5f 74 20 75 73 61 67 65 20 3d 20 58 35  t32_t usage = X5
0fc0: 30 39 5f 67 65 74 5f 6b 65 79 5f 75 73 61 67 65  09_get_key_usage
0fd0: 28 63 65 72 74 29 3b 0a 20 20 20 20 54 63 6c 5f  (cert);.    Tcl_
0fe0: 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d  Obj *resultObj =
0ff0: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
1000: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69  0, NULL);..    i
1010: 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20  f (resultObj == 
1020: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
1030: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
1040: 20 69 66 20 28 28 78 66 6c 61 67 73 20 26 20 45   if ((xflags & E
1050: 58 46 4c 41 47 5f 4b 55 53 41 47 45 29 20 26 26  XFLAG_KUSAGE) &&
1060: 20 75 73 61 67 65 20 3c 20 55 49 4e 54 33 32 5f   usage < UINT32_
1070: 4d 41 58 29 20 7b 0a 09 69 66 20 28 75 73 61 67  MAX) {..if (usag
1080: 65 20 26 20 4b 55 5f 44 49 47 49 54 41 4c 5f 53  e & KU_DIGITAL_S
1090: 49 47 4e 41 54 55 52 45 29 20 7b 0a 09 20 20 20  IGNATURE) {..   
10a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10c0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c  , resultObj, Tcl
10d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 44  _NewStringObj("D
10e0: 69 67 69 74 61 6c 20 53 69 67 6e 61 74 75 72 65  igital Signature
10f0: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
1100: 28 75 73 61 67 65 20 26 20 4b 55 5f 4e 4f 4e 5f  (usage & KU_NON_
1110: 52 45 50 55 44 49 41 54 49 4f 4e 29 20 7b 0a 09  REPUDIATION) {..
1120: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1130: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1140: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
1150: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1160: 28 22 4e 6f 6e 2d 52 65 70 75 64 69 61 74 69 6f  ("Non-Repudiatio
1170: 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66  n", -1));..}..if
1180: 20 28 75 73 61 67 65 20 26 20 4b 55 5f 4b 45 59   (usage & KU_KEY
1190: 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 29 20 7b  _ENCIPHERMENT) {
11a0: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
11b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11c0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
11d0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11e0: 62 6a 28 22 4b 65 79 20 45 6e 63 69 70 68 65 72  bj("Key Encipher
11f0: 6d 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  ment", -1));..}.
1200: 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f  .if (usage & KU_
1210: 44 41 54 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e  DATA_ENCIPHERMEN
1220: 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  T) {..    Tcl_Li
1230: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1240: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  nt(interp, resul
1250: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tObj, Tcl_NewStr
1260: 69 6e 67 4f 62 6a 28 22 44 61 74 61 20 45 6e 63  ingObj("Data Enc
1270: 69 70 68 65 72 6d 65 6e 74 22 2c 20 2d 31 29 29  ipherment", -1))
1280: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20  ;..}..if (usage 
1290: 26 20 4b 55 5f 4b 45 59 5f 41 47 52 45 45 4d 45  & KU_KEY_AGREEME
12a0: 4e 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  NT) {..    Tcl_L
12b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
12c0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ent(interp, resu
12d0: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74  ltObj, Tcl_NewSt
12e0: 72 69 6e 67 4f 62 6a 28 22 4b 65 79 20 41 67 72  ringObj("Key Agr
12f0: 65 65 6d 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09  eement", -1));..
1300: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b  }..if (usage & K
1310: 55 5f 4b 45 59 5f 43 45 52 54 5f 53 49 47 4e 29  U_KEY_CERT_SIGN)
1320: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
1330: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1340: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
1350: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  bj, Tcl_NewStrin
1360: 67 4f 62 6a 28 22 43 65 72 74 69 66 69 63 61 74  gObj("Certificat
1370: 65 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29  e Signing", -1))
1380: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20  ;..}..if (usage 
1390: 26 20 4b 55 5f 43 52 4c 5f 53 49 47 4e 29 20 7b  & KU_CRL_SIGN) {
13a0: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
13b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
13c0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
13d0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
13e0: 62 6a 28 22 43 52 4c 20 53 69 67 6e 69 6e 67 22  bj("CRL Signing"
13f0: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
1400: 75 73 61 67 65 20 26 20 4b 55 5f 45 4e 43 49 50  usage & KU_ENCIP
1410: 48 45 52 5f 4f 4e 4c 59 29 20 7b 0a 09 20 20 20  HER_ONLY) {..   
1420: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1430: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1440: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c  , resultObj, Tcl
1450: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 45  _NewStringObj("E
1460: 6e 63 69 70 68 65 72 20 4f 6e 6c 79 22 2c 20 2d  ncipher Only", -
1470: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61  1));..}..if (usa
1480: 67 65 20 26 20 4b 55 5f 44 45 43 49 50 48 45 52  ge & KU_DECIPHER
1490: 5f 4f 4e 4c 59 29 20 7b 0a 09 20 20 20 20 54 63  _ONLY) {..    Tc
14a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
14b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
14c0: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
14d0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 44 65 63 69  wStringObj("Deci
14e0: 70 68 65 72 20 4f 6e 6c 79 22 2c 20 2d 31 29 29  pher Only", -1))
14f0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
1500: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
1510: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1520: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
1530: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  j, Tcl_NewString
1540: 4f 62 6a 28 22 75 6e 72 65 73 74 72 69 63 74 65  Obj("unrestricte
1550: 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a  d", -1));.    }.
1560: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c      return resul
1570: 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  tObj;.}../*. *--
1580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
15d0: 2a 20 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73  * Tls_x509Purpos
15e0: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 58  e --. *. *.Get X
15f0: 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
1600: 20 70 75 72 70 6f 73 65 0a 20 2a 0a 20 2a 20 52   purpose. *. * R
1610: 65 73 75 6c 74 73 3a 0a 20 2a 09 50 75 72 70 6f  esults:. *.Purpo
1620: 73 65 20 73 74 72 69 6e 67 0a 20 2a 0a 20 2a 20  se string. *. * 
1630: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
1640: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .None. *. *-----
1650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1690: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 63 68 61  --------. */.cha
16a0: 72 20 2a 54 6c 73 5f 78 35 30 39 50 75 72 70 6f  r *Tls_x509Purpo
16b0: 73 65 28 58 35 30 39 20 2a 63 65 72 74 29 20 7b  se(X509 *cert) {
16c0: 0a 20 20 20 20 63 68 61 72 20 2a 70 75 72 70 6f  .    char *purpo
16d0: 73 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20  se = NULL;..    
16e0: 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70  if (X509_check_p
16f0: 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30  urpose(cert, X50
1700: 39 5f 50 55 52 50 4f 53 45 5f 53 53 4c 5f 43 4c  9_PURPOSE_SSL_CL
1710: 49 45 4e 54 2c 20 30 29 20 3e 20 30 29 20 7b 0a  IENT, 0) > 0) {.
1720: 09 70 75 72 70 6f 73 65 20 3d 20 22 53 53 4c 20  .purpose = "SSL 
1730: 43 6c 69 65 6e 74 22 3b 0a 20 20 20 20 7d 20 65  Client";.    } e
1740: 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65  lse if (X509_che
1750: 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c  ck_purpose(cert,
1760: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 53 53   X509_PURPOSE_SS
1770: 4c 5f 53 45 52 56 45 52 2c 20 30 29 20 3e 20 30  L_SERVER, 0) > 0
1780: 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22  ) {..purpose = "
1790: 53 53 4c 20 53 65 72 76 65 72 22 3b 0a 20 20 20  SSL Server";.   
17a0: 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39   } else if (X509
17b0: 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63  _check_purpose(c
17c0: 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53  ert, X509_PURPOS
17d0: 45 5f 4e 53 5f 53 53 4c 5f 53 45 52 56 45 52 2c  E_NS_SSL_SERVER,
17e0: 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70   0) > 0) {..purp
17f0: 6f 73 65 20 3d 20 22 4d 53 53 20 53 53 4c 20 53  ose = "MSS SSL S
1800: 65 72 76 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c  erver";.    } el
1810: 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63  se if (X509_chec
1820: 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20  k_purpose(cert, 
1830: 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 53 4d 49  X509_PURPOSE_SMI
1840: 4d 45 5f 53 49 47 4e 2c 20 30 29 20 3e 20 30 29  ME_SIGN, 0) > 0)
1850: 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 53   {..purpose = "S
1860: 4d 49 4d 45 20 53 69 67 6e 69 6e 67 22 3b 0a 20  MIME Signing";. 
1870: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35     } else if (X5
1880: 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65  09_check_purpose
1890: 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50  (cert, X509_PURP
18a0: 4f 53 45 5f 53 4d 49 4d 45 5f 45 4e 43 52 59 50  OSE_SMIME_ENCRYP
18b0: 54 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75  T, 0) > 0) {..pu
18c0: 72 70 6f 73 65 20 3d 20 22 53 4d 49 4d 45 20 45  rpose = "SMIME E
18d0: 6e 63 72 79 70 74 69 6f 6e 22 3b 0a 20 20 20 20  ncryption";.    
18e0: 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f  } else if (X509_
18f0: 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65  check_purpose(ce
1900: 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45  rt, X509_PURPOSE
1910: 5f 43 52 4c 5f 53 49 47 4e 2c 20 30 29 20 3e 20  _CRL_SIGN, 0) > 
1920: 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20  0) {..purpose = 
1930: 22 43 52 4c 20 53 69 67 6e 69 6e 67 22 3b 0a 20  "CRL Signing";. 
1940: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35     } else if (X5
1950: 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65  09_check_purpose
1960: 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50  (cert, X509_PURP
1970: 4f 53 45 5f 41 4e 59 2c 20 30 29 20 3e 20 30 29  OSE_ANY, 0) > 0)
1980: 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 41   {..purpose = "A
1990: 6e 79 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ny";.    } else 
19a0: 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70  if (X509_check_p
19b0: 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30  urpose(cert, X50
19c0: 39 5f 50 55 52 50 4f 53 45 5f 4f 43 53 50 5f 48  9_PURPOSE_OCSP_H
19d0: 45 4c 50 45 52 2c 20 30 29 20 3e 20 30 29 20 7b  ELPER, 0) > 0) {
19e0: 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 4f 43 53  ..purpose = "OCS
19f0: 50 20 48 65 6c 70 65 72 22 3b 0a 20 20 20 20 7d  P Helper";.    }
1a00: 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63   else if (X509_c
1a10: 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72  heck_purpose(cer
1a20: 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f  t, X509_PURPOSE_
1a30: 54 49 4d 45 53 54 41 4d 50 5f 53 49 47 4e 2c 20  TIMESTAMP_SIGN, 
1a40: 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f  0) > 0) {..purpo
1a50: 73 65 20 3d 20 22 54 69 6d 65 73 74 61 6d 70 20  se = "Timestamp 
1a60: 53 69 67 6e 69 6e 67 22 3b 0a 20 20 20 20 7d 20  Signing";.    } 
1a70: 65 6c 73 65 20 7b 0a 09 70 75 72 70 6f 73 65 20  else {..purpose 
1a80: 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = "";.    }.    
1a90: 72 65 74 75 72 6e 20 70 75 72 70 6f 73 65 3b 0a  return purpose;.
1aa0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
1ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1af0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
1b00: 78 35 30 39 50 75 72 70 6f 73 65 73 20 2d 2d 0a  x509Purposes --.
1b10: 20 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30 39 20   *. *.Get X.509 
1b20: 63 65 72 74 69 66 69 63 61 74 65 20 70 75 72 70  certificate purp
1b30: 6f 73 65 20 74 79 70 65 73 0a 20 2a 0a 20 2a 20  ose types. *. * 
1b40: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 6c 20  Results:. *.Tcl 
1b50: 6c 69 73 74 20 6f 66 20 65 61 63 68 20 70 75 72  list of each pur
1b60: 70 6f 73 65 20 61 6e 64 20 77 68 65 74 68 65 72  pose and whether
1b70: 20 69 74 20 69 73 20 43 41 20 6f 72 20 6e 6f 6e   it is CA or non
1b80: 2d 43 41 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  -CA. *. * Side e
1b90: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  ffects:. *.None.
1ba0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bf0: 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a  --. */.Tcl_Obj *
1c00: 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 65 73  Tls_x509Purposes
1c10: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1c20: 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 29  erp, X509 *cert)
1c30: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
1c40: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f  resultObj = Tcl_
1c50: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
1c60: 4c 4c 29 3b 0a 20 20 20 20 58 35 30 39 5f 50 55  LL);.    X509_PU
1c70: 52 50 4f 53 45 20 2a 70 74 6d 70 3b 0a 0a 20 20  RPOSE *ptmp;..  
1c80: 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20    if (resultObj 
1c90: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
1ca0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
1cb0: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d      for (int i =
1cc0: 20 30 3b 20 69 20 3c 20 58 35 30 39 5f 50 55 52   0; i < X509_PUR
1cd0: 50 4f 53 45 5f 67 65 74 5f 63 6f 75 6e 74 28 29  POSE_get_count()
1ce0: 3b 20 69 2b 2b 29 20 7b 0a 09 70 74 6d 70 20 3d  ; i++) {..ptmp =
1cf0: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65   X509_PURPOSE_ge
1d00: 74 30 28 69 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20  t0(i);..Tcl_Obj 
1d10: 2a 74 6d 70 50 74 72 20 3d 20 54 63 6c 5f 4e 65  *tmpPtr = Tcl_Ne
1d20: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
1d30: 29 3b 0a 0a 09 66 6f 72 20 28 69 6e 74 20 6a 20  );...for (int j 
1d40: 3d 20 30 3b 20 6a 20 3c 20 32 3b 20 6a 2b 2b 29  = 0; j < 2; j++)
1d50: 20 7b 0a 09 20 20 20 20 69 6e 74 20 69 64 72 65   {..    int idre
1d60: 74 20 3d 20 58 35 30 39 5f 63 68 65 63 6b 5f 70  t = X509_check_p
1d70: 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30  urpose(cert, X50
1d80: 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 5f 69 64  9_PURPOSE_get_id
1d90: 28 70 74 6d 70 29 2c 20 6a 29 3b 0a 09 20 20 20  (ptmp), j);..   
1da0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1db0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1dc0: 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65  , tmpPtr, Tcl_Ne
1dd0: 77 53 74 72 69 6e 67 4f 62 6a 28 6a 20 3f 20 22  wStringObj(j ? "
1de0: 43 41 22 20 3a 20 22 6e 6f 6e 43 41 22 2c 20 2d  CA" : "nonCA", -
1df0: 31 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  1));..    Tcl_Li
1e00: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1e10: 6e 74 28 69 6e 74 65 72 70 2c 20 74 6d 70 50 74  nt(interp, tmpPt
1e20: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
1e30: 4f 62 6a 28 69 64 72 65 74 20 3d 3d 20 31 20 3f  Obj(idret == 1 ?
1e40: 20 22 59 65 73 22 20 3a 20 22 4e 6f 22 2c 20 2d   "Yes" : "No", -
1e50: 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44  1));..}..LAPPEND
1e60: 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73  _OBJ(interp, res
1e70: 75 6c 74 4f 62 6a 2c 20 58 35 30 39 5f 50 55 52  ultObj, X509_PUR
1e80: 50 4f 53 45 5f 67 65 74 30 5f 6e 61 6d 65 28 70  POSE_get0_name(p
1e90: 74 6d 70 29 2c 20 74 6d 70 50 74 72 29 3b 0a 20  tmp), tmpPtr);. 
1ea0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1eb0: 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a  resultObj;.}../*
1ec0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
1ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f10: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39 4e  . *. * Tls_x509N
1f20: 61 6d 65 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65  ames --. *. *.Ge
1f30: 74 20 61 20 6c 69 73 74 20 6f 66 20 53 75 62 6a  t a list of Subj
1f40: 65 63 74 20 41 6c 74 65 72 6e 61 74 65 20 4e 61  ect Alternate Na
1f50: 6d 65 73 20 28 53 41 4e 29 20 6f 72 20 49 73 73  mes (SAN) or Iss
1f60: 75 65 72 20 41 6c 74 65 72 6e 61 74 65 20 4e 61  uer Alternate Na
1f70: 6d 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  mes. *. * Result
1f80: 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f  s:. *.Tcl list o
1f90: 66 20 61 6c 74 65 72 6e 61 74 65 20 6e 61 6d 65  f alternate name
1fa0: 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  s. *. * Side eff
1fb0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ects:. *.None. *
1fc0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
1fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2010: 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c  . */.Tcl_Obj *Tl
2020: 73 5f 78 35 30 39 4e 61 6d 65 73 28 54 63 6c 5f  s_x509Names(Tcl_
2030: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2040: 58 35 30 39 20 2a 63 65 72 74 2c 20 69 6e 74 20  X509 *cert, int 
2050: 6e 69 64 2c 20 42 49 4f 20 2a 62 69 6f 29 20 7b  nid, BIO *bio) {
2060: 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 47 45  .    STACK_OF(GE
2070: 4e 45 52 41 4c 5f 4e 41 4d 45 29 20 2a 6e 61 6d  NERAL_NAME) *nam
2080: 65 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  es;.    Tcl_Obj 
2090: 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c  *resultObj = Tcl
20a0: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
20b0: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 53 69  ULL);.    Tcl_Si
20c0: 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 63 68 61 72  ze len;.    char
20d0: 20 62 75 66 66 65 72 5b 31 30 32 34 5d 3b 0a 0a   buffer[1024];..
20e0: 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62      if (resultOb
20f0: 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  j == NULL) {..re
2100: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
2110: 0a 0a 20 20 20 20 69 66 20 28 28 6e 61 6d 65 73  ..    if ((names
2120: 20 3d 20 58 35 30 39 5f 67 65 74 5f 65 78 74 5f   = X509_get_ext_
2130: 64 32 69 28 63 65 72 74 2c 20 6e 69 64 2c 20 4e  d2i(cert, nid, N
2140: 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 4e  ULL, NULL)) != N
2150: 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74  ULL) {..for (int
2160: 20 69 3d 30 3b 20 69 20 3c 20 73 6b 5f 47 45 4e   i=0; i < sk_GEN
2170: 45 52 41 4c 5f 4e 41 4d 45 5f 6e 75 6d 28 6e 61  ERAL_NAME_num(na
2180: 6d 65 73 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20  mes); i++) {..  
2190: 20 20 63 6f 6e 73 74 20 47 45 4e 45 52 41 4c 5f    const GENERAL_
21a0: 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f  NAME *name = sk_
21b0: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 76 61 6c  GENERAL_NAME_val
21c0: 75 65 28 6e 61 6d 65 73 2c 20 69 29 3b 0a 0a 09  ue(names, i);...
21d0: 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f      len = BIO_to
21e0: 5f 42 75 66 66 65 72 28 6e 61 6d 65 20 26 26 20  _Buffer(name && 
21f0: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70 72 69  GENERAL_NAME_pri
2200: 6e 74 28 62 69 6f 2c 20 28 47 45 4e 45 52 41 4c  nt(bio, (GENERAL
2210: 5f 4e 41 4d 45 20 2a 29 20 6e 61 6d 65 29 2c 20  _NAME *) name), 
2220: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 31 30 32  bio, buffer, 102
2230: 34 29 3b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44  4);..    LAPPEND
2240: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73  _STR(interp, res
2250: 75 6c 74 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 62 75  ultObj, NULL, bu
2260: 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 09 7d 0a 09  ffer, len);..}..
2270: 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f  sk_GENERAL_NAME_
2280: 70 6f 70 5f 66 72 65 65 28 6e 61 6d 65 73 2c 20  pop_free(names, 
2290: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 66 72 65  GENERAL_NAME_fre
22a0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  e);.    }.    re
22b0: 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a  turn resultObj;.
22c0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2310: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
2320: 78 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 20  x509ExtKeyUsage 
2330: 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 61 20 6c  --. *. *.Get a l
2340: 69 73 74 20 6f 66 20 45 78 74 65 6e 64 65 64 20  ist of Extended 
2350: 4b 65 79 20 55 73 61 67 65 73 0a 20 2a 0a 20 2a  Key Usages. *. *
2360: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 63 6c   Returns:. *.Tcl
2370: 20 6c 69 73 74 20 6f 66 20 75 73 61 67 65 73 0a   list of usages.
2380: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
2390: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
23a0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
23f0: 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f  */.Tcl_Obj *Tls_
2400: 78 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 28  x509ExtKeyUsage(
2410: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2420: 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c 20  rp, X509 *cert, 
2430: 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 73 29  uint32_t xflags)
2440: 20 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20   {.    uint32_t 
2450: 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 74  usage = X509_get
2460: 5f 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74 29  _key_usage(cert)
2470: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72  ;.    Tcl_Obj *r
2480: 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e  esultObj = Tcl_N
2490: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
24a0: 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73  L);..    if (res
24b0: 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20  ultObj == NULL) 
24c0: 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  {..return NULL;.
24d0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28      }..    if ((
24e0: 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f  xflags & EXFLAG_
24f0: 58 4b 55 53 41 47 45 29 20 26 26 20 75 73 61 67  XKUSAGE) && usag
2500: 65 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58 29 20  e < UINT32_MAX) 
2510: 7b 0a 09 75 73 61 67 65 20 3d 20 58 35 30 39 5f  {..usage = X509_
2520: 67 65 74 5f 65 78 74 65 6e 64 65 64 5f 6b 65 79  get_extended_key
2530: 5f 75 73 61 67 65 28 63 65 72 74 29 3b 0a 0a 09  _usage(cert);...
2540: 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f  if (usage & XKU_
2550: 53 53 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09 20  SSL_SERVER) {.. 
2560: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2570: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2580: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54  rp, resultObj, T
2590: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
25a0: 22 54 4c 53 20 57 65 62 20 53 65 72 76 65 72 20  "TLS Web Server 
25b0: 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 22 2c  Authentication",
25c0: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75   -1));..}..if (u
25d0: 73 61 67 65 20 26 20 58 4b 55 5f 53 53 4c 5f 43  sage & XKU_SSL_C
25e0: 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 54 63  LIENT) {..    Tc
25f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2600: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
2610: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
2620: 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 4c 53 20  wStringObj("TLS 
2630: 57 65 62 20 43 6c 69 65 6e 74 20 41 75 74 68 65  Web Client Authe
2640: 6e 74 69 63 61 74 69 6f 6e 22 2c 20 2d 31 29 29  ntication", -1))
2650: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20  ;..}..if (usage 
2660: 26 20 58 4b 55 5f 53 4d 49 4d 45 29 20 7b 0a 09  & XKU_SMIME) {..
2670: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2680: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2690: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
26a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
26b0: 28 22 45 2d 6d 61 69 6c 20 50 72 6f 74 65 63 74  ("E-mail Protect
26c0: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  ion", -1));..}..
26d0: 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f  if (usage & XKU_
26e0: 43 4f 44 45 5f 53 49 47 4e 29 20 7b 0a 09 20 20  CODE_SIGN) {..  
26f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2700: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2710: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
2720: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
2730: 43 6f 64 65 20 53 69 67 6e 69 6e 67 22 2c 20 2d  Code Signing", -
2740: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61  1));..}..if (usa
2750: 67 65 20 26 20 58 4b 55 5f 53 47 43 29 20 7b 0a  ge & XKU_SGC) {.
2760: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2770: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2780: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
2790: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
27a0: 6a 28 22 53 47 43 22 2c 20 2d 31 29 29 3b 0a 09  j("SGC", -1));..
27b0: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58  }..if (usage & X
27c0: 4b 55 5f 4f 43 53 50 5f 53 49 47 4e 29 20 7b 0a  KU_OCSP_SIGN) {.
27d0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
27e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
27f0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
2800: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2810: 6a 28 22 4f 43 53 50 20 53 69 67 6e 69 6e 67 22  j("OCSP Signing"
2820: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
2830: 75 73 61 67 65 20 26 20 58 4b 55 5f 54 49 4d 45  usage & XKU_TIME
2840: 53 54 41 4d 50 29 20 7b 0a 09 20 20 20 20 54 63  STAMP) {..    Tc
2850: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2860: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
2870: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
2880: 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 69 6d 65  wStringObj("Time
2890: 20 53 74 61 6d 70 69 6e 67 22 2c 20 2d 31 29 29   Stamping", -1))
28a0: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20  ;..}..if (usage 
28b0: 26 20 58 4b 55 5f 44 56 43 53 20 29 20 7b 0a 09  & XKU_DVCS ) {..
28c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
28d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
28e0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
28f0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2900: 28 22 44 56 43 53 22 2c 20 2d 31 29 29 3b 0a 09  ("DVCS", -1));..
2910: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58  }..if (usage & X
2920: 4b 55 5f 41 4e 59 45 4b 55 29 20 7b 0a 09 20 20  KU_ANYEKU) {..  
2930: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2940: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2950: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
2960: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
2970: 41 6e 79 20 45 78 74 65 6e 64 65 64 20 4b 65 79  Any Extended Key
2980: 20 55 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 09   Usage", -1));..
2990: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  }.    } else {..
29a0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
29b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
29c0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
29d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
29e0: 28 22 75 6e 72 65 73 74 72 69 63 74 65 64 22 2c  ("unrestricted",
29f0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20   -1));.    }.   
2a00: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62   return resultOb
2a10: 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  j;.}../*. *-----
2a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a60: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
2a70: 6c 73 5f 78 35 30 39 43 72 6c 44 70 20 2d 2d 0a  ls_x509CrlDp --.
2a80: 20 2a 0a 20 2a 09 47 65 74 20 6c 69 73 74 20 6f   *. *.Get list o
2a90: 66 20 43 52 4c 20 44 69 73 74 72 69 62 75 74 69  f CRL Distributi
2aa0: 6f 6e 20 50 6f 69 6e 74 73 0a 20 2a 0a 20 2a 20  on Points. *. * 
2ab0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 63 6c 20  Returns:. *.Tcl 
2ac0: 6c 69 73 74 20 6f 66 20 55 52 49 73 20 61 6e 64  list of URIs and
2ad0: 20 72 65 6c 61 74 69 76 65 2d 6e 61 6d 65 73 0a   relative-names.
2ae0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
2af0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
2b00: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
2b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2b50: 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f  */.Tcl_Obj *Tls_
2b60: 78 35 30 39 43 72 6c 44 70 28 54 63 6c 5f 49 6e  x509CrlDp(Tcl_In
2b70: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35  terp *interp, X5
2b80: 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20  09 *cert) {.    
2b90: 53 54 41 43 4b 5f 4f 46 28 44 49 53 54 5f 50 4f  STACK_OF(DIST_PO
2ba0: 49 4e 54 29 20 2a 63 72 6c 3b 0a 20 20 20 20 54  INT) *crl;.    T
2bb0: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62  cl_Obj *resultOb
2bc0: 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  j = Tcl_NewListO
2bd0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20  bj(0, NULL);..  
2be0: 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20    if (resultObj 
2bf0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
2c00: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
2c10: 20 20 20 20 69 66 20 28 28 63 72 6c 20 3d 20 58      if ((crl = X
2c20: 35 30 39 5f 67 65 74 5f 65 78 74 5f 64 32 69 28  509_get_ext_d2i(
2c30: 63 65 72 74 2c 20 4e 49 44 5f 63 72 6c 5f 64 69  cert, NID_crl_di
2c40: 73 74 72 69 62 75 74 69 6f 6e 5f 70 6f 69 6e 74  stribution_point
2c50: 73 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20  s, NULL, NULL)) 
2c60: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20  != NULL) {..for 
2c70: 28 69 6e 74 20 69 3d 30 3b 20 69 20 3c 20 73 6b  (int i=0; i < sk
2c80: 5f 44 49 53 54 5f 50 4f 49 4e 54 5f 6e 75 6d 28  _DIST_POINT_num(
2c90: 63 72 6c 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20  crl); i++) {..  
2ca0: 20 20 44 49 53 54 5f 50 4f 49 4e 54 20 2a 64 70    DIST_POINT *dp
2cb0: 20 3d 20 73 6b 5f 44 49 53 54 5f 50 4f 49 4e 54   = sk_DIST_POINT
2cc0: 5f 76 61 6c 75 65 28 63 72 6c 2c 20 69 29 3b 0a  _value(crl, i);.
2cd0: 09 20 20 20 20 44 49 53 54 5f 50 4f 49 4e 54 5f  .    DIST_POINT_
2ce0: 4e 41 4d 45 20 2a 64 69 73 74 70 6f 69 6e 74 20  NAME *distpoint 
2cf0: 3d 20 64 70 2d 3e 64 69 73 74 70 6f 69 6e 74 3b  = dp->distpoint;
2d00: 0a 0a 09 20 20 20 20 69 66 20 28 64 69 73 74 70  ...    if (distp
2d10: 6f 69 6e 74 2d 3e 74 79 70 65 20 3d 3d 20 30 29  oint->type == 0)
2d20: 20 7b 0a 09 09 2f 2a 20 66 75 6c 6c 2d 6e 61 6d   {.../* full-nam
2d30: 65 20 47 45 4e 45 52 41 4c 49 5a 45 44 4e 41 4d  e GENERALIZEDNAM
2d40: 45 20 2a 2f 0a 09 09 66 6f 72 20 28 69 6e 74 20  E */...for (int 
2d50: 6a 20 3d 20 30 3b 20 6a 20 3c 20 73 6b 5f 47 45  j = 0; j < sk_GE
2d60: 4e 45 52 41 4c 5f 4e 41 4d 45 5f 6e 75 6d 28 64  NERAL_NAME_num(d
2d70: 69 73 74 70 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 66  istpoint->name.f
2d80: 75 6c 6c 6e 61 6d 65 29 3b 20 6a 2b 2b 29 20 7b  ullname); j++) {
2d90: 0a 09 09 20 20 20 20 47 45 4e 45 52 41 4c 5f 4e  ...    GENERAL_N
2da0: 41 4d 45 20 2a 67 65 6e 20 3d 20 73 6b 5f 47 45  AME *gen = sk_GE
2db0: 4e 45 52 41 4c 5f 4e 41 4d 45 5f 76 61 6c 75 65  NERAL_NAME_value
2dc0: 28 64 69 73 74 70 6f 69 6e 74 2d 3e 6e 61 6d 65  (distpoint->name
2dd0: 2e 66 75 6c 6c 6e 61 6d 65 2c 20 6a 29 3b 0a 09  .fullname, j);..
2de0: 09 20 20 20 20 69 6e 74 20 74 79 70 65 3b 0a 09  .    int type;..
2df0: 09 20 20 20 20 41 53 4e 31 5f 53 54 52 49 4e 47  .    ASN1_STRING
2e00: 20 2a 75 72 69 20 3d 20 47 45 4e 45 52 41 4c 5f   *uri = GENERAL_
2e10: 4e 41 4d 45 5f 67 65 74 30 5f 76 61 6c 75 65 28  NAME_get0_value(
2e20: 67 65 6e 2c 20 26 74 79 70 65 29 3b 0a 09 09 20  gen, &type);... 
2e30: 20 20 20 69 66 20 28 74 79 70 65 20 3d 3d 20 47     if (type == G
2e40: 45 4e 5f 55 52 49 29 20 7b 0a 09 09 09 4c 41 50  EN_URI) {....LAP
2e50: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
2e60: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 28 63 68 61   resultObj, (cha
2e70: 72 20 2a 29 20 4e 55 4c 4c 2c 20 28 63 68 61 72  r *) NULL, (char
2e80: 20 2a 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f   *) ASN1_STRING_
2e90: 67 65 74 30 5f 64 61 74 61 28 75 72 69 29 2c 20  get0_data(uri), 
2ea0: 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31 5f  (Tcl_Size) ASN1_
2eb0: 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 75 72  STRING_length(ur
2ec0: 69 29 29 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d  i));...    }...}
2ed0: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
2ee0: 28 64 69 73 74 70 6f 69 6e 74 2d 3e 74 79 70 65  (distpoint->type
2ef0: 20 3d 3d 20 31 29 20 7b 0a 09 09 2f 2a 20 72 65   == 1) {.../* re
2f00: 6c 61 74 69 76 65 2d 6e 61 6d 65 20 58 35 30 39  lative-name X509
2f10: 4e 41 4d 45 20 2a 2f 0a 09 09 53 54 41 43 4b 5f  NAME */...STACK_
2f20: 4f 46 28 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54  OF(X509_NAME_ENT
2f30: 52 59 29 20 2a 73 6b 5f 72 65 6c 6e 61 6d 65 20  RY) *sk_relname 
2f40: 3d 20 64 69 73 74 70 6f 69 6e 74 2d 3e 6e 61 6d  = distpoint->nam
2f50: 65 2e 72 65 6c 61 74 69 76 65 6e 61 6d 65 3b 0a  e.relativename;.
2f60: 09 09 66 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30  ..for (int j = 0
2f70: 3b 20 6a 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41  ; j < sk_X509_NA
2f80: 4d 45 5f 45 4e 54 52 59 5f 6e 75 6d 28 73 6b 5f  ME_ENTRY_num(sk_
2f90: 72 65 6c 6e 61 6d 65 29 3b 20 6a 2b 2b 29 20 7b  relname); j++) {
2fa0: 0a 09 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45  ...    X509_NAME
2fb0: 5f 45 4e 54 52 59 20 2a 65 20 3d 20 73 6b 5f 58  _ENTRY *e = sk_X
2fc0: 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 5f 76  509_NAME_ENTRY_v
2fd0: 61 6c 75 65 28 73 6b 5f 72 65 6c 6e 61 6d 65 2c  alue(sk_relname,
2fe0: 20 6a 29 3b 0a 09 09 20 20 20 20 41 53 4e 31 5f   j);...    ASN1_
2ff0: 53 54 52 49 4e 47 20 2a 64 20 3d 20 58 35 30 39  STRING *d = X509
3000: 5f 4e 41 4d 45 5f 45 4e 54 52 59 5f 67 65 74 5f  _NAME_ENTRY_get_
3010: 64 61 74 61 28 65 29 3b 0a 09 09 20 20 20 20 4c  data(e);...    L
3020: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
3030: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 28 63  p, resultObj, (c
3040: 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 20 28 63 68  har *) NULL, (ch
3050: 61 72 20 2a 29 20 41 53 4e 31 5f 53 54 52 49 4e  ar *) ASN1_STRIN
3060: 47 5f 64 61 74 61 28 64 29 2c 20 28 54 63 6c 5f  G_data(d), (Tcl_
3070: 53 69 7a 65 29 20 41 53 4e 31 5f 53 54 52 49 4e  Size) ASN1_STRIN
3080: 47 5f 6c 65 6e 67 74 68 28 64 29 29 3b 0a 09 09  G_length(d));...
3090: 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 43 52 4c  }..    }..}..CRL
30a0: 5f 44 49 53 54 5f 50 4f 49 4e 54 53 5f 66 72 65  _DIST_POINTS_fre
30b0: 65 28 63 72 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  e(crl);.    }.  
30c0: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f    return resultO
30d0: 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  bj;.}../*. *----
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
3130: 54 6c 73 5f 78 35 30 39 4f 73 63 70 0a 20 2a 0a  Tls_x509Oscp. *.
3140: 20 2a 09 47 65 74 20 6c 69 73 74 20 6f 66 20 4f   *.Get list of O
3150: 6e 2d 6c 69 6e 65 20 43 65 72 74 69 66 69 63 61  n-line Certifica
3160: 74 65 20 53 74 61 74 75 73 20 50 72 6f 74 6f 63  te Status Protoc
3170: 6f 6c 20 28 4f 53 43 50 29 20 55 52 49 73 0a 20  ol (OSCP) URIs. 
3180: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
3190: 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 55 52 49  .Tcl list of URI
31a0: 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  s. *. * Side eff
31b0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ects:. *.None. *
31c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
31d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3210: 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c  . */.Tcl_Obj *Tl
3220: 73 5f 78 35 30 39 4f 73 63 70 28 54 63 6c 5f 49  s_x509Oscp(Tcl_I
3230: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58  nterp *interp, X
3240: 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20  509 *cert) {.   
3250: 20 53 54 41 43 4b 5f 4f 46 28 4f 50 45 4e 53 53   STACK_OF(OPENSS
3260: 4c 5f 53 54 52 49 4e 47 29 20 2a 6f 63 73 70 3b  L_STRING) *ocsp;
3270: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65  .    Tcl_Obj *re
3280: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  sultObj = Tcl_Ne
3290: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
32a0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75  );..    if (resu
32b0: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ltObj == NULL) {
32c0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
32d0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 6f     }..    if ((o
32e0: 63 73 70 20 3d 20 58 35 30 39 5f 67 65 74 31 5f  csp = X509_get1_
32f0: 6f 63 73 70 28 63 65 72 74 29 29 20 21 3d 20 4e  ocsp(cert)) != N
3300: 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74  ULL) {..for (int
3310: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 4f   i = 0; i < sk_O
3320: 50 45 4e 53 53 4c 5f 53 54 52 49 4e 47 5f 6e 75  PENSSL_STRING_nu
3330: 6d 28 6f 63 73 70 29 3b 20 69 2b 2b 29 20 7b 0a  m(ocsp); i++) {.
3340: 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
3350: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
3360: 62 6a 2c 20 4e 55 4c 4c 2c 20 73 6b 5f 4f 50 45  bj, NULL, sk_OPE
3370: 4e 53 53 4c 5f 53 54 52 49 4e 47 5f 76 61 6c 75  NSSL_STRING_valu
3380: 65 28 6f 63 73 70 2c 20 69 29 2c 20 2d 31 29 3b  e(ocsp, i), -1);
3390: 0a 09 7d 0a 09 58 35 30 39 5f 65 6d 61 69 6c 5f  ..}..X509_email_
33a0: 66 72 65 65 28 6f 63 73 70 29 3b 0a 20 20 20 20  free(ocsp);.    
33b0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  }.    return res
33c0: 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  ultObj;.}../*. *
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
3420: 0a 20 2a 20 54 6c 73 5f 78 35 30 39 43 61 49 73  . * Tls_x509CaIs
3430: 73 75 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47  suers --. *. *.G
3440: 65 74 20 6c 69 73 74 20 6f 66 20 43 65 72 74 69  et list of Certi
3450: 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 74 79  ficate Authority
3460: 20 28 43 41 29 20 49 73 73 75 65 72 20 55 52 49   (CA) Issuer URI
3470: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  s. *. * Results:
3480: 0a 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20  . *.Tcl list of 
3490: 43 41 20 69 73 73 75 65 72 20 55 52 49 73 0a 20  CA issuer URIs. 
34a0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
34b0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
3510: 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78  /.Tcl_Obj *Tls_x
3520: 35 30 39 43 61 49 73 73 75 65 72 73 28 54 63 6c  509CaIssuers(Tcl
3530: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
3540: 20 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20   X509 *cert) {. 
3550: 20 20 20 53 54 41 43 4b 5f 4f 46 28 41 43 43 45     STACK_OF(ACCE
3560: 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 29 20  SS_DESCRIPTION) 
3570: 2a 61 64 73 3b 0a 20 20 20 20 41 43 43 45 53 53  *ads;.    ACCESS
3580: 5f 44 45 53 43 52 49 50 54 49 4f 4e 20 2a 61 64  _DESCRIPTION *ad
3590: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72  ;.    Tcl_Obj *r
35a0: 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e  esultObj = Tcl_N
35b0: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
35c0: 4c 29 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  L);.    unsigned
35d0: 20 63 68 61 72 20 2a 62 75 66 3b 0a 0a 20 20 20   char *buf;..   
35e0: 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d   if (resultObj =
35f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
3600: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
3610: 20 20 20 69 66 20 28 28 61 64 73 20 3d 20 58 35     if ((ads = X5
3620: 30 39 5f 67 65 74 5f 65 78 74 5f 64 32 69 28 63  09_get_ext_d2i(c
3630: 65 72 74 2c 20 4e 49 44 5f 69 6e 66 6f 5f 61 63  ert, NID_info_ac
3640: 63 65 73 73 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  cess, NULL, NULL
3650: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 66  )) != NULL) {..f
3660: 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69  or (int i = 0; i
3670: 20 3c 20 73 6b 5f 41 43 43 45 53 53 5f 44 45 53   < sk_ACCESS_DES
3680: 43 52 49 50 54 49 4f 4e 5f 6e 75 6d 28 61 64 73  CRIPTION_num(ads
3690: 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 61  ); i++) {..    a
36a0: 64 20 3d 20 73 6b 5f 41 43 43 45 53 53 5f 44 45  d = sk_ACCESS_DE
36b0: 53 43 52 49 50 54 49 4f 4e 5f 76 61 6c 75 65 28  SCRIPTION_value(
36c0: 61 64 73 2c 20 69 29 3b 0a 09 20 20 20 20 69 66  ads, i);..    if
36d0: 20 28 4f 42 4a 5f 6f 62 6a 32 6e 69 64 28 61 64   (OBJ_obj2nid(ad
36e0: 2d 3e 6d 65 74 68 6f 64 29 20 3d 3d 20 4e 49 44  ->method) == NID
36f0: 5f 61 64 5f 63 61 5f 69 73 73 75 65 72 73 20 26  _ad_ca_issuers &
3700: 26 20 61 64 2d 3e 6c 6f 63 61 74 69 6f 6e 29 20  & ad->location) 
3710: 7b 0a 09 09 69 66 20 28 61 64 2d 3e 6c 6f 63 61  {...if (ad->loca
3720: 74 69 6f 6e 2d 3e 74 79 70 65 20 3d 3d 20 47 45  tion->type == GE
3730: 4e 5f 55 52 49 29 20 7b 0a 09 09 20 20 20 20 54  N_URI) {...    T
3740: 63 6c 5f 53 69 7a 65 20 6c 65 6e 20 3d 20 28 54  cl_Size len = (T
3750: 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31 5f 53 54  cl_Size) ASN1_ST
3760: 52 49 4e 47 5f 74 6f 5f 55 54 46 38 28 26 62 75  RING_to_UTF8(&bu
3770: 66 2c 20 61 64 2d 3e 6c 6f 63 61 74 69 6f 6e 2d  f, ad->location-
3780: 3e 64 2e 75 6e 69 66 6f 72 6d 52 65 73 6f 75 72  >d.uniformResour
3790: 63 65 49 64 65 6e 74 69 66 69 65 72 29 3b 0a 09  ceIdentifier);..
37a0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
37b0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
37c0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
37d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
37e0: 6a 28 28 63 68 61 72 20 2a 29 20 62 75 66 2c 20  j((char *) buf, 
37f0: 6c 65 6e 29 29 3b 0a 09 09 20 20 20 20 4f 50 45  len));...    OPE
3800: 4e 53 53 4c 5f 66 72 65 65 28 62 75 66 29 3b 0a  NSSL_free(buf);.
3810: 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d  ..    break;...}
3820: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 73  ..    }..}../* s
3830: 6b 5f 41 43 43 45 53 53 5f 44 45 53 43 52 49 50  k_ACCESS_DESCRIP
3840: 54 49 4f 4e 5f 70 6f 70 5f 66 72 65 65 28 61 64  TION_pop_free(ad
3850: 73 2c 20 41 43 43 45 53 53 5f 44 45 53 43 52 49  s, ACCESS_DESCRI
3860: 50 54 49 4f 4e 5f 66 72 65 65 29 3b 20 2a 2f 0a  PTION_free); */.
3870: 09 41 55 54 48 4f 52 49 54 59 5f 49 4e 46 4f 5f  .AUTHORITY_INFO_
3880: 41 43 43 45 53 53 5f 66 72 65 65 28 61 64 73 29  ACCESS_free(ads)
3890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
38a0: 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a  rn resultObj;.}.
38b0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
38c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3900: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 4e  ----. *. * Tls_N
3910: 65 77 58 35 30 39 4f 62 6a 20 2d 2d 0a 20 2a 0a  ewX509Obj --. *.
3920: 20 2a 09 50 61 72 73 65 73 20 61 20 58 35 30 39   *.Parses a X509
3930: 20 63 65 72 74 69 66 69 63 61 74 65 20 61 6e 64   certificate and
3940: 20 72 65 74 75 72 6e 73 20 63 6f 6e 74 65 6e 74   returns content
3950: 73 20 61 73 20 61 20 6b 65 79 2d 76 61 6c 75 65  s as a key-value
3960: 20 54 63 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a   Tcl list.. *. *
3970: 20 52 65 73 75 6c 74 3a 0a 20 2a 09 41 20 54 63   Result:. *.A Tc
3980: 6c 20 4c 69 73 74 20 77 69 74 68 20 74 68 65 20  l List with the 
3990: 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  X509 certificate
39a0: 20 69 6e 66 6f 20 61 73 20 61 20 6b 65 79 2d 76   info as a key-v
39b0: 61 6c 75 65 20 6c 69 73 74 0a 20 2a 0a 20 2a 20  alue list. *. * 
39c0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
39d0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .None. *. *-----
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c  --------. */.Tcl
3a30: 5f 4f 62 6a 20 2a 54 6c 73 5f 4e 65 77 58 35 30  _Obj *Tls_NewX50
3a40: 39 4f 62 6a 28 54 63 6c 5f 49 6e 74 65 72 70 20  9Obj(Tcl_Interp 
3a50: 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a 63  *interp, X509 *c
3a60: 65 72 74 2c 20 69 6e 74 20 61 6c 6c 29 20 7b 0a  ert, int all) {.
3a70: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73      Tcl_Obj *res
3a80: 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77  ultObj = Tcl_New
3a90: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
3aa0: 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 20 3d  ;.    BIO *bio =
3ab0: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d   BIO_new(BIO_s_m
3ac0: 65 6d 28 29 29 3b 0a 20 20 20 20 69 6e 74 20 6d  em());.    int m
3ad0: 64 6e 69 64 2c 20 70 6b 6e 69 64 2c 20 62 69 74  dnid, pknid, bit
3ae0: 73 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20  s;.    Tcl_Size 
3af0: 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  len;.    unsigne
3b00: 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 20 20 20 20  d int ulen;.    
3b10: 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 73 3b  uint32_t xflags;
3b20: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .    unsigned lo
3b30: 6e 67 20 66 6c 61 67 73 20 3d 20 58 4e 5f 46 4c  ng flags = XN_FL
3b40: 41 47 5f 52 46 43 32 32 35 33 20 7c 20 41 53 4e  AG_RFC2253 | ASN
3b50: 31 5f 53 54 52 46 4c 47 53 5f 55 54 46 38 5f 43  1_STRFLGS_UTF8_C
3b60: 4f 4e 56 45 52 54 3b 0a 20 20 20 20 66 6c 61 67  ONVERT;.    flag
3b70: 73 20 26 3d 20 7e 41 53 4e 31 5f 53 54 52 46 4c  s &= ~ASN1_STRFL
3b80: 47 53 5f 45 53 43 5f 4d 53 42 3b 0a 0a 20 20 20  GS_ESC_MSB;..   
3b90: 20 63 68 61 72 20 2a 62 75 66 66 65 72 20 3d 20   char *buffer = 
3ba0: 63 6b 61 6c 6c 6f 63 28 42 55 46 53 49 5a 20 3e  ckalloc(BUFSIZ >
3bb0: 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45   EVP_MAX_MD_SIZE
3bc0: 20 3f 20 42 55 46 53 49 5a 20 3a 20 45 56 50 5f   ? BUFSIZ : EVP_
3bd0: 4d 41 58 5f 4d 44 5f 53 49 5a 45 29 3b 0a 0a 20  MAX_MD_SIZE);.. 
3be0: 20 20 20 70 72 69 6e 74 66 28 22 43 61 6c 6c 65     printf("Calle
3bf0: 64 5c 6e 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  d\n");..    if (
3c00: 69 6e 74 65 72 70 20 3d 3d 20 4e 55 4c 4c 20 7c  interp == NULL |
3c10: 7c 20 63 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c  | cert == NULL |
3c20: 7c 20 62 69 6f 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  | bio == NULL ||
3c30: 20 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55   resultObj == NU
3c40: 4c 4c 20 7c 7c 20 62 75 66 66 65 72 20 3d 3d 20  LL || buffer == 
3c50: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 63  NULL) {..Tcl_Dec
3c60: 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74  rRefCount(result
3c70: 4f 62 6a 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28  Obj);..BIO_free(
3c80: 62 69 6f 29 3b 0a 09 69 66 20 28 62 75 66 66 65  bio);..if (buffe
3c90: 72 20 21 3d 20 4e 55 4c 4c 29 20 63 6b 66 72 65  r != NULL) ckfre
3ca0: 65 28 62 75 66 66 65 72 29 3b 0a 09 72 65 74 75  e(buffer);..retu
3cb0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
3cc0: 20 20 20 20 2f 2a 20 53 69 67 6e 61 74 75 72 65      /* Signature
3cd0: 20 61 6c 67 6f 72 69 74 68 6d 20 61 6e 64 20 76   algorithm and v
3ce0: 61 6c 75 65 20 2d 20 52 46 43 20 35 32 38 30 20  alue - RFC 5280 
3cf0: 73 65 63 74 69 6f 6e 20 34 2e 31 2e 31 2e 32 20  section 4.1.1.2 
3d00: 61 6e 64 20 34 2e 31 2e 31 2e 33 20 2a 2f 0a 20  and 4.1.1.3 */. 
3d10: 20 20 20 2f 2a 20 73 69 67 6e 61 74 75 72 65 41     /* signatureA
3d20: 6c 67 6f 72 69 74 68 6d 20 69 73 20 74 68 65 20  lgorithm is the 
3d30: 69 64 20 6f 66 20 74 68 65 20 63 72 79 70 74 6f  id of the crypto
3d40: 67 72 61 70 68 69 63 20 61 6c 67 6f 72 69 74 68  graphic algorith
3d50: 6d 20 75 73 65 64 20 62 79 20 74 68 65 0a 09 43  m used by the..C
3d60: 41 20 74 6f 20 73 69 67 6e 20 74 68 69 73 20 63  A to sign this c
3d70: 65 72 74 2e 20 73 69 67 6e 61 74 75 72 65 56 61  ert. signatureVa
3d80: 6c 75 65 20 69 73 20 74 68 65 20 64 69 67 69 74  lue is the digit
3d90: 61 6c 20 73 69 67 6e 61 74 75 72 65 20 63 6f 6d  al signature com
3da0: 70 75 74 65 64 0a 09 75 70 6f 6e 20 74 68 65 20  puted..upon the 
3db0: 41 53 4e 2e 31 20 44 45 52 20 65 6e 63 6f 64 65  ASN.1 DER encode
3dc0: 64 20 74 62 73 43 65 72 74 69 66 69 63 61 74 65  d tbsCertificate
3dd0: 2e 20 2a 2f 0a 20 20 20 20 7b 0a 09 63 6f 6e 73  . */.    {..cons
3de0: 74 20 58 35 30 39 5f 41 4c 47 4f 52 20 2a 73 69  t X509_ALGOR *si
3df0: 67 5f 61 6c 67 3b 0a 09 63 6f 6e 73 74 20 41 53  g_alg;..const AS
3e00: 4e 31 5f 42 49 54 5f 53 54 52 49 4e 47 20 2a 73  N1_BIT_STRING *s
3e10: 69 67 3b 0a 09 69 6e 74 20 73 69 67 5f 6e 69 64  ig;..int sig_nid
3e20: 3b 0a 0a 09 58 35 30 39 5f 67 65 74 30 5f 73 69  ;...X509_get0_si
3e30: 67 6e 61 74 75 72 65 28 26 73 69 67 2c 20 26 73  gnature(&sig, &s
3e40: 69 67 5f 61 6c 67 2c 20 63 65 72 74 29 3b 0a 09  ig_alg, cert);..
3e50: 2f 2a 20 73 69 67 5f 6e 69 64 20 3d 20 58 35 30  /* sig_nid = X50
3e60: 39 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f  9_get_signature_
3e70: 6e 69 64 28 63 65 72 74 29 20 2a 2f 0a 09 73 69  nid(cert) */..si
3e80: 67 5f 6e 69 64 20 3d 20 4f 42 4a 5f 6f 62 6a 32  g_nid = OBJ_obj2
3e90: 6e 69 64 28 73 69 67 5f 61 6c 67 2d 3e 61 6c 67  nid(sig_alg->alg
3ea0: 6f 72 69 74 68 6d 29 3b 0a 09 4c 41 50 50 45 4e  orithm);..LAPPEN
3eb0: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65  D_STR(interp, re
3ec0: 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74  sultObj, "signat
3ed0: 75 72 65 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f  ureAlgorithm", O
3ee0: 42 4a 5f 6e 69 64 32 6c 6e 28 73 69 67 5f 6e 69  BJ_nid2ln(sig_ni
3ef0: 64 29 2c 20 2d 31 29 3b 0a 09 69 66 20 28 73 69  d), -1);..if (si
3f00: 67 5f 6e 69 64 20 21 3d 20 4e 49 44 5f 75 6e 64  g_nid != NID_und
3f10: 65 66 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 45  ef) {..    LAPPE
3f20: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72  ND_OBJ(interp, r
3f30: 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61  esultObj, "signa
3f40: 74 75 72 65 56 61 6c 75 65 22 2c 20 53 74 72 69  tureValue", Stri
3f50: 6e 67 5f 74 6f 5f 48 65 78 28 73 69 67 2d 3e 64  ng_to_Hex(sig->d
3f60: 61 74 61 2c 20 73 69 67 2d 3e 6c 65 6e 67 74 68  ata, sig->length
3f70: 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  ));..} else {.. 
3f80: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
3f90: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
3fa0: 2c 20 22 73 69 67 6e 61 74 75 72 65 56 61 6c 75  , "signatureValu
3fb0: 65 22 2c 20 22 22 2c 20 30 29 3b 0a 09 7d 0a 20  e", "", 0);..}. 
3fc0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72     }..    /* Ver
3fd0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 63 6f  sion of the enco
3fe0: 64 65 64 20 63 65 72 74 69 66 69 63 61 74 65 20  ded certificate 
3ff0: 2d 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69  - RFC 5280 secti
4000: 6f 6e 20 34 2e 31 2e 32 2e 31 20 2a 2f 0a 20 20  on 4.1.2.1 */.  
4010: 20 20 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69    LAPPEND_LONG(i
4020: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
4030: 2c 20 22 76 65 72 73 69 6f 6e 22 2c 20 58 35 30  , "version", X50
4040: 39 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 65  9_get_version(ce
4050: 72 74 29 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  rt)+1);..    /* 
4060: 55 6e 69 71 75 65 20 6e 75 6d 62 65 72 20 61 73  Unique number as
4070: 73 69 67 6e 65 64 20 62 79 20 43 41 20 74 6f 20  signed by CA to 
4080: 63 65 72 74 69 66 69 63 61 74 65 20 2d 20 52 46  certificate - RF
4090: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34  C 5280 section 4
40a0: 2e 31 2e 32 2e 32 20 2a 2f 0a 20 20 20 20 6c 65  .1.2.2 */.    le
40b0: 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65  n = BIO_to_Buffe
40c0: 72 28 69 32 61 5f 41 53 4e 31 5f 49 4e 54 45 47  r(i2a_ASN1_INTEG
40d0: 45 52 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 74  ER(bio, X509_get
40e0: 30 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63  0_serialNumber(c
40f0: 65 72 74 29 29 2c 20 62 69 6f 2c 20 62 75 66 66  ert)), bio, buff
4100: 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 20 20 20  er, BUFSIZ);.   
4110: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
4120: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
4130: 22 73 65 72 69 61 6c 4e 75 6d 62 65 72 22 2c 20  "serialNumber", 
4140: 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a 20  buffer, len);.. 
4150: 20 20 20 2f 2a 20 53 69 67 6e 61 74 75 72 65 20     /* Signature 
4160: 61 6c 67 6f 72 69 74 68 6d 20 75 73 65 64 20 62  algorithm used b
4170: 79 20 74 68 65 20 43 41 20 74 6f 20 73 69 67 6e  y the CA to sign
4180: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
4190: 2e 20 4d 75 73 74 20 6d 61 74 63 68 0a 09 73 69  . Must match..si
41a0: 67 6e 61 74 75 72 65 41 6c 67 6f 72 69 74 68 6d  gnatureAlgorithm
41b0: 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69  . RFC 5280 secti
41c0: 6f 6e 20 34 2e 31 2e 32 2e 33 20 2a 2f 0a 20 20  on 4.1.2.3 */.  
41d0: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
41e0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
41f0: 20 22 73 69 67 6e 61 74 75 72 65 22 2c 20 4f 42   "signature", OB
4200: 4a 5f 6e 69 64 32 6c 6e 28 58 35 30 39 5f 67 65  J_nid2ln(X509_ge
4210: 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28  t_signature_nid(
4220: 63 65 72 74 29 29 2c 20 2d 31 29 3b 0a 0a 20 20  cert)), -1);..  
4230: 20 20 2f 2a 20 49 73 73 75 65 72 20 69 64 65 6e    /* Issuer iden
4240: 74 69 66 69 65 73 20 74 68 65 20 65 6e 74 69 74  tifies the entit
4250: 79 20 74 68 61 74 20 73 69 67 6e 65 64 20 61 6e  y that signed an
4260: 64 20 69 73 73 75 65 64 20 74 68 65 20 63 65 72  d issued the cer
4270: 74 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74  t. RFC 5280 sect
4280: 69 6f 6e 20 34 2e 31 2e 32 2e 34 20 2a 2f 0a 20  ion 4.1.2.4 */. 
4290: 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f     len = BIO_to_
42a0: 42 75 66 66 65 72 28 58 35 30 39 5f 4e 41 4d 45  Buffer(X509_NAME
42b0: 5f 70 72 69 6e 74 5f 65 78 28 62 69 6f 2c 20 58  _print_ex(bio, X
42c0: 35 30 39 5f 67 65 74 5f 69 73 73 75 65 72 5f 6e  509_get_issuer_n
42d0: 61 6d 65 28 63 65 72 74 29 2c 20 30 2c 20 66 6c  ame(cert), 0, fl
42e0: 61 67 73 29 2c 20 62 69 6f 2c 20 62 75 66 66 65  ags), bio, buffe
42f0: 72 2c 20 42 55 46 53 49 5a 29 3b 0a 20 20 20 20  r, BUFSIZ);.    
4300: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
4310: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
4320: 69 73 73 75 65 72 22 2c 20 62 75 66 66 65 72 2c  issuer", buffer,
4330: 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 43   len);..    /* C
4340: 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64  ertificate valid
4350: 69 74 79 20 70 65 72 69 6f 64 20 69 73 20 74 68  ity period is th
4360: 65 20 69 6e 74 65 72 76 61 6c 20 74 68 65 20 43  e interval the C
4370: 41 20 77 61 72 72 61 6e 74 73 20 74 68 61 74 20  A warrants that 
4380: 69 74 20 77 69 6c 6c 0a 09 6d 61 69 6e 74 61 69  it will..maintai
4390: 6e 20 69 6e 66 6f 20 6f 6e 20 74 68 65 20 73 74  n info on the st
43a0: 61 74 75 73 20 6f 66 20 74 68 65 20 63 65 72 74  atus of the cert
43b0: 69 66 69 63 61 74 65 2e 20 52 46 43 20 35 32 38  ificate. RFC 528
43c0: 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e  0 section 4.1.2.
43d0: 35 20 2a 2f 0a 20 20 20 20 2f 2a 20 47 65 74 20  5 */.    /* Get 
43e0: 56 61 6c 69 64 69 74 79 20 2d 20 4e 6f 74 20 42  Validity - Not B
43f0: 65 66 6f 72 65 20 2a 2f 0a 20 20 20 20 6c 65 6e  efore */.    len
4400: 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72   = BIO_to_Buffer
4410: 28 41 53 4e 31 5f 54 49 4d 45 5f 70 72 69 6e 74  (ASN1_TIME_print
4420: 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 74 30 5f  (bio, X509_get0_
4430: 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 29  notBefore(cert))
4440: 2c 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42  , bio, buffer, B
4450: 55 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50  UFSIZ);.    LAPP
4460: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
4470: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6e 6f 74 42  resultObj, "notB
4480: 65 66 6f 72 65 22 2c 20 62 75 66 66 65 72 2c 20  efore", buffer, 
4490: 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  len);..    /* Ge
44a0: 74 20 56 61 6c 69 64 69 74 79 20 2d 20 4e 6f 74  t Validity - Not
44b0: 20 41 66 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65   After */.    le
44c0: 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65  n = BIO_to_Buffe
44d0: 72 28 41 53 4e 31 5f 54 49 4d 45 5f 70 72 69 6e  r(ASN1_TIME_prin
44e0: 74 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 74 30  t(bio, X509_get0
44f0: 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 29  _notAfter(cert))
4500: 2c 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42  , bio, buffer, B
4510: 55 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50  UFSIZ);.    LAPP
4520: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
4530: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6e 6f 74 41  resultObj, "notA
4540: 66 74 65 72 22 2c 20 62 75 66 66 65 72 2c 20 6c  fter", buffer, l
4550: 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62  en);..    /* Sub
4560: 6a 65 63 74 20 69 64 65 6e 74 69 66 69 65 73 20  ject identifies 
4570: 74 68 65 20 65 6e 74 69 74 79 20 61 73 73 6f 63  the entity assoc
4580: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 70  iated with the p
4590: 75 62 6c 69 63 20 6b 65 79 20 73 74 6f 72 65 64  ublic key stored
45a0: 20 69 6e 0a 09 74 68 65 20 73 75 62 6a 65 63 74   in..the subject
45b0: 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 65 6c   public key fiel
45c0: 64 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74  d. RFC 5280 sect
45d0: 69 6f 6e 20 34 2e 31 2e 32 2e 36 20 2a 2f 0a 20  ion 4.1.2.6 */. 
45e0: 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f     len = BIO_to_
45f0: 42 75 66 66 65 72 28 58 35 30 39 5f 4e 41 4d 45  Buffer(X509_NAME
4600: 5f 70 72 69 6e 74 5f 65 78 28 62 69 6f 2c 20 58  _print_ex(bio, X
4610: 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f  509_get_subject_
4620: 6e 61 6d 65 28 63 65 72 74 29 2c 20 30 2c 20 66  name(cert), 0, f
4630: 6c 61 67 73 29 2c 20 62 69 6f 2c 20 62 75 66 66  lags), bio, buff
4640: 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 20 20 20  er, BUFSIZ);.   
4650: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
4660: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
4670: 22 73 75 62 6a 65 63 74 22 2c 20 62 75 66 66 65  "subject", buffe
4680: 72 2c 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a  r, len);..    /*
4690: 20 53 48 41 31 20 44 69 67 65 73 74 20 28 46 69   SHA1 Digest (Fi
46a0: 6e 67 65 72 70 72 69 6e 74 29 20 6f 66 20 63 65  ngerprint) of ce
46b0: 72 74 20 2d 20 44 45 52 20 72 65 70 72 65 73 65  rt - DER represe
46c0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  ntation */.    i
46d0: 66 20 28 58 35 30 39 5f 64 69 67 65 73 74 28 63  f (X509_digest(c
46e0: 65 72 74 2c 20 45 56 50 5f 73 68 61 31 28 29 2c  ert, EVP_sha1(),
46f0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
4700: 2a 29 62 75 66 66 65 72 2c 20 26 75 6c 65 6e 29  *)buffer, &ulen)
4710: 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a  ) {..LAPPEND_OBJ
4720: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
4730: 62 6a 2c 20 22 73 68 61 31 5f 68 61 73 68 22 2c  bj, "sha1_hash",
4740: 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 28   String_to_Hex((
4750: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
4760: 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20 75 6c  buffer, (int) ul
4770: 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  en));.    }..   
4780: 20 2f 2a 20 53 48 41 32 35 36 20 44 69 67 65 73   /* SHA256 Diges
4790: 74 20 28 46 69 6e 67 65 72 70 72 69 6e 74 29 20  t (Fingerprint) 
47a0: 6f 66 20 63 65 72 74 20 2d 20 44 45 52 20 72 65  of cert - DER re
47b0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  presentation */.
47c0: 20 20 20 20 69 66 20 28 58 35 30 39 5f 64 69 67      if (X509_dig
47d0: 65 73 74 28 63 65 72 74 2c 20 45 56 50 5f 73 68  est(cert, EVP_sh
47e0: 61 32 35 36 28 29 2c 20 28 75 6e 73 69 67 6e 65  a256(), (unsigne
47f0: 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 72 2c  d char *)buffer,
4800: 20 26 75 6c 65 6e 29 29 20 7b 0a 09 4c 41 50 50   &ulen)) {..LAPP
4810: 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20  END_OBJ(interp, 
4820: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 68 61 32  resultObj, "sha2
4830: 35 36 5f 68 61 73 68 22 2c 20 53 74 72 69 6e 67  56_hash", String
4840: 5f 74 6f 5f 48 65 78 28 28 75 6e 73 69 67 6e 65  _to_Hex((unsigne
4850: 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 72 2c  d char *)buffer,
4860: 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 20   (int) ulen));. 
4870: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 75 62     }..    /* Sub
4880: 6a 65 63 74 20 50 75 62 6c 69 63 20 4b 65 79 20  ject Public Key 
4890: 49 6e 66 6f 20 73 70 65 63 69 66 69 65 73 20 74  Info specifies t
48a0: 68 65 20 70 75 62 6c 69 63 20 6b 65 79 20 61 6e  he public key an
48b0: 64 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65  d identifies the
48c0: 0a 09 61 6c 67 6f 72 69 74 68 6d 20 77 69 74 68  ..algorithm with
48d0: 20 77 68 69 63 68 20 74 68 65 20 6b 65 79 20 69   which the key i
48e0: 73 20 75 73 65 64 2e 20 52 46 43 20 35 32 38 30  s used. RFC 5280
48f0: 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 37   section 4.1.2.7
4900: 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35 30 39   */.    if (X509
4910: 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 69  _get_signature_i
4920: 6e 66 6f 28 63 65 72 74 2c 20 26 6d 64 6e 69 64  nfo(cert, &mdnid
4930: 2c 20 26 70 6b 6e 69 64 2c 20 26 62 69 74 73 2c  , &pknid, &bits,
4940: 20 26 78 66 6c 61 67 73 29 29 20 7b 0a 09 41 53   &xflags)) {..AS
4950: 4e 31 5f 42 49 54 5f 53 54 52 49 4e 47 20 2a 6b  N1_BIT_STRING *k
4960: 65 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e  ey;..unsigned in
4970: 74 20 6e 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53  t n;...LAPPEND_S
4980: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  TR(interp, resul
4990: 74 4f 62 6a 2c 20 22 73 69 67 6e 69 6e 67 44 69  tObj, "signingDi
49a0: 67 65 73 74 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c  gest", OBJ_nid2l
49b0: 6e 28 6d 64 6e 69 64 29 2c 20 2d 31 29 3b 0a 09  n(mdnid), -1);..
49c0: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
49d0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
49e0: 70 75 62 6c 69 63 4b 65 79 41 6c 67 6f 72 69 74  publicKeyAlgorit
49f0: 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28  hm", OBJ_nid2ln(
4a00: 70 6b 6e 69 64 29 2c 20 2d 31 29 3b 0a 09 4c 41  pknid), -1);..LA
4a10: 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
4a20: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 62 69  , resultObj, "bi
4a30: 74 73 22 2c 20 62 69 74 73 29 3b 20 2f 2a 20 45  ts", bits); /* E
4a40: 66 66 65 63 74 69 76 65 20 73 65 63 75 72 69 74  ffective securit
4a50: 79 20 62 69 74 73 20 2a 2f 0a 0a 09 6b 65 79 20  y bits */...key 
4a60: 3d 20 58 35 30 39 5f 67 65 74 30 5f 70 75 62 6b  = X509_get0_pubk
4a70: 65 79 5f 62 69 74 73 74 72 28 63 65 72 74 29 3b  ey_bitstr(cert);
4a80: 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e  ..LAPPEND_OBJ(in
4a90: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
4aa0: 20 22 70 75 62 6c 69 63 4b 65 79 22 2c 20 53 74   "publicKey", St
4ab0: 72 69 6e 67 5f 74 6f 5f 48 65 78 28 6b 65 79 2d  ring_to_Hex(key-
4ac0: 3e 64 61 74 61 2c 20 6b 65 79 2d 3e 6c 65 6e 67  >data, key->leng
4ad0: 74 68 29 29 3b 0a 0a 09 69 66 20 28 58 35 30 39  th));...if (X509
4ae0: 5f 70 75 62 6b 65 79 5f 64 69 67 65 73 74 28 63  _pubkey_digest(c
4af0: 65 72 74 2c 20 45 56 50 5f 67 65 74 5f 64 69 67  ert, EVP_get_dig
4b00: 65 73 74 62 79 6e 69 64 28 70 6b 6e 69 64 29 2c  estbynid(pknid),
4b10: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
4b20: 2a 29 62 75 66 66 65 72 2c 20 26 6e 29 29 20 7b  *)buffer, &n)) {
4b30: 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42  ..    LAPPEND_OB
4b40: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  J(interp, result
4b50: 4f 62 6a 2c 20 22 70 75 62 6c 69 63 4b 65 79 48  Obj, "publicKeyH
4b60: 61 73 68 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f  ash", String_to_
4b70: 48 65 78 28 28 75 6e 73 69 67 6e 65 64 20 63 68  Hex((unsigned ch
4b80: 61 72 20 2a 29 62 75 66 66 65 72 2c 20 28 69 6e  ar *)buffer, (in
4b90: 74 29 20 6e 29 29 3b 0a 09 7d 20 65 6c 73 65 20  t) n));..} else 
4ba0: 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  {..    LAPPEND_S
4bb0: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  TR(interp, resul
4bc0: 74 4f 62 6a 2c 20 22 70 75 62 6c 69 63 4b 65 79  tObj, "publicKey
4bd0: 48 61 73 68 22 2c 20 22 22 2c 20 30 29 3b 0a 09  Hash", "", 0);..
4be0: 7d 0a 0a 09 2f 2a 20 64 69 67 65 73 74 20 6f 66  }.../* digest of
4bf0: 20 74 68 65 20 44 45 52 20 72 65 70 72 65 73 65   the DER represe
4c00: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ntation of the c
4c10: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 69  ertificate */..i
4c20: 66 20 28 58 35 30 39 5f 64 69 67 65 73 74 28 63  f (X509_digest(c
4c30: 65 72 74 2c 20 45 56 50 5f 67 65 74 5f 64 69 67  ert, EVP_get_dig
4c40: 65 73 74 62 79 6e 69 64 28 6d 64 6e 69 64 29 2c  estbynid(mdnid),
4c50: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
4c60: 2a 29 62 75 66 66 65 72 2c 20 26 6e 29 29 20 7b  *)buffer, &n)) {
4c70: 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42  ..    LAPPEND_OB
4c80: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  J(interp, result
4c90: 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75 72 65 48  Obj, "signatureH
4ca0: 61 73 68 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f  ash", String_to_
4cb0: 48 65 78 28 28 75 6e 73 69 67 6e 65 64 20 63 68  Hex((unsigned ch
4cc0: 61 72 20 2a 29 62 75 66 66 65 72 2c 20 28 69 6e  ar *)buffer, (in
4cd0: 74 29 20 6e 29 29 3b 0a 09 7d 20 65 6c 73 65 20  t) n));..} else 
4ce0: 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  {..    LAPPEND_S
4cf0: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  TR(interp, resul
4d00: 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75 72 65  tObj, "signature
4d10: 48 61 73 68 22 2c 20 22 22 2c 20 30 29 3b 0a 09  Hash", "", 0);..
4d20: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
4d30: 43 65 72 74 69 66 69 63 61 74 65 20 50 75 72 70  Certificate Purp
4d40: 6f 73 65 2e 20 43 61 6c 6c 20 62 65 66 6f 72 65  ose. Call before
4d50: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 65 78   checking for ex
4d60: 74 65 6e 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20  tensions. */.   
4d70: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
4d80: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
4d90: 22 70 75 72 70 6f 73 65 22 2c 20 54 6c 73 5f 78  "purpose", Tls_x
4da0: 35 30 39 50 75 72 70 6f 73 65 28 63 65 72 74 29  509Purpose(cert)
4db0: 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45  , -1);.    LAPPE
4dc0: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72  ND_OBJ(interp, r
4dd0: 65 73 75 6c 74 4f 62 6a 2c 20 22 63 65 72 74 69  esultObj, "certi
4de0: 66 69 63 61 74 65 50 75 72 70 6f 73 65 22 2c 20  ficatePurpose", 
4df0: 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 65 73  Tls_x509Purposes
4e00: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b  (interp, cert));
4e10: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 65 78 74  ..    /* Get ext
4e20: 65 6e 73 69 6f 6e 73 20 66 6c 61 67 73 20 2a 2f  ensions flags */
4e30: 0a 20 20 20 20 78 66 6c 61 67 73 20 3d 20 58 35  .    xflags = X5
4e40: 30 39 5f 67 65 74 5f 65 78 74 65 6e 73 69 6f 6e  09_get_extension
4e50: 5f 66 6c 61 67 73 28 63 65 72 74 29 3b 0a 20 20  _flags(cert);.  
4e60: 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e    LAPPEND_INT(in
4e70: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
4e80: 20 22 65 78 74 46 6c 61 67 73 22 2c 20 78 66 6c   "extFlags", xfl
4e90: 61 67 73 29 3b 0a 0a 09 2f 2a 20 43 68 65 63 6b  ags);.../* Check
4ea0: 20 69 66 20 63 65 72 74 20 77 61 73 20 69 73 73   if cert was iss
4eb0: 75 65 64 20 62 79 20 43 41 20 63 65 72 74 20 69  ued by CA cert i
4ec0: 73 73 75 65 72 20 6f 72 20 73 65 6c 66 20 73 69  ssuer or self si
4ed0: 67 6e 65 64 20 2a 2f 0a 20 20 20 20 4c 41 50 50  gned */.    LAPP
4ee0: 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
4ef0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 65 6c   resultObj, "sel
4f00: 66 49 73 73 75 65 64 22 2c 20 78 66 6c 61 67 73  fIssued", xflags
4f10: 20 26 20 45 58 46 4c 41 47 5f 53 49 29 3b 0a 20   & EXFLAG_SI);. 
4f20: 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28     LAPPEND_BOOL(
4f30: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
4f40: 6a 2c 20 22 73 65 6c 66 53 69 67 6e 65 64 22 2c  j, "selfSigned",
4f50: 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47   xflags & EXFLAG
4f60: 5f 53 53 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  _SS);.    LAPPEN
4f70: 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72  D_BOOL(interp, r
4f80: 65 73 75 6c 74 4f 62 6a 2c 20 22 69 73 50 72 6f  esultObj, "isPro
4f90: 78 79 43 65 72 74 22 2c 20 78 66 6c 61 67 73 20  xyCert", xflags 
4fa0: 26 20 45 58 46 4c 41 47 5f 50 52 4f 58 59 29 3b  & EXFLAG_PROXY);
4fb0: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f  .    LAPPEND_BOO
4fc0: 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  L(interp, result
4fd0: 4f 62 6a 2c 20 22 65 78 74 49 6e 76 61 6c 69 64  Obj, "extInvalid
4fe0: 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c  ", xflags & EXFL
4ff0: 41 47 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 20  AG_INVALID);.   
5000: 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e   LAPPEND_BOOL(in
5010: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
5020: 20 22 69 73 43 41 43 65 72 74 22 2c 20 58 35 30   "isCACert", X50
5030: 39 5f 63 68 65 63 6b 5f 63 61 28 63 65 72 74 29  9_check_ca(cert)
5040: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 55  );..    /* The U
5050: 6e 69 71 75 65 20 49 64 73 20 61 72 65 20 75 73  nique Ids are us
5060: 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
5070: 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20   possibility of 
5080: 72 65 75 73 65 20 6f 66 20 73 75 62 6a 65 63 74  reuse of subject
5090: 0a 09 61 6e 64 2f 6f 72 20 69 73 73 75 65 72 20  ..and/or issuer 
50a0: 6e 61 6d 65 73 20 6f 76 65 72 20 74 69 6d 65 2e  names over time.
50b0: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f   RFC 5280 sectio
50c0: 6e 20 34 2e 31 2e 32 2e 38 20 2a 2f 0a 20 20 20  n 4.1.2.8 */.   
50d0: 20 7b 0a 09 63 6f 6e 73 74 20 41 53 4e 31 5f 42   {..const ASN1_B
50e0: 49 54 5f 53 54 52 49 4e 47 20 2a 69 75 69 64 2c  IT_STRING *iuid,
50f0: 20 2a 73 75 69 64 3b 0a 20 20 20 20 20 20 20 20   *suid;.        
5100: 58 35 30 39 5f 67 65 74 30 5f 75 69 64 73 28 63  X509_get0_uids(c
5110: 65 72 74 2c 20 26 69 75 69 64 2c 20 26 73 75 69  ert, &iuid, &sui
5120: 64 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  d);...Tcl_ListOb
5130: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
5140: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
5150: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5160: 62 6a 28 22 69 73 73 75 65 72 55 6e 69 71 75 65  bj("issuerUnique
5170: 49 64 22 2c 20 2d 31 29 29 3b 0a 09 69 66 20 28  Id", -1));..if (
5180: 69 75 69 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  iuid != NULL) {.
5190: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
51a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
51b0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
51c0: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
51d0: 79 4f 62 6a 28 28 63 6f 6e 73 74 20 75 6e 73 69  yObj((const unsi
51e0: 67 6e 65 64 20 63 68 61 72 20 2a 29 69 75 69 64  gned char *)iuid
51f0: 2d 3e 64 61 74 61 2c 20 28 54 63 6c 5f 53 69 7a  ->data, (Tcl_Siz
5200: 65 29 20 69 75 69 64 2d 3e 6c 65 6e 67 74 68 29  e) iuid->length)
5210: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  );..} else {..  
5220: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5230: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5240: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
5250: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
5260: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 0a 09 54 63  ", -1));..}...Tc
5270: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5280: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
5290: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
52a0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 75 62 6a  wStringObj("subj
52b0: 65 63 74 55 6e 69 71 75 65 49 64 22 2c 20 2d 31  ectUniqueId", -1
52c0: 29 29 3b 0a 09 69 66 20 28 73 75 69 64 20 21 3d  ));..if (suid !=
52d0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63   NULL) {..    Tc
52e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
52f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
5300: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
5310: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 63  wByteArrayObj((c
5320: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
5330: 61 72 20 2a 29 73 75 69 64 2d 3e 64 61 74 61 2c  ar *)suid->data,
5340: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 75 69 64   (Tcl_Size) suid
5350: 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a 09 7d 20 65  ->length));..} e
5360: 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  lse {..    Tcl_L
5370: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5380: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ent(interp, resu
5390: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74  ltObj, Tcl_NewSt
53a0: 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29  ringObj("", -1))
53b0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
53c0: 2f 2a 20 58 35 30 39 20 76 33 20 45 78 74 65 6e  /* X509 v3 Exten
53d0: 73 69 6f 6e 73 20 2d 20 52 46 43 20 35 32 38 30  sions - RFC 5280
53e0: 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 39   section 4.1.2.9
53f0: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
5400: 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 73 75  INT(interp, resu
5410: 6c 74 4f 62 6a 2c 20 22 65 78 74 43 6f 75 6e 74  ltObj, "extCount
5420: 22 2c 20 58 35 30 39 5f 67 65 74 5f 65 78 74 5f  ", X509_get_ext_
5430: 63 6f 75 6e 74 28 63 65 72 74 29 29 3b 0a 20 20  count(cert));.  
5440: 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e    LAPPEND_OBJ(in
5450: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
5460: 20 22 65 78 74 65 6e 73 69 6f 6e 73 22 2c 20 54   "extensions", T
5470: 6c 73 5f 78 35 30 39 45 78 74 65 6e 73 69 6f 6e  ls_x509Extension
5480: 73 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29  s(interp, cert))
5490: 3b 0a 0a 20 20 20 20 2f 2a 20 41 75 74 68 6f 72  ;..    /* Author
54a0: 69 74 79 20 4b 65 79 20 49 64 65 6e 74 69 66 69  ity Key Identifi
54b0: 65 72 20 28 41 4b 49 29 20 69 73 20 74 68 65 20  er (AKI) is the 
54c0: 53 75 62 6a 65 63 74 20 4b 65 79 20 49 64 65 6e  Subject Key Iden
54d0: 74 69 66 69 65 72 20 28 53 4b 49 29 20 6f 66 0a  tifier (SKI) of.
54e0: 09 69 74 73 20 73 69 67 6e 65 72 20 28 74 68 65  .its signer (the
54f0: 20 43 41 29 2e 20 52 46 43 20 35 32 38 30 20 73   CA). RFC 5280 s
5500: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 2c 20  ection 4.2.1.1, 
5510: 4e 49 44 5f 61 75 74 68 6f 72 69 74 79 5f 6b 65  NID_authority_ke
5520: 79 5f 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a  y_identifier */.
5530: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28      LAPPEND_OBJ(
5540: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
5550: 6a 2c 20 22 61 75 74 68 6f 72 69 74 79 4b 65 79  j, "authorityKey
5560: 49 64 65 6e 74 69 66 69 65 72 22 2c 0a 09 54 6c  Identifier",..Tl
5570: 73 5f 78 35 30 39 49 64 65 6e 74 69 66 69 65 72  s_x509Identifier
5580: 28 58 35 30 39 5f 67 65 74 30 5f 61 75 74 68 6f  (X509_get0_autho
5590: 72 69 74 79 5f 6b 65 79 5f 69 64 28 63 65 72 74  rity_key_id(cert
55a0: 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62  )));..    /* Sub
55b0: 6a 65 63 74 20 4b 65 79 20 49 64 65 6e 74 69 66  ject Key Identif
55c0: 69 65 72 20 28 53 4b 49 29 20 69 73 20 75 73 65  ier (SKI) is use
55d0: 64 20 74 6f 20 69 64 65 6e 74 69 66 79 20 63 65  d to identify ce
55e0: 72 74 69 66 69 63 61 74 65 73 20 74 68 61 74 20  rtificates that 
55f0: 63 6f 6e 74 61 69 6e 0a 09 61 20 70 61 72 74 69  contain..a parti
5600: 63 75 6c 61 72 20 70 75 62 6c 69 63 20 6b 65 79  cular public key
5610: 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69  . RFC 5280 secti
5620: 6f 6e 20 34 2e 32 2e 31 2e 32 2c 20 4e 49 44 5f  on 4.2.1.2, NID_
5630: 73 75 62 6a 65 63 74 5f 6b 65 79 5f 69 64 65 6e  subject_key_iden
5640: 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 4c 41  tifier */.    LA
5650: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70  PPEND_OBJ(interp
5660: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 75  , resultObj, "su
5670: 62 6a 65 63 74 4b 65 79 49 64 65 6e 74 69 66 69  bjectKeyIdentifi
5680: 65 72 22 2c 0a 09 54 6c 73 5f 78 35 30 39 49 64  er",..Tls_x509Id
5690: 65 6e 74 69 66 69 65 72 28 58 35 30 39 5f 67 65  entifier(X509_ge
56a0: 74 30 5f 73 75 62 6a 65 63 74 5f 6b 65 79 5f 69  t0_subject_key_i
56b0: 64 28 63 65 72 74 29 29 29 3b 0a 0a 20 20 20 20  d(cert)));..    
56c0: 2f 2a 20 4b 65 79 20 75 73 61 67 65 20 65 78 74  /* Key usage ext
56d0: 65 6e 73 69 6f 6e 20 64 65 66 69 6e 65 73 20 74  ension defines t
56e0: 68 65 20 70 75 72 70 6f 73 65 20 28 65 2e 67 2e  he purpose (e.g.
56f0: 2c 20 65 6e 63 69 70 68 65 72 6d 65 6e 74 2c 20  , encipherment, 
5700: 73 69 67 6e 61 74 75 72 65 2c 20 63 65 72 74 69  signature, certi
5710: 66 69 63 61 74 65 0a 09 73 69 67 6e 69 6e 67 29  ficate..signing)
5720: 20 6f 66 20 74 68 65 20 6b 65 79 20 69 6e 20 74   of the key in t
5730: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 2e 20  he certificate. 
5740: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e  RFC 5280 section
5750: 20 34 2e 32 2e 31 2e 33 2c 20 4e 49 44 5f 6b 65   4.2.1.3, NID_ke
5760: 79 5f 75 73 61 67 65 20 2a 2f 0a 20 20 20 20 4c  y_usage */.    L
5770: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72  APPEND_OBJ(inter
5780: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6b  p, resultObj, "k
5790: 65 79 55 73 61 67 65 22 2c 20 54 6c 73 5f 78 35  eyUsage", Tls_x5
57a0: 30 39 4b 65 79 55 73 61 67 65 28 69 6e 74 65 72  09KeyUsage(inter
57b0: 70 2c 20 63 65 72 74 2c 20 78 66 6c 61 67 73 29  p, cert, xflags)
57c0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 69  );..    /* Certi
57d0: 66 69 63 61 74 65 20 50 6f 6c 69 63 69 65 73 20  ficate Policies 
57e0: 2d 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  - indicates the 
57f0: 69 73 73 75 69 6e 67 20 43 41 20 63 6f 6e 73 69  issuing CA consi
5800: 64 65 72 73 20 69 74 73 20 69 73 73 75 65 72 44  ders its issuerD
5810: 6f 6d 61 69 6e 50 6f 6c 69 63 79 0a 09 65 71 75  omainPolicy..equ
5820: 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 73  ivalent to the s
5830: 75 62 6a 65 63 74 20 43 41 27 73 20 73 75 62 6a  ubject CA's subj
5840: 65 63 74 44 6f 6d 61 69 6e 50 6f 6c 69 63 79 2e  ectDomainPolicy.
5850: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f   RFC 5280 sectio
5860: 6e 20 34 2e 32 2e 31 2e 34 2c 20 4e 49 44 5f 63  n 4.2.1.4, NID_c
5870: 65 72 74 69 66 69 63 61 74 65 5f 70 6f 6c 69 63  ertificate_polic
5880: 69 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 78  ies */.    if (x
5890: 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 49  flags & EXFLAG_I
58a0: 4e 56 41 4c 49 44 5f 50 4f 4c 49 43 59 29 20 7b  NVALID_POLICY) {
58b0: 0a 09 2f 2a 20 52 65 6a 65 63 74 20 63 65 72 74  ../* Reject cert
58c0: 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   */.    }..    /
58d0: 2a 20 50 6f 6c 69 63 79 20 4d 61 70 70 69 6e 67  * Policy Mapping
58e0: 73 20 2d 20 52 46 43 20 35 32 38 30 20 73 65 63  s - RFC 5280 sec
58f0: 74 69 6f 6e 20 34 2e 32 2e 31 2e 35 2c 20 4e 49  tion 4.2.1.5, NI
5900: 44 5f 70 6f 6c 69 63 79 5f 6d 61 70 70 69 6e 67  D_policy_mapping
5910: 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 75 62  s */..    /* Sub
5920: 6a 65 63 74 20 41 6c 74 65 72 6e 61 74 69 76 65  ject Alternative
5930: 20 4e 61 6d 65 20 28 53 41 4e 29 20 63 6f 6e 74   Name (SAN) cont
5940: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
5950: 55 52 4c 73 2c 20 44 4e 53 20 6e 61 6d 65 73 2c  URLs, DNS names,
5960: 20 6f 72 20 49 50 0a 09 61 64 64 72 65 73 73 65   or IP..addresse
5970: 73 20 62 6f 75 6e 64 20 74 6f 20 63 65 72 74 69  s bound to certi
5980: 66 69 63 61 74 65 2e 20 52 46 43 20 35 32 38 30  ficate. RFC 5280
5990: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 36   section 4.2.1.6
59a0: 2c 20 4e 49 44 5f 73 75 62 6a 65 63 74 5f 61 6c  , NID_subject_al
59b0: 74 5f 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41  t_name */.    LA
59c0: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70  PPEND_OBJ(interp
59d0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 75  , resultObj, "su
59e0: 62 6a 65 63 74 41 6c 74 4e 61 6d 65 22 2c 20 54  bjectAltName", T
59f0: 6c 73 5f 78 35 30 39 4e 61 6d 65 73 28 69 6e 74  ls_x509Names(int
5a00: 65 72 70 2c 20 63 65 72 74 2c 20 4e 49 44 5f 73  erp, cert, NID_s
5a10: 75 62 6a 65 63 74 5f 61 6c 74 5f 6e 61 6d 65 2c  ubject_alt_name,
5a20: 20 62 69 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20   bio));..    /* 
5a30: 49 73 73 75 65 72 20 41 6c 74 65 72 6e 61 74 69  Issuer Alternati
5a40: 76 65 20 4e 61 6d 65 20 69 73 20 75 73 65 64 20  ve Name is used 
5a50: 74 6f 20 61 73 73 6f 63 69 61 74 65 20 49 6e 74  to associate Int
5a60: 65 72 6e 65 74 20 73 74 79 6c 65 20 69 64 65 6e  ernet style iden
5a70: 74 69 74 69 65 73 0a 09 77 69 74 68 20 74 68 65  tities..with the
5a80: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73   certificate iss
5a90: 75 65 72 2e 20 52 46 43 20 35 32 38 30 20 73 65  uer. RFC 5280 se
5aa0: 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 37 2c 20 4e  ction 4.2.1.7, N
5ab0: 49 44 5f 69 73 73 75 65 72 5f 61 6c 74 5f 6e 61  ID_issuer_alt_na
5ac0: 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  me */.    LAPPEN
5ad0: 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65  D_OBJ(interp, re
5ae0: 73 75 6c 74 4f 62 6a 2c 20 22 69 73 73 75 65 72  sultObj, "issuer
5af0: 41 6c 74 4e 61 6d 65 22 2c 20 54 6c 73 5f 78 35  AltName", Tls_x5
5b00: 30 39 4e 61 6d 65 73 28 69 6e 74 65 72 70 2c 20  09Names(interp, 
5b10: 63 65 72 74 2c 20 4e 49 44 5f 69 73 73 75 65 72  cert, NID_issuer
5b20: 5f 61 6c 74 5f 6e 61 6d 65 2c 20 62 69 6f 29 29  _alt_name, bio))
5b30: 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63  ;..    /* Subjec
5b40: 74 20 44 69 72 65 63 74 6f 72 79 20 41 74 74 72  t Directory Attr
5b50: 69 62 75 74 65 73 20 70 72 6f 76 69 64 65 73 20  ibutes provides 
5b60: 69 64 65 6e 74 69 66 69 63 61 74 69 6f 6e 20 61  identification a
5b70: 74 74 72 69 62 75 74 65 73 20 28 65 2e 67 2e 2c  ttributes (e.g.,
5b80: 20 6e 61 74 69 6f 6e 61 6c 69 74 79 29 0a 09 6f   nationality)..o
5b90: 66 20 74 68 65 20 73 75 62 6a 65 63 74 2e 20 52  f the subject. R
5ba0: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20  FC 5280 section 
5bb0: 34 2e 32 2e 31 2e 38 20 28 73 75 62 6a 65 63 74  4.2.1.8 (subject
5bc0: 44 69 72 65 63 74 6f 72 79 41 74 74 72 69 62 75  DirectoryAttribu
5bd0: 74 65 73 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  tes) */..    /* 
5be0: 42 61 73 69 63 20 43 6f 6e 73 74 72 61 69 6e 74  Basic Constraint
5bf0: 73 20 69 64 65 6e 74 69 66 69 65 73 20 77 68 65  s identifies whe
5c00: 74 68 65 72 20 74 68 65 20 73 75 62 6a 65 63 74  ther the subject
5c10: 20 6f 66 20 74 68 65 20 63 65 72 74 20 69 73 20   of the cert is 
5c20: 61 20 43 41 20 61 6e 64 0a 09 74 68 65 20 6d 61  a CA and..the ma
5c30: 78 20 64 65 70 74 68 20 6f 66 20 76 61 6c 69 64  x depth of valid
5c40: 20 63 65 72 74 20 70 61 74 68 73 20 66 6f 72 20   cert paths for 
5c50: 74 68 69 73 20 63 65 72 74 2e 20 52 46 43 20 35  this cert. RFC 5
5c60: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e  280 section 4.2.
5c70: 31 2e 39 2c 20 4e 49 44 5f 62 61 73 69 63 5f 63  1.9, NID_basic_c
5c80: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
5c90: 20 20 69 66 20 28 21 28 78 66 6c 61 67 73 20 26    if (!(xflags &
5ca0: 20 45 58 46 4c 41 47 5f 50 52 4f 58 59 29 29 20   EXFLAG_PROXY)) 
5cb0: 7b 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28  {..LAPPEND_LONG(
5cc0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
5cd0: 6a 2c 20 22 70 61 74 68 4c 65 6e 22 2c 20 58 35  j, "pathLen", X5
5ce0: 30 39 5f 67 65 74 5f 70 61 74 68 6c 65 6e 28 63  09_get_pathlen(c
5cf0: 65 72 74 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73  ert));.    } els
5d00: 65 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e  e {..LAPPEND_LON
5d10: 47 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  G(interp, result
5d20: 4f 62 6a 2c 20 22 70 61 74 68 4c 65 6e 22 2c 20  Obj, "pathLen", 
5d30: 58 35 30 39 5f 67 65 74 5f 70 72 6f 78 79 5f 70  X509_get_proxy_p
5d40: 61 74 68 6c 65 6e 28 63 65 72 74 29 29 3b 0a 20  athlen(cert));. 
5d50: 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44     }.    LAPPEND
5d60: 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65  _BOOL(interp, re
5d70: 73 75 6c 74 4f 62 6a 2c 20 22 62 61 73 69 63 43  sultObj, "basicC
5d80: 6f 6e 73 74 72 61 69 6e 74 73 43 41 22 2c 20 78  onstraintsCA", x
5d90: 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 43  flags & EXFLAG_C
5da0: 41 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 61 6d 65  A);..    /* Name
5db0: 20 43 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20   Constraints is 
5dc0: 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 43 41 20  only used in CA 
5dd0: 63 65 72 74 73 20 74 6f 20 69 6e 64 69 63 61 74  certs to indicat
5de0: 65 20 74 68 65 20 6e 61 6d 65 20 73 70 61 63 65  e the name space
5df0: 20 66 6f 72 0a 09 61 6c 6c 20 73 75 62 6a 65 63   for..all subjec
5e00: 74 20 6e 61 6d 65 73 20 69 6e 20 73 75 62 73 65  t names in subse
5e10: 71 75 65 6e 74 20 63 65 72 74 69 66 69 63 61 74  quent certificat
5e20: 65 73 20 69 6e 20 61 20 63 65 72 74 69 66 69 63  es in a certific
5e30: 61 74 69 6f 6e 20 70 61 74 68 0a 09 4d 55 53 54  ation path..MUST
5e40: 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 52 46 43   be located. RFC
5e50: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
5e60: 32 2e 31 2e 31 30 2c 20 4e 49 44 5f 6e 61 6d 65  2.1.10, NID_name
5e70: 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a  _constraints */.
5e80: 0a 20 20 20 20 2f 2a 20 50 6f 6c 69 63 79 20 43  .    /* Policy C
5e90: 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20 6f 6e  onstraints is on
5ea0: 6c 79 20 75 73 65 64 20 69 6e 20 43 41 20 63 65  ly used in CA ce
5eb0: 72 74 73 20 74 6f 20 6c 69 6d 69 74 20 74 68 65  rts to limit the
5ec0: 20 6c 65 6e 67 74 68 20 6f 66 20 61 0a 09 63 65   length of a..ce
5ed0: 72 74 20 63 68 61 69 6e 20 66 6f 72 20 74 68 61  rt chain for tha
5ee0: 74 20 43 41 2e 20 52 46 43 20 35 32 38 30 20 73  t CA. RFC 5280 s
5ef0: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 31 2c  ection 4.2.1.11,
5f00: 20 4e 49 44 5f 70 6f 6c 69 63 79 5f 63 6f 6e 73   NID_policy_cons
5f10: 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20 20  traints */..    
5f20: 2f 2a 20 45 78 74 65 6e 64 65 64 20 4b 65 79 20  /* Extended Key 
5f30: 55 73 61 67 65 20 69 6e 64 69 63 61 74 65 73 20  Usage indicates 
5f40: 74 68 65 20 70 75 72 70 6f 73 65 73 20 74 68 65  the purposes the
5f50: 20 63 65 72 74 69 66 69 65 64 20 70 75 62 6c 69   certified publi
5f60: 63 20 6b 65 79 20 6d 61 79 20 62 65 0a 09 75 73  c key may be..us
5f70: 65 64 2c 20 62 65 79 6f 6e 64 20 74 68 65 20 62  ed, beyond the b
5f80: 61 73 69 63 20 70 75 72 70 6f 73 65 73 2e 20 52  asic purposes. R
5f90: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20  FC 5280 section 
5fa0: 34 2e 32 2e 31 2e 31 32 2c 20 4e 49 44 5f 65 78  4.2.1.12, NID_ex
5fb0: 74 5f 6b 65 79 5f 75 73 61 67 65 20 2a 2f 0a 20  t_key_usage */. 
5fc0: 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69     LAPPEND_OBJ(i
5fd0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
5fe0: 2c 20 22 65 78 74 65 6e 64 65 64 4b 65 79 55 73  , "extendedKeyUs
5ff0: 61 67 65 22 2c 20 54 6c 73 5f 78 35 30 39 45 78  age", Tls_x509Ex
6000: 74 4b 65 79 55 73 61 67 65 28 69 6e 74 65 72 70  tKeyUsage(interp
6010: 2c 20 63 65 72 74 2c 20 78 66 6c 61 67 73 29 29  , cert, xflags))
6020: 3b 0a 0a 20 20 20 20 2f 2a 20 43 52 4c 20 44 69  ;..    /* CRL Di
6030: 73 74 72 69 62 75 74 69 6f 6e 20 50 6f 69 6e 74  stribution Point
6040: 73 20 69 64 65 6e 74 69 66 69 65 73 20 77 68 65  s identifies whe
6050: 72 65 20 43 52 4c 20 69 6e 66 6f 72 6d 61 74 69  re CRL informati
6060: 6f 6e 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e  on can be obtain
6070: 65 64 2e 0a 09 52 46 43 20 35 32 38 30 20 73 65  ed...RFC 5280 se
6080: 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 33 2a 2f  ction 4.2.1.13*/
6090: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a  .    LAPPEND_OBJ
60a0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
60b0: 62 6a 2c 20 22 63 72 6c 44 69 73 74 72 69 62 75  bj, "crlDistribu
60c0: 74 69 6f 6e 50 6f 69 6e 74 73 22 2c 20 54 6c 73  tionPoints", Tls
60d0: 5f 78 35 30 39 43 72 6c 44 70 28 69 6e 74 65 72  _x509CrlDp(inter
60e0: 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 20 20  p, cert));..    
60f0: 2f 2a 20 46 72 65 73 68 65 73 74 20 43 52 4c 20  /* Freshest CRL 
6100: 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 20 20 20  extension */.   
6110: 20 69 66 20 28 78 66 6c 61 67 73 20 26 20 45 58   if (xflags & EX
6120: 46 4c 41 47 5f 46 52 45 53 48 45 53 54 29 20 7b  FLAG_FRESHEST) {
6130: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
6140: 75 74 68 6f 72 69 74 79 20 49 6e 66 6f 72 6d 61  uthority Informa
6150: 74 69 6f 6e 20 41 63 63 65 73 73 20 69 6e 64 69  tion Access indi
6160: 63 61 74 65 73 20 68 6f 77 20 74 6f 20 61 63 63  cates how to acc
6170: 65 73 73 20 69 6e 66 6f 20 61 6e 64 20 73 65 72  ess info and ser
6180: 76 69 63 65 73 0a 09 66 6f 72 20 74 68 65 20 63  vices..for the c
6190: 65 72 74 69 66 69 63 61 74 65 20 69 73 73 75 65  ertificate issue
61a0: 72 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74  r. RFC 5280 sect
61b0: 69 6f 6e 20 34 2e 32 2e 32 2e 31 2c 20 4e 49 44  ion 4.2.2.1, NID
61c0: 5f 69 6e 66 6f 5f 61 63 63 65 73 73 20 2a 2f 0a  _info_access */.
61d0: 0a 20 20 20 20 2f 2a 20 4f 6e 2d 6c 69 6e 65 20  .    /* On-line 
61e0: 43 65 72 74 69 66 69 63 61 74 65 20 53 74 61 74  Certificate Stat
61f0: 75 73 20 50 72 6f 74 6f 63 6f 6c 20 28 4f 53 43  us Protocol (OSC
6200: 50 29 20 52 65 73 70 6f 6e 64 65 72 73 20 55 52  P) Responders UR
6210: 4c 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44  L */.    LAPPEND
6220: 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73  _OBJ(interp, res
6230: 75 6c 74 4f 62 6a 2c 20 22 6f 63 73 70 52 65 73  ultObj, "ocspRes
6240: 70 6f 6e 64 65 72 73 22 2c 20 54 6c 73 5f 78 35  ponders", Tls_x5
6250: 30 39 4f 73 63 70 28 69 6e 74 65 72 70 2c 20 63  09Oscp(interp, c
6260: 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ert));..    /* C
6270: 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f  ertificate Autho
6280: 72 69 74 79 20 28 43 41 29 20 49 73 73 75 65 72  rity (CA) Issuer
6290: 73 20 55 52 4c 20 2a 2f 0a 20 20 20 20 4c 41 50  s URL */.    LAP
62a0: 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c  PEND_OBJ(interp,
62b0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 63 61 49   resultObj, "caI
62c0: 73 73 75 65 72 73 22 2c 20 54 6c 73 5f 78 35 30  ssuers", Tls_x50
62d0: 39 43 61 49 73 73 75 65 72 73 28 69 6e 74 65 72  9CaIssuers(inter
62e0: 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 20 20  p, cert));..    
62f0: 2f 2a 20 53 75 62 6a 65 63 74 20 49 6e 66 6f 72  /* Subject Infor
6300: 6d 61 74 69 6f 6e 20 41 63 63 65 73 73 20 2d 20  mation Access - 
6310: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e  RFC 5280 section
6320: 20 34 2e 32 2e 32 2e 32 2c 20 4e 49 44 5f 73 69   4.2.2.2, NID_si
6330: 6e 66 6f 5f 61 63 63 65 73 73 20 2a 2f 0a 0a 20  nfo_access */.. 
6340: 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63 61 74     /* Certificat
6350: 65 20 41 6c 69 61 73 2e 20 49 66 20 75 73 65 73  e Alias. If uses
6360: 20 61 20 50 4b 43 53 23 31 32 20 73 74 72 75 63   a PKCS#12 struc
6370: 74 75 72 65 2c 20 61 6c 69 61 73 20 77 69 6c 6c  ture, alias will
6380: 20 72 65 66 6c 65 63 74 20 74 68 65 0a 09 66 72   reflect the..fr
6390: 69 65 6e 64 6c 79 4e 61 6d 65 20 61 74 74 72 69  iendlyName attri
63a0: 62 75 74 65 20 28 52 46 43 20 32 39 38 35 29 2e  bute (RFC 2985).
63b0: 20 2a 2f 0a 20 20 20 20 7b 0a 09 69 6e 74 20 69   */.    {..int i
63c0: 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  len = 0;.       
63d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
63e0: 73 74 72 69 6e 67 20 3d 20 58 35 30 39 5f 61 6c  string = X509_al
63f0: 69 61 73 5f 67 65 74 30 28 63 65 72 74 2c 20 26  ias_get0(cert, &
6400: 69 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  ilen);..LAPPEND_
6410: 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75  STR(interp, resu
6420: 6c 74 4f 62 6a 2c 20 22 61 6c 69 61 73 22 2c 20  ltObj, "alias", 
6430: 28 63 68 61 72 20 2a 29 20 73 74 72 69 6e 67 2c  (char *) string,
6440: 20 28 54 63 6c 5f 53 69 7a 65 29 20 69 6c 65 6e   (Tcl_Size) ilen
6450: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e  );.        strin
6460: 67 20 3d 20 58 35 30 39 5f 6b 65 79 69 64 5f 67  g = X509_keyid_g
6470: 65 74 30 28 63 65 72 74 2c 20 26 69 6c 65 6e 29  et0(cert, &ilen)
6480: 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
6490: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
64a0: 2c 20 22 6b 65 79 49 64 22 2c 20 28 63 68 61 72  , "keyId", (char
64b0: 20 2a 29 20 73 74 72 69 6e 67 2c 20 28 54 63 6c   *) string, (Tcl
64c0: 5f 53 69 7a 65 29 20 69 6c 65 6e 29 3b 0a 20 20  _Size) ilen);.  
64d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74    }..    /* Cert
64e0: 69 66 69 63 61 74 65 20 61 6e 64 20 64 75 6d 70  ificate and dump
64f0: 20 61 6c 6c 20 64 61 74 61 20 2a 2f 0a 20 20 20   all data */.   
6500: 20 69 66 20 28 61 6c 6c 29 20 7b 0a 09 54 63 6c   if (all) {..Tcl
6510: 5f 4f 62 6a 20 2a 61 6c 6c 4f 62 6a 20 3d 20 54  _Obj *allObj = T
6520: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
6530: 62 6a 28 4e 55 4c 4c 2c 20 30 29 3b 0a 09 54 63  bj(NULL, 0);..Tc
6540: 6c 5f 4f 62 6a 20 2a 63 65 72 74 4f 62 6a 20 3d  l_Obj *certObj =
6550: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
6560: 79 4f 62 6a 28 4e 55 4c 4c 2c 20 30 29 3b 0a 09  yObj(NULL, 0);..
6570: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
6580: 6c 6c 53 74 72 2c 20 2a 63 65 72 74 53 74 72 3b  llStr, *certStr;
6590: 0a 0a 09 69 66 20 28 61 6c 6c 4f 62 6a 20 3d 3d  ...if (allObj ==
65a0: 20 4e 55 4c 4c 20 7c 7c 20 63 65 72 74 4f 62 6a   NULL || certObj
65b0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   == NULL) {..   
65c0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
65d0: 74 28 61 6c 6c 4f 62 6a 29 3b 0a 09 20 20 20 20  t(allObj);..    
65e0: 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09  BIO_free(bio);..
65f0: 20 20 20 20 63 6b 66 72 65 65 28 62 75 66 66 65      ckfree(buffe
6600: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
6610: 72 65 73 75 6c 74 4f 62 6a 3b 0a 09 7d 0a 0a 09  resultObj;..}...
6620: 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61  /* Get certifica
6630: 74 65 20 2a 2f 0a 09 63 65 72 74 53 74 72 20 3d  te */..certStr =
6640: 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61   Tcl_SetByteArra
6650: 79 4c 65 6e 67 74 68 28 63 65 72 74 4f 62 6a 2c  yLength(certObj,
6660: 20 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 29 3b   CERT_STR_SIZE);
6670: 0a 09 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42  ..len = BIO_to_B
6680: 75 66 66 65 72 28 50 45 4d 5f 77 72 69 74 65 5f  uffer(PEM_write_
6690: 62 69 6f 5f 58 35 30 39 28 62 69 6f 2c 20 63 65  bio_X509(bio, ce
66a0: 72 74 29 2c 20 62 69 6f 2c 20 63 65 72 74 53 74  rt), bio, certSt
66b0: 72 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 5a 45  r, CERT_STR_SIZE
66c0: 29 3b 0a 09 54 63 6c 5f 53 65 74 42 79 74 65 41  );..Tcl_SetByteA
66d0: 72 72 61 79 4c 65 6e 67 74 68 28 63 65 72 74 4f  rrayLength(certO
66e0: 62 6a 2c 20 6c 65 6e 29 3b 0a 09 4c 41 50 50 45  bj, len);..LAPPE
66f0: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72  ND_OBJ(interp, r
6700: 65 73 75 6c 74 4f 62 6a 2c 20 22 63 65 72 74 69  esultObj, "certi
6710: 66 69 63 61 74 65 22 2c 20 63 65 72 74 4f 62 6a  ficate", certObj
6720: 29 0a 0a 09 2f 2a 20 47 65 74 20 61 6c 6c 20 69  ).../* Get all i
6730: 6e 66 6f 20 6f 6e 20 63 65 72 74 69 66 69 63 61  nfo on certifica
6740: 74 65 20 2a 2f 0a 09 61 6c 6c 53 74 72 20 3d 20  te */..allStr = 
6750: 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79  Tcl_SetByteArray
6760: 4c 65 6e 67 74 68 28 61 6c 6c 4f 62 6a 2c 20 43  Length(allObj, C
6770: 45 52 54 5f 53 54 52 5f 53 49 5a 45 20 2a 20 32  ERT_STR_SIZE * 2
6780: 29 3b 0a 09 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f  );..len = BIO_to
6790: 5f 42 75 66 66 65 72 28 58 35 30 39 5f 70 72 69  _Buffer(X509_pri
67a0: 6e 74 5f 65 78 28 62 69 6f 2c 20 63 65 72 74 2c  nt_ex(bio, cert,
67b0: 20 66 6c 61 67 73 2c 20 30 29 2c 20 62 69 6f 2c   flags, 0), bio,
67c0: 20 61 6c 6c 53 74 72 2c 20 43 45 52 54 5f 53 54   allStr, CERT_ST
67d0: 52 5f 53 49 5a 45 20 2a 20 32 29 3b 0a 09 54 63  R_SIZE * 2);..Tc
67e0: 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65  l_SetByteArrayLe
67f0: 6e 67 74 68 28 61 6c 6c 4f 62 6a 2c 20 6c 65 6e  ngth(allObj, len
6800: 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28  );..LAPPEND_OBJ(
6810: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
6820: 6a 2c 20 22 61 6c 6c 22 2c 20 61 6c 6c 4f 62 6a  j, "all", allObj
6830: 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 42 49 4f  ).    }..    BIO
6840: 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20 20  _free(bio);.    
6850: 63 6b 66 72 65 65 28 62 75 66 66 65 72 29 3b 0a  ckfree(buffer);.
6860: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c      return resul
6870: 74 4f 62 6a 3b 0a 7d 0a                          tObj;.}.