Hex Artifact Content

Artifact d88846a73e23e17e351135280d8d66b85718880710986d6824af2c5cbc891f31:


0000: 2f 2a 0a 20 2a 20 50 61 72 73 65 20 58 2e 35 30  /*. * Parse X.50
0010: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61 6e  9 certificate an
0020: 64 20 72 65 74 75 72 6e 20 63 6f 6e 74 65 6e 74  d return content
0030: 73 20 61 73 20 61 20 54 43 4c 20 6b 65 79 2d 76  s as a TCL key-v
0040: 61 6c 75 65 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a  alue list.. *. *
0050: 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31   Copyright (C) 1
0060: 39 39 37 2d 32 30 30 30 20 53 65 6e 73 75 73 20  997-2000 Sensus 
0070: 43 6f 6e 73 75 6c 74 69 6e 67 20 4c 74 64 2e 0a  Consulting Ltd..
0080: 20 2a 20 4d 61 74 74 20 4e 65 77 6d 61 6e 20 3c   * Matt Newman <
0090: 6d 61 74 74 40 73 65 6e 73 75 73 2e 6f 72 67 3e  matt@sensus.org>
00a0: 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 43  . * Copyright (C
00b0: 29 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48  ) 2023 Brian O'H
00c0: 61 67 61 6e 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64  agan. */.#includ
00d0: 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e 63 6c 75  e <tcl.h>.#inclu
00e0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
00f0: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 62  clude <openssl/b
0100: 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  io.h>.#include <
0110: 6f 70 65 6e 73 73 6c 2f 73 68 61 2e 68 3e 0a 23  openssl/sha.h>.#
0120: 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c  include <openssl
0130: 2f 78 35 30 39 2e 68 3e 0a 23 69 6e 63 6c 75 64  /x509.h>.#includ
0140: 65 20 3c 6f 70 65 6e 73 73 6c 2f 78 35 30 39 76  e <openssl/x509v
0150: 33 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f  3.h>.#include <o
0160: 70 65 6e 73 73 6c 2f 78 35 30 39 5f 76 66 79 2e  penssl/x509_vfy.
0170: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
0180: 6e 73 73 6c 2f 61 73 6e 31 2e 68 3e 0a 23 69 6e  nssl/asn1.h>.#in
0190: 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 22  clude "tlsInt.h"
01a0: 0a 0a 2f 2a 20 44 65 66 69 6e 65 20 6d 61 78 69  ../* Define maxi
01b0: 6d 75 6d 20 63 65 72 74 69 66 69 63 61 74 65 20  mum certificate 
01c0: 73 69 7a 65 2e 20 4d 61 78 20 50 45 4d 20 73 69  size. Max PEM si
01d0: 7a 65 20 31 30 30 6b 42 20 61 6e 64 20 44 45 52  ze 100kB and DER
01e0: 20 73 69 7a 65 20 69 73 20 32 34 6b 42 2e 20 2a   size is 24kB. *
01f0: 2f 0a 23 64 65 66 69 6e 65 20 43 45 52 54 5f 53  /.#define CERT_S
0200: 54 52 5f 53 49 5a 45 20 32 34 35 37 36 0a 0a 0c  TR_SIZE 24576...
0210: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
0220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0260: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 72 69 6e 67  ---. *. * String
0270: 5f 74 6f 5f 48 65 78 20 2d 2d 0a 20 2a 0a 20 2a  _to_Hex --. *. *
0280: 09 46 6f 72 6d 61 74 20 63 6f 6e 74 65 6e 74 73  .Format contents
0290: 20 6f 66 20 61 20 62 69 6e 61 72 79 20 73 74 72   of a binary str
02a0: 69 6e 67 20 61 73 20 61 20 68 65 78 20 73 74 72  ing as a hex str
02b0: 69 6e 67 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ing. *. * Result
02c0: 73 3a 0a 20 2a 09 54 43 4c 20 62 79 74 65 20 61  s:. *.TCL byte a
02d0: 72 72 61 79 20 6f 62 6a 65 63 74 20 77 69 74 68  rray object with
02e0: 20 78 35 30 39 20 69 64 65 6e 74 69 66 69 65 72   x509 identifier
02f0: 20 61 73 20 61 20 68 65 78 20 73 74 72 69 6e 67   as a hex string
0300: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 45 66 66 65  . *. * Side Effe
0310: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  cts:. *.None. *.
0320: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
0330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0370: 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 53 74 72   */.Tcl_Obj *Str
0380: 69 6e 67 5f 74 6f 5f 48 65 78 28 75 6e 73 69 67  ing_to_Hex(unsig
0390: 6e 65 64 20 63 68 61 72 2a 20 69 6e 70 75 74 2c  ned char* input,
03a0: 20 69 6e 74 20 69 6c 65 6e 29 20 7b 0a 20 20 20   int ilen) {.   
03b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
03c0: 69 70 74 72 20 3d 20 69 6e 70 75 74 3b 0a 20 20  iptr = input;.  
03d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c    Tcl_Obj *resul
03e0: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79  tObj = Tcl_NewBy
03f0: 74 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c 2c  teArrayObj(NULL,
0400: 20 30 29 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65   0);.    unsigne
0410: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 54  d char *data = T
0420: 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c  cl_SetByteArrayL
0430: 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c  ength(resultObj,
0440: 20 28 54 63 6c 5f 53 69 7a 65 29 69 6c 65 6e 2a   (Tcl_Size)ilen*
0450: 32 29 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  2);.    unsigned
0460: 20 63 68 61 72 20 2a 64 70 74 72 20 3d 20 26 64   char *dptr = &d
0470: 61 74 61 5b 30 5d 3b 0a 20 20 20 20 63 6f 6e 73  ata[0];.    cons
0480: 74 20 63 68 61 72 20 2a 68 65 78 20 3d 20 22 30  t char *hex = "0
0490: 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22  123456789abcdef"
04a0: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c  ;..    if (resul
04b0: 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tObj == NULL) {.
04c0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
04d0: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 69 6e    }..    for (in
04e0: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 69 6c 65  t i = 0; i < ile
04f0: 6e 3b 20 69 2b 2b 29 20 7b 0a 09 2a 64 70 74 72  n; i++) {..*dptr
0500: 2b 2b 20 3d 20 68 65 78 5b 28 2a 69 70 74 72 3e  ++ = hex[(*iptr>
0510: 3e 34 29 26 30 78 46 5d 3b 0a 09 2a 64 70 74 72  >4)&0xF];..*dptr
0520: 2b 2b 20 3d 20 68 65 78 5b 28 2a 69 70 74 72 2b  ++ = hex[(*iptr+
0530: 2b 29 26 30 78 46 5d 3b 0a 20 20 20 20 7d 0a 20  +)&0xF];.    }. 
0540: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74     return result
0550: 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  Obj;.}../*. *---
0560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
05b0: 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 20 2d   BIO_to_Buffer -
05c0: 2d 0a 20 2a 0a 20 2a 09 4f 75 74 70 75 74 20 63  -. *. *.Output c
05d0: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 42 49 4f  ontents of a BIO
05e0: 20 74 6f 20 61 20 62 75 66 66 65 72 0a 20 2a 0a   to a buffer. *.
05f0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52   * Results:. *.R
0600: 65 74 75 72 6e 73 20 6c 65 6e 67 74 68 20 6f 66  eturns length of
0610: 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66 66 65   string in buffe
0620: 72 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  r. *. * Side eff
0630: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ects:. *.None. *
0640: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
0650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0690: 0a 20 2a 2f 0a 54 63 6c 5f 53 69 7a 65 20 42 49  . */.Tcl_Size BI
06a0: 4f 5f 74 6f 5f 42 75 66 66 65 72 28 69 6e 74 20  O_to_Buffer(int 
06b0: 72 65 73 75 6c 74 2c 20 42 49 4f 20 2a 62 69 6f  result, BIO *bio
06c0: 2c 20 76 6f 69 64 20 2a 6f 75 74 70 75 74 2c 20  , void *output, 
06d0: 69 6e 74 20 6f 6c 65 6e 29 20 7b 0a 20 20 20 20  int olen) {.    
06e0: 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 20 3d 20 30  Tcl_Size len = 0
06f0: 3b 0a 20 20 20 20 69 6e 74 20 70 65 6e 64 69 6e  ;.    int pendin
0700: 67 20 3d 20 42 49 4f 5f 70 65 6e 64 69 6e 67 28  g = BIO_pending(
0710: 62 69 6f 29 3b 0a 0a 20 20 20 20 69 66 20 28 72  bio);..    if (r
0720: 65 73 75 6c 74 29 20 7b 0a 09 6c 65 6e 20 3d 20  esult) {..len = 
0730: 28 54 63 6c 5f 53 69 7a 65 29 20 42 49 4f 5f 72  (Tcl_Size) BIO_r
0740: 65 61 64 28 62 69 6f 2c 20 6f 75 74 70 75 74 2c  ead(bio, output,
0750: 20 28 70 65 6e 64 69 6e 67 20 3c 20 6f 6c 65 6e   (pending < olen
0760: 29 20 3f 20 70 65 6e 64 69 6e 67 20 3a 20 6f 6c  ) ? pending : ol
0770: 65 6e 29 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f  en);..(void)BIO_
0780: 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09 69 66 20  flush(bio);..if 
0790: 28 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 20 20 20  (len < 0) {..   
07a0: 20 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 20 20 20   len = 0;..}.   
07b0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65   }.    return le
07c0: 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  n;.}.../*. *----
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 0a 20 2a 0a 20 2a 20  ---------. *. * 
0820: 54 6c 73 5f 78 35 30 39 45 78 74 65 6e 73 69 6f  Tls_x509Extensio
0830: 6e 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20  ns --. *. *.Get 
0840: 6c 69 73 74 20 6f 66 20 58 2e 35 30 39 20 43 65  list of X.509 Ce
0850: 72 74 69 66 69 63 61 74 65 20 45 78 74 65 6e 73  rtificate Extens
0860: 69 6f 6e 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ions. *. * Resul
0870: 74 73 3a 0a 20 2a 09 54 43 4c 20 6c 69 73 74 20  ts:. *.TCL list 
0880: 6f 66 20 65 78 74 65 6e 73 69 6f 6e 73 20 61 6e  of extensions an
0890: 64 20 62 6f 6f 6c 65 61 6e 20 63 72 69 74 69 63  d boolean critic
08a0: 61 6c 20 73 74 61 74 75 73 0a 20 2a 0a 20 2a 20  al status. *. * 
08b0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
08c0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .None. *. *-----
08d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c  --------. */.Tcl
0920: 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 45 78  _Obj *Tls_x509Ex
0930: 74 65 6e 73 69 6f 6e 73 28 54 63 6c 5f 49 6e 74  tensions(Tcl_Int
0940: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30  erp *interp, X50
0950: 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 63  9 *cert) {.    c
0960: 6f 6e 73 74 20 53 54 41 43 4b 5f 4f 46 28 58 35  onst STACK_OF(X5
0970: 30 39 5f 45 58 54 45 4e 53 49 4f 4e 29 20 2a 65  09_EXTENSION) *e
0980: 78 74 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  xts;.    Tcl_Obj
0990: 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63   *resultObj = Tc
09a0: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
09b0: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28  NULL);..    if (
09c0: 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c  resultObj == NUL
09d0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  L) {..return NUL
09e0: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  L;.    }..    if
09f0: 20 28 28 65 78 74 73 20 3d 20 58 35 30 39 5f 67   ((exts = X509_g
0a00: 65 74 30 5f 65 78 74 65 6e 73 69 6f 6e 73 28 63  et0_extensions(c
0a10: 65 72 74 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  ert)) != NULL) {
0a20: 0a 09 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b 20  ..for (int i=0; 
0a30: 69 20 3c 20 58 35 30 39 5f 67 65 74 5f 65 78 74  i < X509_get_ext
0a40: 5f 63 6f 75 6e 74 28 63 65 72 74 29 3b 20 69 2b  _count(cert); i+
0a50: 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 45  +) {..    X509_E
0a60: 58 54 45 4e 53 49 4f 4e 20 2a 65 78 20 3d 20 73  XTENSION *ex = s
0a70: 6b 5f 58 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e  k_X509_EXTENSION
0a80: 5f 76 61 6c 75 65 28 65 78 74 73 2c 20 69 29 3b  _value(exts, i);
0a90: 0a 09 20 20 20 20 41 53 4e 31 5f 4f 42 4a 45 43  ..    ASN1_OBJEC
0aa0: 54 20 2a 6f 62 6a 20 3d 20 58 35 30 39 5f 45 58  T *obj = X509_EX
0ab0: 54 45 4e 53 49 4f 4e 5f 67 65 74 5f 6f 62 6a 65  TENSION_get_obje
0ac0: 63 74 28 65 78 29 3b 0a 09 20 20 20 20 2f 2a 20  ct(ex);..    /* 
0ad0: 41 53 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49 4e  ASN1_OCTET_STRIN
0ae0: 47 20 2a 64 61 74 61 20 3d 20 58 35 30 39 5f 45  G *data = X509_E
0af0: 58 54 45 4e 53 49 4f 4e 5f 67 65 74 5f 64 61 74  XTENSION_get_dat
0b00: 61 28 65 78 29 3b 20 2a 2f 0a 09 20 20 20 20 69  a(ex); */..    i
0b10: 6e 74 20 63 72 69 74 69 63 61 6c 20 3d 20 58 35  nt critical = X5
0b20: 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74  09_EXTENSION_get
0b30: 5f 63 72 69 74 69 63 61 6c 28 65 78 29 3b 0a 09  _critical(ex);..
0b40: 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c      LAPPEND_BOOL
0b50: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
0b60: 62 6a 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 4f  bj, OBJ_nid2ln(O
0b70: 42 4a 5f 6f 62 6a 32 6e 69 64 28 6f 62 6a 29 29  BJ_obj2nid(obj))
0b80: 2c 20 63 72 69 74 69 63 61 6c 29 3b 0a 09 7d 0a  , critical);..}.
0b90: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
0ba0: 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f   resultObj;.}../
0bb0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c00: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39  -. *. * Tls_x509
0c10: 49 64 65 6e 74 69 66 69 65 72 20 2d 2d 0a 20 2a  Identifier --. *
0c20: 0a 20 2a 09 47 65 74 20 58 2e 35 30 39 20 63 65  . *.Get X.509 ce
0c30: 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f 72  rtificate Author
0c40: 69 74 79 20 6f 72 20 53 75 62 6a 65 63 74 20 4b  ity or Subject K
0c50: 65 79 20 49 64 65 6e 74 69 66 69 65 72 73 0a 20  ey Identifiers. 
0c60: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
0c70: 09 54 43 4c 20 62 79 74 65 20 61 72 72 61 79 20  .TCL byte array 
0c80: 6f 62 6a 65 63 74 20 77 69 74 68 20 78 35 30 39  object with x509
0c90: 20 69 64 65 6e 74 69 66 69 65 72 20 61 73 20 61   identifier as a
0ca0: 20 68 65 78 20 73 74 72 69 6e 67 0a 20 2a 0a 20   hex string. *. 
0cb0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
0cc0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.None. *. *---
0cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54  ----------. */.T
0d20: 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39  cl_Obj *Tls_x509
0d30: 49 64 65 6e 74 69 66 69 65 72 28 63 6f 6e 73 74  Identifier(const
0d40: 20 41 53 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49   ASN1_OCTET_STRI
0d50: 4e 47 20 2a 61 73 74 72 69 6e 67 29 20 7b 0a 20  NG *astring) {. 
0d60: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75     Tcl_Obj *resu
0d70: 6c 74 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  ltObj = NULL;.. 
0d80: 20 20 20 69 66 20 28 61 73 74 72 69 6e 67 20 21     if (astring !
0d90: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 75 6c  = NULL) {..resul
0da0: 74 4f 62 6a 20 3d 20 53 74 72 69 6e 67 5f 74 6f  tObj = String_to
0db0: 5f 48 65 78 28 28 75 6e 73 69 67 6e 65 64 20 63  _Hex((unsigned c
0dc0: 68 61 72 20 2a 29 41 53 4e 31 5f 53 54 52 49 4e  har *)ASN1_STRIN
0dd0: 47 5f 67 65 74 30 5f 64 61 74 61 28 61 73 74 72  G_get0_data(astr
0de0: 69 6e 67 29 2c 0a 09 20 20 20 20 41 53 4e 31 5f  ing),..    ASN1_
0df0: 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 61 73  STRING_length(as
0e00: 74 72 69 6e 67 29 29 3b 0a 20 20 20 20 7d 0a 20  tring));.    }. 
0e10: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74     return result
0e20: 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  Obj;.}../*. *---
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
0e80: 20 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67   Tls_x509KeyUsag
0e90: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 58  e --. *. *.Get X
0ea0: 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
0eb0: 20 6b 65 79 20 75 73 61 67 65 20 74 79 70 65 73   key usage types
0ec0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
0ed0: 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 74   *.Tcl list of t
0ee0: 79 70 65 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ypes. *. * Side 
0ef0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
0f00: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
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 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20  ---. */.Tcl_Obj 
0f60: 2a 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67  *Tls_x509KeyUsag
0f70: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  e(Tcl_Interp *in
0f80: 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74  terp, X509 *cert
0f90: 2c 20 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67  , uint32_t xflag
0fa0: 73 29 20 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f  s) {.    uint32_
0fb0: 74 20 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67  t usage = X509_g
0fc0: 65 74 5f 6b 65 79 5f 75 73 61 67 65 28 63 65 72  et_key_usage(cer
0fd0: 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  t);.    Tcl_Obj 
0fe0: 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c  *resultObj = Tcl
0ff0: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
1000: 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72  ULL);..    if (r
1010: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c  esultObj == NULL
1020: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  ) {..return NULL
1030: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
1040: 28 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41  ((xflags & EXFLA
1050: 47 5f 4b 55 53 41 47 45 29 20 26 26 20 75 73 61  G_KUSAGE) && usa
1060: 67 65 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58 29  ge < UINT32_MAX)
1070: 20 7b 0a 09 69 66 20 28 75 73 61 67 65 20 26 20   {..if (usage & 
1080: 4b 55 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41  KU_DIGITAL_SIGNA
1090: 54 55 52 45 29 20 7b 0a 09 20 20 20 20 54 63 6c  TURE) {..    Tcl
10a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65  ement(interp, re
10c0: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77  sultObj, Tcl_New
10d0: 53 74 72 69 6e 67 4f 62 6a 28 22 44 69 67 69 74  StringObj("Digit
10e0: 61 6c 20 53 69 67 6e 61 74 75 72 65 22 2c 20 2d  al Signature", -
10f0: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61  1));..}..if (usa
1100: 67 65 20 26 20 4b 55 5f 4e 4f 4e 5f 52 45 50 55  ge & KU_NON_REPU
1110: 44 49 41 54 49 4f 4e 29 20 7b 0a 09 20 20 20 20  DIATION) {..    
1120: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1130: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1140: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f   resultObj, Tcl_
1150: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 6f  NewStringObj("No
1160: 6e 2d 52 65 70 75 64 69 61 74 69 6f 6e 22 2c 20  n-Repudiation", 
1170: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73  -1));..}..if (us
1180: 61 67 65 20 26 20 4b 55 5f 4b 45 59 5f 45 4e 43  age & KU_KEY_ENC
1190: 49 50 48 45 52 4d 45 4e 54 29 20 7b 0a 09 20 20  IPHERMENT) {..  
11a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
11b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11c0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
11d0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
11e0: 4b 65 79 20 45 6e 63 69 70 68 65 72 6d 65 6e 74  Key Encipherment
11f0: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
1200: 28 75 73 61 67 65 20 26 20 4b 55 5f 44 41 54 41  (usage & KU_DATA
1210: 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 29 20 7b  _ENCIPHERMENT) {
1220: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
1230: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1240: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
1250: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1260: 62 6a 28 22 44 61 74 61 20 45 6e 63 69 70 68 65  bj("Data Enciphe
1270: 72 6d 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d  rment", -1));..}
1280: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55  ..if (usage & KU
1290: 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 29 20  _KEY_AGREEMENT) 
12a0: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
12b0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12c0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
12d0: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  j, Tcl_NewString
12e0: 4f 62 6a 28 22 4b 65 79 20 41 67 72 65 65 6d 65  Obj("Key Agreeme
12f0: 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  nt", -1));..}..i
1300: 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f 4b 45  f (usage & KU_KE
1310: 59 5f 43 45 52 54 5f 53 49 47 4e 29 20 7b 0a 09  Y_CERT_SIGN) {..
1320: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1330: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1340: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
1350: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1360: 28 22 43 65 72 74 69 66 69 63 61 74 65 20 53 69  ("Certificate Si
1370: 67 6e 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d  gning", -1));..}
1380: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55  ..if (usage & KU
1390: 5f 43 52 4c 5f 53 49 47 4e 29 20 7b 0a 09 20 20  _CRL_SIGN) {..  
13a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
13b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
13c0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
13d0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
13e0: 43 52 4c 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31  CRL Signing", -1
13f0: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67  ));..}..if (usag
1400: 65 20 26 20 4b 55 5f 45 4e 43 49 50 48 45 52 5f  e & KU_ENCIPHER_
1410: 4f 4e 4c 59 29 20 7b 0a 09 20 20 20 20 54 63 6c  ONLY) {..    Tcl
1420: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1430: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65  ement(interp, re
1440: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77  sultObj, Tcl_New
1450: 53 74 72 69 6e 67 4f 62 6a 28 22 45 6e 63 69 70  StringObj("Encip
1460: 68 65 72 20 4f 6e 6c 79 22 2c 20 2d 31 29 29 3b  her Only", -1));
1470: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26  ..}..if (usage &
1480: 20 4b 55 5f 44 45 43 49 50 48 45 52 5f 4f 4e 4c   KU_DECIPHER_ONL
1490: 59 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  Y) {..    Tcl_Li
14a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
14b0: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  nt(interp, resul
14c0: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tObj, Tcl_NewStr
14d0: 69 6e 67 4f 62 6a 28 22 44 65 63 69 70 68 65 72  ingObj("Decipher
14e0: 20 4f 6e 6c 79 22 2c 20 2d 31 29 29 3b 0a 09 7d   Only", -1));..}
14f0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20  .    } else {.. 
1500: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1510: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1520: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54  rp, resultObj, T
1530: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1540: 22 75 6e 72 65 73 74 72 69 63 74 65 64 22 2c 20  "unrestricted", 
1550: 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  -1));.    }.    
1560: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a  return resultObj
1570: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
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 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
15d0: 73 5f 78 35 30 39 50 75 72 70 6f 73 65 20 2d 2d  s_x509Purpose --
15e0: 0a 20 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30 39  . *. *.Get X.509
15f0: 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75 72   certificate pur
1600: 70 6f 73 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  pose. *. * Resul
1610: 74 73 3a 0a 20 2a 09 50 75 72 70 6f 73 65 20 73  ts:. *.Purpose s
1620: 74 72 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65  tring. *. * Side
1630: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
1640: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
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 0a 20 2a 2f 0a 63 68 61 72 20 2a 54  ----. */.char *T
16a0: 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 65 28 58  ls_x509Purpose(X
16b0: 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20  509 *cert) {.   
16c0: 20 63 68 61 72 20 2a 70 75 72 70 6f 73 65 20 3d   char *purpose =
16d0: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 28   NULL;..    if (
16e0: 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f  X509_check_purpo
16f0: 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55  se(cert, X509_PU
1700: 52 50 4f 53 45 5f 53 53 4c 5f 43 4c 49 45 4e 54  RPOSE_SSL_CLIENT
1710: 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72  , 0) > 0) {..pur
1720: 70 6f 73 65 20 3d 20 22 53 53 4c 20 43 6c 69 65  pose = "SSL Clie
1730: 6e 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  nt";.    } else 
1740: 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70  if (X509_check_p
1750: 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30  urpose(cert, X50
1760: 39 5f 50 55 52 50 4f 53 45 5f 53 53 4c 5f 53 45  9_PURPOSE_SSL_SE
1770: 52 56 45 52 2c 20 30 29 20 3e 20 30 29 20 7b 0a  RVER, 0) > 0) {.
1780: 09 70 75 72 70 6f 73 65 20 3d 20 22 53 53 4c 20  .purpose = "SSL 
1790: 53 65 72 76 65 72 22 3b 0a 20 20 20 20 7d 20 65  Server";.    } e
17a0: 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65  lse if (X509_che
17b0: 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c  ck_purpose(cert,
17c0: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 4e 53   X509_PURPOSE_NS
17d0: 5f 53 53 4c 5f 53 45 52 56 45 52 2c 20 30 29 20  _SSL_SERVER, 0) 
17e0: 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20  > 0) {..purpose 
17f0: 3d 20 22 4d 53 53 20 53 53 4c 20 53 65 72 76 65  = "MSS SSL Serve
1800: 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  r";.    } else i
1810: 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75  f (X509_check_pu
1820: 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39  rpose(cert, X509
1830: 5f 50 55 52 50 4f 53 45 5f 53 4d 49 4d 45 5f 53  _PURPOSE_SMIME_S
1840: 49 47 4e 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09  IGN, 0) > 0) {..
1850: 70 75 72 70 6f 73 65 20 3d 20 22 53 4d 49 4d 45  purpose = "SMIME
1860: 20 53 69 67 6e 69 6e 67 22 3b 0a 20 20 20 20 7d   Signing";.    }
1870: 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63   else if (X509_c
1880: 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72  heck_purpose(cer
1890: 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f  t, X509_PURPOSE_
18a0: 53 4d 49 4d 45 5f 45 4e 43 52 59 50 54 2c 20 30  SMIME_ENCRYPT, 0
18b0: 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73  ) > 0) {..purpos
18c0: 65 20 3d 20 22 53 4d 49 4d 45 20 45 6e 63 72 79  e = "SMIME Encry
18d0: 70 74 69 6f 6e 22 3b 0a 20 20 20 20 7d 20 65 6c  ption";.    } el
18e0: 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63  se if (X509_chec
18f0: 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20  k_purpose(cert, 
1900: 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 43 52 4c  X509_PURPOSE_CRL
1910: 5f 53 49 47 4e 2c 20 30 29 20 3e 20 30 29 20 7b  _SIGN, 0) > 0) {
1920: 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 43 52 4c  ..purpose = "CRL
1930: 20 53 69 67 6e 69 6e 67 22 3b 0a 20 20 20 20 7d   Signing";.    }
1940: 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63   else if (X509_c
1950: 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72  heck_purpose(cer
1960: 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f  t, X509_PURPOSE_
1970: 41 4e 59 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09  ANY, 0) > 0) {..
1980: 70 75 72 70 6f 73 65 20 3d 20 22 41 6e 79 22 3b  purpose = "Any";
1990: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
19a0: 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f  X509_check_purpo
19b0: 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55  se(cert, X509_PU
19c0: 52 50 4f 53 45 5f 4f 43 53 50 5f 48 45 4c 50 45  RPOSE_OCSP_HELPE
19d0: 52 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75  R, 0) > 0) {..pu
19e0: 72 70 6f 73 65 20 3d 20 22 4f 43 53 50 20 48 65  rpose = "OCSP He
19f0: 6c 70 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73  lper";.    } els
1a00: 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b  e if (X509_check
1a10: 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58  _purpose(cert, X
1a20: 35 30 39 5f 50 55 52 50 4f 53 45 5f 54 49 4d 45  509_PURPOSE_TIME
1a30: 53 54 41 4d 50 5f 53 49 47 4e 2c 20 30 29 20 3e  STAMP_SIGN, 0) >
1a40: 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d   0) {..purpose =
1a50: 20 22 54 69 6d 65 73 74 61 6d 70 20 53 69 67 6e   "Timestamp Sign
1a60: 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ing";.    } else
1a70: 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 22   {..purpose = ""
1a80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1a90: 72 6e 20 70 75 72 70 6f 73 65 3b 0a 7d 0a 0a 2f  rn purpose;.}../
1aa0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
1ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1af0: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39  -. *. * Tls_x509
1b00: 50 75 72 70 6f 73 65 73 20 2d 2d 0a 20 2a 0a 20  Purposes --. *. 
1b10: 2a 09 47 65 74 20 58 2e 35 30 39 20 63 65 72 74  *.Get X.509 cert
1b20: 69 66 69 63 61 74 65 20 70 75 72 70 6f 73 65 20  ificate purpose 
1b30: 74 79 70 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75  types. *. * Resu
1b40: 6c 74 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 74  lts:. *.Tcl list
1b50: 20 6f 66 20 65 61 63 68 20 70 75 72 70 6f 73 65   of each purpose
1b60: 20 61 6e 64 20 77 68 65 74 68 65 72 20 69 74 20   and whether it 
1b70: 69 73 20 43 41 20 6f 72 20 6e 6f 6e 2d 43 41 0a  is CA or non-CA.
1b80: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
1b90: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
1ba0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
1bf0: 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f  */.Tcl_Obj *Tls_
1c00: 78 35 30 39 50 75 72 70 6f 73 65 73 28 54 63 6c  x509Purposes(Tcl
1c10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1c20: 20 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20   X509 *cert) {. 
1c30: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75     Tcl_Obj *resu
1c40: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c  ltObj = Tcl_NewL
1c50: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
1c60: 0a 20 20 20 20 58 35 30 39 5f 50 55 52 50 4f 53  .    X509_PURPOS
1c70: 45 20 2a 70 74 6d 70 3b 0a 0a 20 20 20 20 69 66  E *ptmp;..    if
1c80: 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e   (resultObj == N
1c90: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e  ULL) {..return N
1ca0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
1cb0: 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20  for (int i = 0; 
1cc0: 69 20 3c 20 58 35 30 39 5f 50 55 52 50 4f 53 45  i < X509_PURPOSE
1cd0: 5f 67 65 74 5f 63 6f 75 6e 74 28 29 3b 20 69 2b  _get_count(); i+
1ce0: 2b 29 20 7b 0a 09 70 74 6d 70 20 3d 20 58 35 30  +) {..ptmp = X50
1cf0: 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 30 28 69  9_PURPOSE_get0(i
1d00: 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 74 6d 70  );..Tcl_Obj *tmp
1d10: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
1d20: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a  tObj(0, NULL);..
1d30: 09 66 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b  .for (int j = 0;
1d40: 20 6a 20 3c 20 32 3b 20 6a 2b 2b 29 20 7b 0a 09   j < 2; j++) {..
1d50: 20 20 20 20 69 6e 74 20 69 64 72 65 74 20 3d 20      int idret = 
1d60: 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f  X509_check_purpo
1d70: 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55  se(cert, X509_PU
1d80: 52 50 4f 53 45 5f 67 65 74 5f 69 64 28 70 74 6d  RPOSE_get_id(ptm
1d90: 70 29 2c 20 6a 29 3b 0a 09 20 20 20 20 54 63 6c  p), j);..    Tcl
1da0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1db0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 74 6d  ement(interp, tm
1dc0: 70 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pPtr, Tcl_NewStr
1dd0: 69 6e 67 4f 62 6a 28 6a 20 3f 20 22 43 41 22 20  ingObj(j ? "CA" 
1de0: 3a 20 22 6e 6f 6e 43 41 22 2c 20 2d 31 29 29 3b  : "nonCA", -1));
1df0: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
1e00: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1e10: 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 2c 20 54  nterp, tmpPtr, T
1e20: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1e30: 69 64 72 65 74 20 3d 3d 20 31 20 3f 20 22 59 65  idret == 1 ? "Ye
1e40: 73 22 20 3a 20 22 4e 6f 22 2c 20 2d 31 29 29 3b  s" : "No", -1));
1e50: 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a  ..}..LAPPEND_OBJ
1e60: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
1e70: 62 6a 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45  bj, X509_PURPOSE
1e80: 5f 67 65 74 30 5f 6e 61 6d 65 28 70 74 6d 70 29  _get0_name(ptmp)
1e90: 2c 20 74 6d 70 50 74 72 29 3b 0a 20 20 20 20 7d  , tmpPtr);.    }
1ea0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75  .    return resu
1eb0: 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  ltObj;.}../*. *-
1ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
1f10: 20 2a 20 54 6c 73 5f 78 35 30 39 4e 61 6d 65 73   * Tls_x509Names
1f20: 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 61 20   --. *. *.Get a 
1f30: 6c 69 73 74 20 6f 66 20 53 75 62 6a 65 63 74 20  list of Subject 
1f40: 41 6c 74 65 72 6e 61 74 65 20 4e 61 6d 65 73 20  Alternate Names 
1f50: 28 53 41 4e 29 20 6f 72 20 49 73 73 75 65 72 20  (SAN) or Issuer 
1f60: 41 6c 74 65 72 6e 61 74 65 20 4e 61 6d 65 73 0a  Alternate Names.
1f70: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
1f80: 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 61 6c  *.Tcl list of al
1f90: 74 65 72 6e 61 74 65 20 6e 61 6d 65 73 0a 20 2a  ternate names. *
1fa0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
1fb0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d  :. *.None. *. *-
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
2010: 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35  .Tcl_Obj *Tls_x5
2020: 30 39 4e 61 6d 65 73 28 54 63 6c 5f 49 6e 74 65  09Names(Tcl_Inte
2030: 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39  rp *interp, X509
2040: 20 2a 63 65 72 74 2c 20 69 6e 74 20 6e 69 64 2c   *cert, int nid,
2050: 20 42 49 4f 20 2a 62 69 6f 29 20 7b 0a 20 20 20   BIO *bio) {.   
2060: 20 53 54 41 43 4b 5f 4f 46 28 47 45 4e 45 52 41   STACK_OF(GENERA
2070: 4c 5f 4e 41 4d 45 29 20 2a 6e 61 6d 65 73 3b 0a  L_NAME) *names;.
2080: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73      Tcl_Obj *res
2090: 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77  ultObj = Tcl_New
20a0: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
20b0: 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c  ;.    Tcl_Size l
20c0: 65 6e 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66  en;.    char buf
20d0: 66 65 72 5b 31 30 32 34 5d 3b 0a 0a 20 20 20 20  fer[1024];..    
20e0: 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d  if (resultObj ==
20f0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
2100: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
2110: 20 20 69 66 20 28 28 6e 61 6d 65 73 20 3d 20 58    if ((names = X
2120: 35 30 39 5f 67 65 74 5f 65 78 74 5f 64 32 69 28  509_get_ext_d2i(
2130: 63 65 72 74 2c 20 6e 69 64 2c 20 4e 55 4c 4c 2c  cert, nid, NULL,
2140: 20 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29   NULL)) != NULL)
2150: 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69 3d 30   {..for (int i=0
2160: 3b 20 69 20 3c 20 73 6b 5f 47 45 4e 45 52 41 4c  ; i < sk_GENERAL
2170: 5f 4e 41 4d 45 5f 6e 75 6d 28 6e 61 6d 65 73 29  _NAME_num(names)
2180: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 63 6f  ; i++) {..    co
2190: 6e 73 74 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45  nst GENERAL_NAME
21a0: 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 47 45 4e 45   *name = sk_GENE
21b0: 52 41 4c 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 6e  RAL_NAME_value(n
21c0: 61 6d 65 73 2c 20 69 29 3b 0a 0a 09 20 20 20 20  ames, i);...    
21d0: 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66  len = BIO_to_Buf
21e0: 66 65 72 28 6e 61 6d 65 20 26 26 20 47 45 4e 45  fer(name && GENE
21f0: 52 41 4c 5f 4e 41 4d 45 5f 70 72 69 6e 74 28 62  RAL_NAME_print(b
2200: 69 6f 2c 20 28 47 45 4e 45 52 41 4c 5f 4e 41 4d  io, (GENERAL_NAM
2210: 45 20 2a 29 20 6e 61 6d 65 29 2c 20 62 69 6f 2c  E *) name), bio,
2220: 20 62 75 66 66 65 72 2c 20 31 30 32 34 29 3b 0a   buffer, 1024);.
2230: 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
2240: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
2250: 62 6a 2c 20 4e 55 4c 4c 2c 20 62 75 66 66 65 72  bj, NULL, buffer
2260: 2c 20 6c 65 6e 29 3b 0a 09 7d 0a 09 73 6b 5f 47  , len);..}..sk_G
2270: 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70 6f 70 5f  ENERAL_NAME_pop_
2280: 66 72 65 65 28 6e 61 6d 65 73 2c 20 47 45 4e 45  free(names, GENE
2290: 52 41 4c 5f 4e 41 4d 45 5f 66 72 65 65 29 3b 0a  RAL_NAME_free);.
22a0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
22b0: 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f   resultObj;.}../
22c0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2310: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39  -. *. * Tls_x509
2320: 45 78 74 4b 65 79 55 73 61 67 65 20 2d 2d 0a 20  ExtKeyUsage --. 
2330: 2a 0a 20 2a 09 47 65 74 20 61 20 6c 69 73 74 20  *. *.Get a list 
2340: 6f 66 20 45 78 74 65 6e 64 65 64 20 4b 65 79 20  of Extended Key 
2350: 55 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52 65 74  Usages. *. * Ret
2360: 75 72 6e 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73  urns:. *.Tcl lis
2370: 74 20 6f 66 20 75 73 61 67 65 73 0a 20 2a 0a 20  t of usages. *. 
2380: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
2390: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.None. *. *---
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54  ----------. */.T
23f0: 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39  cl_Obj *Tls_x509
2400: 45 78 74 4b 65 79 55 73 61 67 65 28 54 63 6c 5f  ExtKeyUsage(Tcl_
2410: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2420: 58 35 30 39 20 2a 63 65 72 74 2c 20 75 69 6e 74  X509 *cert, uint
2430: 33 32 5f 74 20 78 66 6c 61 67 73 29 20 7b 0a 20  32_t xflags) {. 
2440: 20 20 20 75 69 6e 74 33 32 5f 74 20 75 73 61 67     uint32_t usag
2450: 65 20 3d 20 58 35 30 39 5f 67 65 74 5f 6b 65 79  e = X509_get_key
2460: 5f 75 73 61 67 65 28 63 65 72 74 29 3b 0a 20 20  _usage(cert);.  
2470: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c    Tcl_Obj *resul
2480: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  tObj = Tcl_NewLi
2490: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
24a0: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f  .    if (resultO
24b0: 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  bj == NULL) {..r
24c0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
24d0: 7d 0a 0a 20 20 20 20 69 66 20 28 28 78 66 6c 61  }..    if ((xfla
24e0: 67 73 20 26 20 45 58 46 4c 41 47 5f 58 4b 55 53  gs & EXFLAG_XKUS
24f0: 41 47 45 29 20 26 26 20 75 73 61 67 65 20 3c 20  AGE) && usage < 
2500: 55 49 4e 54 33 32 5f 4d 41 58 29 20 7b 0a 09 75  UINT32_MAX) {..u
2510: 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 74 5f  sage = X509_get_
2520: 65 78 74 65 6e 64 65 64 5f 6b 65 79 5f 75 73 61  extended_key_usa
2530: 67 65 28 63 65 72 74 29 3b 0a 0a 09 69 66 20 28  ge(cert);...if (
2540: 75 73 61 67 65 20 26 20 58 4b 55 5f 53 53 4c 5f  usage & XKU_SSL_
2550: 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 54  SERVER) {..    T
2560: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2570: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2580: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e  resultObj, Tcl_N
2590: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 4c 53  ewStringObj("TLS
25a0: 20 57 65 62 20 53 65 72 76 65 72 20 41 75 74 68   Web Server Auth
25b0: 65 6e 74 69 63 61 74 69 6f 6e 22 2c 20 2d 31 29  entication", -1)
25c0: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65  );..}..if (usage
25d0: 20 26 20 58 4b 55 5f 53 53 4c 5f 43 4c 49 45 4e   & XKU_SSL_CLIEN
25e0: 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  T) {..    Tcl_Li
25f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2600: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  nt(interp, resul
2610: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tObj, Tcl_NewStr
2620: 69 6e 67 4f 62 6a 28 22 54 4c 53 20 57 65 62 20  ingObj("TLS Web 
2630: 43 6c 69 65 6e 74 20 41 75 74 68 65 6e 74 69 63  Client Authentic
2640: 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d  ation", -1));..}
2650: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b  ..if (usage & XK
2660: 55 5f 53 4d 49 4d 45 29 20 7b 0a 09 20 20 20 20  U_SMIME) {..    
2670: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2680: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2690: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f   resultObj, Tcl_
26a0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 45 2d  NewStringObj("E-
26b0: 6d 61 69 6c 20 50 72 6f 74 65 63 74 69 6f 6e 22  mail Protection"
26c0: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
26d0: 75 73 61 67 65 20 26 20 58 4b 55 5f 43 4f 44 45  usage & XKU_CODE
26e0: 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 20 54 63  _SIGN) {..    Tc
26f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2700: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
2710: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
2720: 77 53 74 72 69 6e 67 4f 62 6a 28 22 43 6f 64 65  wStringObj("Code
2730: 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 3b   Signing", -1));
2740: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26  ..}..if (usage &
2750: 20 58 4b 55 5f 53 47 43 29 20 7b 0a 09 20 20 20   XKU_SGC) {..   
2760: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2770: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2780: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c  , resultObj, Tcl
2790: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 53  _NewStringObj("S
27a0: 47 43 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  GC", -1));..}..i
27b0: 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f 4f  f (usage & XKU_O
27c0: 43 53 50 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20  CSP_SIGN) {..   
27d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
27e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
27f0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c  , resultObj, Tcl
2800: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4f  _NewStringObj("O
2810: 43 53 50 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31  CSP Signing", -1
2820: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67  ));..}..if (usag
2830: 65 20 26 20 58 4b 55 5f 54 49 4d 45 53 54 41 4d  e & XKU_TIMESTAM
2840: 50 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  P) {..    Tcl_Li
2850: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2860: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  nt(interp, resul
2870: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tObj, Tcl_NewStr
2880: 69 6e 67 4f 62 6a 28 22 54 69 6d 65 20 53 74 61  ingObj("Time Sta
2890: 6d 70 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d  mping", -1));..}
28a0: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b  ..if (usage & XK
28b0: 55 5f 44 56 43 53 20 29 20 7b 0a 09 20 20 20 20  U_DVCS ) {..    
28c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
28d0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
28e0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f   resultObj, Tcl_
28f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 44 56  NewStringObj("DV
2900: 43 53 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  CS", -1));..}..i
2910: 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f 41  f (usage & XKU_A
2920: 4e 59 45 4b 55 29 20 7b 0a 09 20 20 20 20 54 63  NYEKU) {..    Tc
2930: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2940: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
2950: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65  esultObj, Tcl_Ne
2960: 77 53 74 72 69 6e 67 4f 62 6a 28 22 41 6e 79 20  wStringObj("Any 
2970: 45 78 74 65 6e 64 65 64 20 4b 65 79 20 55 73 61  Extended Key Usa
2980: 67 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 20  ge", -1));..}.  
2990: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20    } else {..    
29a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
29b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
29c0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f   resultObj, Tcl_
29d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e  NewStringObj("un
29e0: 72 65 73 74 72 69 63 74 65 64 22 2c 20 2d 31 29  restricted", -1)
29f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
2a00: 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d  urn resultObj;.}
2a10: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
2a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a60: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78  ----. *. * Tls_x
2a70: 35 30 39 43 72 6c 44 70 20 2d 2d 0a 20 2a 0a 20  509CrlDp --. *. 
2a80: 2a 09 47 65 74 20 6c 69 73 74 20 6f 66 20 43 52  *.Get list of CR
2a90: 4c 20 44 69 73 74 72 69 62 75 74 69 6f 6e 20 50  L Distribution P
2aa0: 6f 69 6e 74 73 0a 20 2a 0a 20 2a 20 52 65 74 75  oints. *. * Retu
2ab0: 72 6e 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 74  rns:. *.Tcl list
2ac0: 20 6f 66 20 55 52 49 73 20 61 6e 64 20 72 65 6c   of URIs and rel
2ad0: 61 74 69 76 65 2d 6e 61 6d 65 73 0a 20 2a 0a 20  ative-names. *. 
2ae0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
2af0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.None. *. *---
2b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54  ----------. */.T
2b50: 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39  cl_Obj *Tls_x509
2b60: 43 72 6c 44 70 28 54 63 6c 5f 49 6e 74 65 72 70  CrlDp(Tcl_Interp
2b70: 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a   *interp, X509 *
2b80: 63 65 72 74 29 20 7b 0a 20 20 20 20 53 54 41 43  cert) {.    STAC
2b90: 4b 5f 4f 46 28 44 49 53 54 5f 50 4f 49 4e 54 29  K_OF(DIST_POINT)
2ba0: 20 2a 63 72 6c 3b 0a 20 20 20 20 54 63 6c 5f 4f   *crl;.    Tcl_O
2bb0: 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20  bj *resultObj = 
2bc0: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
2bd0: 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66  , NULL);..    if
2be0: 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e   (resultObj == N
2bf0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e  ULL) {..return N
2c00: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
2c10: 69 66 20 28 28 63 72 6c 20 3d 20 58 35 30 39 5f  if ((crl = X509_
2c20: 67 65 74 5f 65 78 74 5f 64 32 69 28 63 65 72 74  get_ext_d2i(cert
2c30: 2c 20 4e 49 44 5f 63 72 6c 5f 64 69 73 74 72 69  , NID_crl_distri
2c40: 62 75 74 69 6f 6e 5f 70 6f 69 6e 74 73 2c 20 4e  bution_points, N
2c50: 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 4e  ULL, NULL)) != N
2c60: 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74  ULL) {..for (int
2c70: 20 69 3d 30 3b 20 69 20 3c 20 73 6b 5f 44 49 53   i=0; i < sk_DIS
2c80: 54 5f 50 4f 49 4e 54 5f 6e 75 6d 28 63 72 6c 29  T_POINT_num(crl)
2c90: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 44 49  ; i++) {..    DI
2ca0: 53 54 5f 50 4f 49 4e 54 20 2a 64 70 20 3d 20 73  ST_POINT *dp = s
2cb0: 6b 5f 44 49 53 54 5f 50 4f 49 4e 54 5f 76 61 6c  k_DIST_POINT_val
2cc0: 75 65 28 63 72 6c 2c 20 69 29 3b 0a 09 20 20 20  ue(crl, i);..   
2cd0: 20 44 49 53 54 5f 50 4f 49 4e 54 5f 4e 41 4d 45   DIST_POINT_NAME
2ce0: 20 2a 64 69 73 74 70 6f 69 6e 74 20 3d 20 64 70   *distpoint = dp
2cf0: 2d 3e 64 69 73 74 70 6f 69 6e 74 3b 0a 0a 09 20  ->distpoint;... 
2d00: 20 20 20 69 66 20 28 64 69 73 74 70 6f 69 6e 74     if (distpoint
2d10: 2d 3e 74 79 70 65 20 3d 3d 20 30 29 20 7b 0a 09  ->type == 0) {..
2d20: 09 2f 2a 20 66 75 6c 6c 2d 6e 61 6d 65 20 47 45  ./* full-name GE
2d30: 4e 45 52 41 4c 49 5a 45 44 4e 41 4d 45 20 2a 2f  NERALIZEDNAME */
2d40: 0a 09 09 66 6f 72 20 28 69 6e 74 20 6a 20 3d 20  ...for (int j = 
2d50: 30 3b 20 6a 20 3c 20 73 6b 5f 47 45 4e 45 52 41  0; j < sk_GENERA
2d60: 4c 5f 4e 41 4d 45 5f 6e 75 6d 28 64 69 73 74 70  L_NAME_num(distp
2d70: 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c 6e  oint->name.fulln
2d80: 61 6d 65 29 3b 20 6a 2b 2b 29 20 7b 0a 09 09 20  ame); j++) {... 
2d90: 20 20 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 20     GENERAL_NAME 
2da0: 2a 67 65 6e 20 3d 20 73 6b 5f 47 45 4e 45 52 41  *gen = sk_GENERA
2db0: 4c 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 64 69 73  L_NAME_value(dis
2dc0: 74 70 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 66 75 6c  tpoint->name.ful
2dd0: 6c 6e 61 6d 65 2c 20 6a 29 3b 0a 09 09 20 20 20  lname, j);...   
2de0: 20 69 6e 74 20 74 79 70 65 3b 0a 09 09 20 20 20   int type;...   
2df0: 20 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 75 72   ASN1_STRING *ur
2e00: 69 20 3d 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45  i = GENERAL_NAME
2e10: 5f 67 65 74 30 5f 76 61 6c 75 65 28 67 65 6e 2c  _get0_value(gen,
2e20: 20 26 74 79 70 65 29 3b 0a 09 09 20 20 20 20 69   &type);...    i
2e30: 66 20 28 74 79 70 65 20 3d 3d 20 47 45 4e 5f 55  f (type == GEN_U
2e40: 52 49 29 20 7b 0a 09 09 09 4c 41 50 50 45 4e 44  RI) {....LAPPEND
2e50: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73  _STR(interp, res
2e60: 75 6c 74 4f 62 6a 2c 20 28 63 68 61 72 20 2a 29  ultObj, (char *)
2e70: 20 4e 55 4c 4c 2c 20 28 63 68 61 72 20 2a 29 20   NULL, (char *) 
2e80: 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74 30  ASN1_STRING_get0
2e90: 5f 64 61 74 61 28 75 72 69 29 2c 20 28 54 63 6c  _data(uri), (Tcl
2ea0: 5f 53 69 7a 65 29 20 41 53 4e 31 5f 53 54 52 49  _Size) ASN1_STRI
2eb0: 4e 47 5f 6c 65 6e 67 74 68 28 75 72 69 29 29 3b  NG_length(uri));
2ec0: 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20  ...    }...}..  
2ed0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 69 73    } else if (dis
2ee0: 74 70 6f 69 6e 74 2d 3e 74 79 70 65 20 3d 3d 20  tpoint->type == 
2ef0: 31 29 20 7b 0a 09 09 2f 2a 20 72 65 6c 61 74 69  1) {.../* relati
2f00: 76 65 2d 6e 61 6d 65 20 58 35 30 39 4e 41 4d 45  ve-name X509NAME
2f10: 20 2a 2f 0a 09 09 53 54 41 43 4b 5f 4f 46 28 58   */...STACK_OF(X
2f20: 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 29 20  509_NAME_ENTRY) 
2f30: 2a 73 6b 5f 72 65 6c 6e 61 6d 65 20 3d 20 64 69  *sk_relname = di
2f40: 73 74 70 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 72 65  stpoint->name.re
2f50: 6c 61 74 69 76 65 6e 61 6d 65 3b 0a 09 09 66 6f  lativename;...fo
2f60: 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a 20  r (int j = 0; j 
2f70: 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 45  < sk_X509_NAME_E
2f80: 4e 54 52 59 5f 6e 75 6d 28 73 6b 5f 72 65 6c 6e  NTRY_num(sk_reln
2f90: 61 6d 65 29 3b 20 6a 2b 2b 29 20 7b 0a 09 09 20  ame); j++) {... 
2fa0: 20 20 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54     X509_NAME_ENT
2fb0: 52 59 20 2a 65 20 3d 20 73 6b 5f 58 35 30 39 5f  RY *e = sk_X509_
2fc0: 4e 41 4d 45 5f 45 4e 54 52 59 5f 76 61 6c 75 65  NAME_ENTRY_value
2fd0: 28 73 6b 5f 72 65 6c 6e 61 6d 65 2c 20 6a 29 3b  (sk_relname, j);
2fe0: 0a 09 09 20 20 20 20 41 53 4e 31 5f 53 54 52 49  ...    ASN1_STRI
2ff0: 4e 47 20 2a 64 20 3d 20 58 35 30 39 5f 4e 41 4d  NG *d = X509_NAM
3000: 45 5f 45 4e 54 52 59 5f 67 65 74 5f 64 61 74 61  E_ENTRY_get_data
3010: 28 65 29 3b 0a 09 09 20 20 20 20 4c 41 50 50 45  (e);...    LAPPE
3020: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72  ND_STR(interp, r
3030: 65 73 75 6c 74 4f 62 6a 2c 20 28 63 68 61 72 20  esultObj, (char 
3040: 2a 29 20 4e 55 4c 4c 2c 20 28 63 68 61 72 20 2a  *) NULL, (char *
3050: 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 64 61  ) ASN1_STRING_da
3060: 74 61 28 64 29 2c 20 28 54 63 6c 5f 53 69 7a 65  ta(d), (Tcl_Size
3070: 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c 65  ) ASN1_STRING_le
3080: 6e 67 74 68 28 64 29 29 3b 0a 09 09 7d 0a 09 20  ngth(d));...}.. 
3090: 20 20 20 7d 0a 09 7d 0a 09 43 52 4c 5f 44 49 53     }..}..CRL_DIS
30a0: 54 5f 50 4f 49 4e 54 53 5f 66 72 65 65 28 63 72  T_POINTS_free(cr
30b0: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  l);.    }.    re
30c0: 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a  turn resultObj;.
30d0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3120: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
3130: 78 35 30 39 4f 73 63 70 0a 20 2a 0a 20 2a 09 47  x509Oscp. *. *.G
3140: 65 74 20 6c 69 73 74 20 6f 66 20 4f 6e 2d 6c 69  et list of On-li
3150: 6e 65 20 43 65 72 74 69 66 69 63 61 74 65 20 53  ne Certificate S
3160: 74 61 74 75 73 20 50 72 6f 74 6f 63 6f 6c 20 28  tatus Protocol (
3170: 4f 53 43 50 29 20 55 52 49 73 0a 20 2a 0a 20 2a  OSCP) URIs. *. *
3180: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 6c   Results:. *.Tcl
3190: 20 6c 69 73 74 20 6f 66 20 55 52 49 73 0a 20 2a   list of URIs. *
31a0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
31b0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d  :. *.None. *. *-
31c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3210: 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35  .Tcl_Obj *Tls_x5
3220: 30 39 4f 73 63 70 28 54 63 6c 5f 49 6e 74 65 72  09Oscp(Tcl_Inter
3230: 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20  p *interp, X509 
3240: 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 53 54 41  *cert) {.    STA
3250: 43 4b 5f 4f 46 28 4f 50 45 4e 53 53 4c 5f 53 54  CK_OF(OPENSSL_ST
3260: 52 49 4e 47 29 20 2a 6f 63 73 70 3b 0a 20 20 20  RING) *ocsp;.   
3270: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74   Tcl_Obj *result
3280: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Obj = Tcl_NewLis
3290: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a  tObj(0, NULL);..
32a0: 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62      if (resultOb
32b0: 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  j == NULL) {..re
32c0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
32d0: 0a 0a 20 20 20 20 69 66 20 28 28 6f 63 73 70 20  ..    if ((ocsp 
32e0: 3d 20 58 35 30 39 5f 67 65 74 31 5f 6f 63 73 70  = X509_get1_ocsp
32f0: 28 63 65 72 74 29 29 20 21 3d 20 4e 55 4c 4c 29  (cert)) != NULL)
3300: 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d   {..for (int i =
3310: 20 30 3b 20 69 20 3c 20 73 6b 5f 4f 50 45 4e 53   0; i < sk_OPENS
3320: 53 4c 5f 53 54 52 49 4e 47 5f 6e 75 6d 28 6f 63  SL_STRING_num(oc
3330: 73 70 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20  sp); i++) {..   
3340: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
3350: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
3360: 4e 55 4c 4c 2c 20 73 6b 5f 4f 50 45 4e 53 53 4c  NULL, sk_OPENSSL
3370: 5f 53 54 52 49 4e 47 5f 76 61 6c 75 65 28 6f 63  _STRING_value(oc
3380: 73 70 2c 20 69 29 2c 20 2d 31 29 3b 0a 09 7d 0a  sp, i), -1);..}.
3390: 09 58 35 30 39 5f 65 6d 61 69 6c 5f 66 72 65 65  .X509_email_free
33a0: 28 6f 63 73 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (ocsp);.    }.  
33b0: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f    return resultO
33c0: 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  bj;.}../*. *----
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 0a 20 2a 0a 20 2a 20  ---------. *. * 
3420: 54 6c 73 5f 78 35 30 39 43 61 49 73 73 75 65 72  Tls_x509CaIssuer
3430: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 6c  s --. *. *.Get l
3440: 69 73 74 20 6f 66 20 43 65 72 74 69 66 69 63 61  ist of Certifica
3450: 74 65 20 41 75 74 68 6f 72 69 74 79 20 28 43 41  te Authority (CA
3460: 29 20 49 73 73 75 65 72 20 55 52 49 73 0a 20 2a  ) Issuer URIs. *
3470: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
3480: 54 63 6c 20 6c 69 73 74 20 6f 66 20 43 41 20 69  Tcl list of CA i
3490: 73 73 75 65 72 20 55 52 49 73 0a 20 2a 0a 20 2a  ssuer URIs. *. *
34a0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
34b0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d  *.None. *. *----
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63  ---------. */.Tc
3510: 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 43  l_Obj *Tls_x509C
3520: 61 49 73 73 75 65 72 73 28 54 63 6c 5f 49 6e 74  aIssuers(Tcl_Int
3530: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30  erp *interp, X50
3540: 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 53  9 *cert) {.    S
3550: 54 41 43 4b 5f 4f 46 28 41 43 43 45 53 53 5f 44  TACK_OF(ACCESS_D
3560: 45 53 43 52 49 50 54 49 4f 4e 29 20 2a 61 64 73  ESCRIPTION) *ads
3570: 3b 0a 20 20 20 20 41 43 43 45 53 53 5f 44 45 53  ;.    ACCESS_DES
3580: 43 52 49 50 54 49 4f 4e 20 2a 61 64 3b 0a 20 20  CRIPTION *ad;.  
3590: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c    Tcl_Obj *resul
35a0: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  tObj = Tcl_NewLi
35b0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
35c0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
35d0: 72 20 2a 62 75 66 3b 0a 0a 20 20 20 20 69 66 20  r *buf;..    if 
35e0: 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55  (resultObj == NU
35f0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55  LL) {..return NU
3600: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  LL;.    }..    i
3610: 66 20 28 28 61 64 73 20 3d 20 58 35 30 39 5f 67  f ((ads = X509_g
3620: 65 74 5f 65 78 74 5f 64 32 69 28 63 65 72 74 2c  et_ext_d2i(cert,
3630: 20 4e 49 44 5f 69 6e 66 6f 5f 61 63 63 65 73 73   NID_info_access
3640: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 21  , NULL, NULL)) !
3650: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28  = NULL) {..for (
3660: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73  int i = 0; i < s
3670: 6b 5f 41 43 43 45 53 53 5f 44 45 53 43 52 49 50  k_ACCESS_DESCRIP
3680: 54 49 4f 4e 5f 6e 75 6d 28 61 64 73 29 3b 20 69  TION_num(ads); i
3690: 2b 2b 29 20 7b 0a 09 20 20 20 20 61 64 20 3d 20  ++) {..    ad = 
36a0: 73 6b 5f 41 43 43 45 53 53 5f 44 45 53 43 52 49  sk_ACCESS_DESCRI
36b0: 50 54 49 4f 4e 5f 76 61 6c 75 65 28 61 64 73 2c  PTION_value(ads,
36c0: 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 4f 42   i);..    if (OB
36d0: 4a 5f 6f 62 6a 32 6e 69 64 28 61 64 2d 3e 6d 65  J_obj2nid(ad->me
36e0: 74 68 6f 64 29 20 3d 3d 20 4e 49 44 5f 61 64 5f  thod) == NID_ad_
36f0: 63 61 5f 69 73 73 75 65 72 73 20 26 26 20 61 64  ca_issuers && ad
3700: 2d 3e 6c 6f 63 61 74 69 6f 6e 29 20 7b 0a 09 09  ->location) {...
3710: 69 66 20 28 61 64 2d 3e 6c 6f 63 61 74 69 6f 6e  if (ad->location
3720: 2d 3e 74 79 70 65 20 3d 3d 20 47 45 4e 5f 55 52  ->type == GEN_UR
3730: 49 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53  I) {...    Tcl_S
3740: 69 7a 65 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53  ize len = (Tcl_S
3750: 69 7a 65 29 20 41 53 4e 31 5f 53 54 52 49 4e 47  ize) ASN1_STRING
3760: 5f 74 6f 5f 55 54 46 38 28 26 62 75 66 2c 20 61  _to_UTF8(&buf, a
3770: 64 2d 3e 6c 6f 63 61 74 69 6f 6e 2d 3e 64 2e 75  d->location->d.u
3780: 6e 69 66 6f 72 6d 52 65 73 6f 75 72 63 65 49 64  niformResourceId
3790: 65 6e 74 69 66 69 65 72 29 3b 0a 09 09 20 20 20  entifier);...   
37a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
37b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
37c0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c  , resultObj, Tcl
37d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
37e0: 68 61 72 20 2a 29 20 62 75 66 2c 20 6c 65 6e 29  har *) buf, len)
37f0: 29 3b 0a 09 09 20 20 20 20 4f 50 45 4e 53 53 4c  );...    OPENSSL
3800: 5f 66 72 65 65 28 62 75 66 29 3b 0a 09 09 20 20  _free(buf);...  
3810: 20 20 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 20 20    break;...}..  
3820: 20 20 7d 0a 09 7d 0a 09 2f 2a 20 73 6b 5f 41 43    }..}../* sk_AC
3830: 43 45 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e  CESS_DESCRIPTION
3840: 5f 70 6f 70 5f 66 72 65 65 28 61 64 73 2c 20 41  _pop_free(ads, A
3850: 43 43 45 53 53 5f 44 45 53 43 52 49 50 54 49 4f  CCESS_DESCRIPTIO
3860: 4e 5f 66 72 65 65 29 3b 20 2a 2f 0a 09 41 55 54  N_free); */..AUT
3870: 48 4f 52 49 54 59 5f 49 4e 46 4f 5f 41 43 43 45  HORITY_INFO_ACCE
3880: 53 53 5f 66 72 65 65 28 61 64 73 29 3b 0a 20 20  SS_free(ads);.  
3890: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
38a0: 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0c 0a 2f 2a  esultObj;.}.../*
38b0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
38c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3900: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 4e 65 77 58 35  . *. * Tls_NewX5
3910: 30 39 4f 62 6a 20 2d 2d 0a 20 2a 0a 20 2a 09 50  09Obj --. *. *.P
3920: 61 72 73 65 73 20 61 20 58 35 30 39 20 63 65 72  arses a X509 cer
3930: 74 69 66 69 63 61 74 65 20 61 6e 64 20 72 65 74  tificate and ret
3940: 75 72 6e 73 20 63 6f 6e 74 65 6e 74 73 20 61 73  urns contents as
3950: 20 61 20 6b 65 79 2d 76 61 6c 75 65 20 54 63 6c   a key-value Tcl
3960: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73   list.. *. * Res
3970: 75 6c 74 3a 0a 20 2a 09 41 20 54 63 6c 20 4c 69  ult:. *.A Tcl Li
3980: 73 74 20 77 69 74 68 20 74 68 65 20 58 35 30 39  st with the X509
3990: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 66   certificate inf
39a0: 6f 20 61 73 20 61 20 6b 65 79 2d 76 61 6c 75 65  o as a key-value
39b0: 20 6c 69 73 74 0a 20 2a 0a 20 2a 20 53 69 64 65   list. *. * Side
39c0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
39d0: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
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 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a  ----. */.Tcl_Obj
3a30: 20 2a 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a   *Tls_NewX509Obj
3a40: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
3a50: 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c  erp, X509 *cert,
3a60: 20 69 6e 74 20 61 6c 6c 29 20 7b 0a 20 20 20 20   int all) {.    
3a70: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f  Tcl_Obj *resultO
3a80: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  bj = Tcl_NewList
3a90: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20  Obj(0, NULL);.  
3aa0: 20 20 42 49 4f 20 2a 62 69 6f 20 3d 20 42 49 4f    BIO *bio = BIO
3ab0: 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29  _new(BIO_s_mem()
3ac0: 29 3b 0a 20 20 20 20 69 6e 74 20 6d 64 6e 69 64  );.    int mdnid
3ad0: 2c 20 70 6b 6e 69 64 2c 20 62 69 74 73 3b 0a 20  , pknid, bits;. 
3ae0: 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b     Tcl_Size len;
3af0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
3b00: 74 20 75 6c 65 6e 3b 0a 20 20 20 20 75 69 6e 74  t ulen;.    uint
3b10: 33 32 5f 74 20 78 66 6c 61 67 73 3b 0a 20 20 20  32_t xflags;.   
3b20: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 66   unsigned long f
3b30: 6c 61 67 73 20 3d 20 58 4e 5f 46 4c 41 47 5f 52  lags = XN_FLAG_R
3b40: 46 43 32 32 35 33 20 7c 20 41 53 4e 31 5f 53 54  FC2253 | ASN1_ST
3b50: 52 46 4c 47 53 5f 55 54 46 38 5f 43 4f 4e 56 45  RFLGS_UTF8_CONVE
3b60: 52 54 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d  RT;.    flags &=
3b70: 20 7e 41 53 4e 31 5f 53 54 52 46 4c 47 53 5f 45   ~ASN1_STRFLGS_E
3b80: 53 43 5f 4d 53 42 3b 0a 0a 20 20 20 20 63 68 61  SC_MSB;..    cha
3b90: 72 20 2a 62 75 66 66 65 72 20 3d 20 63 6b 61 6c  r *buffer = ckal
3ba0: 6c 6f 63 28 42 55 46 53 49 5a 20 3e 20 45 56 50  loc(BUFSIZ > EVP
3bb0: 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 20 3f 20 42  _MAX_MD_SIZE ? B
3bc0: 55 46 53 49 5a 20 3a 20 45 56 50 5f 4d 41 58 5f  UFSIZ : EVP_MAX_
3bd0: 4d 44 5f 53 49 5a 45 29 3b 0a 0a 20 20 20 20 64  MD_SIZE);..    d
3be0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
3bf0: 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72  ;..    if (inter
3c00: 70 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 65 72  p == NULL || cer
3c10: 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62 69 6f  t == NULL || bio
3c20: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 65 73 75   == NULL || resu
3c30: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  ltObj == NULL ||
3c40: 20 62 75 66 66 65 72 20 3d 3d 20 4e 55 4c 4c 29   buffer == NULL)
3c50: 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43   {..Tcl_DecrRefC
3c60: 6f 75 6e 74 28 72 65 73 75 6c 74 4f 62 6a 29 3b  ount(resultObj);
3c70: 0a 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b  ..BIO_free(bio);
3c80: 0a 09 69 66 20 28 62 75 66 66 65 72 20 21 3d 20  ..if (buffer != 
3c90: 4e 55 4c 4c 29 20 63 6b 66 72 65 65 28 62 75 66  NULL) ckfree(buf
3ca0: 66 65 72 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  fer);..return NU
3cb0: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  LL;.    }..    /
3cc0: 2a 20 53 69 67 6e 61 74 75 72 65 20 61 6c 67 6f  * Signature algo
3cd0: 72 69 74 68 6d 20 61 6e 64 20 76 61 6c 75 65 20  rithm and value 
3ce0: 2d 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69  - RFC 5280 secti
3cf0: 6f 6e 20 34 2e 31 2e 31 2e 32 20 61 6e 64 20 34  on 4.1.1.2 and 4
3d00: 2e 31 2e 31 2e 33 20 2a 2f 0a 20 20 20 20 2f 2a  .1.1.3 */.    /*
3d10: 20 73 69 67 6e 61 74 75 72 65 41 6c 67 6f 72 69   signatureAlgori
3d20: 74 68 6d 20 69 73 20 74 68 65 20 69 64 20 6f 66  thm is the id of
3d30: 20 74 68 65 20 63 72 79 70 74 6f 67 72 61 70 68   the cryptograph
3d40: 69 63 20 61 6c 67 6f 72 69 74 68 6d 20 75 73 65  ic algorithm use
3d50: 64 20 62 79 20 74 68 65 0a 09 43 41 20 74 6f 20  d by the..CA to 
3d60: 73 69 67 6e 20 74 68 69 73 20 63 65 72 74 2e 20  sign this cert. 
3d70: 73 69 67 6e 61 74 75 72 65 56 61 6c 75 65 20 69  signatureValue i
3d80: 73 20 74 68 65 20 64 69 67 69 74 61 6c 20 73 69  s the digital si
3d90: 67 6e 61 74 75 72 65 20 63 6f 6d 70 75 74 65 64  gnature computed
3da0: 0a 09 75 70 6f 6e 20 74 68 65 20 41 53 4e 2e 31  ..upon the ASN.1
3db0: 20 44 45 52 20 65 6e 63 6f 64 65 64 20 74 62 73   DER encoded tbs
3dc0: 43 65 72 74 69 66 69 63 61 74 65 2e 20 2a 2f 0a  Certificate. */.
3dd0: 20 20 20 20 7b 0a 09 63 6f 6e 73 74 20 58 35 30      {..const X50
3de0: 39 5f 41 4c 47 4f 52 20 2a 73 69 67 5f 61 6c 67  9_ALGOR *sig_alg
3df0: 3b 0a 09 63 6f 6e 73 74 20 41 53 4e 31 5f 42 49  ;..const ASN1_BI
3e00: 54 5f 53 54 52 49 4e 47 20 2a 73 69 67 3b 0a 09  T_STRING *sig;..
3e10: 69 6e 74 20 73 69 67 5f 6e 69 64 3b 0a 0a 09 58  int sig_nid;...X
3e20: 35 30 39 5f 67 65 74 30 5f 73 69 67 6e 61 74 75  509_get0_signatu
3e30: 72 65 28 26 73 69 67 2c 20 26 73 69 67 5f 61 6c  re(&sig, &sig_al
3e40: 67 2c 20 63 65 72 74 29 3b 0a 09 2f 2a 20 73 69  g, cert);../* si
3e50: 67 5f 6e 69 64 20 3d 20 58 35 30 39 5f 67 65 74  g_nid = X509_get
3e60: 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 63  _signature_nid(c
3e70: 65 72 74 29 20 2a 2f 0a 09 73 69 67 5f 6e 69 64  ert) */..sig_nid
3e80: 20 3d 20 4f 42 4a 5f 6f 62 6a 32 6e 69 64 28 73   = OBJ_obj2nid(s
3e90: 69 67 5f 61 6c 67 2d 3e 61 6c 67 6f 72 69 74 68  ig_alg->algorith
3ea0: 6d 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  m);..LAPPEND_STR
3eb0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
3ec0: 62 6a 2c 20 22 73 69 67 6e 61 74 75 72 65 41 6c  bj, "signatureAl
3ed0: 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69  gorithm", OBJ_ni
3ee0: 64 32 6c 6e 28 73 69 67 5f 6e 69 64 29 2c 20 2d  d2ln(sig_nid), -
3ef0: 31 29 3b 0a 09 69 66 20 28 73 69 67 5f 6e 69 64  1);..if (sig_nid
3f00: 20 21 3d 20 4e 49 44 5f 75 6e 64 65 66 29 20 7b   != NID_undef) {
3f10: 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42  ..    LAPPEND_OB
3f20: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  J(interp, result
3f30: 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75 72 65 56  Obj, "signatureV
3f40: 61 6c 75 65 22 2c 20 53 74 72 69 6e 67 5f 74 6f  alue", String_to
3f50: 5f 48 65 78 28 73 69 67 2d 3e 64 61 74 61 2c 20  _Hex(sig->data, 
3f60: 73 69 67 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a 09  sig->length));..
3f70: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 4c 41  } else {..    LA
3f80: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
3f90: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69  , resultObj, "si
3fa0: 67 6e 61 74 75 72 65 56 61 6c 75 65 22 2c 20 22  gnatureValue", "
3fb0: 22 2c 20 30 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ", 0);..}.    }.
3fc0: 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 20  .    /* Version 
3fd0: 6f 66 20 74 68 65 20 65 6e 63 6f 64 65 64 20 63  of the encoded c
3fe0: 65 72 74 69 66 69 63 61 74 65 20 2d 20 52 46 43  ertificate - RFC
3ff0: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
4000: 31 2e 32 2e 31 20 2a 2f 0a 20 20 20 20 4c 41 50  1.2.1 */.    LAP
4010: 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70  PEND_LONG(interp
4020: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 76 65  , resultObj, "ve
4030: 72 73 69 6f 6e 22 2c 20 58 35 30 39 5f 67 65 74  rsion", X509_get
4040: 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 29 2b 31  _version(cert)+1
4050: 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 69 71 75  );..    /* Uniqu
4060: 65 20 6e 75 6d 62 65 72 20 61 73 73 69 67 6e 65  e number assigne
4070: 64 20 62 79 20 43 41 20 74 6f 20 63 65 72 74 69  d by CA to certi
4080: 66 69 63 61 74 65 20 2d 20 52 46 43 20 35 32 38  ficate - RFC 528
4090: 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e  0 section 4.1.2.
40a0: 32 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42  2 */.    len = B
40b0: 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 69 32 61  IO_to_Buffer(i2a
40c0: 5f 41 53 4e 31 5f 49 4e 54 45 47 45 52 28 62 69  _ASN1_INTEGER(bi
40d0: 6f 2c 20 58 35 30 39 5f 67 65 74 30 5f 73 65 72  o, X509_get0_ser
40e0: 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 29  ialNumber(cert))
40f0: 2c 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42  , bio, buffer, B
4100: 55 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50  UFSIZ);.    LAPP
4110: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
4120: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 65 72 69  resultObj, "seri
4130: 61 6c 4e 75 6d 62 65 72 22 2c 20 62 75 66 66 65  alNumber", buffe
4140: 72 2c 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a  r, len);..    /*
4150: 20 53 69 67 6e 61 74 75 72 65 20 61 6c 67 6f 72   Signature algor
4160: 69 74 68 6d 20 75 73 65 64 20 62 79 20 74 68 65  ithm used by the
4170: 20 43 41 20 74 6f 20 73 69 67 6e 20 74 68 65 20   CA to sign the 
4180: 63 65 72 74 69 66 69 63 61 74 65 2e 20 4d 75 73  certificate. Mus
4190: 74 20 6d 61 74 63 68 0a 09 73 69 67 6e 61 74 75  t match..signatu
41a0: 72 65 41 6c 67 6f 72 69 74 68 6d 2e 20 52 46 43  reAlgorithm. RFC
41b0: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
41c0: 31 2e 32 2e 33 20 2a 2f 0a 20 20 20 20 4c 41 50  1.2.3 */.    LAP
41d0: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
41e0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67   resultObj, "sig
41f0: 6e 61 74 75 72 65 22 2c 20 4f 42 4a 5f 6e 69 64  nature", OBJ_nid
4200: 32 6c 6e 28 58 35 30 39 5f 67 65 74 5f 73 69 67  2ln(X509_get_sig
4210: 6e 61 74 75 72 65 5f 6e 69 64 28 63 65 72 74 29  nature_nid(cert)
4220: 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  ), -1);..    /* 
4230: 49 73 73 75 65 72 20 69 64 65 6e 74 69 66 69 65  Issuer identifie
4240: 73 20 74 68 65 20 65 6e 74 69 74 79 20 74 68 61  s the entity tha
4250: 74 20 73 69 67 6e 65 64 20 61 6e 64 20 69 73 73  t signed and iss
4260: 75 65 64 20 74 68 65 20 63 65 72 74 2e 20 52 46  ued the cert. RF
4270: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34  C 5280 section 4
4280: 2e 31 2e 32 2e 34 20 2a 2f 0a 20 20 20 20 6c 65  .1.2.4 */.    le
4290: 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65  n = BIO_to_Buffe
42a0: 72 28 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e  r(X509_NAME_prin
42b0: 74 5f 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67  t_ex(bio, X509_g
42c0: 65 74 5f 69 73 73 75 65 72 5f 6e 61 6d 65 28 63  et_issuer_name(c
42d0: 65 72 74 29 2c 20 30 2c 20 66 6c 61 67 73 29 2c  ert), 0, flags),
42e0: 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55   bio, buffer, BU
42f0: 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45  FSIZ);.    LAPPE
4300: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72  ND_STR(interp, r
4310: 65 73 75 6c 74 4f 62 6a 2c 20 22 69 73 73 75 65  esultObj, "issue
4320: 72 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29  r", buffer, len)
4330: 3b 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66  ;..    /* Certif
4340: 69 63 61 74 65 20 76 61 6c 69 64 69 74 79 20 70  icate validity p
4350: 65 72 69 6f 64 20 69 73 20 74 68 65 20 69 6e 74  eriod is the int
4360: 65 72 76 61 6c 20 74 68 65 20 43 41 20 77 61 72  erval the CA war
4370: 72 61 6e 74 73 20 74 68 61 74 20 69 74 20 77 69  rants that it wi
4380: 6c 6c 0a 09 6d 61 69 6e 74 61 69 6e 20 69 6e 66  ll..maintain inf
4390: 6f 20 6f 6e 20 74 68 65 20 73 74 61 74 75 73 20  o on the status 
43a0: 6f 66 20 74 68 65 20 63 65 72 74 69 66 69 63 61  of the certifica
43b0: 74 65 2e 20 52 46 43 20 35 32 38 30 20 73 65 63  te. RFC 5280 sec
43c0: 74 69 6f 6e 20 34 2e 31 2e 32 2e 35 20 2a 2f 0a  tion 4.1.2.5 */.
43d0: 20 20 20 20 2f 2a 20 47 65 74 20 56 61 6c 69 64      /* Get Valid
43e0: 69 74 79 20 2d 20 4e 6f 74 20 42 65 66 6f 72 65  ity - Not Before
43f0: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49   */.    len = BI
4400: 4f 5f 74 6f 5f 42 75 66 66 65 72 28 41 53 4e 31  O_to_Buffer(ASN1
4410: 5f 54 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c  _TIME_print(bio,
4420: 20 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74 42 65   X509_get0_notBe
4430: 66 6f 72 65 28 63 65 72 74 29 29 2c 20 62 69 6f  fore(cert)), bio
4440: 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a  , buffer, BUFSIZ
4450: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  );.    LAPPEND_S
4460: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  TR(interp, resul
4470: 74 4f 62 6a 2c 20 22 6e 6f 74 42 65 66 6f 72 65  tObj, "notBefore
4480: 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b  ", buffer, len);
4490: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 56 61 6c  ..    /* Get Val
44a0: 69 64 69 74 79 20 2d 20 4e 6f 74 20 41 66 74 65  idity - Not Afte
44b0: 72 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42  r */.    len = B
44c0: 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 41 53 4e  IO_to_Buffer(ASN
44d0: 31 5f 54 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f  1_TIME_print(bio
44e0: 2c 20 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74 41  , X509_get0_notA
44f0: 66 74 65 72 28 63 65 72 74 29 29 2c 20 62 69 6f  fter(cert)), bio
4500: 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a  , buffer, BUFSIZ
4510: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  );.    LAPPEND_S
4520: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  TR(interp, resul
4530: 74 4f 62 6a 2c 20 22 6e 6f 74 41 66 74 65 72 22  tObj, "notAfter"
4540: 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a  , buffer, len);.
4550: 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20  .    /* Subject 
4560: 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 65  identifies the e
4570: 6e 74 69 74 79 20 61 73 73 6f 63 69 61 74 65 64  ntity associated
4580: 20 77 69 74 68 20 74 68 65 20 70 75 62 6c 69 63   with the public
4590: 20 6b 65 79 20 73 74 6f 72 65 64 20 69 6e 0a 09   key stored in..
45a0: 74 68 65 20 73 75 62 6a 65 63 74 20 70 75 62 6c  the subject publ
45b0: 69 63 20 6b 65 79 20 66 69 65 6c 64 2e 20 52 46  ic key field. RF
45c0: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34  C 5280 section 4
45d0: 2e 31 2e 32 2e 36 20 2a 2f 0a 20 20 20 20 6c 65  .1.2.6 */.    le
45e0: 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65  n = BIO_to_Buffe
45f0: 72 28 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e  r(X509_NAME_prin
4600: 74 5f 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67  t_ex(bio, X509_g
4610: 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28  et_subject_name(
4620: 63 65 72 74 29 2c 20 30 2c 20 66 6c 61 67 73 29  cert), 0, flags)
4630: 2c 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42  , bio, buffer, B
4640: 55 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50  UFSIZ);.    LAPP
4650: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
4660: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 75 62 6a  resultObj, "subj
4670: 65 63 74 22 2c 20 62 75 66 66 65 72 2c 20 6c 65  ect", buffer, le
4680: 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 48 41 31  n);..    /* SHA1
4690: 20 44 69 67 65 73 74 20 28 46 69 6e 67 65 72 70   Digest (Fingerp
46a0: 72 69 6e 74 29 20 6f 66 20 63 65 72 74 20 2d 20  rint) of cert - 
46b0: 44 45 52 20 72 65 70 72 65 73 65 6e 74 61 74 69  DER representati
46c0: 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35  on */.    if (X5
46d0: 30 39 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20  09_digest(cert, 
46e0: 45 56 50 5f 73 68 61 31 28 29 2c 20 28 75 6e 73  EVP_sha1(), (uns
46f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66  igned char *)buf
4700: 66 65 72 2c 20 26 75 6c 65 6e 29 29 20 7b 0a 09  fer, &ulen)) {..
4710: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65  LAPPEND_OBJ(inte
4720: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22  rp, resultObj, "
4730: 73 68 61 31 5f 68 61 73 68 22 2c 20 53 74 72 69  sha1_hash", Stri
4740: 6e 67 5f 74 6f 5f 48 65 78 28 28 75 6e 73 69 67  ng_to_Hex((unsig
4750: 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 65  ned char *)buffe
4760: 72 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b  r, (int) ulen));
4770: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
4780: 48 41 32 35 36 20 44 69 67 65 73 74 20 28 46 69  HA256 Digest (Fi
4790: 6e 67 65 72 70 72 69 6e 74 29 20 6f 66 20 63 65  ngerprint) of ce
47a0: 72 74 20 2d 20 44 45 52 20 72 65 70 72 65 73 65  rt - DER represe
47b0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  ntation */.    i
47c0: 66 20 28 58 35 30 39 5f 64 69 67 65 73 74 28 63  f (X509_digest(c
47d0: 65 72 74 2c 20 45 56 50 5f 73 68 61 32 35 36 28  ert, EVP_sha256(
47e0: 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ), (unsigned cha
47f0: 72 20 2a 29 62 75 66 66 65 72 2c 20 26 75 6c 65  r *)buffer, &ule
4800: 6e 29 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 4f  n)) {..LAPPEND_O
4810: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  BJ(interp, resul
4820: 74 4f 62 6a 2c 20 22 73 68 61 32 35 36 5f 68 61  tObj, "sha256_ha
4830: 73 68 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f 48  sh", String_to_H
4840: 65 78 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ex((unsigned cha
4850: 72 20 2a 29 62 75 66 66 65 72 2c 20 28 69 6e 74  r *)buffer, (int
4860: 29 20 75 6c 65 6e 29 29 3b 0a 20 20 20 20 7d 0a  ) ulen));.    }.
4870: 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20  .    /* Subject 
4880: 50 75 62 6c 69 63 20 4b 65 79 20 49 6e 66 6f 20  Public Key Info 
4890: 73 70 65 63 69 66 69 65 73 20 74 68 65 20 70 75  specifies the pu
48a0: 62 6c 69 63 20 6b 65 79 20 61 6e 64 20 69 64 65  blic key and ide
48b0: 6e 74 69 66 69 65 73 20 74 68 65 0a 09 61 6c 67  ntifies the..alg
48c0: 6f 72 69 74 68 6d 20 77 69 74 68 20 77 68 69 63  orithm with whic
48d0: 68 20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65  h the key is use
48e0: 64 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74  d. RFC 5280 sect
48f0: 69 6f 6e 20 34 2e 31 2e 32 2e 37 20 2a 2f 0a 20  ion 4.1.2.7 */. 
4900: 20 20 20 69 66 20 28 58 35 30 39 5f 67 65 74 5f     if (X509_get_
4910: 73 69 67 6e 61 74 75 72 65 5f 69 6e 66 6f 28 63  signature_info(c
4920: 65 72 74 2c 20 26 6d 64 6e 69 64 2c 20 26 70 6b  ert, &mdnid, &pk
4930: 6e 69 64 2c 20 26 62 69 74 73 2c 20 26 78 66 6c  nid, &bits, &xfl
4940: 61 67 73 29 29 20 7b 0a 09 41 53 4e 31 5f 42 49  ags)) {..ASN1_BI
4950: 54 5f 53 54 52 49 4e 47 20 2a 6b 65 79 3b 0a 09  T_STRING *key;..
4960: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 3b 0a  unsigned int n;.
4970: 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
4980: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
4990: 20 22 73 69 67 6e 69 6e 67 44 69 67 65 73 74 22   "signingDigest"
49a0: 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6d 64 6e  , OBJ_nid2ln(mdn
49b0: 69 64 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45  id), -1);..LAPPE
49c0: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72  ND_STR(interp, r
49d0: 65 73 75 6c 74 4f 62 6a 2c 20 22 70 75 62 6c 69  esultObj, "publi
49e0: 63 4b 65 79 41 6c 67 6f 72 69 74 68 6d 22 2c 20  cKeyAlgorithm", 
49f0: 4f 42 4a 5f 6e 69 64 32 6c 6e 28 70 6b 6e 69 64  OBJ_nid2ln(pknid
4a00: 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44  ), -1);..LAPPEND
4a10: 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 73  _INT(interp, res
4a20: 75 6c 74 4f 62 6a 2c 20 22 62 69 74 73 22 2c 20  ultObj, "bits", 
4a30: 62 69 74 73 29 3b 20 2f 2a 20 45 66 66 65 63 74  bits); /* Effect
4a40: 69 76 65 20 73 65 63 75 72 69 74 79 20 62 69 74  ive security bit
4a50: 73 20 2a 2f 0a 0a 09 6b 65 79 20 3d 20 58 35 30  s */...key = X50
4a60: 39 5f 67 65 74 30 5f 70 75 62 6b 65 79 5f 62 69  9_get0_pubkey_bi
4a70: 74 73 74 72 28 63 65 72 74 29 3b 0a 09 4c 41 50  tstr(cert);..LAP
4a80: 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c  PEND_OBJ(interp,
4a90: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 75 62   resultObj, "pub
4aa0: 6c 69 63 4b 65 79 22 2c 20 53 74 72 69 6e 67 5f  licKey", String_
4ab0: 74 6f 5f 48 65 78 28 6b 65 79 2d 3e 64 61 74 61  to_Hex(key->data
4ac0: 2c 20 6b 65 79 2d 3e 6c 65 6e 67 74 68 29 29 3b  , key->length));
4ad0: 0a 0a 09 69 66 20 28 58 35 30 39 5f 70 75 62 6b  ...if (X509_pubk
4ae0: 65 79 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20  ey_digest(cert, 
4af0: 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74 62 79  EVP_get_digestby
4b00: 6e 69 64 28 70 6b 6e 69 64 29 2c 20 28 75 6e 73  nid(pknid), (uns
4b10: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66  igned char *)buf
4b20: 66 65 72 2c 20 26 6e 29 29 20 7b 0a 09 20 20 20  fer, &n)) {..   
4b30: 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74   LAPPEND_OBJ(int
4b40: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
4b50: 22 70 75 62 6c 69 63 4b 65 79 48 61 73 68 22 2c  "publicKeyHash",
4b60: 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 28   String_to_Hex((
4b70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
4b80: 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20 6e 29  buffer, (int) n)
4b90: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  );..} else {..  
4ba0: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
4bb0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
4bc0: 20 22 70 75 62 6c 69 63 4b 65 79 48 61 73 68 22   "publicKeyHash"
4bd0: 2c 20 22 22 2c 20 30 29 3b 0a 09 7d 0a 0a 09 2f  , "", 0);..}.../
4be0: 2a 20 64 69 67 65 73 74 20 6f 66 20 74 68 65 20  * digest of the 
4bf0: 44 45 52 20 72 65 70 72 65 73 65 6e 74 61 74 69  DER representati
4c00: 6f 6e 20 6f 66 20 74 68 65 20 63 65 72 74 69 66  on of the certif
4c10: 69 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 58 35  icate */..if (X5
4c20: 30 39 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20  09_digest(cert, 
4c30: 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74 62 79  EVP_get_digestby
4c40: 6e 69 64 28 6d 64 6e 69 64 29 2c 20 28 75 6e 73  nid(mdnid), (uns
4c50: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66  igned char *)buf
4c60: 66 65 72 2c 20 26 6e 29 29 20 7b 0a 09 20 20 20  fer, &n)) {..   
4c70: 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74   LAPPEND_OBJ(int
4c80: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
4c90: 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 22 2c  "signatureHash",
4ca0: 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 28   String_to_Hex((
4cb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
4cc0: 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20 6e 29  buffer, (int) n)
4cd0: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  );..} else {..  
4ce0: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
4cf0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
4d00: 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 22   "signatureHash"
4d10: 2c 20 22 22 2c 20 30 29 3b 0a 09 7d 0a 20 20 20  , "", 0);..}.   
4d20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 69   }..    /* Certi
4d30: 66 69 63 61 74 65 20 50 75 72 70 6f 73 65 2e 20  ficate Purpose. 
4d40: 43 61 6c 6c 20 62 65 66 6f 72 65 20 63 68 65 63  Call before chec
4d50: 6b 69 6e 67 20 66 6f 72 20 65 78 74 65 6e 73 69  king for extensi
4d60: 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 4c 41 50 50  ons. */.    LAPP
4d70: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
4d80: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 75 72 70  resultObj, "purp
4d90: 6f 73 65 22 2c 20 54 6c 73 5f 78 35 30 39 50 75  ose", Tls_x509Pu
4da0: 72 70 6f 73 65 28 63 65 72 74 29 2c 20 2d 31 29  rpose(cert), -1)
4db0: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42  ;.    LAPPEND_OB
4dc0: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  J(interp, result
4dd0: 4f 62 6a 2c 20 22 63 65 72 74 69 66 69 63 61 74  Obj, "certificat
4de0: 65 50 75 72 70 6f 73 65 22 2c 20 54 6c 73 5f 78  ePurpose", Tls_x
4df0: 35 30 39 50 75 72 70 6f 73 65 73 28 69 6e 74 65  509Purposes(inte
4e00: 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 20  rp, cert));..   
4e10: 20 2f 2a 20 47 65 74 20 65 78 74 65 6e 73 69 6f   /* Get extensio
4e20: 6e 73 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20  ns flags */.    
4e30: 78 66 6c 61 67 73 20 3d 20 58 35 30 39 5f 67 65  xflags = X509_ge
4e40: 74 5f 65 78 74 65 6e 73 69 6f 6e 5f 66 6c 61 67  t_extension_flag
4e50: 73 28 63 65 72 74 29 3b 0a 20 20 20 20 4c 41 50  s(cert);.    LAP
4e60: 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
4e70: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74   resultObj, "ext
4e80: 46 6c 61 67 73 22 2c 20 78 66 6c 61 67 73 29 3b  Flags", xflags);
4e90: 0a 0a 09 2f 2a 20 43 68 65 63 6b 20 69 66 20 63  .../* Check if c
4ea0: 65 72 74 20 77 61 73 20 69 73 73 75 65 64 20 62  ert was issued b
4eb0: 79 20 43 41 20 63 65 72 74 20 69 73 73 75 65 72  y CA cert issuer
4ec0: 20 6f 72 20 73 65 6c 66 20 73 69 67 6e 65 64 20   or self signed 
4ed0: 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42  */.    LAPPEND_B
4ee0: 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 75  OOL(interp, resu
4ef0: 6c 74 4f 62 6a 2c 20 22 73 65 6c 66 49 73 73 75  ltObj, "selfIssu
4f00: 65 64 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58  ed", xflags & EX
4f10: 46 4c 41 47 5f 53 49 29 3b 0a 20 20 20 20 4c 41  FLAG_SI);.    LA
4f20: 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
4f30: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73  p, resultObj, "s
4f40: 65 6c 66 53 69 67 6e 65 64 22 2c 20 78 66 6c 61  elfSigned", xfla
4f50: 67 73 20 26 20 45 58 46 4c 41 47 5f 53 53 29 3b  gs & EXFLAG_SS);
4f60: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f  .    LAPPEND_BOO
4f70: 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  L(interp, result
4f80: 4f 62 6a 2c 20 22 69 73 50 72 6f 78 79 43 65 72  Obj, "isProxyCer
4f90: 74 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58 46  t", xflags & EXF
4fa0: 4c 41 47 5f 50 52 4f 58 59 29 3b 0a 20 20 20 20  LAG_PROXY);.    
4fb0: 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
4fc0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
4fd0: 22 65 78 74 49 6e 76 61 6c 69 64 22 2c 20 78 66  "extInvalid", xf
4fe0: 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 49 4e  lags & EXFLAG_IN
4ff0: 56 41 4c 49 44 29 3b 0a 20 20 20 20 4c 41 50 50  VALID);.    LAPP
5000: 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
5010: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 69 73 43   resultObj, "isC
5020: 41 43 65 72 74 22 2c 20 58 35 30 39 5f 63 68 65  ACert", X509_che
5030: 63 6b 5f 63 61 28 63 65 72 74 29 29 3b 0a 0a 20  ck_ca(cert));.. 
5040: 20 20 20 2f 2a 20 54 68 65 20 55 6e 69 71 75 65     /* The Unique
5050: 20 49 64 73 20 61 72 65 20 75 73 65 64 20 74 6f   Ids are used to
5060: 20 68 61 6e 64 6c 65 20 74 68 65 20 70 6f 73 73   handle the poss
5070: 69 62 69 6c 69 74 79 20 6f 66 20 72 65 75 73 65  ibility of reuse
5080: 20 6f 66 20 73 75 62 6a 65 63 74 0a 09 61 6e 64   of subject..and
5090: 2f 6f 72 20 69 73 73 75 65 72 20 6e 61 6d 65 73  /or issuer names
50a0: 20 6f 76 65 72 20 74 69 6d 65 2e 20 52 46 43 20   over time. RFC 
50b0: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31  5280 section 4.1
50c0: 2e 32 2e 38 20 2a 2f 0a 20 20 20 20 7b 0a 09 63  .2.8 */.    {..c
50d0: 6f 6e 73 74 20 41 53 4e 31 5f 42 49 54 5f 53 54  onst ASN1_BIT_ST
50e0: 52 49 4e 47 20 2a 69 75 69 64 2c 20 2a 73 75 69  RING *iuid, *sui
50f0: 64 3b 0a 09 58 35 30 39 5f 67 65 74 30 5f 75 69  d;..X509_get0_ui
5100: 64 73 28 63 65 72 74 2c 20 26 69 75 69 64 2c 20  ds(cert, &iuid, 
5110: 26 73 75 69 64 29 3b 0a 0a 09 54 63 6c 5f 4c 69  &suid);...Tcl_Li
5120: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5130: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  nt(interp, resul
5140: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tObj, Tcl_NewStr
5150: 69 6e 67 4f 62 6a 28 22 69 73 73 75 65 72 55 6e  ingObj("issuerUn
5160: 69 71 75 65 49 64 22 2c 20 2d 31 29 29 3b 0a 09  iqueId", -1));..
5170: 69 66 20 28 69 75 69 64 20 21 3d 20 4e 55 4c 4c  if (iuid != NULL
5180: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
5190: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
51a0: 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  t(interp, result
51b0: 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  Obj, Tcl_NewByte
51c0: 41 72 72 61 79 4f 62 6a 28 28 63 6f 6e 73 74 20  ArrayObj((const 
51d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
51e0: 69 75 69 64 2d 3e 64 61 74 61 2c 20 28 54 63 6c  iuid->data, (Tcl
51f0: 5f 53 69 7a 65 29 20 69 75 69 64 2d 3e 6c 65 6e  _Size) iuid->len
5200: 67 74 68 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  gth));..} else {
5210: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
5220: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
5230: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
5240: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5250: 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  bj("", -1));..}.
5260: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
5270: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5280: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
5290: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
52a0: 73 75 62 6a 65 63 74 55 6e 69 71 75 65 49 64 22  subjectUniqueId"
52b0: 2c 20 2d 31 29 29 3b 0a 09 69 66 20 28 73 75 69  , -1));..if (sui
52c0: 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  d != NULL) {..  
52d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
52e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
52f0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63  p, resultObj, Tc
5300: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
5310: 6a 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  j((const unsigne
5320: 64 20 63 68 61 72 20 2a 29 73 75 69 64 2d 3e 64  d char *)suid->d
5330: 61 74 61 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  ata, (Tcl_Size) 
5340: 73 75 69 64 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a  suid->length));.
5350: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54  .} else {..    T
5360: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5370: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
5380: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e  resultObj, Tcl_N
5390: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20  ewStringObj("", 
53a0: 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  -1));..}.    }..
53b0: 20 20 20 20 2f 2a 20 58 35 30 39 20 76 33 20 45      /* X509 v3 E
53c0: 78 74 65 6e 73 69 6f 6e 73 20 2d 20 52 46 43 20  xtensions - RFC 
53d0: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31  5280 section 4.1
53e0: 2e 32 2e 39 20 2a 2f 0a 20 20 20 20 4c 41 50 50  .2.9 */.    LAPP
53f0: 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
5400: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74 43  resultObj, "extC
5410: 6f 75 6e 74 22 2c 20 58 35 30 39 5f 67 65 74 5f  ount", X509_get_
5420: 65 78 74 5f 63 6f 75 6e 74 28 63 65 72 74 29 29  ext_count(cert))
5430: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42  ;.    LAPPEND_OB
5440: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  J(interp, result
5450: 4f 62 6a 2c 20 22 65 78 74 65 6e 73 69 6f 6e 73  Obj, "extensions
5460: 22 2c 20 54 6c 73 5f 78 35 30 39 45 78 74 65 6e  ", Tls_x509Exten
5470: 73 69 6f 6e 73 28 69 6e 74 65 72 70 2c 20 63 65  sions(interp, ce
5480: 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 75  rt));..    /* Au
5490: 74 68 6f 72 69 74 79 20 4b 65 79 20 49 64 65 6e  thority Key Iden
54a0: 74 69 66 69 65 72 20 28 41 4b 49 29 20 69 73 20  tifier (AKI) is 
54b0: 74 68 65 20 53 75 62 6a 65 63 74 20 4b 65 79 20  the Subject Key 
54c0: 49 64 65 6e 74 69 66 69 65 72 20 28 53 4b 49 29  Identifier (SKI)
54d0: 20 6f 66 0a 09 69 74 73 20 73 69 67 6e 65 72 20   of..its signer 
54e0: 28 74 68 65 20 43 41 29 2e 20 52 46 43 20 35 32  (the CA). RFC 52
54f0: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31  80 section 4.2.1
5500: 2e 31 2c 20 4e 49 44 5f 61 75 74 68 6f 72 69 74  .1, NID_authorit
5510: 79 5f 6b 65 79 5f 69 64 65 6e 74 69 66 69 65 72  y_key_identifier
5520: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
5530: 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75  OBJ(interp, resu
5540: 6c 74 4f 62 6a 2c 20 22 61 75 74 68 6f 72 69 74  ltObj, "authorit
5550: 79 4b 65 79 49 64 65 6e 74 69 66 69 65 72 22 2c  yKeyIdentifier",
5560: 0a 09 54 6c 73 5f 78 35 30 39 49 64 65 6e 74 69  ..Tls_x509Identi
5570: 66 69 65 72 28 58 35 30 39 5f 67 65 74 30 5f 61  fier(X509_get0_a
5580: 75 74 68 6f 72 69 74 79 5f 6b 65 79 5f 69 64 28  uthority_key_id(
5590: 63 65 72 74 29 29 29 3b 0a 0a 20 20 20 20 2f 2a  cert)));..    /*
55a0: 20 53 75 62 6a 65 63 74 20 4b 65 79 20 49 64 65   Subject Key Ide
55b0: 6e 74 69 66 69 65 72 20 28 53 4b 49 29 20 69 73  ntifier (SKI) is
55c0: 20 75 73 65 64 20 74 6f 20 69 64 65 6e 74 69 66   used to identif
55d0: 79 20 63 65 72 74 69 66 69 63 61 74 65 73 20 74  y certificates t
55e0: 68 61 74 20 63 6f 6e 74 61 69 6e 0a 09 61 20 70  hat contain..a p
55f0: 61 72 74 69 63 75 6c 61 72 20 70 75 62 6c 69 63  articular public
5600: 20 6b 65 79 2e 20 52 46 43 20 35 32 38 30 20 73   key. RFC 5280 s
5610: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 32 2c 20  ection 4.2.1.2, 
5620: 4e 49 44 5f 73 75 62 6a 65 63 74 5f 6b 65 79 5f  NID_subject_key_
5630: 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a 20 20  identifier */.  
5640: 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e    LAPPEND_OBJ(in
5650: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
5660: 20 22 73 75 62 6a 65 63 74 4b 65 79 49 64 65 6e   "subjectKeyIden
5670: 74 69 66 69 65 72 22 2c 0a 09 54 6c 73 5f 78 35  tifier",..Tls_x5
5680: 30 39 49 64 65 6e 74 69 66 69 65 72 28 58 35 30  09Identifier(X50
5690: 39 5f 67 65 74 30 5f 73 75 62 6a 65 63 74 5f 6b  9_get0_subject_k
56a0: 65 79 5f 69 64 28 63 65 72 74 29 29 29 3b 0a 0a  ey_id(cert)));..
56b0: 20 20 20 20 2f 2a 20 4b 65 79 20 75 73 61 67 65      /* Key usage
56c0: 20 65 78 74 65 6e 73 69 6f 6e 20 64 65 66 69 6e   extension defin
56d0: 65 73 20 74 68 65 20 70 75 72 70 6f 73 65 20 28  es the purpose (
56e0: 65 2e 67 2e 2c 20 65 6e 63 69 70 68 65 72 6d 65  e.g., encipherme
56f0: 6e 74 2c 20 73 69 67 6e 61 74 75 72 65 2c 20 63  nt, signature, c
5700: 65 72 74 69 66 69 63 61 74 65 0a 09 73 69 67 6e  ertificate..sign
5710: 69 6e 67 29 20 6f 66 20 74 68 65 20 6b 65 79 20  ing) of the key 
5720: 69 6e 20 74 68 65 20 63 65 72 74 69 66 69 63 61  in the certifica
5730: 74 65 2e 20 52 46 43 20 35 32 38 30 20 73 65 63  te. RFC 5280 sec
5740: 74 69 6f 6e 20 34 2e 32 2e 31 2e 33 2c 20 4e 49  tion 4.2.1.3, NI
5750: 44 5f 6b 65 79 5f 75 73 61 67 65 20 2a 2f 0a 20  D_key_usage */. 
5760: 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69     LAPPEND_OBJ(i
5770: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a  nterp, resultObj
5780: 2c 20 22 6b 65 79 55 73 61 67 65 22 2c 20 54 6c  , "keyUsage", Tl
5790: 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65 28 69  s_x509KeyUsage(i
57a0: 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 78 66 6c  nterp, cert, xfl
57b0: 61 67 73 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ags));..    /* C
57c0: 65 72 74 69 66 69 63 61 74 65 20 50 6f 6c 69 63  ertificate Polic
57d0: 69 65 73 20 2d 20 69 6e 64 69 63 61 74 65 73 20  ies - indicates 
57e0: 74 68 65 20 69 73 73 75 69 6e 67 20 43 41 20 63  the issuing CA c
57f0: 6f 6e 73 69 64 65 72 73 20 69 74 73 20 69 73 73  onsiders its iss
5800: 75 65 72 44 6f 6d 61 69 6e 50 6f 6c 69 63 79 0a  uerDomainPolicy.
5810: 09 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74  .equivalent to t
5820: 68 65 20 73 75 62 6a 65 63 74 20 43 41 27 73 20  he subject CA's 
5830: 73 75 62 6a 65 63 74 44 6f 6d 61 69 6e 50 6f 6c  subjectDomainPol
5840: 69 63 79 2e 20 52 46 43 20 35 32 38 30 20 73 65  icy. RFC 5280 se
5850: 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 34 2c 20 4e  ction 4.2.1.4, N
5860: 49 44 5f 63 65 72 74 69 66 69 63 61 74 65 5f 70  ID_certificate_p
5870: 6f 6c 69 63 69 65 73 20 2a 2f 0a 20 20 20 20 69  olicies */.    i
5880: 66 20 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c  f (xflags & EXFL
5890: 41 47 5f 49 4e 56 41 4c 49 44 5f 50 4f 4c 49 43  AG_INVALID_POLIC
58a0: 59 29 20 7b 0a 09 2f 2a 20 52 65 6a 65 63 74 20  Y) {../* Reject 
58b0: 63 65 72 74 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20  cert */.    }.. 
58c0: 20 20 20 2f 2a 20 50 6f 6c 69 63 79 20 4d 61 70     /* Policy Map
58d0: 70 69 6e 67 73 20 2d 20 52 46 43 20 35 32 38 30  pings - RFC 5280
58e0: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 35   section 4.2.1.5
58f0: 2c 20 4e 49 44 5f 70 6f 6c 69 63 79 5f 6d 61 70  , NID_policy_map
5900: 70 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pings */..    /*
5910: 20 53 75 62 6a 65 63 74 20 41 6c 74 65 72 6e 61   Subject Alterna
5920: 74 69 76 65 20 4e 61 6d 65 20 28 53 41 4e 29 20  tive Name (SAN) 
5930: 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f  contains additio
5940: 6e 61 6c 20 55 52 4c 73 2c 20 44 4e 53 20 6e 61  nal URLs, DNS na
5950: 6d 65 73 2c 20 6f 72 20 49 50 0a 09 61 64 64 72  mes, or IP..addr
5960: 65 73 73 65 73 20 62 6f 75 6e 64 20 74 6f 20 63  esses bound to c
5970: 65 72 74 69 66 69 63 61 74 65 2e 20 52 46 43 20  ertificate. RFC 
5980: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32  5280 section 4.2
5990: 2e 31 2e 36 2c 20 4e 49 44 5f 73 75 62 6a 65 63  .1.6, NID_subjec
59a0: 74 5f 61 6c 74 5f 6e 61 6d 65 20 2a 2f 0a 20 20  t_alt_name */.  
59b0: 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e    LAPPEND_OBJ(in
59c0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c  terp, resultObj,
59d0: 20 22 73 75 62 6a 65 63 74 41 6c 74 4e 61 6d 65   "subjectAltName
59e0: 22 2c 20 54 6c 73 5f 78 35 30 39 4e 61 6d 65 73  ", Tls_x509Names
59f0: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 4e  (interp, cert, N
5a00: 49 44 5f 73 75 62 6a 65 63 74 5f 61 6c 74 5f 6e  ID_subject_alt_n
5a10: 61 6d 65 2c 20 62 69 6f 29 29 3b 0a 0a 20 20 20  ame, bio));..   
5a20: 20 2f 2a 20 49 73 73 75 65 72 20 41 6c 74 65 72   /* Issuer Alter
5a30: 6e 61 74 69 76 65 20 4e 61 6d 65 20 69 73 20 75  native Name is u
5a40: 73 65 64 20 74 6f 20 61 73 73 6f 63 69 61 74 65  sed to associate
5a50: 20 49 6e 74 65 72 6e 65 74 20 73 74 79 6c 65 20   Internet style 
5a60: 69 64 65 6e 74 69 74 69 65 73 0a 09 77 69 74 68  identities..with
5a70: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
5a80: 20 69 73 73 75 65 72 2e 20 52 46 43 20 35 32 38   issuer. RFC 528
5a90: 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e  0 section 4.2.1.
5aa0: 37 2c 20 4e 49 44 5f 69 73 73 75 65 72 5f 61 6c  7, NID_issuer_al
5ab0: 74 5f 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41  t_name */.    LA
5ac0: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70  PPEND_OBJ(interp
5ad0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 69 73  , resultObj, "is
5ae0: 73 75 65 72 41 6c 74 4e 61 6d 65 22 2c 20 54 6c  suerAltName", Tl
5af0: 73 5f 78 35 30 39 4e 61 6d 65 73 28 69 6e 74 65  s_x509Names(inte
5b00: 72 70 2c 20 63 65 72 74 2c 20 4e 49 44 5f 69 73  rp, cert, NID_is
5b10: 73 75 65 72 5f 61 6c 74 5f 6e 61 6d 65 2c 20 62  suer_alt_name, b
5b20: 69 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75  io));..    /* Su
5b30: 62 6a 65 63 74 20 44 69 72 65 63 74 6f 72 79 20  bject Directory 
5b40: 41 74 74 72 69 62 75 74 65 73 20 70 72 6f 76 69  Attributes provi
5b50: 64 65 73 20 69 64 65 6e 74 69 66 69 63 61 74 69  des identificati
5b60: 6f 6e 20 61 74 74 72 69 62 75 74 65 73 20 28 65  on attributes (e
5b70: 2e 67 2e 2c 20 6e 61 74 69 6f 6e 61 6c 69 74 79  .g., nationality
5b80: 29 0a 09 6f 66 20 74 68 65 20 73 75 62 6a 65 63  )..of the subjec
5b90: 74 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74  t. RFC 5280 sect
5ba0: 69 6f 6e 20 34 2e 32 2e 31 2e 38 20 28 73 75 62  ion 4.2.1.8 (sub
5bb0: 6a 65 63 74 44 69 72 65 63 74 6f 72 79 41 74 74  jectDirectoryAtt
5bc0: 72 69 62 75 74 65 73 29 20 2a 2f 0a 0a 20 20 20  ributes) */..   
5bd0: 20 2f 2a 20 42 61 73 69 63 20 43 6f 6e 73 74 72   /* Basic Constr
5be0: 61 69 6e 74 73 20 69 64 65 6e 74 69 66 69 65 73  aints identifies
5bf0: 20 77 68 65 74 68 65 72 20 74 68 65 20 73 75 62   whether the sub
5c00: 6a 65 63 74 20 6f 66 20 74 68 65 20 63 65 72 74  ject of the cert
5c10: 20 69 73 20 61 20 43 41 20 61 6e 64 0a 09 74 68   is a CA and..th
5c20: 65 20 6d 61 78 20 64 65 70 74 68 20 6f 66 20 76  e max depth of v
5c30: 61 6c 69 64 20 63 65 72 74 20 70 61 74 68 73 20  alid cert paths 
5c40: 66 6f 72 20 74 68 69 73 20 63 65 72 74 2e 20 52  for this cert. R
5c50: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20  FC 5280 section 
5c60: 34 2e 32 2e 31 2e 39 2c 20 4e 49 44 5f 62 61 73  4.2.1.9, NID_bas
5c70: 69 63 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ic_constraints *
5c80: 2f 0a 20 20 20 20 69 66 20 28 21 28 78 66 6c 61  /.    if (!(xfla
5c90: 67 73 20 26 20 45 58 46 4c 41 47 5f 50 52 4f 58  gs & EXFLAG_PROX
5ca0: 59 29 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 4c  Y)) {..LAPPEND_L
5cb0: 4f 4e 47 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ONG(interp, resu
5cc0: 6c 74 4f 62 6a 2c 20 22 70 61 74 68 4c 65 6e 22  ltObj, "pathLen"
5cd0: 2c 20 58 35 30 39 5f 67 65 74 5f 70 61 74 68 6c  , X509_get_pathl
5ce0: 65 6e 28 63 65 72 74 29 29 3b 0a 20 20 20 20 7d  en(cert));.    }
5cf0: 20 65 6c 73 65 20 7b 0a 09 4c 41 50 50 45 4e 44   else {..LAPPEND
5d00: 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 72 65  _LONG(interp, re
5d10: 73 75 6c 74 4f 62 6a 2c 20 22 70 61 74 68 4c 65  sultObj, "pathLe
5d20: 6e 22 2c 20 58 35 30 39 5f 67 65 74 5f 70 72 6f  n", X509_get_pro
5d30: 78 79 5f 70 61 74 68 6c 65 6e 28 63 65 72 74 29  xy_pathlen(cert)
5d40: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50  );.    }.    LAP
5d50: 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
5d60: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 62 61  , resultObj, "ba
5d70: 73 69 63 43 6f 6e 73 74 72 61 69 6e 74 73 43 41  sicConstraintsCA
5d80: 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c  ", xflags & EXFL
5d90: 41 47 5f 43 41 29 3b 0a 0a 20 20 20 20 2f 2a 20  AG_CA);..    /* 
5da0: 4e 61 6d 65 20 43 6f 6e 73 74 72 61 69 6e 74 73  Name Constraints
5db0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e   is only used in
5dc0: 20 43 41 20 63 65 72 74 73 20 74 6f 20 69 6e 64   CA certs to ind
5dd0: 69 63 61 74 65 20 74 68 65 20 6e 61 6d 65 20 73  icate the name s
5de0: 70 61 63 65 20 66 6f 72 0a 09 61 6c 6c 20 73 75  pace for..all su
5df0: 62 6a 65 63 74 20 6e 61 6d 65 73 20 69 6e 20 73  bject names in s
5e00: 75 62 73 65 71 75 65 6e 74 20 63 65 72 74 69 66  ubsequent certif
5e10: 69 63 61 74 65 73 20 69 6e 20 61 20 63 65 72 74  icates in a cert
5e20: 69 66 69 63 61 74 69 6f 6e 20 70 61 74 68 0a 09  ification path..
5e30: 4d 55 53 54 20 62 65 20 6c 6f 63 61 74 65 64 2e  MUST be located.
5e40: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f   RFC 5280 sectio
5e50: 6e 20 34 2e 32 2e 31 2e 31 30 2c 20 4e 49 44 5f  n 4.2.1.10, NID_
5e60: 6e 61 6d 65 5f 63 6f 6e 73 74 72 61 69 6e 74 73  name_constraints
5e70: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 50 6f 6c 69   */..    /* Poli
5e80: 63 79 20 43 6f 6e 73 74 72 61 69 6e 74 73 20 69  cy Constraints i
5e90: 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 43  s only used in C
5ea0: 41 20 63 65 72 74 73 20 74 6f 20 6c 69 6d 69 74  A certs to limit
5eb0: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 61   the length of a
5ec0: 0a 09 63 65 72 74 20 63 68 61 69 6e 20 66 6f 72  ..cert chain for
5ed0: 20 74 68 61 74 20 43 41 2e 20 52 46 43 20 35 32   that CA. RFC 52
5ee0: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31  80 section 4.2.1
5ef0: 2e 31 31 2c 20 4e 49 44 5f 70 6f 6c 69 63 79 5f  .11, NID_policy_
5f00: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a  constraints */..
5f10: 20 20 20 20 2f 2a 20 45 78 74 65 6e 64 65 64 20      /* Extended 
5f20: 4b 65 79 20 55 73 61 67 65 20 69 6e 64 69 63 61  Key Usage indica
5f30: 74 65 73 20 74 68 65 20 70 75 72 70 6f 73 65 73  tes the purposes
5f40: 20 74 68 65 20 63 65 72 74 69 66 69 65 64 20 70   the certified p
5f50: 75 62 6c 69 63 20 6b 65 79 20 6d 61 79 20 62 65  ublic key may be
5f60: 0a 09 75 73 65 64 2c 20 62 65 79 6f 6e 64 20 74  ..used, beyond t
5f70: 68 65 20 62 61 73 69 63 20 70 75 72 70 6f 73 65  he basic purpose
5f80: 73 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74  s. RFC 5280 sect
5f90: 69 6f 6e 20 34 2e 32 2e 31 2e 31 32 2c 20 4e 49  ion 4.2.1.12, NI
5fa0: 44 5f 65 78 74 5f 6b 65 79 5f 75 73 61 67 65 20  D_ext_key_usage 
5fb0: 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f  */.    LAPPEND_O
5fc0: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  BJ(interp, resul
5fd0: 74 4f 62 6a 2c 20 22 65 78 74 65 6e 64 65 64 4b  tObj, "extendedK
5fe0: 65 79 55 73 61 67 65 22 2c 20 54 6c 73 5f 78 35  eyUsage", Tls_x5
5ff0: 30 39 45 78 74 4b 65 79 55 73 61 67 65 28 69 6e  09ExtKeyUsage(in
6000: 74 65 72 70 2c 20 63 65 72 74 2c 20 78 66 6c 61  terp, cert, xfla
6010: 67 73 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 52  gs));..    /* CR
6020: 4c 20 44 69 73 74 72 69 62 75 74 69 6f 6e 20 50  L Distribution P
6030: 6f 69 6e 74 73 20 69 64 65 6e 74 69 66 69 65 73  oints identifies
6040: 20 77 68 65 72 65 20 43 52 4c 20 69 6e 66 6f 72   where CRL infor
6050: 6d 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 6f 62  mation can be ob
6060: 74 61 69 6e 65 64 2e 0a 09 52 46 43 20 35 32 38  tained...RFC 528
6070: 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e  0 section 4.2.1.
6080: 31 33 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44  13*/.    LAPPEND
6090: 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73  _OBJ(interp, res
60a0: 75 6c 74 4f 62 6a 2c 20 22 63 72 6c 44 69 73 74  ultObj, "crlDist
60b0: 72 69 62 75 74 69 6f 6e 50 6f 69 6e 74 73 22 2c  ributionPoints",
60c0: 20 54 6c 73 5f 78 35 30 39 43 72 6c 44 70 28 69   Tls_x509CrlDp(i
60d0: 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a  nterp, cert));..
60e0: 20 20 20 20 2f 2a 20 46 72 65 73 68 65 73 74 20      /* Freshest 
60f0: 43 52 4c 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f  CRL extension */
6100: 0a 20 20 20 20 69 66 20 28 78 66 6c 61 67 73 20  .    if (xflags 
6110: 26 20 45 58 46 4c 41 47 5f 46 52 45 53 48 45 53  & EXFLAG_FRESHES
6120: 54 29 20 7b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  T) {.    }..    
6130: 2f 2a 20 41 75 74 68 6f 72 69 74 79 20 49 6e 66  /* Authority Inf
6140: 6f 72 6d 61 74 69 6f 6e 20 41 63 63 65 73 73 20  ormation Access 
6150: 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 74 6f  indicates how to
6160: 20 61 63 63 65 73 73 20 69 6e 66 6f 20 61 6e 64   access info and
6170: 20 73 65 72 76 69 63 65 73 0a 09 66 6f 72 20 74   services..for t
6180: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69  he certificate i
6190: 73 73 75 65 72 2e 20 52 46 43 20 35 32 38 30 20  ssuer. RFC 5280 
61a0: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 32 2e 31 2c  section 4.2.2.1,
61b0: 20 4e 49 44 5f 69 6e 66 6f 5f 61 63 63 65 73 73   NID_info_access
61c0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4f 6e 2d 6c   */..    /* On-l
61d0: 69 6e 65 20 43 65 72 74 69 66 69 63 61 74 65 20  ine Certificate 
61e0: 53 74 61 74 75 73 20 50 72 6f 74 6f 63 6f 6c 20  Status Protocol 
61f0: 28 4f 53 43 50 29 20 52 65 73 70 6f 6e 64 65 72  (OSCP) Responder
6200: 73 20 55 52 4c 20 2a 2f 0a 20 20 20 20 4c 41 50  s URL */.    LAP
6210: 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c  PEND_OBJ(interp,
6220: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6f 63 73   resultObj, "ocs
6230: 70 52 65 73 70 6f 6e 64 65 72 73 22 2c 20 54 6c  pResponders", Tl
6240: 73 5f 78 35 30 39 4f 73 63 70 28 69 6e 74 65 72  s_x509Oscp(inter
6250: 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 20 20  p, cert));..    
6260: 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65 20 41  /* Certificate A
6270: 75 74 68 6f 72 69 74 79 20 28 43 41 29 20 49 73  uthority (CA) Is
6280: 73 75 65 72 73 20 55 52 4c 20 2a 2f 0a 20 20 20  suers URL */.   
6290: 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74   LAPPEND_OBJ(int
62a0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
62b0: 22 63 61 49 73 73 75 65 72 73 22 2c 20 54 6c 73  "caIssuers", Tls
62c0: 5f 78 35 30 39 43 61 49 73 73 75 65 72 73 28 69  _x509CaIssuers(i
62d0: 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a  nterp, cert));..
62e0: 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 49      /* Subject I
62f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 41 63 63 65 73  nformation Acces
6300: 73 20 2d 20 52 46 43 20 35 32 38 30 20 73 65 63  s - RFC 5280 sec
6310: 74 69 6f 6e 20 34 2e 32 2e 32 2e 32 2c 20 4e 49  tion 4.2.2.2, NI
6320: 44 5f 73 69 6e 66 6f 5f 61 63 63 65 73 73 20 2a  D_sinfo_access *
6330: 2f 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66  /..    /* Certif
6340: 69 63 61 74 65 20 41 6c 69 61 73 2e 20 49 66 20  icate Alias. If 
6350: 75 73 65 73 20 61 20 50 4b 43 53 23 31 32 20 73  uses a PKCS#12 s
6360: 74 72 75 63 74 75 72 65 2c 20 61 6c 69 61 73 20  tructure, alias 
6370: 77 69 6c 6c 20 72 65 66 6c 65 63 74 20 74 68 65  will reflect the
6380: 0a 09 66 72 69 65 6e 64 6c 79 4e 61 6d 65 20 61  ..friendlyName a
6390: 74 74 72 69 62 75 74 65 20 28 52 46 43 20 32 39  ttribute (RFC 29
63a0: 38 35 29 2e 20 2a 2f 0a 20 20 20 20 7b 0a 09 69  85). */.    {..i
63b0: 6e 74 20 69 6c 65 6e 20 3d 20 30 3b 0a 09 75 6e  nt ilen = 0;..un
63c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 74 72  signed char *str
63d0: 69 6e 67 20 3d 20 58 35 30 39 5f 61 6c 69 61 73  ing = X509_alias
63e0: 5f 67 65 74 30 28 63 65 72 74 2c 20 26 69 6c 65  _get0(cert, &ile
63f0: 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  n);..LAPPEND_STR
6400: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
6410: 62 6a 2c 20 22 61 6c 69 61 73 22 2c 20 28 63 68  bj, "alias", (ch
6420: 61 72 20 2a 29 20 73 74 72 69 6e 67 2c 20 28 54  ar *) string, (T
6430: 63 6c 5f 53 69 7a 65 29 20 69 6c 65 6e 29 3b 0a  cl_Size) ilen);.
6440: 09 73 74 72 69 6e 67 20 3d 20 58 35 30 39 5f 6b  .string = X509_k
6450: 65 79 69 64 5f 67 65 74 30 28 63 65 72 74 2c 20  eyid_get0(cert, 
6460: 26 69 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44  &ilen);..LAPPEND
6470: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73  _STR(interp, res
6480: 75 6c 74 4f 62 6a 2c 20 22 6b 65 79 49 64 22 2c  ultObj, "keyId",
6490: 20 28 63 68 61 72 20 2a 29 20 73 74 72 69 6e 67   (char *) string
64a0: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 69 6c 65  , (Tcl_Size) ile
64b0: 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  n);.    }..    /
64c0: 2a 20 43 65 72 74 69 66 69 63 61 74 65 20 61 6e  * Certificate an
64d0: 64 20 64 75 6d 70 20 61 6c 6c 20 64 61 74 61 20  d dump all data 
64e0: 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 6c 29 20  */.    if (all) 
64f0: 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 61 6c 6c 4f  {..Tcl_Obj *allO
6500: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  bj = Tcl_NewByte
6510: 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c 2c 20 30  ArrayObj(NULL, 0
6520: 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 65 72  );..Tcl_Obj *cer
6530: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79  tObj = Tcl_NewBy
6540: 74 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c 2c  teArrayObj(NULL,
6550: 20 30 29 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63   0);..unsigned c
6560: 68 61 72 20 2a 61 6c 6c 53 74 72 2c 20 2a 63 65  har *allStr, *ce
6570: 72 74 53 74 72 3b 0a 0a 09 69 66 20 28 61 6c 6c  rtStr;...if (all
6580: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63  Obj == NULL || c
6590: 65 72 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20  ertObj == NULL) 
65a0: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72 52  {..    Tcl_DecrR
65b0: 65 66 43 6f 75 6e 74 28 61 6c 6c 4f 62 6a 29 3b  efCount(allObj);
65c0: 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62  ..    BIO_free(b
65d0: 69 6f 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65  io);..    ckfree
65e0: 28 62 75 66 66 65 72 29 3b 0a 09 20 20 20 20 72  (buffer);..    r
65f0: 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b  eturn resultObj;
6600: 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 63 65 72  ..}.../* Get cer
6610: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 63 65 72  tificate */..cer
6620: 74 53 74 72 20 3d 20 54 63 6c 5f 53 65 74 42 79  tStr = Tcl_SetBy
6630: 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 63 65  teArrayLength(ce
6640: 72 74 4f 62 6a 2c 20 43 45 52 54 5f 53 54 52 5f  rtObj, CERT_STR_
6650: 53 49 5a 45 29 3b 0a 09 6c 65 6e 20 3d 20 42 49  SIZE);..len = BI
6660: 4f 5f 74 6f 5f 42 75 66 66 65 72 28 50 45 4d 5f  O_to_Buffer(PEM_
6670: 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 62  write_bio_X509(b
6680: 69 6f 2c 20 63 65 72 74 29 2c 20 62 69 6f 2c 20  io, cert), bio, 
6690: 63 65 72 74 53 74 72 2c 20 43 45 52 54 5f 53 54  certStr, CERT_ST
66a0: 52 5f 53 49 5a 45 29 3b 0a 09 54 63 6c 5f 53 65  R_SIZE);..Tcl_Se
66b0: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68  tByteArrayLength
66c0: 28 63 65 72 74 4f 62 6a 2c 20 6c 65 6e 29 3b 0a  (certObj, len);.
66d0: 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74  .LAPPEND_OBJ(int
66e0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
66f0: 22 63 65 72 74 69 66 69 63 61 74 65 22 2c 20 63  "certificate", c
6700: 65 72 74 4f 62 6a 29 0a 0a 09 2f 2a 20 47 65 74  ertObj).../* Get
6710: 20 61 6c 6c 20 69 6e 66 6f 20 6f 6e 20 63 65 72   all info on cer
6720: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 61 6c 6c  tificate */..all
6730: 53 74 72 20 3d 20 54 63 6c 5f 53 65 74 42 79 74  Str = Tcl_SetByt
6740: 65 41 72 72 61 79 4c 65 6e 67 74 68 28 61 6c 6c  eArrayLength(all
6750: 4f 62 6a 2c 20 43 45 52 54 5f 53 54 52 5f 53 49  Obj, CERT_STR_SI
6760: 5a 45 20 2a 20 32 29 3b 0a 09 6c 65 6e 20 3d 20  ZE * 2);..len = 
6770: 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 58 35  BIO_to_Buffer(X5
6780: 30 39 5f 70 72 69 6e 74 5f 65 78 28 62 69 6f 2c  09_print_ex(bio,
6790: 20 63 65 72 74 2c 20 66 6c 61 67 73 2c 20 30 29   cert, flags, 0)
67a0: 2c 20 62 69 6f 2c 20 61 6c 6c 53 74 72 2c 20 43  , bio, allStr, C
67b0: 45 52 54 5f 53 54 52 5f 53 49 5a 45 20 2a 20 32  ERT_STR_SIZE * 2
67c0: 29 3b 0a 09 54 63 6c 5f 53 65 74 42 79 74 65 41  );..Tcl_SetByteA
67d0: 72 72 61 79 4c 65 6e 67 74 68 28 61 6c 6c 4f 62  rrayLength(allOb
67e0: 6a 2c 20 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e  j, len);..LAPPEN
67f0: 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65  D_OBJ(interp, re
6800: 73 75 6c 74 4f 62 6a 2c 20 22 61 6c 6c 22 2c 20  sultObj, "all", 
6810: 61 6c 6c 4f 62 6a 29 0a 20 20 20 20 7d 0a 0a 20  allObj).    }.. 
6820: 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29     BIO_free(bio)
6830: 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 75 66  ;.    ckfree(buf
6840: 66 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  fer);.    return
6850: 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a         resultObj;.}.