Hex Artifact Content

Artifact c0c6da8f728ec3983ea037fd20d92c704b98037af00099b89cc7351e563ffb1a:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 32 30 30 30 20 53 65  (C) 1997-2000 Se
0020: 6e 73 75 73 20 43 6f 6e 73 75 6c 74 69 6e 67 20  nsus Consulting 
0030: 4c 74 64 2e 0a 20 2a 20 4d 61 74 74 20 4e 65 77  Ltd.. * Matt New
0040: 6d 61 6e 20 3c 6d 61 74 74 40 73 65 6e 73 75 73  man <matt@sensus
0050: 2e 6f 72 67 3e 0a 20 2a 20 43 6f 70 79 72 69 67  .org>. * Copyrig
0060: 68 74 20 28 43 29 20 32 30 32 33 20 42 72 69 61  ht (C) 2023 Bria
0070: 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 2f 0a 23 69  n O'Hagan. */.#i
0080: 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23  nclude <tcl.h>.#
0090: 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68  include <stdio.h
00a0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  >.#include <open
00b0: 73 73 6c 2f 62 69 6f 2e 68 3e 0a 23 69 6e 63 6c  ssl/bio.h>.#incl
00c0: 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 68 61  ude <openssl/sha
00d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70  .h>.#include <op
00e0: 65 6e 73 73 6c 2f 78 35 30 39 2e 68 3e 0a 23 69  enssl/x509.h>.#i
00f0: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0100: 78 35 30 39 76 33 2e 68 3e 0a 23 69 6e 63 6c 75  x509v3.h>.#inclu
0110: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 61 73 6e 31  de <openssl/asn1
0120: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c  .h>.#include "tl
0130: 73 49 6e 74 2e 68 22 0a 0a 2f 2a 20 44 65 66 69  sInt.h"../* Defi
0140: 6e 65 20 6d 61 78 69 6d 75 6d 20 63 65 72 74 69  ne maximum certi
0150: 66 69 63 61 74 65 20 73 69 7a 65 2e 20 4d 61 78  ficate size. Max
0160: 20 50 45 4d 20 73 69 7a 65 20 31 30 30 6b 42 20   PEM size 100kB 
0170: 61 6e 64 20 44 45 52 20 73 69 7a 65 20 69 73 20  and DER size is 
0180: 32 34 6b 42 2e 20 2a 2f 0a 23 64 65 66 69 6e 65  24kB. */.#define
0190: 20 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 20 33   CERT_STR_SIZE 3
01a0: 32 37 36 38 0a 0a 2f 2a 20 43 6f 6d 6d 6f 6e 20  2768../* Common 
01b0: 6d 61 63 72 6f 73 20 2a 2f 0a 23 64 65 66 69 6e  macros */.#defin
01c0: 65 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  e LAPPEND_STR(in
01d0: 74 65 72 70 2c 20 6f 62 6a 2c 20 74 65 78 74 2c  terp, obj, text,
01e0: 20 76 61 6c 75 65 2c 20 73 69 7a 65 29 20 7b 5c   value, size) {\
01f0: 0a 20 20 20 20 69 66 20 28 74 65 78 74 20 21 3d  .    if (text !=
0200: 20 4e 55 4c 4c 29 20 54 63 6c 5f 4c 69 73 74 4f   NULL) Tcl_ListO
0210: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
0220: 69 6e 74 65 72 70 2c 20 6f 62 6a 2c 20 54 63 6c  interp, obj, Tcl
0230: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 65  _NewStringObj(te
0240: 78 74 2c 20 2d 31 29 29 3b 20 5c 0a 20 20 20 20  xt, -1)); \.    
0250: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
0260: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
0270: 20 6f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72   obj, Tcl_NewStr
0280: 69 6e 67 4f 62 6a 28 76 61 6c 75 65 2c 20 73 69  ingObj(value, si
0290: 7a 65 29 29 3b 20 5c 0a 7d 0a 23 64 65 66 69 6e  ze)); \.}.#defin
02a0: 65 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  e LAPPEND_INT(in
02b0: 74 65 72 70 2c 20 6f 62 6a 2c 20 74 65 78 74 2c  terp, obj, text,
02c0: 20 76 61 6c 75 65 29 20 7b 5c 0a 20 20 20 20 69   value) {\.    i
02d0: 66 20 28 74 65 78 74 20 21 3d 20 4e 55 4c 4c 29  f (text != NULL)
02e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
02f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
0300: 2c 20 6f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74  , obj, Tcl_NewSt
0310: 72 69 6e 67 4f 62 6a 28 74 65 78 74 2c 20 2d 31  ringObj(text, -1
0320: 29 29 3b 20 5c 0a 20 20 20 20 54 63 6c 5f 4c 69  )); \.    Tcl_Li
0330: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
0340: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 2c 20  nt(interp, obj, 
0350: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 61  Tcl_NewIntObj(va
0360: 6c 75 65 29 29 3b 20 5c 0a 7d 0a 23 64 65 66 69  lue)); \.}.#defi
0370: 6e 65 20 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28  ne LAPPEND_LONG(
0380: 69 6e 74 65 72 70 2c 20 6f 62 6a 2c 20 74 65 78  interp, obj, tex
0390: 74 2c 20 76 61 6c 75 65 29 20 7b 5c 0a 20 20 20  t, value) {\.   
03a0: 20 69 66 20 28 74 65 78 74 20 21 3d 20 4e 55 4c   if (text != NUL
03b0: 4c 29 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  L) Tcl_ListObjAp
03c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
03d0: 72 70 2c 20 6f 62 6a 2c 20 54 63 6c 5f 4e 65 77  rp, obj, Tcl_New
03e0: 53 74 72 69 6e 67 4f 62 6a 28 74 65 78 74 2c 20  StringObj(text, 
03f0: 2d 31 29 29 3b 20 5c 0a 20 20 20 20 54 63 6c 5f  -1)); \.    Tcl_
0400: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
0410: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
0420: 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a  , Tcl_NewLongObj
0430: 28 76 61 6c 75 65 29 29 3b 20 5c 0a 7d 0a 23 64  (value)); \.}.#d
0440: 65 66 69 6e 65 20 4c 41 50 50 45 4e 44 5f 42 4f  efine LAPPEND_BO
0450: 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 2c 20  OL(interp, obj, 
0460: 74 65 78 74 2c 20 76 61 6c 75 65 29 20 7b 5c 0a  text, value) {\.
0470: 20 20 20 20 69 66 20 28 74 65 78 74 20 21 3d 20      if (text != 
0480: 4e 55 4c 4c 29 20 54 63 6c 5f 4c 69 73 74 4f 62  NULL) Tcl_ListOb
0490: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
04a0: 6e 74 65 72 70 2c 20 6f 62 6a 2c 20 54 63 6c 5f  nterp, obj, Tcl_
04b0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 65 78  NewStringObj(tex
04c0: 74 2c 20 2d 31 29 29 3b 20 5c 0a 20 20 20 20 54  t, -1)); \.    T
04d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
04e0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
04f0: 6f 62 6a 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  obj, Tcl_NewBool
0500: 65 61 6e 4f 62 6a 28 76 61 6c 75 65 29 29 3b 20  eanObj(value)); 
0510: 5c 0a 7d 0a 23 64 65 66 69 6e 65 20 4c 41 50 50  \.}.#define LAPP
0520: 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20  END_OBJ(interp, 
0530: 6f 62 6a 2c 20 74 65 78 74 2c 20 6c 69 73 74 4f  obj, text, listO
0540: 62 6a 29 20 7b 5c 0a 20 20 20 20 69 66 20 28 74  bj) {\.    if (t
0550: 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20 54 63 6c  ext != NULL) Tcl
0560: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
0570: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
0580: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  j, Tcl_NewString
0590: 4f 62 6a 28 74 65 78 74 2c 20 2d 31 29 29 3b 20  Obj(text, -1)); 
05a0: 5c 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  \.    Tcl_ListOb
05b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
05c0: 6e 74 65 72 70 2c 20 6f 62 6a 2c 20 6c 69 73 74  nterp, obj, list
05d0: 4f 62 6a 29 3b 20 5c 0a 7d 0a 0c 0a 2f 2a 0a 20  Obj); \.}.../*. 
05e0: 2a 20 42 69 6e 61 72 79 20 73 74 72 69 6e 67 20  * Binary string 
05f0: 74 6f 20 68 65 78 20 73 74 72 69 6e 67 0a 20 2a  to hex string. *
0600: 2f 0a 69 6e 74 20 53 74 72 69 6e 67 5f 74 6f 5f  /.int String_to_
0610: 48 65 78 28 63 68 61 72 2a 20 69 6e 70 75 74 2c  Hex(char* input,
0620: 20 69 6e 74 20 6c 65 6e 2c 20 63 68 61 72 20 2a   int len, char *
0630: 6f 75 74 70 75 74 2c 20 69 6e 74 20 73 69 7a 65  output, int size
0640: 29 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 75 6e  ) {.    int coun
0650: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 66 6f 72 20  t = 0;..    for 
0660: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (int i = 0; i < 
0670: 6c 65 6e 20 26 26 20 63 6f 75 6e 74 20 3c 20 73  len && count < s
0680: 69 7a 65 20 2d 20 31 3b 20 69 2b 2b 2c 20 63 6f  ize - 1; i++, co
0690: 75 6e 74 20 2b 3d 20 32 29 20 7b 0a 09 73 70 72  unt += 2) {..spr
06a0: 69 6e 74 66 28 6f 75 74 70 75 74 20 2b 20 63 6f  intf(output + co
06b0: 75 6e 74 2c 20 22 25 30 32 58 22 2c 20 69 6e 70  unt, "%02X", inp
06c0: 75 74 5b 69 5d 20 26 20 30 78 66 66 29 3b 0a 20  ut[i] & 0xff);. 
06d0: 20 20 20 7d 0a 20 20 20 20 6f 75 74 70 75 74 5b     }.    output[
06e0: 63 6f 75 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20  count] = 0;.    
06f0: 72 65 74 75 72 6e 20 63 6f 75 6e 74 3b 0a 7d 0a  return count;.}.
0700: 0a 2f 2a 0a 20 2a 20 42 49 4f 20 74 6f 20 42 75  ./*. * BIO to Bu
0710: 66 66 65 72 0a 20 2a 2f 0a 69 6e 74 20 42 49 4f  ffer. */.int BIO
0720: 5f 74 6f 5f 42 75 66 66 65 72 28 69 6e 74 20 72  _to_Buffer(int r
0730: 65 73 75 6c 74 2c 20 42 49 4f 20 2a 62 69 6f 2c  esult, BIO *bio,
0740: 20 76 6f 69 64 20 2a 62 75 66 66 65 72 2c 20 69   void *buffer, i
0750: 6e 74 20 73 69 7a 65 29 20 7b 0a 20 20 20 20 69  nt size) {.    i
0760: 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nt len = 0;.    
0770: 69 6e 74 20 70 65 6e 64 69 6e 67 20 3d 20 42 49  int pending = BI
0780: 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 3b 0a  O_pending(bio);.
0790: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 29  .    if (result)
07a0: 20 7b 0a 09 6c 65 6e 20 3d 20 42 49 4f 5f 72 65   {..len = BIO_re
07b0: 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20  ad(bio, buffer, 
07c0: 28 70 65 6e 64 69 6e 67 20 3c 20 73 69 7a 65 29  (pending < size)
07d0: 20 3f 20 70 65 6e 64 69 6e 67 20 3a 20 73 69 7a   ? pending : siz
07e0: 65 29 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f 66  e);..(void)BIO_f
07f0: 6c 75 73 68 28 62 69 6f 29 3b 0a 09 69 66 20 28  lush(bio);..if (
0800: 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 20 20 20 20  len < 0) {..    
0810: 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 20 20 20 20  len = 0;..}.    
0820: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
0830: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 47 65 74 20  ;.}.../*. * Get 
0840: 58 35 30 39 20 43 65 72 74 69 66 69 63 61 74 65  X509 Certificate
0850: 20 45 78 74 65 6e 73 69 6f 6e 73 0a 20 2a 2f 0a   Extensions. */.
0860: 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30  Tcl_Obj *Tls_x50
0870: 39 45 78 74 65 6e 73 69 6f 6e 73 28 54 63 6c 5f  9Extensions(Tcl_
0880: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
0890: 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20  X509 *cert) {.  
08a0: 20 20 63 6f 6e 73 74 20 53 54 41 43 4b 5f 4f 46    const STACK_OF
08b0: 28 58 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e 29  (X509_EXTENSION)
08c0: 20 2a 65 78 74 73 3b 0a 20 20 20 20 54 63 6c 5f   *exts;.    Tcl_
08d0: 4f 62 6a 20 2a 6c 69 73 74 50 74 72 20 3d 20 54  Obj *listPtr = T
08e0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
08f0: 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20   NULL);..    if 
0900: 28 6c 69 73 74 50 74 72 20 3d 3d 20 4e 55 4c 4c  (listPtr == NULL
0910: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  ) {..return NULL
0920: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
0930: 28 65 78 74 73 20 3d 20 58 35 30 39 5f 67 65 74  (exts = X509_get
0940: 30 5f 65 78 74 65 6e 73 69 6f 6e 73 28 63 65 72  0_extensions(cer
0950: 74 29 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20  t)) {..for (int 
0960: 69 3d 30 3b 20 69 20 3c 20 58 35 30 39 5f 67 65  i=0; i < X509_ge
0970: 74 5f 65 78 74 5f 63 6f 75 6e 74 28 63 65 72 74  t_ext_count(cert
0980: 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58  ); i++) {..    X
0990: 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e 20 2a 65  509_EXTENSION *e
09a0: 78 20 3d 20 73 6b 5f 58 35 30 39 5f 45 58 54 45  x = sk_X509_EXTE
09b0: 4e 53 49 4f 4e 5f 76 61 6c 75 65 28 65 78 74 73  NSION_value(exts
09c0: 2c 20 69 29 3b 0a 09 20 20 20 20 41 53 4e 31 5f  , i);..    ASN1_
09d0: 4f 42 4a 45 43 54 20 2a 6f 62 6a 20 3d 20 58 35  OBJECT *obj = X5
09e0: 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74  09_EXTENSION_get
09f0: 5f 6f 62 6a 65 63 74 28 65 78 29 3b 0a 09 20 20  _object(ex);..  
0a00: 20 20 2f 2a 20 41 53 4e 31 5f 4f 43 54 45 54 5f    /* ASN1_OCTET_
0a10: 53 54 52 49 4e 47 20 2a 64 61 74 61 20 3d 20 58  STRING *data = X
0a20: 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65  509_EXTENSION_ge
0a30: 74 5f 64 61 74 61 28 65 78 29 3b 20 2a 2f 0a 09  t_data(ex); */..
0a40: 20 20 20 20 69 6e 74 20 63 72 69 74 69 63 61 6c      int critical
0a50: 20 3d 20 58 35 30 39 5f 45 58 54 45 4e 53 49 4f   = X509_EXTENSIO
0a60: 4e 5f 67 65 74 5f 63 72 69 74 69 63 61 6c 28 65  N_get_critical(e
0a70: 78 29 3b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44  x);..    LAPPEND
0a80: 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6c 69  _BOOL(interp, li
0a90: 73 74 50 74 72 2c 20 4f 42 4a 5f 6e 69 64 32 6c  stPtr, OBJ_nid2l
0aa0: 6e 28 4f 42 4a 5f 6f 62 6a 32 6e 69 64 28 6f 62  n(OBJ_obj2nid(ob
0ab0: 6a 29 29 2c 20 63 72 69 74 69 63 61 6c 29 3b 0a  j)), critical);.
0ac0: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  .}.    }.    ret
0ad0: 75 72 6e 20 6c 69 73 74 50 74 72 3b 0a 7d 0a 0a  urn listPtr;.}..
0ae0: 2f 2a 0a 20 2a 20 47 65 74 20 41 75 74 68 6f 72  /*. * Get Author
0af0: 69 74 79 20 61 6e 64 20 53 75 62 6a 65 63 74 20  ity and Subject 
0b00: 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 73 0a  Key Identifiers.
0b10: 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73   */.Tcl_Obj *Tls
0b20: 5f 78 35 30 39 49 64 65 6e 74 69 66 69 65 72 28  _x509Identifier(
0b30: 41 53 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49 4e  ASN1_OCTET_STRIN
0b40: 47 20 2a 61 73 74 72 69 6e 67 29 20 7b 0a 20 20  G *astring) {.  
0b50: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c    Tcl_Obj *resul
0b60: 74 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  tPtr = NULL;.   
0b70: 20 69 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20   int len = 0;.  
0b80: 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 30    char buffer[10
0b90: 32 34 5d 3b 0a 0a 20 20 20 20 69 66 20 28 61 73  24];..    if (as
0ba0: 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 29 20 7b  tring != NULL) {
0bb0: 0a 09 6c 65 6e 20 3d 20 53 74 72 69 6e 67 5f 74  ..len = String_t
0bc0: 6f 5f 48 65 78 28 28 63 68 61 72 20 2a 29 41 53  o_Hex((char *)AS
0bd0: 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74 30 5f 64  N1_STRING_get0_d
0be0: 61 74 61 28 61 73 74 72 69 6e 67 29 2c 0a 09 20  ata(astring),.. 
0bf0: 20 20 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c     ASN1_STRING_l
0c00: 65 6e 67 74 68 28 61 73 74 72 69 6e 67 29 2c 20  ength(astring), 
0c10: 62 75 66 66 65 72 2c 20 31 30 32 34 29 3b 0a 20  buffer, 1024);. 
0c20: 20 20 20 7d 0a 20 20 20 20 72 65 73 75 6c 74 50     }.    resultP
0c30: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  tr = Tcl_NewStri
0c40: 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 6c 65  ngObj(buffer, le
0c50: 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  n);.    return r
0c60: 65 73 75 6c 74 50 74 72 3b 0a 7d 0a 0a 2f 2a 0a  esultPtr;.}../*.
0c70: 20 2a 20 47 65 74 20 4b 65 79 20 55 73 61 67 65   * Get Key Usage
0c80: 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c  . */.Tcl_Obj *Tl
0c90: 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65 28 54  s_x509KeyUsage(T
0ca0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0cb0: 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c 20 75  p, X509 *cert, u
0cc0: 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 73 29 20  int32_t xflags) 
0cd0: 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 75  {.    uint32_t u
0ce0: 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 74 5f  sage = X509_get_
0cf0: 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74 29 3b  key_usage(cert);
0d00: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69  .    Tcl_Obj *li
0d10: 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  stPtr = Tcl_NewL
0d20: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
0d30: 0a 0a 20 20 20 20 69 66 20 28 6c 69 73 74 50 74  ..    if (listPt
0d40: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  r == NULL) {..re
0d50: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
0d60: 0a 0a 20 20 20 20 69 66 20 28 28 78 66 6c 61 67  ..    if ((xflag
0d70: 73 20 26 20 45 58 46 4c 41 47 5f 4b 55 53 41 47  s & EXFLAG_KUSAG
0d80: 45 29 20 26 26 20 75 73 61 67 65 20 3c 20 30 78  E) && usage < 0x
0d90: 66 66 66 66 66 66 29 20 7b 0a 09 69 66 20 28 75  ffffff) {..if (u
0da0: 73 61 67 65 20 26 20 4b 55 5f 44 49 47 49 54 41  sage & KU_DIGITA
0db0: 4c 5f 53 49 47 4e 41 54 55 52 45 29 20 7b 0a 09  L_SIGNATURE) {..
0dc0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
0dd0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
0de0: 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63  erp, listPtr, Tc
0df0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
0e00: 44 69 67 69 74 61 6c 20 53 69 67 6e 61 74 75 72  Digital Signatur
0e10: 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66  e", -1));..}..if
0e20: 20 28 75 73 61 67 65 20 26 20 4b 55 5f 4e 4f 4e   (usage & KU_NON
0e30: 5f 52 45 50 55 44 49 41 54 49 4f 4e 29 20 7b 0a  _REPUDIATION) {.
0e40: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
0e50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
0e60: 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54  terp, listPtr, T
0e70: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
0e80: 22 4e 6f 6e 2d 52 65 70 75 64 69 61 74 69 6f 6e  "Non-Repudiation
0e90: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
0ea0: 28 75 73 61 67 65 20 26 20 4b 55 5f 4b 45 59 5f  (usage & KU_KEY_
0eb0: 45 4e 43 49 50 48 45 52 4d 45 4e 54 29 20 7b 0a  ENCIPHERMENT) {.
0ec0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
0ed0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
0ee0: 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54  terp, listPtr, T
0ef0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
0f00: 22 4b 65 79 20 45 6e 63 69 70 68 65 72 6d 65 6e  "Key Enciphermen
0f10: 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66  t", -1));..}..if
0f20: 20 28 75 73 61 67 65 20 26 20 4b 55 5f 44 41 54   (usage & KU_DAT
0f30: 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 29 20  A_ENCIPHERMENT) 
0f40: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
0f50: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
0f60: 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c  interp, listPtr,
0f70: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
0f80: 6a 28 22 44 61 74 61 20 45 6e 63 69 70 68 65 72  j("Data Encipher
0f90: 6d 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  ment", -1));..}.
0fa0: 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f  .if (usage & KU_
0fb0: 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 29 20 7b  KEY_AGREEMENT) {
0fc0: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
0fd0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
0fe0: 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20  nterp, listPtr, 
0ff0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1000: 28 22 4b 65 79 20 41 67 72 65 65 6d 65 6e 74 22  ("Key Agreement"
1010: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
1020: 75 73 61 67 65 20 26 20 4b 55 5f 4b 45 59 5f 43  usage & KU_KEY_C
1030: 45 52 54 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20  ERT_SIGN) {..   
1040: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1050: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1060: 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e  , listPtr, Tcl_N
1070: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 43 65 72  ewStringObj("Cer
1080: 74 69 66 69 63 61 74 65 20 53 69 67 6e 69 6e 67  tificate Signing
1090: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
10a0: 28 75 73 61 67 65 20 26 20 4b 55 5f 43 52 4c 5f  (usage & KU_CRL_
10b0: 53 49 47 4e 29 20 7b 0a 09 20 20 20 20 54 63 6c  SIGN) {..    Tcl
10c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10d0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
10e0: 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  stPtr, Tcl_NewSt
10f0: 72 69 6e 67 4f 62 6a 28 22 43 52 4c 20 53 69 67  ringObj("CRL Sig
1100: 6e 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  ning", -1));..}.
1110: 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f  .if (usage & KU_
1120: 45 4e 43 49 50 48 45 52 5f 4f 4e 4c 59 29 20 7b  ENCIPHER_ONLY) {
1130: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
1140: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1150: 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20  nterp, listPtr, 
1160: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1170: 28 22 45 6e 63 69 70 68 65 72 20 4f 6e 6c 79 22  ("Encipher Only"
1180: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
1190: 75 73 61 67 65 20 26 20 4b 55 5f 44 45 43 49 50  usage & KU_DECIP
11a0: 48 45 52 5f 4f 4e 4c 59 29 20 7b 0a 09 20 20 20  HER_ONLY) {..   
11b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
11c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11d0: 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e  , listPtr, Tcl_N
11e0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 44 65 63  ewStringObj("Dec
11f0: 69 70 68 65 72 20 4f 6e 6c 79 22 2c 20 2d 31 29  ipher Only", -1)
1200: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20  );..}.    }.    
1210: 72 65 74 75 72 6e 20 6c 69 73 74 50 74 72 3b 0a  return listPtr;.
1220: 7d 0a 0a 2f 2a 0a 20 2a 20 47 65 74 20 43 65 72  }../*. * Get Cer
1230: 74 69 66 69 63 61 74 65 20 50 75 72 70 6f 73 65  tificate Purpose
1240: 0a 20 2a 2f 0a 63 68 61 72 20 2a 54 6c 73 5f 78  . */.char *Tls_x
1250: 35 30 39 50 75 72 70 6f 73 65 28 58 35 30 39 20  509Purpose(X509 
1260: 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 63 68 61  *cert) {.    cha
1270: 72 20 2a 70 75 72 70 6f 73 65 20 3d 20 4e 55 4c  r *purpose = NUL
1280: 4c 3b 0a 0a 20 20 20 20 69 66 20 28 58 35 30 39  L;..    if (X509
1290: 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63  _check_purpose(c
12a0: 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53  ert, X509_PURPOS
12b0: 45 5f 53 53 4c 5f 43 4c 49 45 4e 54 2c 20 30 29  E_SSL_CLIENT, 0)
12c0: 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65   > 0) {..purpose
12d0: 20 3d 20 22 53 53 4c 20 43 6c 69 65 6e 74 22 3b   = "SSL Client";
12e0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
12f0: 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f  X509_check_purpo
1300: 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55  se(cert, X509_PU
1310: 52 50 4f 53 45 5f 53 53 4c 5f 53 45 52 56 45 52  RPOSE_SSL_SERVER
1320: 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72  , 0) > 0) {..pur
1330: 70 6f 73 65 20 3d 20 22 53 53 4c 20 53 65 72 76  pose = "SSL Serv
1340: 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  er";.    } else 
1350: 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70  if (X509_check_p
1360: 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30  urpose(cert, X50
1370: 39 5f 50 55 52 50 4f 53 45 5f 4e 53 5f 53 53 4c  9_PURPOSE_NS_SSL
1380: 5f 53 45 52 56 45 52 2c 20 30 29 20 3e 20 30 29  _SERVER, 0) > 0)
1390: 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 4d   {..purpose = "M
13a0: 53 53 20 53 53 4c 20 53 65 72 76 65 72 22 3b 0a  SS SSL Server";.
13b0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 58      } else if (X
13c0: 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73  509_check_purpos
13d0: 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52  e(cert, X509_PUR
13e0: 50 4f 53 45 5f 53 4d 49 4d 45 5f 53 49 47 4e 2c  POSE_SMIME_SIGN,
13f0: 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70   0) > 0) {..purp
1400: 6f 73 65 20 3d 20 22 53 4d 49 4d 45 20 53 69 67  ose = "SMIME Sig
1410: 6e 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73  ning";.    } els
1420: 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b  e if (X509_check
1430: 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58  _purpose(cert, X
1440: 35 30 39 5f 50 55 52 50 4f 53 45 5f 53 4d 49 4d  509_PURPOSE_SMIM
1450: 45 5f 45 4e 43 52 59 50 54 2c 20 30 29 20 3e 20  E_ENCRYPT, 0) > 
1460: 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20  0) {..purpose = 
1470: 22 53 4d 49 4d 45 20 45 6e 63 72 79 70 74 69 6f  "SMIME Encryptio
1480: 6e 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  n";.    } else i
1490: 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75  f (X509_check_pu
14a0: 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39  rpose(cert, X509
14b0: 5f 50 55 52 50 4f 53 45 5f 43 52 4c 5f 53 49 47  _PURPOSE_CRL_SIG
14c0: 4e 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75  N, 0) > 0) {..pu
14d0: 72 70 6f 73 65 20 3d 20 22 43 52 4c 20 53 69 67  rpose = "CRL Sig
14e0: 6e 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73  ning";.    } els
14f0: 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b  e if (X509_check
1500: 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58  _purpose(cert, X
1510: 35 30 39 5f 50 55 52 50 4f 53 45 5f 41 4e 59 2c  509_PURPOSE_ANY,
1520: 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70   0) > 0) {..purp
1530: 6f 73 65 20 3d 20 22 41 6e 79 22 3b 0a 20 20 20  ose = "Any";.   
1540: 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39   } else if (X509
1550: 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63  _check_purpose(c
1560: 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53  ert, X509_PURPOS
1570: 45 5f 4f 43 53 50 5f 48 45 4c 50 45 52 2c 20 30  E_OCSP_HELPER, 0
1580: 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73  ) > 0) {..purpos
1590: 65 20 3d 20 22 4f 43 53 50 20 48 65 6c 70 65 72  e = "OCSP Helper
15a0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ";.    } else if
15b0: 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72   (X509_check_pur
15c0: 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f  pose(cert, X509_
15d0: 50 55 52 50 4f 53 45 5f 54 49 4d 45 53 54 41 4d  PURPOSE_TIMESTAM
15e0: 50 5f 53 49 47 4e 2c 20 30 29 20 3e 20 30 29 20  P_SIGN, 0) > 0) 
15f0: 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 54 69  {..purpose = "Ti
1600: 6d 65 73 74 61 6d 70 20 53 69 67 6e 69 6e 67 22  mestamp Signing"
1610: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
1620: 70 75 72 70 6f 73 65 20 3d 20 22 22 3b 0a 20 20  purpose = "";.  
1630: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
1640: 75 72 70 6f 73 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  urpose;.}../*. *
1650: 20 46 6f 72 20 65 61 63 68 20 70 75 72 70 6f 73   For each purpos
1660: 65 2c 20 67 65 74 20 63 65 72 74 69 66 69 63 61  e, get certifica
1670: 74 65 20 61 70 70 6c 69 63 61 62 69 6c 69 74 79  te applicability
1680: 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c  . */.Tcl_Obj *Tl
1690: 73 5f 78 35 30 39 50 75 72 70 6f 73 65 73 28 54  s_x509Purposes(T
16a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
16b0: 70 2c 20 58 35 30 39 20 2a 63 65 72 74 29 20 7b  p, X509 *cert) {
16c0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69  .    Tcl_Obj *li
16d0: 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  stPtr = Tcl_NewL
16e0: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
16f0: 0a 20 20 20 20 58 35 30 39 5f 50 55 52 50 4f 53  .    X509_PURPOS
1700: 45 20 2a 70 74 6d 70 3b 0a 0a 20 20 20 20 69 66  E *ptmp;..    if
1710: 20 28 6c 69 73 74 50 74 72 20 3d 3d 20 4e 55 4c   (listPtr == NUL
1720: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  L) {..return NUL
1730: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f  L;.    }..    fo
1740: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20  r (int i = 0; i 
1750: 3c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67  < X509_PURPOSE_g
1760: 65 74 5f 63 6f 75 6e 74 28 29 3b 20 69 2b 2b 29  et_count(); i++)
1770: 20 7b 0a 09 70 74 6d 70 20 3d 20 58 35 30 39 5f   {..ptmp = X509_
1780: 50 55 52 50 4f 53 45 5f 67 65 74 30 28 69 29 3b  PURPOSE_get0(i);
1790: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 74 6d 70 50 74  ..Tcl_Obj *tmpPt
17a0: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
17b0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 66  bj(0, NULL);...f
17c0: 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a  or (int j = 0; j
17d0: 20 3c 20 32 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20   < 2; j++) {..  
17e0: 20 20 69 6e 74 20 69 64 72 65 74 20 3d 20 58 35    int idret = X5
17f0: 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65  09_check_purpose
1800: 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50  (cert, X509_PURP
1810: 4f 53 45 5f 67 65 74 5f 69 64 28 70 74 6d 70 29  OSE_get_id(ptmp)
1820: 2c 20 6a 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c  , j);..    Tcl_L
1830: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1840: 65 6e 74 28 69 6e 74 65 72 70 2c 20 74 6d 70 50  ent(interp, tmpP
1850: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1860: 67 4f 62 6a 28 6a 20 3f 20 22 43 41 22 20 3a 20  gObj(j ? "CA" : 
1870: 22 6e 6f 6e 43 41 22 2c 20 2d 31 29 29 3b 0a 09  "nonCA", -1));..
1880: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1890: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
18a0: 65 72 70 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c  erp, tmpPtr, Tcl
18b0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 69 64  _NewStringObj(id
18c0: 72 65 74 20 3d 3d 20 31 20 3f 20 22 59 65 73 22  ret == 1 ? "Yes"
18d0: 20 3a 20 22 4e 6f 22 2c 20 2d 31 29 29 3b 0a 09   : "No", -1));..
18e0: 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69  }..LAPPEND_OBJ(i
18f0: 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20  nterp, listPtr, 
1900: 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74  X509_PURPOSE_get
1910: 30 5f 6e 61 6d 65 28 70 74 6d 70 29 2c 20 74 6d  0_name(ptmp), tm
1920: 70 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pPtr);.    }.   
1930: 20 72 65 74 75 72 6e 20 6c 69 73 74 50 74 72 3b   return listPtr;
1940: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 47 65 74 20 53 75  .}../*. * Get Su
1950: 62 6a 65 63 74 20 41 6c 74 65 72 6e 61 74 65 20  bject Alternate 
1960: 4e 61 6d 65 73 20 28 53 41 4e 29 20 61 6e 64 20  Names (SAN) and 
1970: 49 73 73 75 65 72 20 41 6c 74 65 72 6e 61 74 65  Issuer Alternate
1980: 20 4e 61 6d 65 73 0a 20 2a 2f 0a 54 63 6c 5f 4f   Names. */.Tcl_O
1990: 62 6a 20 2a 54 6c 73 5f 78 35 30 39 4e 61 6d 65  bj *Tls_x509Name
19a0: 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  s(Tcl_Interp *in
19b0: 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74  terp, X509 *cert
19c0: 2c 20 69 6e 74 20 6e 69 64 2c 20 42 49 4f 20 2a  , int nid, BIO *
19d0: 62 69 6f 29 20 7b 0a 20 20 20 20 53 54 41 43 4b  bio) {.    STACK
19e0: 5f 4f 46 28 47 45 4e 45 52 41 4c 5f 4e 41 4d 45  _OF(GENERAL_NAME
19f0: 29 20 2a 6e 61 6d 65 73 3b 0a 20 20 20 20 54 63  ) *names;.    Tc
1a00: 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50 74 72 20 3d  l_Obj *listPtr =
1a10: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
1a20: 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 6e  0, NULL);.    in
1a30: 74 20 6c 65 6e 3b 0a 20 20 20 20 63 68 61 72 20  t len;.    char 
1a40: 62 75 66 66 65 72 5b 31 30 32 34 5d 3b 0a 0a 20  buffer[1024];.. 
1a50: 20 20 20 69 66 20 28 6c 69 73 74 50 74 72 20 3d     if (listPtr =
1a60: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
1a70: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
1a80: 20 20 20 69 66 20 28 6e 61 6d 65 73 20 3d 20 58     if (names = X
1a90: 35 30 39 5f 67 65 74 5f 65 78 74 5f 64 32 69 28  509_get_ext_d2i(
1aa0: 63 65 72 74 2c 20 6e 69 64 2c 20 4e 55 4c 4c 2c  cert, nid, NULL,
1ab0: 20 4e 55 4c 4c 29 29 20 7b 0a 09 66 6f 72 20 28   NULL)) {..for (
1ac0: 69 6e 74 20 69 3d 30 3b 20 69 20 3c 20 73 6b 5f  int i=0; i < sk_
1ad0: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 6e 75 6d  GENERAL_NAME_num
1ae0: 28 6e 61 6d 65 73 29 3b 20 69 2b 2b 29 20 7b 0a  (names); i++) {.
1af0: 09 20 20 20 20 63 6f 6e 73 74 20 47 45 4e 45 52  .    const GENER
1b00: 41 4c 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20  AL_NAME *name = 
1b10: 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f  sk_GENERAL_NAME_
1b20: 76 61 6c 75 65 28 6e 61 6d 65 73 2c 20 69 29 3b  value(names, i);
1b30: 0a 0a 09 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f  ...    len = BIO
1b40: 5f 74 6f 5f 42 75 66 66 65 72 28 6e 61 6d 65 20  _to_Buffer(name 
1b50: 26 26 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f  && GENERAL_NAME_
1b60: 70 72 69 6e 74 28 62 69 6f 2c 20 6e 61 6d 65 29  print(bio, name)
1b70: 2c 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 31  , bio, buffer, 1
1b80: 30 32 34 29 3b 0a 09 20 20 20 20 4c 41 50 50 45  024);..    LAPPE
1b90: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6c  ND_STR(interp, l
1ba0: 69 73 74 50 74 72 2c 20 4e 55 4c 4c 2c 20 62 75  istPtr, NULL, bu
1bb0: 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 09 7d 0a 09  ffer, len);..}..
1bc0: 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f  sk_GENERAL_NAME_
1bd0: 70 6f 70 5f 66 72 65 65 28 6e 61 6d 65 73 2c 20  pop_free(names, 
1be0: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 66 72 65  GENERAL_NAME_fre
1bf0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  e);.    }.    re
1c00: 74 75 72 6e 20 6c 69 73 74 50 74 72 3b 0a 7d 0a  turn listPtr;.}.
1c10: 0a 2f 2a 0a 20 2a 20 47 65 74 20 45 58 74 65 6e  ./*. * Get EXten
1c20: 64 65 64 20 4b 65 79 20 55 73 61 67 65 0a 20 2a  ded Key Usage. *
1c30: 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78  /.Tcl_Obj *Tls_x
1c40: 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 28 54  509ExtKeyUsage(T
1c50: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1c60: 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c 20 75  p, X509 *cert, u
1c70: 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 73 29 20  int32_t xflags) 
1c80: 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 75  {.    uint32_t u
1c90: 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 74 5f  sage = X509_get_
1ca0: 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74 29 3b  key_usage(cert);
1cb0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69  .    Tcl_Obj *li
1cc0: 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  stPtr = Tcl_NewL
1cd0: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
1ce0: 0a 0a 20 20 20 20 69 66 20 28 6c 69 73 74 50 74  ..    if (listPt
1cf0: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  r == NULL) {..re
1d00: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
1d10: 0a 0a 20 20 20 20 69 66 20 28 78 66 6c 61 67 73  ..    if (xflags
1d20: 20 26 20 45 58 46 4c 41 47 5f 58 4b 55 53 41 47   & EXFLAG_XKUSAG
1d30: 45 29 20 7b 0a 09 75 73 61 67 65 20 3d 20 58 35  E) {..usage = X5
1d40: 30 39 5f 67 65 74 5f 65 78 74 65 6e 64 65 64 5f  09_get_extended_
1d50: 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74 29 3b  key_usage(cert);
1d60: 0a 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58  ...if (usage & X
1d70: 4b 55 5f 53 53 4c 5f 53 45 52 56 45 52 29 20 7b  KU_SSL_SERVER) {
1d80: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
1d90: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1da0: 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20  nterp, listPtr, 
1db0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1dc0: 28 22 54 4c 53 20 57 65 62 20 53 65 72 76 65 72  ("TLS Web Server
1dd0: 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 22   Authentication"
1de0: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
1df0: 75 73 61 67 65 20 26 20 58 4b 55 5f 53 53 4c 5f  usage & XKU_SSL_
1e00: 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 54  CLIENT) {..    T
1e10: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1e20: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1e30: 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77  listPtr, Tcl_New
1e40: 53 74 72 69 6e 67 4f 62 6a 28 22 54 4c 53 20 57  StringObj("TLS W
1e50: 65 62 20 43 6c 69 65 6e 74 20 41 75 74 68 65 6e  eb Client Authen
1e60: 74 69 63 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b  tication", -1));
1e70: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26  ..}..if (usage &
1e80: 20 58 4b 55 5f 53 4d 49 4d 45 29 20 7b 0a 09 20   XKU_SMIME) {.. 
1e90: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1ea0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1eb0: 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c  rp, listPtr, Tcl
1ec0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 45  _NewStringObj("E
1ed0: 2d 6d 61 69 6c 20 50 72 6f 74 65 63 74 69 6f 6e  -mail Protection
1ee0: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
1ef0: 28 75 73 61 67 65 20 26 20 58 4b 55 5f 43 4f 44  (usage & XKU_COD
1f00: 45 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 20 54  E_SIGN) {..    T
1f10: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1f20: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1f30: 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77  listPtr, Tcl_New
1f40: 53 74 72 69 6e 67 4f 62 6a 28 22 43 6f 64 65 20  StringObj("Code 
1f50: 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 3b 0a  Signing", -1));.
1f60: 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20  .}..if (usage & 
1f70: 58 4b 55 5f 53 47 43 29 20 7b 0a 09 20 20 20 20  XKU_SGC) {..    
1f80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1f90: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1fa0: 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65   listPtr, Tcl_Ne
1fb0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 53 47 43 22  wStringObj("SGC"
1fc0: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
1fd0: 75 73 61 67 65 20 26 20 58 4b 55 5f 4f 43 53 50  usage & XKU_OCSP
1fe0: 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 20 54 63  _SIGN) {..    Tc
1ff0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2000: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
2010: 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  istPtr, Tcl_NewS
2020: 74 72 69 6e 67 4f 62 6a 28 22 4f 43 53 50 20 53  tringObj("OCSP S
2030: 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09  igning", -1));..
2040: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58  }..if (usage & X
2050: 4b 55 5f 54 49 4d 45 53 54 41 4d 50 29 20 7b 0a  KU_TIMESTAMP) {.
2060: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2070: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2080: 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54  terp, listPtr, T
2090: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
20a0: 22 54 69 6d 65 20 53 74 61 6d 70 69 6e 67 22 2c  "Time Stamping",
20b0: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75   -1));..}..if (u
20c0: 73 61 67 65 20 26 20 58 4b 55 5f 44 56 43 53 20  sage & XKU_DVCS 
20d0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
20e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
20f0: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74  t(interp, listPt
2100: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2110: 4f 62 6a 28 22 44 56 43 53 22 2c 20 2d 31 29 29  Obj("DVCS", -1))
2120: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20  ;..}..if (usage 
2130: 26 20 58 4b 55 5f 41 4e 59 45 4b 55 29 20 7b 0a  & XKU_ANYEKU) {.
2140: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2150: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2160: 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54  terp, listPtr, T
2170: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2180: 22 41 6e 79 20 45 78 74 65 6e 64 65 64 20 4b 65  "Any Extended Ke
2190: 79 20 55 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a  y Usage", -1));.
21a0: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  .}.    }.    ret
21b0: 75 72 6e 20 6c 69 73 74 50 74 72 3b 0a 7d 0a 0a  urn listPtr;.}..
21c0: 2f 2a 0a 20 2a 20 47 65 74 20 43 52 4c 20 44 69  /*. * Get CRL Di
21d0: 73 74 72 69 62 75 74 69 6f 6e 20 50 6f 69 6e 74  stribution Point
21e0: 73 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54  s. */.Tcl_Obj *T
21f0: 6c 73 5f 78 35 30 39 43 72 6c 44 70 28 54 63 6c  ls_x509CrlDp(Tcl
2200: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2210: 20 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20   X509 *cert) {. 
2220: 20 20 20 53 54 41 43 4b 5f 4f 46 28 44 49 53 54     STACK_OF(DIST
2230: 5f 50 4f 49 4e 54 29 20 2a 63 72 6c 3b 0a 20 20  _POINT) *crl;.  
2240: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50    Tcl_Obj *listP
2250: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
2260: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20  Obj(0, NULL);.. 
2270: 20 20 20 69 66 20 28 6c 69 73 74 50 74 72 20 3d     if (listPtr =
2280: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
2290: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
22a0: 20 20 20 69 66 20 28 63 72 6c 20 3d 20 58 35 30     if (crl = X50
22b0: 39 5f 67 65 74 5f 65 78 74 5f 64 32 69 28 63 65  9_get_ext_d2i(ce
22c0: 72 74 2c 20 4e 49 44 5f 63 72 6c 5f 64 69 73 74  rt, NID_crl_dist
22d0: 72 69 62 75 74 69 6f 6e 5f 70 6f 69 6e 74 73 2c  ribution_points,
22e0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 7b 0a   NULL, NULL)) {.
22f0: 09 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b 20 69  .for (int i=0; i
2300: 20 3c 20 73 6b 5f 44 49 53 54 5f 50 4f 49 4e 54   < sk_DIST_POINT
2310: 5f 6e 75 6d 28 63 72 6c 29 3b 20 69 2b 2b 29 20  _num(crl); i++) 
2320: 7b 0a 09 20 20 20 20 44 49 53 54 5f 50 4f 49 4e  {..    DIST_POIN
2330: 54 20 2a 64 70 20 3d 20 73 6b 5f 44 49 53 54 5f  T *dp = sk_DIST_
2340: 50 4f 49 4e 54 5f 76 61 6c 75 65 28 63 72 6c 2c  POINT_value(crl,
2350: 20 69 29 3b 0a 09 20 20 20 20 44 49 53 54 5f 50   i);..    DIST_P
2360: 4f 49 4e 54 5f 4e 41 4d 45 20 2a 64 69 73 74 70  OINT_NAME *distp
2370: 6f 69 6e 74 20 3d 20 64 70 2d 3e 64 69 73 74 70  oint = dp->distp
2380: 6f 69 6e 74 3b 0a 0a 09 20 20 20 20 69 66 20 28  oint;...    if (
2390: 64 69 73 74 70 6f 69 6e 74 2d 3e 74 79 70 65 20  distpoint->type 
23a0: 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 66 75 6c  == 0) {.../* ful
23b0: 6c 2d 6e 61 6d 65 20 47 45 4e 45 52 41 4c 49 5a  l-name GENERALIZ
23c0: 45 44 4e 41 4d 45 20 2a 2f 0a 09 09 66 6f 72 20  EDNAME */...for 
23d0: 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 3c 20  (int j = 0; j < 
23e0: 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f  sk_GENERAL_NAME_
23f0: 6e 75 6d 28 64 69 73 74 70 6f 69 6e 74 2d 3e 6e  num(distpoint->n
2400: 61 6d 65 2e 66 75 6c 6c 6e 61 6d 65 29 3b 20 6a  ame.fullname); j
2410: 2b 2b 29 20 7b 0a 09 09 20 20 20 20 47 45 4e 45  ++) {...    GENE
2420: 52 41 4c 5f 4e 41 4d 45 20 2a 67 65 6e 20 3d 20  RAL_NAME *gen = 
2430: 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f  sk_GENERAL_NAME_
2440: 76 61 6c 75 65 28 64 69 73 74 70 6f 69 6e 74 2d  value(distpoint-
2450: 3e 6e 61 6d 65 2e 66 75 6c 6c 6e 61 6d 65 2c 20  >name.fullname, 
2460: 6a 29 3b 0a 09 09 20 20 20 20 69 6e 74 20 74 79  j);...    int ty
2470: 70 65 3b 0a 09 09 20 20 20 20 41 53 4e 31 5f 53  pe;...    ASN1_S
2480: 54 52 49 4e 47 20 2a 75 72 69 20 3d 20 47 45 4e  TRING *uri = GEN
2490: 45 52 41 4c 5f 4e 41 4d 45 5f 67 65 74 30 5f 76  ERAL_NAME_get0_v
24a0: 61 6c 75 65 28 67 65 6e 2c 20 26 74 79 70 65 29  alue(gen, &type)
24b0: 3b 0a 09 09 20 20 20 20 69 66 20 28 74 79 70 65  ;...    if (type
24c0: 20 3d 3d 20 47 45 4e 5f 55 52 49 29 20 7b 0a 09   == GEN_URI) {..
24d0: 09 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
24e0: 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 4e  terp, listPtr, N
24f0: 55 4c 4c 2c 20 41 53 4e 31 5f 53 54 52 49 4e 47  ULL, ASN1_STRING
2500: 5f 67 65 74 30 5f 64 61 74 61 28 75 72 69 29 2c  _get0_data(uri),
2510: 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c 65 6e   ASN1_STRING_len
2520: 67 74 68 28 75 72 69 29 29 3b 0a 09 09 20 20 20  gth(uri));...   
2530: 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c   }...}..    } el
2540: 73 65 20 69 66 20 28 64 69 73 74 70 6f 69 6e 74  se if (distpoint
2550: 2d 3e 74 79 70 65 20 3d 3d 20 31 29 20 7b 0a 09  ->type == 1) {..
2560: 09 2f 2a 20 72 65 6c 61 74 69 76 65 2d 6e 61 6d  ./* relative-nam
2570: 65 20 58 35 30 39 4e 41 4d 45 20 2a 2f 0a 09 09  e X509NAME */...
2580: 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41  STACK_OF(X509_NA
2590: 4d 45 5f 45 4e 54 52 59 29 20 2a 73 6b 5f 72 65  ME_ENTRY) *sk_re
25a0: 6c 6e 61 6d 65 20 3d 20 64 69 73 74 70 6f 69 6e  lname = distpoin
25b0: 74 2d 3e 6e 61 6d 65 2e 72 65 6c 61 74 69 76 65  t->name.relative
25c0: 6e 61 6d 65 3b 0a 09 09 66 6f 72 20 28 69 6e 74  name;...for (int
25d0: 20 6a 20 3d 20 30 3b 20 6a 20 3c 20 73 6b 5f 58   j = 0; j < sk_X
25e0: 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 5f 6e  509_NAME_ENTRY_n
25f0: 75 6d 28 73 6b 5f 72 65 6c 6e 61 6d 65 29 3b 20  um(sk_relname); 
2600: 6a 2b 2b 29 20 7b 0a 09 09 20 20 20 20 58 35 30  j++) {...    X50
2610: 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 20 2a 65 20  9_NAME_ENTRY *e 
2620: 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 45  = sk_X509_NAME_E
2630: 4e 54 52 59 5f 76 61 6c 75 65 28 73 6b 5f 72 65  NTRY_value(sk_re
2640: 6c 6e 61 6d 65 2c 20 6a 29 3b 0a 09 09 20 20 20  lname, j);...   
2650: 20 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 64 20   ASN1_STRING *d 
2660: 3d 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52  = X509_NAME_ENTR
2670: 59 5f 67 65 74 5f 64 61 74 61 28 65 29 3b 0a 09  Y_get_data(e);..
2680: 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
2690: 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72  (interp, listPtr
26a0: 2c 20 4e 55 4c 4c 2c 20 41 53 4e 31 5f 53 54 52  , NULL, ASN1_STR
26b0: 49 4e 47 5f 64 61 74 61 28 64 29 2c 20 41 53 4e  ING_data(d), ASN
26c0: 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28  1_STRING_length(
26d0: 64 29 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a  d));...}..    }.
26e0: 09 7d 0a 09 43 52 4c 5f 44 49 53 54 5f 50 4f 49  .}..CRL_DIST_POI
26f0: 4e 54 53 5f 66 72 65 65 28 63 72 6c 29 3b 0a 20  NTS_free(crl);. 
2700: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2710: 6c 69 73 74 50 74 72 3b 0a 7d 0a 0a 2f 2a 0a 20  listPtr;.}../*. 
2720: 2a 20 47 65 74 20 4f 6e 2d 6c 69 6e 65 20 43 65  * Get On-line Ce
2730: 72 74 69 66 69 63 61 74 65 20 53 74 61 74 75 73  rtificate Status
2740: 20 50 72 6f 74 6f 63 6f 6c 20 28 4f 53 43 50 29   Protocol (OSCP)
2750: 20 55 52 4c 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a   URL. */.Tcl_Obj
2760: 20 2a 54 6c 73 5f 78 35 30 39 4f 73 63 70 28 54   *Tls_x509Oscp(T
2770: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2780: 70 2c 20 58 35 30 39 20 2a 63 65 72 74 29 20 7b  p, X509 *cert) {
2790: 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 4f 50  .    STACK_OF(OP
27a0: 45 4e 53 53 4c 5f 53 54 52 49 4e 47 29 20 2a 6f  ENSSL_STRING) *o
27b0: 63 73 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  csp;.    Tcl_Obj
27c0: 20 2a 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f   *listPtr = Tcl_
27d0: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
27e0: 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 6c 69  LL);..    if (li
27f0: 73 74 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b  stPtr == NULL) {
2800: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
2810: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6f 63     }..    if (oc
2820: 73 70 20 3d 20 58 35 30 39 5f 67 65 74 31 5f 6f  sp = X509_get1_o
2830: 63 73 70 28 63 65 72 74 29 29 20 7b 0a 09 66 6f  csp(cert)) {..fo
2840: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20  r (int i = 0; i 
2850: 3c 20 73 6b 5f 4f 50 45 4e 53 53 4c 5f 53 54 52  < sk_OPENSSL_STR
2860: 49 4e 47 5f 6e 75 6d 28 6f 63 73 70 29 3b 20 69  ING_num(ocsp); i
2870: 2b 2b 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 45  ++) {..    LAPPE
2880: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6c  ND_STR(interp, l
2890: 69 73 74 50 74 72 2c 20 4e 55 4c 4c 2c 20 73 6b  istPtr, NULL, sk
28a0: 5f 4f 50 45 4e 53 53 4c 5f 53 54 52 49 4e 47 5f  _OPENSSL_STRING_
28b0: 76 61 6c 75 65 28 6f 63 73 70 2c 20 69 29 2c 20  value(ocsp, i), 
28c0: 2d 31 29 3b 0a 09 7d 0a 09 58 35 30 39 5f 65 6d  -1);..}..X509_em
28d0: 61 69 6c 5f 66 72 65 65 28 6f 63 73 70 29 3b 0a  ail_free(ocsp);.
28e0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
28f0: 20 6c 69 73 74 50 74 72 3b 0a 7d 0a 0a 2f 2a 0a   listPtr;.}../*.
2900: 20 2a 20 47 65 74 20 43 65 72 74 69 66 69 63 61   * Get Certifica
2910: 74 65 20 41 75 74 68 6f 72 69 74 79 20 28 43 41  te Authority (CA
2920: 29 20 49 73 73 75 65 72 73 20 55 52 4c 0a 20 2a  ) Issuers URL. *
2930: 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78  /.Tcl_Obj *Tls_x
2940: 35 30 39 43 61 49 73 73 75 65 72 73 28 54 63 6c  509CaIssuers(Tcl
2950: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2960: 20 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20   X509 *cert) {. 
2970: 20 20 20 53 54 41 43 4b 5f 4f 46 28 41 43 43 45     STACK_OF(ACCE
2980: 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 29 20  SS_DESCRIPTION) 
2990: 2a 61 64 73 3b 0a 20 20 20 20 41 43 43 45 53 53  *ads;.    ACCESS
29a0: 5f 44 45 53 43 52 49 50 54 49 4f 4e 20 2a 61 64  _DESCRIPTION *ad
29b0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c  ;.    Tcl_Obj *l
29c0: 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  istPtr = Tcl_New
29d0: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
29e0: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
29f0: 68 61 72 20 2a 62 75 66 3b 0a 20 20 20 20 69 6e  har *buf;.    in
2a00: 74 20 6c 65 6e 3b 0a 0a 20 20 20 20 69 66 20 28  t len;..    if (
2a10: 61 64 73 20 3d 20 58 35 30 39 5f 67 65 74 5f 65  ads = X509_get_e
2a20: 78 74 5f 64 32 69 28 63 65 72 74 2c 20 4e 49 44  xt_d2i(cert, NID
2a30: 5f 69 6e 66 6f 5f 61 63 63 65 73 73 2c 20 4e 55  _info_access, NU
2a40: 4c 4c 2c 20 4e 55 4c 4c 29 29 20 7b 0a 09 66 6f  LL, NULL)) {..fo
2a50: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20  r (int i = 0; i 
2a60: 3c 20 73 6b 5f 41 43 43 45 53 53 5f 44 45 53 43  < sk_ACCESS_DESC
2a70: 52 49 50 54 49 4f 4e 5f 6e 75 6d 28 61 64 73 29  RIPTION_num(ads)
2a80: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 61 64  ; i++) {..    ad
2a90: 20 3d 20 73 6b 5f 41 43 43 45 53 53 5f 44 45 53   = sk_ACCESS_DES
2aa0: 43 52 49 50 54 49 4f 4e 5f 76 61 6c 75 65 28 61  CRIPTION_value(a
2ab0: 64 73 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20  ds, i);..    if 
2ac0: 28 4f 42 4a 5f 6f 62 6a 32 6e 69 64 28 61 64 2d  (OBJ_obj2nid(ad-
2ad0: 3e 6d 65 74 68 6f 64 29 20 3d 3d 20 4e 49 44 5f  >method) == NID_
2ae0: 61 64 5f 63 61 5f 69 73 73 75 65 72 73 20 26 26  ad_ca_issuers &&
2af0: 20 61 64 2d 3e 6c 6f 63 61 74 69 6f 6e 29 20 7b   ad->location) {
2b00: 0a 09 09 69 66 20 28 61 64 2d 3e 6c 6f 63 61 74  ...if (ad->locat
2b10: 69 6f 6e 2d 3e 74 79 70 65 20 3d 3d 20 47 45 4e  ion->type == GEN
2b20: 5f 55 52 49 29 20 7b 0a 09 09 20 20 20 20 6c 65  _URI) {...    le
2b30: 6e 20 3d 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f  n = ASN1_STRING_
2b40: 74 6f 5f 55 54 46 38 28 26 62 75 66 2c 20 61 64  to_UTF8(&buf, ad
2b50: 2d 3e 6c 6f 63 61 74 69 6f 6e 2d 3e 64 2e 75 6e  ->location->d.un
2b60: 69 66 6f 72 6d 52 65 73 6f 75 72 63 65 49 64 65  iformResourceIde
2b70: 6e 74 69 66 69 65 72 29 3b 0a 09 09 20 20 20 20  ntifier);...    
2b80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2b90: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2ba0: 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65   listPtr, Tcl_Ne
2bb0: 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20  wStringObj(buf, 
2bc0: 6c 65 6e 29 29 3b 0a 09 09 20 20 20 20 4f 50 45  len));...    OPE
2bd0: 4e 53 53 4c 5f 66 72 65 65 28 62 75 66 29 3b 0a  NSSL_free(buf);.
2be0: 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d  ..    break;...}
2bf0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 73  ..    }..}../* s
2c00: 6b 5f 41 43 43 45 53 53 5f 44 45 53 43 52 49 50  k_ACCESS_DESCRIP
2c10: 54 49 4f 4e 5f 70 6f 70 5f 66 72 65 65 28 61 64  TION_pop_free(ad
2c20: 73 2c 20 41 43 43 45 53 53 5f 44 45 53 43 52 49  s, ACCESS_DESCRI
2c30: 50 54 49 4f 4e 5f 66 72 65 65 29 3b 20 2a 2f 0a  PTION_free); */.
2c40: 09 41 55 54 48 4f 52 49 54 59 5f 49 4e 46 4f 5f  .AUTHORITY_INFO_
2c50: 41 43 43 45 53 53 5f 66 72 65 65 28 61 64 73 29  ACCESS_free(ads)
2c60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
2c70: 72 6e 20 6c 69 73 74 50 74 72 3b 0a 7d 0a 0c 0a  rn listPtr;.}...
2c80: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
2c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
2cc0: 20 2a 09 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62   *.Tls_NewX509Ob
2cd0: 6a 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d  j --. *. *.-----
2ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09  -----------*. *.
2d10: 43 6f 6e 76 65 72 74 73 20 61 20 58 35 30 39 20  Converts a X509 
2d20: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 74 6f  certificate into
2d30: 20 61 20 54 63 6c 5f 4f 62 6a 0a 20 2a 09 2d 2d   a Tcl_Obj. *.--
2d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
2d70: 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63   *. *.Side effec
2d80: 74 73 3a 0a 20 2a 09 09 4e 6f 6e 65 0a 20 2a 0a  ts:. *..None. *.
2d90: 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41   *.Result:. *..A
2da0: 20 54 63 6c 20 4c 69 73 74 20 4f 62 6a 65 63 74   Tcl List Object
2db0: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
2dc0: 65 20 70 72 6f 76 69 64 65 64 0a 20 2a 09 09 58  e provided. *..X
2dd0: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 2e  509 certificate.
2de0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
2df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
2e20: 2f 0a 0a 54 63 6c 5f 4f 62 6a 2a 0a 54 6c 73 5f  /..Tcl_Obj*.Tls_
2e30: 4e 65 77 58 35 30 39 4f 62 6a 28 54 63 6c 5f 49  NewX509Obj(Tcl_I
2e40: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58  nterp *interp, X
2e50: 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20  509 *cert) {.   
2e60: 20 54 63 6c 5f 4f 62 6a 20 2a 63 65 72 74 50 74   Tcl_Obj *certPt
2e70: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
2e80: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  bj(0, NULL);.   
2e90: 20 42 49 4f 20 2a 62 69 6f 20 3d 20 42 49 4f 5f   BIO *bio = BIO_
2ea0: 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29  new(BIO_s_mem())
2eb0: 3b 0a 20 20 20 20 69 6e 74 20 6d 64 6e 69 64 2c  ;.    int mdnid,
2ec0: 20 70 6b 6e 69 64 2c 20 62 69 74 73 2c 20 6c 65   pknid, bits, le
2ed0: 6e 3b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20  n;.    uint32_t 
2ee0: 78 66 6c 61 67 73 3b 0a 20 20 20 20 63 68 61 72  xflags;.    char
2ef0: 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b   buffer[BUFSIZ];
2f00: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
2f10: 61 72 20 6d 64 5b 45 56 50 5f 4d 41 58 5f 4d 44  ar md[EVP_MAX_MD
2f20: 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 75 6e 73 69  _SIZE];.    unsi
2f30: 67 6e 65 64 20 6c 6f 6e 67 20 66 6c 61 67 73 20  gned long flags 
2f40: 3d 20 58 4e 5f 46 4c 41 47 5f 52 46 43 32 32 35  = XN_FLAG_RFC225
2f50: 33 20 7c 20 41 53 4e 31 5f 53 54 52 46 4c 47 53  3 | ASN1_STRFLGS
2f60: 5f 55 54 46 38 5f 43 4f 4e 56 45 52 54 3b 0a 20  _UTF8_CONVERT;. 
2f70: 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 41 53 4e     flags &= ~ASN
2f80: 31 5f 53 54 52 46 4c 47 53 5f 45 53 43 5f 4d 53  1_STRFLGS_ESC_MS
2f90: 42 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65  B;..    if (inte
2fa0: 72 70 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 65  rp == NULL || ce
2fb0: 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62 69  rt == NULL || bi
2fc0: 6f 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 65 72  o == NULL || cer
2fd0: 74 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tPtr == NULL) {.
2fe0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
2ff0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 69 67 6e    }..    /* Sign
3000: 61 74 75 72 65 20 61 6c 67 6f 72 69 74 68 6d 20  ature algorithm 
3010: 61 6e 64 20 76 61 6c 75 65 20 2d 20 52 46 43 20  and value - RFC 
3020: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31  5280 section 4.1
3030: 2e 31 2e 32 20 61 6e 64 20 34 2e 31 2e 31 2e 33  .1.2 and 4.1.1.3
3040: 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 69 67 6e 61   */.    /* signa
3050: 74 75 72 65 41 6c 67 6f 72 69 74 68 6d 20 69 73  tureAlgorithm is
3060: 20 74 68 65 20 69 64 20 6f 66 20 74 68 65 20 63   the id of the c
3070: 72 79 70 74 6f 67 72 61 70 68 69 63 20 61 6c 67  ryptographic alg
3080: 6f 72 69 74 68 6d 20 75 73 65 64 20 62 79 20 74  orithm used by t
3090: 68 65 0a 09 43 41 20 74 6f 20 73 69 67 6e 20 74  he..CA to sign t
30a0: 68 69 73 20 63 65 72 74 2e 20 73 69 67 6e 61 74  his cert. signat
30b0: 75 72 65 56 61 6c 75 65 20 69 73 20 74 68 65 20  ureValue is the 
30c0: 64 69 67 69 74 61 6c 20 73 69 67 6e 61 74 75 72  digital signatur
30d0: 65 20 63 6f 6d 70 75 74 65 64 0a 09 75 70 6f 6e  e computed..upon
30e0: 20 74 68 65 20 41 53 4e 2e 31 20 44 45 52 20 65   the ASN.1 DER e
30f0: 6e 63 6f 64 65 64 20 74 62 73 43 65 72 74 69 66  ncoded tbsCertif
3100: 69 63 61 74 65 2e 20 2a 2f 0a 20 20 20 20 7b 0a  icate. */.    {.
3110: 09 63 6f 6e 73 74 20 58 35 30 39 5f 41 4c 47 4f  .const X509_ALGO
3120: 52 20 2a 73 69 67 5f 61 6c 67 3b 0a 09 63 6f 6e  R *sig_alg;..con
3130: 73 74 20 41 53 4e 31 5f 42 49 54 5f 53 54 52 49  st ASN1_BIT_STRI
3140: 4e 47 20 2a 73 69 67 3b 0a 09 69 6e 74 20 73 69  NG *sig;..int si
3150: 67 5f 6e 69 64 3b 0a 0a 09 58 35 30 39 5f 67 65  g_nid;...X509_ge
3160: 74 30 5f 73 69 67 6e 61 74 75 72 65 28 26 73 69  t0_signature(&si
3170: 67 2c 20 26 73 69 67 5f 61 6c 67 2c 20 63 65 72  g, &sig_alg, cer
3180: 74 29 3b 0a 09 2f 2a 20 73 69 67 5f 6e 69 64 20  t);../* sig_nid 
3190: 3d 20 58 35 30 39 5f 67 65 74 5f 73 69 67 6e 61  = X509_get_signa
31a0: 74 75 72 65 5f 6e 69 64 28 63 65 72 74 29 20 2a  ture_nid(cert) *
31b0: 2f 0a 09 73 69 67 5f 6e 69 64 20 3d 20 4f 42 4a  /..sig_nid = OBJ
31c0: 5f 6f 62 6a 32 6e 69 64 28 73 69 67 5f 61 6c 67  _obj2nid(sig_alg
31d0: 2d 3e 61 6c 67 6f 72 69 74 68 6d 29 3b 0a 09 4c  ->algorithm);..L
31e0: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
31f0: 70 2c 20 63 65 72 74 50 74 72 2c 20 22 73 69 67  p, certPtr, "sig
3200: 6e 61 74 75 72 65 41 6c 67 6f 72 69 74 68 6d 22  natureAlgorithm"
3210: 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 73 69 67  , OBJ_nid2ln(sig
3220: 5f 6e 69 64 29 2c 20 2d 31 29 3b 0a 09 6c 65 6e  _nid), -1);..len
3230: 20 3d 20 28 73 69 67 5f 6e 69 64 20 21 3d 20 4e   = (sig_nid != N
3240: 49 44 5f 75 6e 64 65 66 29 20 3f 20 53 74 72 69  ID_undef) ? Stri
3250: 6e 67 5f 74 6f 5f 48 65 78 28 73 69 67 2d 3e 64  ng_to_Hex(sig->d
3260: 61 74 61 2c 20 73 69 67 2d 3e 6c 65 6e 67 74 68  ata, sig->length
3270: 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a  , buffer, BUFSIZ
3280: 29 20 3a 20 30 3b 0a 09 4c 41 50 50 45 4e 44 5f  ) : 0;..LAPPEND_
3290: 53 54 52 28 69 6e 74 65 72 70 2c 20 63 65 72 74  STR(interp, cert
32a0: 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 56  Ptr, "signatureV
32b0: 61 6c 75 65 22 2c 20 62 75 66 66 65 72 2c 20 6c  alue", buffer, l
32c0: 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  en);.    }..    
32d0: 2f 2a 20 56 65 72 73 69 6f 6e 20 6f 66 20 74 68  /* Version of th
32e0: 65 20 65 6e 63 6f 64 65 64 20 63 65 72 74 69 66  e encoded certif
32f0: 69 63 61 74 65 20 2d 20 52 46 43 20 35 32 38 30  icate - RFC 5280
3300: 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 31   section 4.1.2.1
3310: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
3320: 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 63 65 72  LONG(interp, cer
3330: 74 50 74 72 2c 20 22 76 65 72 73 69 6f 6e 22 2c  tPtr, "version",
3340: 20 58 35 30 39 5f 67 65 74 5f 76 65 72 73 69 6f   X509_get_versio
3350: 6e 28 63 65 72 74 29 2b 31 29 3b 0a 0a 20 20 20  n(cert)+1);..   
3360: 20 2f 2a 20 55 6e 69 71 75 65 20 6e 75 6d 62 65   /* Unique numbe
3370: 72 20 61 73 73 69 67 6e 65 64 20 62 79 20 43 41  r assigned by CA
3380: 20 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 20   to certificate 
3390: 2d 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69  - RFC 5280 secti
33a0: 6f 6e 20 34 2e 31 2e 32 2e 32 20 2a 2f 0a 20 20  on 4.1.2.2 */.  
33b0: 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42    len = BIO_to_B
33c0: 75 66 66 65 72 28 69 32 61 5f 41 53 4e 31 5f 49  uffer(i2a_ASN1_I
33d0: 4e 54 45 47 45 52 28 62 69 6f 2c 20 58 35 30 39  NTEGER(bio, X509
33e0: 5f 67 65 74 30 5f 73 65 72 69 61 6c 4e 75 6d 62  _get0_serialNumb
33f0: 65 72 28 63 65 72 74 29 29 2c 20 62 69 6f 2c 20  er(cert)), bio, 
3400: 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b  buffer, BUFSIZ);
3410: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
3420: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72  (interp, certPtr
3430: 2c 20 22 73 65 72 69 61 6c 4e 75 6d 62 65 72 22  , "serialNumber"
3440: 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a  , buffer, len);.
3450: 0a 20 20 20 20 2f 2a 20 53 69 67 6e 61 74 75 72  .    /* Signatur
3460: 65 20 61 6c 67 6f 72 69 74 68 6d 20 75 73 65 64  e algorithm used
3470: 20 62 79 20 74 68 65 20 43 41 20 74 6f 20 73 69   by the CA to si
3480: 67 6e 20 74 68 65 20 63 65 72 74 69 66 69 63 61  gn the certifica
3490: 74 65 2e 20 4d 75 73 74 20 6d 61 74 63 68 0a 09  te. Must match..
34a0: 73 69 67 6e 61 74 75 72 65 41 6c 67 6f 72 69 74  signatureAlgorit
34b0: 68 6d 2e 20 52 46 43 20 35 32 38 30 20 73 65 63  hm. RFC 5280 sec
34c0: 74 69 6f 6e 20 34 2e 31 2e 32 2e 33 20 2a 2f 0a  tion 4.1.2.3 */.
34d0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
34e0: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c  interp, certPtr,
34f0: 20 22 73 69 67 6e 61 74 75 72 65 22 2c 20 4f 42   "signature", OB
3500: 4a 5f 6e 69 64 32 6c 6e 28 58 35 30 39 5f 67 65  J_nid2ln(X509_ge
3510: 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28  t_signature_nid(
3520: 63 65 72 74 29 29 2c 20 2d 31 29 3b 0a 0a 20 20  cert)), -1);..  
3530: 20 20 2f 2a 20 49 73 73 75 65 72 20 69 64 65 6e    /* Issuer iden
3540: 74 69 66 69 65 73 20 74 68 65 20 65 6e 74 69 74  tifies the entit
3550: 79 20 74 68 61 74 20 73 69 67 6e 65 64 20 61 6e  y that signed an
3560: 64 20 69 73 73 75 65 64 20 74 68 65 20 63 65 72  d issued the cer
3570: 74 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74  t. RFC 5280 sect
3580: 69 6f 6e 20 34 2e 31 2e 32 2e 34 20 2a 2f 0a 20  ion 4.1.2.4 */. 
3590: 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f     len = BIO_to_
35a0: 42 75 66 66 65 72 28 58 35 30 39 5f 4e 41 4d 45  Buffer(X509_NAME
35b0: 5f 70 72 69 6e 74 5f 65 78 28 62 69 6f 2c 20 58  _print_ex(bio, X
35c0: 35 30 39 5f 67 65 74 5f 69 73 73 75 65 72 5f 6e  509_get_issuer_n
35d0: 61 6d 65 28 63 65 72 74 29 2c 20 30 2c 20 66 6c  ame(cert), 0, fl
35e0: 61 67 73 29 2c 20 62 69 6f 2c 20 62 75 66 66 65  ags), bio, buffe
35f0: 72 2c 20 42 55 46 53 49 5a 29 3b 0a 20 20 20 20  r, BUFSIZ);.    
3600: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
3610: 72 70 2c 20 63 65 72 74 50 74 72 2c 20 22 69 73  rp, certPtr, "is
3620: 73 75 65 72 22 2c 20 62 75 66 66 65 72 2c 20 6c  suer", buffer, l
3630: 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 65 72  en);..    /* Cer
3640: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 69 74  tificate validit
3650: 79 20 70 65 72 69 6f 64 20 69 73 20 74 68 65 20  y period is the 
3660: 69 6e 74 65 72 76 61 6c 20 74 68 65 20 43 41 20  interval the CA 
3670: 77 61 72 72 61 6e 74 73 20 74 68 61 74 20 69 74  warrants that it
3680: 20 77 69 6c 6c 0a 09 6d 61 69 6e 74 61 69 6e 20   will..maintain 
3690: 69 6e 66 6f 20 6f 6e 20 74 68 65 20 73 74 61 74  info on the stat
36a0: 75 73 20 6f 66 20 74 68 65 20 63 65 72 74 69 66  us of the certif
36b0: 69 63 61 74 65 2e 20 52 46 43 20 35 32 38 30 20  icate. RFC 5280 
36c0: 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 35 20  section 4.1.2.5 
36d0: 2a 2f 0a 20 20 20 20 2f 2a 20 47 65 74 20 56 61  */.    /* Get Va
36e0: 6c 69 64 69 74 79 20 2d 20 4e 6f 74 20 42 65 66  lidity - Not Bef
36f0: 6f 72 65 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d  ore */.    len =
3700: 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 41   BIO_to_Buffer(A
3710: 53 4e 31 5f 54 49 4d 45 5f 70 72 69 6e 74 28 62  SN1_TIME_print(b
3720: 69 6f 2c 20 58 35 30 39 5f 67 65 74 30 5f 6e 6f  io, X509_get0_no
3730: 74 42 65 66 6f 72 65 28 63 65 72 74 29 29 2c 20  tBefore(cert)), 
3740: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46  bio, buffer, BUF
3750: 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  SIZ);.    LAPPEN
3760: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 63 65  D_STR(interp, ce
3770: 72 74 50 74 72 2c 20 22 6e 6f 74 42 65 66 6f 72  rtPtr, "notBefor
3780: 65 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29  e", buffer, len)
3790: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 56 61  ;..    /* Get Va
37a0: 6c 69 64 69 74 79 20 2d 20 4e 6f 74 20 41 66 74  lidity - Not Aft
37b0: 65 72 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20  er */.    len = 
37c0: 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 41 53  BIO_to_Buffer(AS
37d0: 4e 31 5f 54 49 4d 45 5f 70 72 69 6e 74 28 62 69  N1_TIME_print(bi
37e0: 6f 2c 20 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74  o, X509_get0_not
37f0: 41 66 74 65 72 28 63 65 72 74 29 29 2c 20 62 69  After(cert)), bi
3800: 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49  o, buffer, BUFSI
3810: 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  Z);.    LAPPEND_
3820: 53 54 52 28 69 6e 74 65 72 70 2c 20 63 65 72 74  STR(interp, cert
3830: 50 74 72 2c 20 22 6e 6f 74 41 66 74 65 72 22 2c  Ptr, "notAfter",
3840: 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a   buffer, len);..
3850: 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 69      /* Subject i
3860: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 65 6e  dentifies the en
3870: 74 69 74 79 20 61 73 73 6f 63 69 61 74 65 64 20  tity associated 
3880: 77 69 74 68 20 74 68 65 20 70 75 62 6c 69 63 20  with the public 
3890: 6b 65 79 20 73 74 6f 72 65 64 20 69 6e 0a 09 74  key stored in..t
38a0: 68 65 20 73 75 62 6a 65 63 74 20 70 75 62 6c 69  he subject publi
38b0: 63 20 6b 65 79 20 66 69 65 6c 64 2e 20 52 46 43  c key field. RFC
38c0: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
38d0: 31 2e 32 2e 36 20 2a 2f 0a 20 20 20 20 6c 65 6e  1.2.6 */.    len
38e0: 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72   = BIO_to_Buffer
38f0: 28 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e 74  (X509_NAME_print
3900: 5f 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67 65  _ex(bio, X509_ge
3910: 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63  t_subject_name(c
3920: 65 72 74 29 2c 20 30 2c 20 66 6c 61 67 73 29 2c  ert), 0, flags),
3930: 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55   bio, buffer, BU
3940: 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45  FSIZ);.    LAPPE
3950: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 63  ND_STR(interp, c
3960: 65 72 74 50 74 72 2c 20 22 73 75 62 6a 65 63 74  ertPtr, "subject
3970: 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b  ", buffer, len);
3980: 0a 0a 20 20 20 20 2f 2a 20 53 48 41 31 20 46 69  ..    /* SHA1 Fi
3990: 6e 67 65 72 70 72 69 6e 74 20 6f 66 20 63 65 72  ngerprint of cer
39a0: 74 20 2d 20 44 45 52 20 72 65 70 72 65 73 65 6e  t - DER represen
39b0: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  tation */.    if
39c0: 20 28 58 35 30 39 5f 64 69 67 65 73 74 28 63 65   (X509_digest(ce
39d0: 72 74 2c 20 45 56 50 5f 73 68 61 31 28 29 2c 20  rt, EVP_sha1(), 
39e0: 6d 64 2c 20 26 6c 65 6e 29 29 20 7b 0a 20 20 20  md, &len)) {.   
39f0: 20 6c 65 6e 20 3d 20 53 74 72 69 6e 67 5f 74 6f   len = String_to
3a00: 5f 48 65 78 28 6d 64 2c 20 6c 65 6e 2c 20 62 75  _Hex(md, len, bu
3a10: 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09  ffer, BUFSIZ);..
3a20: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
3a30: 72 70 2c 20 63 65 72 74 50 74 72 2c 20 22 73 68  rp, certPtr, "sh
3a40: 61 31 5f 68 61 73 68 22 2c 20 62 75 66 66 65 72  a1_hash", buffer
3a50: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20  , len);.    }.. 
3a60: 20 20 20 2f 2a 20 53 48 41 32 35 36 20 46 69 6e     /* SHA256 Fin
3a70: 67 65 72 70 72 69 6e 74 20 6f 66 20 63 65 72 74  gerprint of cert
3a80: 20 2d 20 44 45 52 20 72 65 70 72 65 73 65 6e 74   - DER represent
3a90: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20  ation */.    if 
3aa0: 28 58 35 30 39 5f 64 69 67 65 73 74 28 63 65 72  (X509_digest(cer
3ab0: 74 2c 20 45 56 50 5f 73 68 61 32 35 36 28 29 2c  t, EVP_sha256(),
3ac0: 20 6d 64 2c 20 26 6c 65 6e 29 29 20 7b 0a 20 20   md, &len)) {.  
3ad0: 20 20 6c 65 6e 20 3d 20 53 74 72 69 6e 67 5f 74    len = String_t
3ae0: 6f 5f 48 65 78 28 6d 64 2c 20 6c 65 6e 2c 20 62  o_Hex(md, len, b
3af0: 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a  uffer, BUFSIZ);.
3b00: 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
3b10: 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 22 73  erp, certPtr, "s
3b20: 68 61 32 35 36 5f 68 61 73 68 22 2c 20 62 75 66  ha256_hash", buf
3b30: 66 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 7d  fer, len);.    }
3b40: 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74  ..    /* Subject
3b50: 20 50 75 62 6c 69 63 20 4b 65 79 20 49 6e 66 6f   Public Key Info
3b60: 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 70   specifies the p
3b70: 75 62 6c 69 63 20 6b 65 79 20 61 6e 64 20 69 64  ublic key and id
3b80: 65 6e 74 69 66 69 65 73 20 74 68 65 0a 09 61 6c  entifies the..al
3b90: 67 6f 72 69 74 68 6d 20 77 69 74 68 20 77 68 69  gorithm with whi
3ba0: 63 68 20 74 68 65 20 6b 65 79 20 69 73 20 75 73  ch the key is us
3bb0: 65 64 2e 20 52 46 43 20 35 32 38 30 20 73 65 63  ed. RFC 5280 sec
3bc0: 74 69 6f 6e 20 34 2e 31 2e 32 2e 37 20 2a 2f 0a  tion 4.1.2.7 */.
3bd0: 20 20 20 20 69 66 20 28 58 35 30 39 5f 67 65 74      if (X509_get
3be0: 5f 73 69 67 6e 61 74 75 72 65 5f 69 6e 66 6f 28  _signature_info(
3bf0: 63 65 72 74 2c 20 26 6d 64 6e 69 64 2c 20 26 70  cert, &mdnid, &p
3c00: 6b 6e 69 64 2c 20 26 62 69 74 73 2c 20 26 78 66  knid, &bits, &xf
3c10: 6c 61 67 73 29 29 20 7b 0a 09 41 53 4e 31 5f 42  lags)) {..ASN1_B
3c20: 49 54 5f 53 54 52 49 4e 47 20 2a 6b 65 79 3b 0a  IT_STRING *key;.
3c30: 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 3b  .unsigned int n;
3c40: 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ...LAPPEND_STR(i
3c50: 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20  nterp, certPtr, 
3c60: 22 73 69 67 6e 69 6e 67 44 69 67 65 73 74 22 2c  "signingDigest",
3c70: 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6d 64 6e 69   OBJ_nid2ln(mdni
3c80: 64 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  d), -1);..LAPPEN
3c90: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 63 65  D_STR(interp, ce
3ca0: 72 74 50 74 72 2c 20 22 70 75 62 6c 69 63 4b 65  rtPtr, "publicKe
3cb0: 79 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a  yAlgorithm", OBJ
3cc0: 5f 6e 69 64 32 6c 6e 28 70 6b 6e 69 64 29 2c 20  _nid2ln(pknid), 
3cd0: 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e  -1);..LAPPEND_IN
3ce0: 54 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74  T(interp, certPt
3cf0: 72 2c 20 22 62 69 74 73 22 2c 20 62 69 74 73 29  r, "bits", bits)
3d00: 3b 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73  ; /* Effective s
3d10: 65 63 75 72 69 74 79 20 62 69 74 73 20 2a 2f 0a  ecurity bits */.
3d20: 0a 09 6b 65 79 20 3d 20 58 35 30 39 5f 67 65 74  ..key = X509_get
3d30: 30 5f 70 75 62 6b 65 79 5f 62 69 74 73 74 72 28  0_pubkey_bitstr(
3d40: 63 65 72 74 29 3b 0a 09 6c 65 6e 20 3d 20 53 74  cert);..len = St
3d50: 72 69 6e 67 5f 74 6f 5f 48 65 78 28 6b 65 79 2d  ring_to_Hex(key-
3d60: 3e 64 61 74 61 2c 20 6b 65 79 2d 3e 6c 65 6e 67  >data, key->leng
3d70: 74 68 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53  th, buffer, BUFS
3d80: 49 5a 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  IZ);..LAPPEND_ST
3d90: 52 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74  R(interp, certPt
3da0: 72 2c 20 22 70 75 62 6c 69 63 4b 65 79 22 2c 20  r, "publicKey", 
3db0: 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a 09  buffer, len);...
3dc0: 6c 65 6e 20 3d 20 30 3b 0a 09 69 66 20 28 58 35  len = 0;..if (X5
3dd0: 30 39 5f 70 75 62 6b 65 79 5f 64 69 67 65 73 74  09_pubkey_digest
3de0: 28 63 65 72 74 2c 20 45 56 50 5f 67 65 74 5f 64  (cert, EVP_get_d
3df0: 69 67 65 73 74 62 79 6e 69 64 28 70 6b 6e 69 64  igestbynid(pknid
3e00: 29 2c 20 6d 64 2c 20 26 6e 29 29 20 7b 0a 09 20  ), md, &n)) {.. 
3e10: 20 20 20 6c 65 6e 20 3d 20 53 74 72 69 6e 67 5f     len = String_
3e20: 74 6f 5f 48 65 78 28 6d 64 2c 20 28 69 6e 74 29  to_Hex(md, (int)
3e30: 6e 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49  n, buffer, BUFSI
3e40: 5a 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f  Z);..}..LAPPEND_
3e50: 53 54 52 28 69 6e 74 65 72 70 2c 20 63 65 72 74  STR(interp, cert
3e60: 50 74 72 2c 20 22 70 75 62 6c 69 63 4b 65 79 48  Ptr, "publicKeyH
3e70: 61 73 68 22 2c 20 62 75 66 66 65 72 2c 20 6c 65  ash", buffer, le
3e80: 6e 29 3b 0a 0a 09 6c 65 6e 20 3d 20 30 3b 0a 09  n);...len = 0;..
3e90: 69 66 20 28 58 35 30 39 5f 64 69 67 65 73 74 28  if (X509_digest(
3ea0: 63 65 72 74 2c 20 45 56 50 5f 67 65 74 5f 64 69  cert, EVP_get_di
3eb0: 67 65 73 74 62 79 6e 69 64 28 6d 64 6e 69 64 29  gestbynid(mdnid)
3ec0: 2c 20 6d 64 2c 20 26 6e 29 29 20 7b 0a 09 20 20  , md, &n)) {..  
3ed0: 20 20 6c 65 6e 20 3d 20 53 74 72 69 6e 67 5f 74    len = String_t
3ee0: 6f 5f 48 65 78 28 6d 64 2c 20 28 69 6e 74 29 6e  o_Hex(md, (int)n
3ef0: 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a  , buffer, BUFSIZ
3f00: 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53  );..}..LAPPEND_S
3f10: 54 52 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50  TR(interp, certP
3f20: 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61  tr, "signatureHa
3f30: 73 68 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e  sh", buffer, len
3f40: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
3f50: 20 47 65 74 20 65 78 74 65 6e 73 69 6f 6e 73 20   Get extensions 
3f60: 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20 78 66 6c  flags */.    xfl
3f70: 61 67 73 20 3d 20 58 35 30 39 5f 67 65 74 5f 65  ags = X509_get_e
3f80: 78 74 65 6e 73 69 6f 6e 5f 66 6c 61 67 73 28 63  xtension_flags(c
3f90: 65 72 74 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  ert);.    LAPPEN
3fa0: 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 63 65  D_INT(interp, ce
3fb0: 72 74 50 74 72 2c 20 22 65 78 74 46 6c 61 67 73  rtPtr, "extFlags
3fc0: 22 2c 20 78 66 6c 61 67 73 29 3b 0a 0a 09 2f 2a  ", xflags);.../*
3fd0: 20 43 68 65 63 6b 20 69 66 20 63 65 72 74 20 77   Check if cert w
3fe0: 61 73 20 69 73 73 75 65 64 20 62 79 20 43 41 20  as issued by CA 
3ff0: 63 65 72 74 20 69 73 73 75 65 72 20 6f 72 20 73  cert issuer or s
4000: 65 6c 66 20 73 69 67 6e 65 64 20 2a 2f 0a 20 20  elf signed */.  
4010: 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69    LAPPEND_BOOL(i
4020: 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20  nterp, certPtr, 
4030: 22 73 65 6c 66 49 73 73 75 65 64 22 2c 20 78 66  "selfIssued", xf
4040: 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 53 49  lags & EXFLAG_SI
4050: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42  );.    LAPPEND_B
4060: 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 63 65 72 74  OOL(interp, cert
4070: 50 74 72 2c 20 22 73 65 6c 66 53 69 67 6e 65 64  Ptr, "selfSigned
4080: 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c  ", xflags & EXFL
4090: 41 47 5f 53 53 29 3b 0a 0a 20 20 20 20 2f 2a 20  AG_SS);..    /* 
40a0: 54 68 65 20 55 6e 69 71 75 65 20 49 64 73 20 61  The Unique Ids a
40b0: 72 65 20 75 73 65 64 20 74 6f 20 68 61 6e 64 6c  re used to handl
40c0: 65 20 74 68 65 20 70 6f 73 73 69 62 69 6c 69 74  e the possibilit
40d0: 79 20 6f 66 20 72 65 75 73 65 20 6f 66 20 73 75  y of reuse of su
40e0: 62 6a 65 63 74 0a 09 61 6e 64 2f 6f 72 20 69 73  bject..and/or is
40f0: 73 75 65 72 20 6e 61 6d 65 73 20 6f 76 65 72 20  suer names over 
4100: 74 69 6d 65 2e 20 52 46 43 20 35 32 38 30 20 73  time. RFC 5280 s
4110: 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 38 20 2a  ection 4.1.2.8 *
4120: 2f 0a 20 20 20 20 7b 0a 09 63 6f 6e 73 74 20 41  /.    {..const A
4130: 53 4e 31 5f 42 49 54 5f 53 54 52 49 4e 47 20 2a  SN1_BIT_STRING *
4140: 69 75 69 64 2c 20 2a 73 75 69 64 3b 0a 20 20 20  iuid, *suid;.   
4150: 20 20 20 20 20 58 35 30 39 5f 67 65 74 30 5f 75       X509_get0_u
4160: 69 64 73 28 63 65 72 74 2c 20 26 69 75 69 64 2c  ids(cert, &iuid,
4170: 20 26 73 75 69 64 29 3b 0a 0a 09 54 63 6c 5f 4c   &suid);...Tcl_L
4180: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4190: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74  ent(interp, cert
41a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
41b0: 6e 67 4f 62 6a 28 22 69 73 73 75 65 72 55 6e 69  ngObj("issuerUni
41c0: 71 75 65 49 64 22 2c 20 2d 31 29 29 3b 0a 09 69  queId", -1));..i
41d0: 66 20 28 69 75 69 64 20 21 3d 20 4e 55 4c 4c 29  f (iuid != NULL)
41e0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
41f0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4200: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72  (interp, certPtr
4210: 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
4220: 61 79 4f 62 6a 28 28 63 68 61 72 20 2a 29 69 75  ayObj((char *)iu
4230: 69 64 2d 3e 64 61 74 61 2c 20 69 75 69 64 2d 3e  id->data, iuid->
4240: 6c 65 6e 67 74 68 29 29 3b 0a 09 7d 20 65 6c 73  length));..} els
4250: 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  e {..    Tcl_Lis
4260: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4270: 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74  t(interp, certPt
4280: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
4290: 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 09 7d  Obj("", -1));..}
42a0: 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ...Tcl_ListObjAp
42b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
42c0: 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c  rp, certPtr, Tcl
42d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
42e0: 75 62 6a 65 63 74 55 6e 69 71 75 65 49 64 22 2c  ubjectUniqueId",
42f0: 20 2d 31 29 29 3b 0a 09 69 66 20 28 73 75 69 64   -1));..if (suid
4300: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
4310: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4320: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4330: 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e  , certPtr, Tcl_N
4340: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28  ewByteArrayObj((
4350: 63 68 61 72 20 2a 29 73 75 69 64 2d 3e 64 61 74  char *)suid->dat
4360: 61 2c 20 73 75 69 64 2d 3e 6c 65 6e 67 74 68 29  a, suid->length)
4370: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  );..} else {..  
4380: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4390: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
43a0: 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f  p, certPtr, Tcl_
43b0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c  NewStringObj("",
43c0: 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a   -1));..}.    }.
43d0: 0a 20 20 20 20 2f 2a 20 58 35 30 39 20 76 33 20  .    /* X509 v3 
43e0: 45 78 74 65 6e 73 69 6f 6e 73 20 2d 20 52 46 43  Extensions - RFC
43f0: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
4400: 31 2e 32 2e 39 20 2a 2f 0a 20 20 20 20 4c 41 50  1.2.9 */.    LAP
4410: 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
4420: 20 63 65 72 74 50 74 72 2c 20 22 65 78 74 43 6f   certPtr, "extCo
4430: 75 6e 74 22 2c 20 58 35 30 39 5f 67 65 74 5f 65  unt", X509_get_e
4440: 78 74 5f 63 6f 75 6e 74 28 63 65 72 74 29 29 3b  xt_count(cert));
4450: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a  .    LAPPEND_OBJ
4460: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72  (interp, certPtr
4470: 2c 20 22 65 78 74 65 6e 73 69 6f 6e 73 22 2c 20  , "extensions", 
4480: 54 6c 73 5f 78 35 30 39 45 78 74 65 6e 73 69 6f  Tls_x509Extensio
4490: 6e 73 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29  ns(interp, cert)
44a0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 75 74 68 6f  );..    /* Autho
44b0: 72 69 74 79 20 4b 65 79 20 49 64 65 6e 74 69 66  rity Key Identif
44c0: 69 65 72 20 28 41 4b 49 29 20 69 73 20 74 68 65  ier (AKI) is the
44d0: 20 53 75 62 6a 65 63 74 20 4b 65 79 20 49 64 65   Subject Key Ide
44e0: 6e 74 69 66 69 65 72 20 28 53 4b 49 29 20 6f 66  ntifier (SKI) of
44f0: 0a 09 69 74 73 20 73 69 67 6e 65 72 20 28 74 68  ..its signer (th
4500: 65 20 43 41 29 2e 20 52 46 43 20 35 32 38 30 20  e CA). RFC 5280 
4510: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 2c  section 4.2.1.1,
4520: 20 4e 49 44 5f 61 75 74 68 6f 72 69 74 79 5f 6b   NID_authority_k
4530: 65 79 5f 69 64 65 6e 74 69 66 69 65 72 20 2a 2f  ey_identifier */
4540: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a  .    LAPPEND_OBJ
4550: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72  (interp, certPtr
4560: 2c 20 22 61 75 74 68 6f 72 69 74 79 4b 65 79 49  , "authorityKeyI
4570: 64 65 6e 74 69 66 69 65 72 22 2c 0a 09 54 6c 73  dentifier",..Tls
4580: 5f 78 35 30 39 49 64 65 6e 74 69 66 69 65 72 28  _x509Identifier(
4590: 58 35 30 39 5f 67 65 74 30 5f 61 75 74 68 6f 72  X509_get0_author
45a0: 69 74 79 5f 6b 65 79 5f 69 64 28 63 65 72 74 29  ity_key_id(cert)
45b0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a  ));..    /* Subj
45c0: 65 63 74 20 4b 65 79 20 49 64 65 6e 74 69 66 69  ect Key Identifi
45d0: 65 72 20 28 53 4b 49 29 20 69 73 20 75 73 65 64  er (SKI) is used
45e0: 20 74 6f 20 69 64 65 6e 74 69 66 79 20 63 65 72   to identify cer
45f0: 74 69 66 69 63 61 74 65 73 20 74 68 61 74 20 63  tificates that c
4600: 6f 6e 74 61 69 6e 0a 09 61 20 70 61 72 74 69 63  ontain..a partic
4610: 75 6c 61 72 20 70 75 62 6c 69 63 20 6b 65 79 2e  ular public key.
4620: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f   RFC 5280 sectio
4630: 6e 20 34 2e 32 2e 31 2e 32 2c 20 4e 49 44 5f 73  n 4.2.1.2, NID_s
4640: 75 62 6a 65 63 74 5f 6b 65 79 5f 69 64 65 6e 74  ubject_key_ident
4650: 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50  ifier */.    LAP
4660: 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c  PEND_OBJ(interp,
4670: 20 63 65 72 74 50 74 72 2c 20 22 73 75 62 6a 65   certPtr, "subje
4680: 63 74 4b 65 79 49 64 65 6e 74 69 66 69 65 72 22  ctKeyIdentifier"
4690: 2c 0a 09 54 6c 73 5f 78 35 30 39 49 64 65 6e 74  ,..Tls_x509Ident
46a0: 69 66 69 65 72 28 58 35 30 39 5f 67 65 74 30 5f  ifier(X509_get0_
46b0: 73 75 62 6a 65 63 74 5f 6b 65 79 5f 69 64 28 63  subject_key_id(c
46c0: 65 72 74 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  ert)));..    /* 
46d0: 4b 65 79 20 75 73 61 67 65 20 65 78 74 65 6e 73  Key usage extens
46e0: 69 6f 6e 20 64 65 66 69 6e 65 73 20 74 68 65 20  ion defines the 
46f0: 70 75 72 70 6f 73 65 20 28 65 2e 67 2e 2c 20 65  purpose (e.g., e
4700: 6e 63 69 70 68 65 72 6d 65 6e 74 2c 20 73 69 67  ncipherment, sig
4710: 6e 61 74 75 72 65 2c 20 63 65 72 74 69 66 69 63  nature, certific
4720: 61 74 65 0a 09 73 69 67 6e 69 6e 67 29 20 6f 66  ate..signing) of
4730: 20 74 68 65 20 6b 65 79 20 69 6e 20 74 68 65 20   the key in the 
4740: 63 65 72 74 69 66 69 63 61 74 65 2e 20 52 46 43  certificate. RFC
4750: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
4760: 32 2e 31 2e 33 2c 20 4e 49 44 5f 6b 65 79 5f 75  2.1.3, NID_key_u
4770: 73 61 67 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50  sage */.    LAPP
4780: 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20  END_OBJ(interp, 
4790: 63 65 72 74 50 74 72 2c 20 22 6b 65 79 55 73 61  certPtr, "keyUsa
47a0: 67 65 22 2c 20 54 6c 73 5f 78 35 30 39 4b 65 79  ge", Tls_x509Key
47b0: 55 73 61 67 65 28 69 6e 74 65 72 70 2c 20 63 65  Usage(interp, ce
47c0: 72 74 2c 20 78 66 6c 61 67 73 29 29 3b 0a 0a 20  rt, xflags));.. 
47d0: 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63 61 74     /* Certificat
47e0: 65 20 50 75 72 70 6f 73 65 20 2a 2f 0a 20 20 20  e Purpose */.   
47f0: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
4800: 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 22 70  erp, certPtr, "p
4810: 75 72 70 6f 73 65 22 2c 20 54 6c 73 5f 78 35 30  urpose", Tls_x50
4820: 39 50 75 72 70 6f 73 65 28 63 65 72 74 29 2c 20  9Purpose(cert), 
4830: 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74  -1);..    /* Get
4840: 20 70 75 72 70 6f 73 65 73 20 2a 2f 0a 20 20 20   purposes */.   
4850: 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74   LAPPEND_OBJ(int
4860: 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 22 63  erp, certPtr, "c
4870: 65 72 74 69 66 69 63 61 74 65 50 75 72 70 6f 73  ertificatePurpos
4880: 65 22 2c 20 54 6c 73 5f 78 35 30 39 50 75 72 70  e", Tls_x509Purp
4890: 6f 73 65 73 28 69 6e 74 65 72 70 2c 20 63 65 72  oses(interp, cer
48a0: 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 65 72  t));..    /* Cer
48b0: 74 69 66 69 63 61 74 65 20 50 6f 6c 69 63 69 65  tificate Policie
48c0: 73 20 2d 20 69 6e 64 69 63 61 74 65 73 20 74 68  s - indicates th
48d0: 65 20 69 73 73 75 69 6e 67 20 43 41 20 63 6f 6e  e issuing CA con
48e0: 73 69 64 65 72 73 20 69 74 73 20 69 73 73 75 65  siders its issue
48f0: 72 44 6f 6d 61 69 6e 50 6f 6c 69 63 79 0a 09 65  rDomainPolicy..e
4900: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
4910: 20 73 75 62 6a 65 63 74 20 43 41 27 73 20 73 75   subject CA's su
4920: 62 6a 65 63 74 44 6f 6d 61 69 6e 50 6f 6c 69 63  bjectDomainPolic
4930: 79 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74  y. RFC 5280 sect
4940: 69 6f 6e 20 34 2e 32 2e 31 2e 34 2c 20 4e 49 44  ion 4.2.1.4, NID
4950: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 70 6f 6c  _certificate_pol
4960: 69 63 69 65 73 20 2a 2f 0a 20 20 20 20 69 66 20  icies */.    if 
4970: 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47  (xflags & EXFLAG
4980: 5f 49 4e 56 41 4c 49 44 5f 50 4f 4c 49 43 59 29  _INVALID_POLICY)
4990: 20 7b 0a 09 2f 2a 20 52 65 6a 65 63 74 20 63 65   {../* Reject ce
49a0: 72 74 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  rt */.    }..   
49b0: 20 2f 2a 20 50 6f 6c 69 63 79 20 4d 61 70 70 69   /* Policy Mappi
49c0: 6e 67 73 20 2d 20 52 46 43 20 35 32 38 30 20 73  ngs - RFC 5280 s
49d0: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 35 2c 20  ection 4.2.1.5, 
49e0: 4e 49 44 5f 70 6f 6c 69 63 79 5f 6d 61 70 70 69  NID_policy_mappi
49f0: 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ngs */..    /* S
4a00: 75 62 6a 65 63 74 20 41 6c 74 65 72 6e 61 74 69  ubject Alternati
4a10: 76 65 20 4e 61 6d 65 20 28 53 41 4e 29 20 63 6f  ve Name (SAN) co
4a20: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
4a30: 6c 20 55 52 4c 73 2c 20 44 4e 53 20 6e 61 6d 65  l URLs, DNS name
4a40: 73 2c 20 6f 72 20 49 50 0a 09 61 64 64 72 65 73  s, or IP..addres
4a50: 73 65 73 20 62 6f 75 6e 64 20 74 6f 20 63 65 72  ses bound to cer
4a60: 74 69 66 69 63 61 74 65 2e 20 52 46 43 20 35 32  tificate. RFC 52
4a70: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31  80 section 4.2.1
4a80: 2e 36 2c 20 4e 49 44 5f 73 75 62 6a 65 63 74 5f  .6, NID_subject_
4a90: 61 6c 74 5f 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  alt_name */.    
4aa0: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65  LAPPEND_OBJ(inte
4ab0: 72 70 2c 20 63 65 72 74 50 74 72 2c 20 22 73 75  rp, certPtr, "su
4ac0: 62 6a 65 63 74 41 6c 74 4e 61 6d 65 22 2c 20 54  bjectAltName", T
4ad0: 6c 73 5f 78 35 30 39 4e 61 6d 65 73 28 69 6e 74  ls_x509Names(int
4ae0: 65 72 70 2c 20 63 65 72 74 2c 20 4e 49 44 5f 73  erp, cert, NID_s
4af0: 75 62 6a 65 63 74 5f 61 6c 74 5f 6e 61 6d 65 2c  ubject_alt_name,
4b00: 20 62 69 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20   bio));..    /* 
4b10: 49 73 73 75 65 72 20 41 6c 74 65 72 6e 61 74 69  Issuer Alternati
4b20: 76 65 20 4e 61 6d 65 20 69 73 20 75 73 65 64 20  ve Name is used 
4b30: 74 6f 20 61 73 73 6f 63 69 61 74 65 20 49 6e 74  to associate Int
4b40: 65 72 6e 65 74 20 73 74 79 6c 65 20 69 64 65 6e  ernet style iden
4b50: 74 69 74 69 65 73 0a 09 77 69 74 68 20 74 68 65  tities..with the
4b60: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73   certificate iss
4b70: 75 65 72 2e 20 52 46 43 20 35 32 38 30 20 73 65  uer. RFC 5280 se
4b80: 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 37 2c 20 4e  ction 4.2.1.7, N
4b90: 49 44 5f 69 73 73 75 65 72 5f 61 6c 74 5f 6e 61  ID_issuer_alt_na
4ba0: 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  me */.    LAPPEN
4bb0: 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 63 65  D_OBJ(interp, ce
4bc0: 72 74 50 74 72 2c 20 22 69 73 73 75 65 72 41 6c  rtPtr, "issuerAl
4bd0: 74 4e 61 6d 65 22 2c 20 54 6c 73 5f 78 35 30 39  tName", Tls_x509
4be0: 4e 61 6d 65 73 28 69 6e 74 65 72 70 2c 20 63 65  Names(interp, ce
4bf0: 72 74 2c 20 4e 49 44 5f 69 73 73 75 65 72 5f 61  rt, NID_issuer_a
4c00: 6c 74 5f 6e 61 6d 65 2c 20 62 69 6f 29 29 3b 0a  lt_name, bio));.
4c10: 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20  .    /* Subject 
4c20: 44 69 72 65 63 74 6f 72 79 20 41 74 74 72 69 62  Directory Attrib
4c30: 75 74 65 73 20 70 72 6f 76 69 64 65 73 20 69 64  utes provides id
4c40: 65 6e 74 69 66 69 63 61 74 69 6f 6e 20 61 74 74  entification att
4c50: 72 69 62 75 74 65 73 20 28 65 2e 67 2e 2c 20 6e  ributes (e.g., n
4c60: 61 74 69 6f 6e 61 6c 69 74 79 29 0a 09 6f 66 20  ationality)..of 
4c70: 74 68 65 20 73 75 62 6a 65 63 74 2e 20 52 46 43  the subject. RFC
4c80: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
4c90: 32 2e 31 2e 38 20 28 73 75 62 6a 65 63 74 44 69  2.1.8 (subjectDi
4ca0: 72 65 63 74 6f 72 79 41 74 74 72 69 62 75 74 65  rectoryAttribute
4cb0: 73 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 42 61  s) */..    /* Ba
4cc0: 73 69 63 20 43 6f 6e 73 74 72 61 69 6e 74 73 20  sic Constraints 
4cd0: 69 64 65 6e 74 69 66 69 65 73 20 77 68 65 74 68  identifies wheth
4ce0: 65 72 20 74 68 65 20 73 75 62 6a 65 63 74 20 6f  er the subject o
4cf0: 66 20 74 68 65 20 63 65 72 74 20 69 73 20 61 20  f the cert is a 
4d00: 43 41 20 61 6e 64 0a 09 74 68 65 20 6d 61 78 20  CA and..the max 
4d10: 64 65 70 74 68 20 6f 66 20 76 61 6c 69 64 20 63  depth of valid c
4d20: 65 72 74 20 70 61 74 68 73 20 66 6f 72 20 74 68  ert paths for th
4d30: 69 73 20 63 65 72 74 2e 20 52 46 43 20 35 32 38  is cert. RFC 528
4d40: 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e  0 section 4.2.1.
4d50: 39 2c 20 4e 49 44 5f 62 61 73 69 63 5f 63 6f 6e  9, NID_basic_con
4d60: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
4d70: 69 66 20 28 78 66 6c 61 67 73 20 26 20 45 58 46  if (xflags & EXF
4d80: 4c 41 47 5f 42 43 4f 4e 53 29 20 7b 0a 09 4c 41  LAG_BCONS) {..LA
4d90: 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72  PPEND_LONG(inter
4da0: 70 2c 20 63 65 72 74 50 74 72 2c 20 22 70 61 74  p, certPtr, "pat
4db0: 68 4c 65 6e 22 2c 20 58 35 30 39 5f 67 65 74 5f  hLen", X509_get_
4dc0: 70 61 74 68 6c 65 6e 28 63 65 72 74 29 29 3b 0a  pathlen(cert));.
4dd0: 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e      }.    LAPPEN
4de0: 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 63  D_BOOL(interp, c
4df0: 65 72 74 50 74 72 2c 20 22 62 61 73 69 63 43 6f  ertPtr, "basicCo
4e00: 6e 73 74 72 61 69 6e 74 73 43 41 22 2c 20 78 66  nstraintsCA", xf
4e10: 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 43 41  lags & EXFLAG_CA
4e20: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42  );.    LAPPEND_B
4e30: 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 63 65 72 74  OOL(interp, cert
4e40: 50 74 72 2c 20 22 62 61 73 69 63 43 6f 6e 73 74  Ptr, "basicConst
4e50: 72 61 69 6e 74 73 43 72 69 74 69 63 61 6c 22 2c  raintsCritical",
4e60: 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47   xflags & EXFLAG
4e70: 5f 43 52 49 54 49 43 41 4c 29 3b 0a 0a 20 20 20  _CRITICAL);..   
4e80: 20 2f 2a 20 4e 61 6d 65 20 43 6f 6e 73 74 72 61   /* Name Constra
4e90: 69 6e 74 73 20 69 73 20 6f 6e 6c 79 20 75 73 65  ints is only use
4ea0: 64 20 69 6e 20 43 41 20 63 65 72 74 73 20 74 6f  d in CA certs to
4eb0: 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 6e 61   indicate the na
4ec0: 6d 65 20 73 70 61 63 65 20 66 6f 72 0a 09 61 6c  me space for..al
4ed0: 6c 20 73 75 62 6a 65 63 74 20 6e 61 6d 65 73 20  l subject names 
4ee0: 69 6e 20 73 75 62 73 65 71 75 65 6e 74 20 63 65  in subsequent ce
4ef0: 72 74 69 66 69 63 61 74 65 73 20 69 6e 20 61 20  rtificates in a 
4f00: 63 65 72 74 69 66 69 63 61 74 69 6f 6e 20 70 61  certification pa
4f10: 74 68 0a 09 4d 55 53 54 20 62 65 20 6c 6f 63 61  th..MUST be loca
4f20: 74 65 64 2e 20 52 46 43 20 35 32 38 30 20 73 65  ted. RFC 5280 se
4f30: 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 30 2c 20  ction 4.2.1.10, 
4f40: 4e 49 44 5f 6e 61 6d 65 5f 63 6f 6e 73 74 72 61  NID_name_constra
4f50: 69 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ints */..    /* 
4f60: 50 6f 6c 69 63 79 20 43 6f 6e 73 74 72 61 69 6e  Policy Constrain
4f70: 74 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  ts is only used 
4f80: 69 6e 20 43 41 20 63 65 72 74 73 20 74 6f 20 6c  in CA certs to l
4f90: 69 6d 69 74 20 74 68 65 20 6c 65 6e 67 74 68 20  imit the length 
4fa0: 6f 66 20 61 0a 09 63 65 72 74 20 63 68 61 69 6e  of a..cert chain
4fb0: 20 66 6f 72 20 74 68 61 74 20 43 41 2e 20 52 46   for that CA. RF
4fc0: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34  C 5280 section 4
4fd0: 2e 32 2e 31 2e 31 31 2c 20 4e 49 44 5f 70 6f 6c  .2.1.11, NID_pol
4fe0: 69 63 79 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  icy_constraints 
4ff0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e  */..    /* Exten
5000: 64 65 64 20 4b 65 79 20 55 73 61 67 65 20 69 6e  ded Key Usage in
5010: 64 69 63 61 74 65 73 20 74 68 65 20 70 75 72 70  dicates the purp
5020: 6f 73 65 73 20 74 68 65 20 63 65 72 74 69 66 69  oses the certifi
5030: 65 64 20 70 75 62 6c 69 63 20 6b 65 79 20 6d 61  ed public key ma
5040: 79 20 62 65 0a 09 75 73 65 64 2c 20 62 65 79 6f  y be..used, beyo
5050: 6e 64 20 74 68 65 20 62 61 73 69 63 20 70 75 72  nd the basic pur
5060: 70 6f 73 65 73 2e 20 52 46 43 20 35 32 38 30 20  poses. RFC 5280 
5070: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 32  section 4.2.1.12
5080: 2c 20 4e 49 44 5f 65 78 74 5f 6b 65 79 5f 75 73  , NID_ext_key_us
5090: 61 67 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45  age */.    LAPPE
50a0: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 63  ND_OBJ(interp, c
50b0: 65 72 74 50 74 72 2c 20 22 65 78 74 65 6e 64 65  ertPtr, "extende
50c0: 64 4b 65 79 55 73 61 67 65 22 2c 20 54 6c 73 5f  dKeyUsage", Tls_
50d0: 78 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 28  x509ExtKeyUsage(
50e0: 69 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 78 66  interp, cert, xf
50f0: 6c 61 67 73 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  lags));..    /* 
5100: 43 52 4c 20 44 69 73 74 72 69 62 75 74 69 6f 6e  CRL Distribution
5110: 20 50 6f 69 6e 74 73 20 69 64 65 6e 74 69 66 69   Points identifi
5120: 65 73 20 77 68 65 72 65 20 43 52 4c 20 69 6e 66  es where CRL inf
5130: 6f 72 6d 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  ormation can be 
5140: 6f 62 74 61 69 6e 65 64 2e 0a 09 52 46 43 20 35  obtained...RFC 5
5150: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e  280 section 4.2.
5160: 31 2e 31 33 2a 2f 0a 20 20 20 20 4c 41 50 50 45  1.13*/.    LAPPE
5170: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 63  ND_OBJ(interp, c
5180: 65 72 74 50 74 72 2c 20 22 63 72 6c 44 69 73 74  ertPtr, "crlDist
5190: 72 69 62 75 74 69 6f 6e 50 6f 69 6e 74 73 22 2c  ributionPoints",
51a0: 20 54 6c 73 5f 78 35 30 39 43 72 6c 44 70 28 69   Tls_x509CrlDp(i
51b0: 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a  nterp, cert));..
51c0: 20 20 20 20 2f 2a 20 46 72 65 73 68 65 73 74 20      /* Freshest 
51d0: 43 52 4c 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f  CRL extension */
51e0: 0a 20 20 20 20 69 66 20 28 78 66 6c 61 67 73 20  .    if (xflags 
51f0: 26 20 45 58 46 4c 41 47 5f 46 52 45 53 48 45 53  & EXFLAG_FRESHES
5200: 54 29 20 7b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  T) {.    }..    
5210: 2f 2a 20 41 75 74 68 6f 72 69 74 79 20 49 6e 66  /* Authority Inf
5220: 6f 72 6d 61 74 69 6f 6e 20 41 63 63 65 73 73 20  ormation Access 
5230: 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 74 6f  indicates how to
5240: 20 61 63 63 65 73 73 20 69 6e 66 6f 20 61 6e 64   access info and
5250: 20 73 65 72 76 69 63 65 73 0a 09 66 6f 72 20 74   services..for t
5260: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69  he certificate i
5270: 73 73 75 65 72 2e 20 52 46 43 20 35 32 38 30 20  ssuer. RFC 5280 
5280: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 32 2e 31 2c  section 4.2.2.1,
5290: 20 4e 49 44 5f 69 6e 66 6f 5f 61 63 63 65 73 73   NID_info_access
52a0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20   */..    /* Get 
52b0: 4f 6e 2d 6c 69 6e 65 20 43 65 72 74 69 66 69 63  On-line Certific
52c0: 61 74 65 20 53 74 61 74 75 73 20 50 72 6f 74 6f  ate Status Proto
52d0: 63 6f 6c 20 28 4f 53 43 50 29 20 55 52 4c 20 2a  col (OSCP) URL *
52e0: 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42  /.    LAPPEND_OB
52f0: 4a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74  J(interp, certPt
5300: 72 2c 20 22 6f 63 73 70 22 2c 20 54 6c 73 5f 78  r, "ocsp", Tls_x
5310: 35 30 39 4f 73 63 70 28 69 6e 74 65 72 70 2c 20  509Oscp(interp, 
5320: 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  cert));..    /* 
5330: 47 65 74 20 43 65 72 74 69 66 69 63 61 74 65 20  Get Certificate 
5340: 41 75 74 68 6f 72 69 74 79 20 28 43 41 29 20 49  Authority (CA) I
5350: 73 73 75 65 72 73 20 55 52 4c 20 2a 2f 0a 20 20  ssuers URL */.  
5360: 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e    LAPPEND_OBJ(in
5370: 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 22  terp, certPtr, "
5380: 63 61 49 73 73 75 65 72 73 22 2c 20 54 6c 73 5f  caIssuers", Tls_
5390: 78 35 30 39 43 61 49 73 73 75 65 72 73 28 69 6e  x509CaIssuers(in
53a0: 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20  terp, cert));.. 
53b0: 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 49 6e     /* Subject In
53c0: 66 6f 72 6d 61 74 69 6f 6e 20 41 63 63 65 73 73  formation Access
53d0: 20 2d 20 52 46 43 20 35 32 38 30 20 73 65 63 74   - RFC 5280 sect
53e0: 69 6f 6e 20 34 2e 32 2e 32 2e 32 2c 20 4e 49 44  ion 4.2.2.2, NID
53f0: 5f 73 69 6e 66 6f 5f 61 63 63 65 73 73 20 2a 2f  _sinfo_access */
5400: 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69  ..    /* Certifi
5410: 63 61 74 65 20 41 6c 69 61 73 2e 20 49 66 20 75  cate Alias. If u
5420: 73 65 73 20 61 20 50 4b 43 53 23 31 32 20 73 74  ses a PKCS#12 st
5430: 72 75 63 74 75 72 65 2c 20 61 6c 69 61 73 20 77  ructure, alias w
5440: 69 6c 6c 20 72 65 66 6c 65 63 74 20 74 68 65 0a  ill reflect the.
5450: 09 66 72 69 65 6e 64 6c 79 4e 61 6d 65 20 61 74  .friendlyName at
5460: 74 72 69 62 75 74 65 20 28 52 46 43 20 32 39 38  tribute (RFC 298
5470: 35 29 2e 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 65  5). */.    {..le
5480: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  n = 0;.        c
5490: 68 61 72 20 2a 73 74 72 69 6e 67 20 3d 20 58 35  har *string = X5
54a0: 30 39 5f 61 6c 69 61 73 5f 67 65 74 30 28 63 65  09_alias_get0(ce
54b0: 72 74 2c 20 26 6c 65 6e 29 3b 0a 09 4c 41 50 50  rt, &len);..LAPP
54c0: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
54d0: 63 65 72 74 50 74 72 2c 20 22 61 6c 69 61 73 22  certPtr, "alias"
54e0: 2c 20 73 74 72 69 6e 67 2c 20 6c 65 6e 29 3b 0a  , string, len);.
54f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 65      }..    /* Ce
5500: 72 74 69 66 69 63 61 74 65 20 61 6e 64 20 64 75  rtificate and du
5510: 6d 70 20 61 6c 6c 20 64 61 74 61 20 2a 2f 0a 20  mp all data */. 
5520: 20 20 20 7b 0a 09 63 68 61 72 20 63 65 72 74 53     {..char certS
5530: 74 72 5b 43 45 52 54 5f 53 54 52 5f 53 49 5a 45  tr[CERT_STR_SIZE
5540: 5d 3b 0a 0a 09 2f 2a 20 47 65 74 20 63 65 72 74  ];.../* Get cert
5550: 69 66 69 63 61 74 65 20 2a 2f 0a 09 6c 65 6e 20  ificate */..len 
5560: 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28  = BIO_to_Buffer(
5570: 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35  PEM_write_bio_X5
5580: 30 39 28 62 69 6f 2c 20 63 65 72 74 29 2c 20 62  09(bio, cert), b
5590: 69 6f 2c 20 63 65 72 74 53 74 72 2c 20 43 45 52  io, certStr, CER
55a0: 54 5f 53 54 52 5f 53 49 5a 45 29 3b 0a 09 4c 41  T_STR_SIZE);..LA
55b0: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
55c0: 2c 20 63 65 72 74 50 74 72 2c 20 22 63 65 72 74  , certPtr, "cert
55d0: 69 66 69 63 61 74 65 22 2c 20 63 65 72 74 53 74  ificate", certSt
55e0: 72 2c 20 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 47 65  r, len);.../* Ge
55f0: 74 20 61 6c 6c 20 63 65 72 74 20 69 6e 66 6f 20  t all cert info 
5600: 2a 2f 0a 09 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f  */..len = BIO_to
5610: 5f 42 75 66 66 65 72 28 58 35 30 39 5f 70 72 69  _Buffer(X509_pri
5620: 6e 74 5f 65 78 28 62 69 6f 2c 20 63 65 72 74 2c  nt_ex(bio, cert,
5630: 20 66 6c 61 67 73 2c 20 30 29 2c 20 62 69 6f 2c   flags, 0), bio,
5640: 20 63 65 72 74 53 74 72 2c 20 43 45 52 54 5f 53   certStr, CERT_S
5650: 54 52 5f 53 49 5a 45 29 3b 0a 09 4c 41 50 50 45  TR_SIZE);..LAPPE
5660: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 63  ND_STR(interp, c
5670: 65 72 74 50 74 72 2c 20 22 61 6c 6c 22 2c 20 63  ertPtr, "all", c
5680: 65 72 74 53 74 72 2c 20 6c 65 6e 29 3b 0a 20 20  ertStr, len);.  
5690: 20 20 7d 0a 0a 20 20 20 20 42 49 4f 5f 66 72 65    }..    BIO_fre
56a0: 65 28 62 69 6f 29 3b 0a 20 20 20 20 72 65 74 75  e(bio);.    retu
56b0: 72 6e 20 63 65 72 74 50 74 72 3b 0a 7d 0a        rn certPtr;.}.