Hex Artifact Content

Artifact 0d1e21b2287a0d92883cd0b1210cee54acd9e23a6bb6fbc0d9e10c6dd5fd4f1b:


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 78 35 30 39  de <openssl/x509
0120: 5f 76 66 79 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  _vfy.h>.#include
0130: 20 3c 6f 70 65 6e 73 73 6c 2f 61 73 6e 31 2e 68   <openssl/asn1.h
0140: 3e 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49  >.#include "tlsI
0150: 6e 74 2e 68 22 0a 0a 2f 2a 20 44 65 66 69 6e 65  nt.h"../* Define
0160: 20 6d 61 78 69 6d 75 6d 20 63 65 72 74 69 66 69   maximum certifi
0170: 63 61 74 65 20 73 69 7a 65 2e 20 4d 61 78 20 50  cate size. Max P
0180: 45 4d 20 73 69 7a 65 20 31 30 30 6b 42 20 61 6e  EM size 100kB an
0190: 64 20 44 45 52 20 73 69 7a 65 20 69 73 20 32 34  d DER size is 24
01a0: 6b 42 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43  kB. */.#define C
01b0: 45 52 54 5f 53 54 52 5f 53 49 5a 45 20 33 32 37  ERT_STR_SIZE 327
01c0: 36 38 0a 0a 2f 2a 20 43 6f 6d 6d 6f 6e 20 6d 61  68../* Common ma
01d0: 63 72 6f 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cros */.#define 
01e0: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
01f0: 72 70 2c 20 6f 62 6a 2c 20 74 65 78 74 2c 20 76  rp, obj, text, v
0200: 61 6c 75 65 2c 20 73 69 7a 65 29 20 7b 5c 0a 20  alue, size) {\. 
0210: 20 20 20 69 66 20 28 74 65 78 74 20 21 3d 20 4e     if (text != N
0220: 55 4c 4c 29 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  ULL) Tcl_ListObj
0230: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
0240: 74 65 72 70 2c 20 6f 62 6a 2c 20 54 63 6c 5f 4e  terp, obj, Tcl_N
0250: 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 65 78 74  ewStringObj(text
0260: 2c 20 2d 31 29 29 3b 20 5c 0a 20 20 20 20 54 63  , -1)); \.    Tc
0270: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
0280: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
0290: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  bj, Tcl_NewStrin
02a0: 67 4f 62 6a 28 76 61 6c 75 65 2c 20 73 69 7a 65  gObj(value, size
02b0: 29 29 3b 20 5c 0a 7d 0a 23 64 65 66 69 6e 65 20  )); \.}.#define 
02c0: 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
02d0: 72 70 2c 20 6f 62 6a 2c 20 74 65 78 74 2c 20 76  rp, obj, text, v
02e0: 61 6c 75 65 29 20 7b 5c 0a 20 20 20 20 69 66 20  alue) {\.    if 
02f0: 28 74 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20 54  (text != NULL) T
0300: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
0310: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
0320: 6f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  obj, Tcl_NewStri
0330: 6e 67 4f 62 6a 28 74 65 78 74 2c 20 2d 31 29 29  ngObj(text, -1))
0340: 3b 20 5c 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ; \.    Tcl_List
0350: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
0360: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 2c 20 54 63  (interp, obj, Tc
0370: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 61 6c 75  l_NewIntObj(valu
0380: 65 29 29 3b 20 5c 0a 7d 0a 23 64 65 66 69 6e 65  e)); \.}.#define
0390: 20 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e   LAPPEND_LONG(in
03a0: 74 65 72 70 2c 20 6f 62 6a 2c 20 74 65 78 74 2c  terp, obj, text,
03b0: 20 76 61 6c 75 65 29 20 7b 5c 0a 20 20 20 20 69   value) {\.    i
03c0: 66 20 28 74 65 78 74 20 21 3d 20 4e 55 4c 4c 29  f (text != NULL)
03d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
03e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
03f0: 2c 20 6f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74  , obj, Tcl_NewSt
0400: 72 69 6e 67 4f 62 6a 28 74 65 78 74 2c 20 2d 31  ringObj(text, -1
0410: 29 29 3b 20 5c 0a 20 20 20 20 54 63 6c 5f 4c 69  )); \.    Tcl_Li
0420: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
0430: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 2c 20  nt(interp, obj, 
0440: 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 76  Tcl_NewLongObj(v
0450: 61 6c 75 65 29 29 3b 20 5c 0a 7d 0a 23 64 65 66  alue)); \.}.#def
0460: 69 6e 65 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  ine LAPPEND_BOOL
0470: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 2c 20 74 65  (interp, obj, te
0480: 78 74 2c 20 76 61 6c 75 65 29 20 7b 5c 0a 20 20  xt, value) {\.  
0490: 20 20 69 66 20 28 74 65 78 74 20 21 3d 20 4e 55    if (text != NU
04a0: 4c 4c 29 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  LL) Tcl_ListObjA
04b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
04c0: 65 72 70 2c 20 6f 62 6a 2c 20 54 63 6c 5f 4e 65  erp, obj, Tcl_Ne
04d0: 77 53 74 72 69 6e 67 4f 62 6a 28 74 65 78 74 2c  wStringObj(text,
04e0: 20 2d 31 29 29 3b 20 5c 0a 20 20 20 20 54 63 6c   -1)); \.    Tcl
04f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
0500: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
0510: 6a 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  j, Tcl_NewBoolea
0520: 6e 4f 62 6a 28 76 61 6c 75 65 29 29 3b 20 5c 0a  nObj(value)); \.
0530: 7d 0a 23 64 65 66 69 6e 65 20 4c 41 50 50 45 4e  }.#define LAPPEN
0540: 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62  D_OBJ(interp, ob
0550: 6a 2c 20 74 65 78 74 2c 20 6c 69 73 74 4f 62 6a  j, text, listObj
0560: 29 20 7b 5c 0a 20 20 20 20 69 66 20 28 74 65 78  ) {\.    if (tex
0570: 74 20 21 3d 20 4e 55 4c 4c 29 20 54 63 6c 5f 4c  t != NULL) Tcl_L
0580: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
0590: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 2c  ent(interp, obj,
05a0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
05b0: 6a 28 74 65 78 74 2c 20 2d 31 29 29 3b 20 5c 0a  j(text, -1)); \.
05c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
05d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
05e0: 65 72 70 2c 20 6f 62 6a 2c 20 6c 69 73 74 4f 62  erp, obj, listOb
05f0: 6a 29 3b 20 5c 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20  j); \.}.../*. * 
0600: 42 69 6e 61 72 79 20 73 74 72 69 6e 67 20 74 6f  Binary string to
0610: 20 68 65 78 20 73 74 72 69 6e 67 0a 20 2a 2f 0a   hex string. */.
0620: 69 6e 74 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65  int String_to_He
0630: 78 28 63 68 61 72 2a 20 69 6e 70 75 74 2c 20 69  x(char* input, i
0640: 6e 74 20 69 6c 65 6e 2c 20 63 68 61 72 20 2a 6f  nt ilen, char *o
0650: 75 74 70 75 74 2c 20 69 6e 74 20 6f 6c 65 6e 29  utput, int olen)
0660: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 75 6e 74   {.    int count
0670: 20 3d 20 30 3b 0a 0a 20 20 20 20 66 6f 72 20 28   = 0;..    for (
0680: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 69  int i = 0; i < i
0690: 6c 65 6e 20 26 26 20 63 6f 75 6e 74 20 3c 20 6f  len && count < o
06a0: 6c 65 6e 20 2d 20 31 3b 20 69 2b 2b 2c 20 63 6f  len - 1; i++, co
06b0: 75 6e 74 20 2b 3d 20 32 29 20 7b 0a 09 73 70 72  unt += 2) {..spr
06c0: 69 6e 74 66 28 6f 75 74 70 75 74 20 2b 20 63 6f  intf(output + co
06d0: 75 6e 74 2c 20 22 25 30 32 58 22 2c 20 69 6e 70  unt, "%02X", inp
06e0: 75 74 5b 69 5d 20 26 20 30 78 66 66 29 3b 0a 20  ut[i] & 0xff);. 
06f0: 20 20 20 7d 0a 20 20 20 20 6f 75 74 70 75 74 5b     }.    output[
0700: 63 6f 75 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20  count] = 0;.    
0710: 72 65 74 75 72 6e 20 63 6f 75 6e 74 3b 0a 7d 0a  return count;.}.
0720: 0a 2f 2a 0a 20 2a 20 42 49 4f 20 74 6f 20 42 75  ./*. * BIO to Bu
0730: 66 66 65 72 0a 20 2a 2f 0a 69 6e 74 20 42 49 4f  ffer. */.int BIO
0740: 5f 74 6f 5f 42 75 66 66 65 72 28 69 6e 74 20 72  _to_Buffer(int r
0750: 65 73 75 6c 74 2c 20 42 49 4f 20 2a 62 69 6f 2c  esult, BIO *bio,
0760: 20 76 6f 69 64 20 2a 62 75 66 66 65 72 2c 20 69   void *buffer, i
0770: 6e 74 20 73 69 7a 65 29 20 7b 0a 20 20 20 20 69  nt size) {.    i
0780: 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nt len = 0;.    
0790: 69 6e 74 20 70 65 6e 64 69 6e 67 20 3d 20 42 49  int pending = BI
07a0: 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 3b 0a  O_pending(bio);.
07b0: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 29  .    if (result)
07c0: 20 7b 0a 09 6c 65 6e 20 3d 20 42 49 4f 5f 72 65   {..len = BIO_re
07d0: 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20  ad(bio, buffer, 
07e0: 28 70 65 6e 64 69 6e 67 20 3c 20 73 69 7a 65 29  (pending < size)
07f0: 20 3f 20 70 65 6e 64 69 6e 67 20 3a 20 73 69 7a   ? pending : siz
0800: 65 29 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f 66  e);..(void)BIO_f
0810: 6c 75 73 68 28 62 69 6f 29 3b 0a 09 69 66 20 28  lush(bio);..if (
0820: 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 20 20 20 20  len < 0) {..    
0830: 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 20 20 20 20  len = 0;..}.    
0840: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
0850: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 47 65 74 20  ;.}.../*. * Get 
0860: 58 35 30 39 20 43 65 72 74 69 66 69 63 61 74 65  X509 Certificate
0870: 20 45 78 74 65 6e 73 69 6f 6e 73 0a 20 2a 2f 0a   Extensions. */.
0880: 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30  Tcl_Obj *Tls_x50
0890: 39 45 78 74 65 6e 73 69 6f 6e 73 28 54 63 6c 5f  9Extensions(Tcl_
08a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
08b0: 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20  X509 *cert) {.  
08c0: 20 20 63 6f 6e 73 74 20 53 54 41 43 4b 5f 4f 46    const STACK_OF
08d0: 28 58 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e 29  (X509_EXTENSION)
08e0: 20 2a 65 78 74 73 3b 0a 20 20 20 20 54 63 6c 5f   *exts;.    Tcl_
08f0: 4f 62 6a 20 2a 6c 69 73 74 50 74 72 20 3d 20 54  Obj *listPtr = T
0900: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
0910: 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20   NULL);..    if 
0920: 28 6c 69 73 74 50 74 72 20 3d 3d 20 4e 55 4c 4c  (listPtr == NULL
0930: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  ) {..return NULL
0940: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
0950: 28 65 78 74 73 20 3d 20 58 35 30 39 5f 67 65 74  (exts = X509_get
0960: 30 5f 65 78 74 65 6e 73 69 6f 6e 73 28 63 65 72  0_extensions(cer
0970: 74 29 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20  t)) {..for (int 
0980: 69 3d 30 3b 20 69 20 3c 20 58 35 30 39 5f 67 65  i=0; i < X509_ge
0990: 74 5f 65 78 74 5f 63 6f 75 6e 74 28 63 65 72 74  t_ext_count(cert
09a0: 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58  ); i++) {..    X
09b0: 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e 20 2a 65  509_EXTENSION *e
09c0: 78 20 3d 20 73 6b 5f 58 35 30 39 5f 45 58 54 45  x = sk_X509_EXTE
09d0: 4e 53 49 4f 4e 5f 76 61 6c 75 65 28 65 78 74 73  NSION_value(exts
09e0: 2c 20 69 29 3b 0a 09 20 20 20 20 41 53 4e 31 5f  , i);..    ASN1_
09f0: 4f 42 4a 45 43 54 20 2a 6f 62 6a 20 3d 20 58 35  OBJECT *obj = X5
0a00: 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74  09_EXTENSION_get
0a10: 5f 6f 62 6a 65 63 74 28 65 78 29 3b 0a 09 20 20  _object(ex);..  
0a20: 20 20 2f 2a 20 41 53 4e 31 5f 4f 43 54 45 54 5f    /* ASN1_OCTET_
0a30: 53 54 52 49 4e 47 20 2a 64 61 74 61 20 3d 20 58  STRING *data = X
0a40: 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65  509_EXTENSION_ge
0a50: 74 5f 64 61 74 61 28 65 78 29 3b 20 2a 2f 0a 09  t_data(ex); */..
0a60: 20 20 20 20 69 6e 74 20 63 72 69 74 69 63 61 6c      int critical
0a70: 20 3d 20 58 35 30 39 5f 45 58 54 45 4e 53 49 4f   = X509_EXTENSIO
0a80: 4e 5f 67 65 74 5f 63 72 69 74 69 63 61 6c 28 65  N_get_critical(e
0a90: 78 29 3b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44  x);..    LAPPEND
0aa0: 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6c 69  _BOOL(interp, li
0ab0: 73 74 50 74 72 2c 20 4f 42 4a 5f 6e 69 64 32 6c  stPtr, OBJ_nid2l
0ac0: 6e 28 4f 42 4a 5f 6f 62 6a 32 6e 69 64 28 6f 62  n(OBJ_obj2nid(ob
0ad0: 6a 29 29 2c 20 63 72 69 74 69 63 61 6c 29 3b 0a  j)), critical);.
0ae0: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  .}.    }.    ret
0af0: 75 72 6e 20 6c 69 73 74 50 74 72 3b 0a 7d 0a 0a  urn listPtr;.}..
0b00: 2f 2a 0a 20 2a 20 47 65 74 20 41 75 74 68 6f 72  /*. * Get Author
0b10: 69 74 79 20 61 6e 64 20 53 75 62 6a 65 63 74 20  ity and Subject 
0b20: 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 73 0a  Key Identifiers.
0b30: 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73   */.Tcl_Obj *Tls
0b40: 5f 78 35 30 39 49 64 65 6e 74 69 66 69 65 72 28  _x509Identifier(
0b50: 41 53 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49 4e  ASN1_OCTET_STRIN
0b60: 47 20 2a 61 73 74 72 69 6e 67 29 20 7b 0a 20 20  G *astring) {.  
0b70: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c    Tcl_Obj *resul
0b80: 74 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  tPtr = NULL;.   
0b90: 20 69 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20   int len = 0;.  
0ba0: 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 30    char buffer[10
0bb0: 32 34 5d 3b 0a 0a 20 20 20 20 69 66 20 28 61 73  24];..    if (as
0bc0: 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 29 20 7b  tring != NULL) {
0bd0: 0a 09 6c 65 6e 20 3d 20 53 74 72 69 6e 67 5f 74  ..len = String_t
0be0: 6f 5f 48 65 78 28 28 63 68 61 72 20 2a 29 41 53  o_Hex((char *)AS
0bf0: 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74 30 5f 64  N1_STRING_get0_d
0c00: 61 74 61 28 61 73 74 72 69 6e 67 29 2c 0a 09 20  ata(astring),.. 
0c10: 20 20 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c     ASN1_STRING_l
0c20: 65 6e 67 74 68 28 61 73 74 72 69 6e 67 29 2c 20  ength(astring), 
0c30: 62 75 66 66 65 72 2c 20 31 30 32 34 29 3b 0a 20  buffer, 1024);. 
0c40: 20 20 20 7d 0a 20 20 20 20 72 65 73 75 6c 74 50     }.    resultP
0c50: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  tr = Tcl_NewStri
0c60: 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 6c 65  ngObj(buffer, le
0c70: 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  n);.    return r
0c80: 65 73 75 6c 74 50 74 72 3b 0a 7d 0a 0a 2f 2a 0a  esultPtr;.}../*.
0c90: 20 2a 20 47 65 74 20 4b 65 79 20 55 73 61 67 65   * Get Key Usage
0ca0: 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c  . */.Tcl_Obj *Tl
0cb0: 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65 28 54  s_x509KeyUsage(T
0cc0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0cd0: 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c 20 75  p, X509 *cert, u
0ce0: 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 73 29 20  int32_t xflags) 
0cf0: 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 75  {.    uint32_t u
0d00: 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 74 5f  sage = X509_get_
0d10: 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74 29 3b  key_usage(cert);
0d20: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69  .    Tcl_Obj *li
0d30: 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  stPtr = Tcl_NewL
0d40: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
0d50: 0a 0a 20 20 20 20 69 66 20 28 6c 69 73 74 50 74  ..    if (listPt
0d60: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  r == NULL) {..re
0d70: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
0d80: 0a 0a 20 20 20 20 69 66 20 28 28 78 66 6c 61 67  ..    if ((xflag
0d90: 73 20 26 20 45 58 46 4c 41 47 5f 4b 55 53 41 47  s & EXFLAG_KUSAG
0da0: 45 29 20 26 26 20 75 73 61 67 65 20 3c 20 55 49  E) && usage < UI
0db0: 4e 54 33 32 5f 4d 41 58 29 20 7b 0a 09 69 66 20  NT32_MAX) {..if 
0dc0: 28 75 73 61 67 65 20 26 20 4b 55 5f 44 49 47 49  (usage & KU_DIGI
0dd0: 54 41 4c 5f 53 49 47 4e 41 54 55 52 45 29 20 7b  TAL_SIGNATURE) {
0de0: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
0df0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
0e00: 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20  nterp, listPtr, 
0e10: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
0e20: 28 22 44 69 67 69 74 61 6c 20 53 69 67 6e 61 74  ("Digital Signat
0e30: 75 72 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  ure", -1));..}..
0e40: 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f 4e  if (usage & KU_N
0e50: 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e 29 20  ON_REPUDIATION) 
0e60: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
0e70: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
0e80: 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c  interp, listPtr,
0e90: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
0ea0: 6a 28 22 4e 6f 6e 2d 52 65 70 75 64 69 61 74 69  j("Non-Repudiati
0eb0: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  on", -1));..}..i
0ec0: 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f 4b 45  f (usage & KU_KE
0ed0: 59 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 29 20  Y_ENCIPHERMENT) 
0ee0: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
0ef0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
0f00: 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c  interp, listPtr,
0f10: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
0f20: 6a 28 22 4b 65 79 20 45 6e 63 69 70 68 65 72 6d  j("Key Encipherm
0f30: 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  ent", -1));..}..
0f40: 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f 44  if (usage & KU_D
0f50: 41 54 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54  ATA_ENCIPHERMENT
0f60: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
0f70: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
0f80: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74  t(interp, listPt
0f90: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
0fa0: 4f 62 6a 28 22 44 61 74 61 20 45 6e 63 69 70 68  Obj("Data Enciph
0fb0: 65 72 6d 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09  erment", -1));..
0fc0: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b  }..if (usage & K
0fd0: 55 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 29  U_KEY_AGREEMENT)
0fe0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
0ff0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1000: 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72  (interp, listPtr
1010: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1020: 62 6a 28 22 4b 65 79 20 41 67 72 65 65 6d 65 6e  bj("Key Agreemen
1030: 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66  t", -1));..}..if
1040: 20 28 75 73 61 67 65 20 26 20 4b 55 5f 4b 45 59   (usage & KU_KEY
1050: 5f 43 45 52 54 5f 53 49 47 4e 29 20 7b 0a 09 20  _CERT_SIGN) {.. 
1060: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1070: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1080: 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c  rp, listPtr, Tcl
1090: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 43  _NewStringObj("C
10a0: 65 72 74 69 66 69 63 61 74 65 20 53 69 67 6e 69  ertificate Signi
10b0: 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  ng", -1));..}..i
10c0: 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f 43 52  f (usage & KU_CR
10d0: 4c 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 20 54  L_SIGN) {..    T
10e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
10f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1100: 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77  listPtr, Tcl_New
1110: 53 74 72 69 6e 67 4f 62 6a 28 22 43 52 4c 20 53  StringObj("CRL S
1120: 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09  igning", -1));..
1130: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b  }..if (usage & K
1140: 55 5f 45 4e 43 49 50 48 45 52 5f 4f 4e 4c 59 29  U_ENCIPHER_ONLY)
1150: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
1160: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1170: 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72  (interp, listPtr
1180: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1190: 62 6a 28 22 45 6e 63 69 70 68 65 72 20 4f 6e 6c  bj("Encipher Onl
11a0: 79 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66  y", -1));..}..if
11b0: 20 28 75 73 61 67 65 20 26 20 4b 55 5f 44 45 43   (usage & KU_DEC
11c0: 49 50 48 45 52 5f 4f 4e 4c 59 29 20 7b 0a 09 20  IPHER_ONLY) {.. 
11d0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
11e0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11f0: 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c  rp, listPtr, Tcl
1200: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 44  _NewStringObj("D
1210: 65 63 69 70 68 65 72 20 4f 6e 6c 79 22 2c 20 2d  ecipher Only", -
1220: 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  1));..}.    } el
1230: 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  se {..    Tcl_Li
1240: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1250: 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50  nt(interp, listP
1260: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1270: 67 4f 62 6a 28 22 75 6e 72 65 73 74 72 69 63 74  gObj("unrestrict
1280: 65 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d  ed", -1));.    }
1290: 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 69 73 74  .    return list
12a0: 50 74 72 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 47 65  Ptr;.}../*. * Ge
12b0: 74 20 43 65 72 74 69 66 69 63 61 74 65 20 50 75  t Certificate Pu
12c0: 72 70 6f 73 65 0a 20 2a 2f 0a 63 68 61 72 20 2a  rpose. */.char *
12d0: 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 65 28  Tls_x509Purpose(
12e0: 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20  X509 *cert) {.  
12f0: 20 20 63 68 61 72 20 2a 70 75 72 70 6f 73 65 20    char *purpose 
1300: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20  = NULL;..    if 
1310: 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70  (X509_check_purp
1320: 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50  ose(cert, X509_P
1330: 55 52 50 4f 53 45 5f 53 53 4c 5f 43 4c 49 45 4e  URPOSE_SSL_CLIEN
1340: 54 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75  T, 0) > 0) {..pu
1350: 72 70 6f 73 65 20 3d 20 22 53 53 4c 20 43 6c 69  rpose = "SSL Cli
1360: 65 6e 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ent";.    } else
1370: 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f   if (X509_check_
1380: 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35  purpose(cert, X5
1390: 30 39 5f 50 55 52 50 4f 53 45 5f 53 53 4c 5f 53  09_PURPOSE_SSL_S
13a0: 45 52 56 45 52 2c 20 30 29 20 3e 20 30 29 20 7b  ERVER, 0) > 0) {
13b0: 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 53 53 4c  ..purpose = "SSL
13c0: 20 53 65 72 76 65 72 22 3b 0a 20 20 20 20 7d 20   Server";.    } 
13d0: 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68  else if (X509_ch
13e0: 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74  eck_purpose(cert
13f0: 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 4e  , X509_PURPOSE_N
1400: 53 5f 53 53 4c 5f 53 45 52 56 45 52 2c 20 30 29  S_SSL_SERVER, 0)
1410: 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65   > 0) {..purpose
1420: 20 3d 20 22 4d 53 53 20 53 53 4c 20 53 65 72 76   = "MSS SSL Serv
1430: 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  er";.    } else 
1440: 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70  if (X509_check_p
1450: 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30  urpose(cert, X50
1460: 39 5f 50 55 52 50 4f 53 45 5f 53 4d 49 4d 45 5f  9_PURPOSE_SMIME_
1470: 53 49 47 4e 2c 20 30 29 20 3e 20 30 29 20 7b 0a  SIGN, 0) > 0) {.
1480: 09 70 75 72 70 6f 73 65 20 3d 20 22 53 4d 49 4d  .purpose = "SMIM
1490: 45 20 53 69 67 6e 69 6e 67 22 3b 0a 20 20 20 20  E Signing";.    
14a0: 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f  } else if (X509_
14b0: 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65  check_purpose(ce
14c0: 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45  rt, X509_PURPOSE
14d0: 5f 53 4d 49 4d 45 5f 45 4e 43 52 59 50 54 2c 20  _SMIME_ENCRYPT, 
14e0: 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f  0) > 0) {..purpo
14f0: 73 65 20 3d 20 22 53 4d 49 4d 45 20 45 6e 63 72  se = "SMIME Encr
1500: 79 70 74 69 6f 6e 22 3b 0a 20 20 20 20 7d 20 65  yption";.    } e
1510: 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65  lse if (X509_che
1520: 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c  ck_purpose(cert,
1530: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 43 52   X509_PURPOSE_CR
1540: 4c 5f 53 49 47 4e 2c 20 30 29 20 3e 20 30 29 20  L_SIGN, 0) > 0) 
1550: 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 43 52  {..purpose = "CR
1560: 4c 20 53 69 67 6e 69 6e 67 22 3b 0a 20 20 20 20  L Signing";.    
1570: 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f  } else if (X509_
1580: 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65  check_purpose(ce
1590: 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45  rt, X509_PURPOSE
15a0: 5f 41 4e 59 2c 20 30 29 20 3e 20 30 29 20 7b 0a  _ANY, 0) > 0) {.
15b0: 09 70 75 72 70 6f 73 65 20 3d 20 22 41 6e 79 22  .purpose = "Any"
15c0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
15d0: 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70  (X509_check_purp
15e0: 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50  ose(cert, X509_P
15f0: 55 52 50 4f 53 45 5f 4f 43 53 50 5f 48 45 4c 50  URPOSE_OCSP_HELP
1600: 45 52 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70  ER, 0) > 0) {..p
1610: 75 72 70 6f 73 65 20 3d 20 22 4f 43 53 50 20 48  urpose = "OCSP H
1620: 65 6c 70 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c  elper";.    } el
1630: 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63  se if (X509_chec
1640: 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20  k_purpose(cert, 
1650: 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 54 49 4d  X509_PURPOSE_TIM
1660: 45 53 54 41 4d 50 5f 53 49 47 4e 2c 20 30 29 20  ESTAMP_SIGN, 0) 
1670: 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20  > 0) {..purpose 
1680: 3d 20 22 54 69 6d 65 73 74 61 6d 70 20 53 69 67  = "Timestamp Sig
1690: 6e 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73  ning";.    } els
16a0: 65 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22  e {..purpose = "
16b0: 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  ";.    }.    ret
16c0: 75 72 6e 20 70 75 72 70 6f 73 65 3b 0a 7d 0a 0a  urn purpose;.}..
16d0: 2f 2a 0a 20 2a 20 46 6f 72 20 65 61 63 68 20 70  /*. * For each p
16e0: 75 72 70 6f 73 65 2c 20 67 65 74 20 63 65 72 74  urpose, get cert
16f0: 69 66 69 63 61 74 65 20 61 70 70 6c 69 63 61 62  ificate applicab
1700: 69 6c 69 74 79 0a 20 2a 2f 0a 54 63 6c 5f 4f 62  ility. */.Tcl_Ob
1710: 6a 20 2a 54 6c 73 5f 78 35 30 39 50 75 72 70 6f  j *Tls_x509Purpo
1720: 73 65 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ses(Tcl_Interp *
1730: 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65  interp, X509 *ce
1740: 72 74 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  rt) {.    Tcl_Ob
1750: 6a 20 2a 6c 69 73 74 50 74 72 20 3d 20 54 63 6c  j *listPtr = Tcl
1760: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
1770: 55 4c 4c 29 3b 0a 20 20 20 20 58 35 30 39 5f 50  ULL);.    X509_P
1780: 55 52 50 4f 53 45 20 2a 70 74 6d 70 3b 0a 0a 20  URPOSE *ptmp;.. 
1790: 20 20 20 69 66 20 28 6c 69 73 74 50 74 72 20 3d     if (listPtr =
17a0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
17b0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
17c0: 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20     for (int i = 
17d0: 30 3b 20 69 20 3c 20 58 35 30 39 5f 50 55 52 50  0; i < X509_PURP
17e0: 4f 53 45 5f 67 65 74 5f 63 6f 75 6e 74 28 29 3b  OSE_get_count();
17f0: 20 69 2b 2b 29 20 7b 0a 09 70 74 6d 70 20 3d 20   i++) {..ptmp = 
1800: 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74  X509_PURPOSE_get
1810: 30 28 69 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a  0(i);..Tcl_Obj *
1820: 74 6d 70 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  tmpPtr = Tcl_New
1830: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
1840: 3b 0a 0a 09 66 6f 72 20 28 69 6e 74 20 6a 20 3d  ;...for (int j =
1850: 20 30 3b 20 6a 20 3c 20 32 3b 20 6a 2b 2b 29 20   0; j < 2; j++) 
1860: 7b 0a 09 20 20 20 20 69 6e 74 20 69 64 72 65 74  {..    int idret
1870: 20 3d 20 58 35 30 39 5f 63 68 65 63 6b 5f 70 75   = X509_check_pu
1880: 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39  rpose(cert, X509
1890: 5f 50 55 52 50 4f 53 45 5f 67 65 74 5f 69 64 28  _PURPOSE_get_id(
18a0: 70 74 6d 70 29 2c 20 6a 29 3b 0a 09 20 20 20 20  ptmp), j);..    
18b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
18c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
18d0: 20 74 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65 77   tmpPtr, Tcl_New
18e0: 53 74 72 69 6e 67 4f 62 6a 28 6a 20 3f 20 22 43  StringObj(j ? "C
18f0: 41 22 20 3a 20 22 6e 6f 6e 43 41 22 2c 20 2d 31  A" : "nonCA", -1
1900: 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ));..    Tcl_Lis
1910: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1920: 74 28 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 72  t(interp, tmpPtr
1930: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1940: 62 6a 28 69 64 72 65 74 20 3d 3d 20 31 20 3f 20  bj(idret == 1 ? 
1950: 22 59 65 73 22 20 3a 20 22 4e 6f 22 2c 20 2d 31  "Yes" : "No", -1
1960: 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f  ));..}..LAPPEND_
1970: 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  OBJ(interp, list
1980: 50 74 72 2c 20 58 35 30 39 5f 50 55 52 50 4f 53  Ptr, X509_PURPOS
1990: 45 5f 67 65 74 30 5f 6e 61 6d 65 28 70 74 6d 70  E_get0_name(ptmp
19a0: 29 2c 20 74 6d 70 50 74 72 29 3b 0a 20 20 20 20  ), tmpPtr);.    
19b0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 69 73  }.    return lis
19c0: 74 50 74 72 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 47  tPtr;.}../*. * G
19d0: 65 74 20 53 75 62 6a 65 63 74 20 41 6c 74 65 72  et Subject Alter
19e0: 6e 61 74 65 20 4e 61 6d 65 73 20 28 53 41 4e 29  nate Names (SAN)
19f0: 20 61 6e 64 20 49 73 73 75 65 72 20 41 6c 74 65   and Issuer Alte
1a00: 72 6e 61 74 65 20 4e 61 6d 65 73 0a 20 2a 2f 0a  rnate Names. */.
1a10: 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30  Tcl_Obj *Tls_x50
1a20: 39 4e 61 6d 65 73 28 54 63 6c 5f 49 6e 74 65 72  9Names(Tcl_Inter
1a30: 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20  p *interp, X509 
1a40: 2a 63 65 72 74 2c 20 69 6e 74 20 6e 69 64 2c 20  *cert, int nid, 
1a50: 42 49 4f 20 2a 62 69 6f 29 20 7b 0a 20 20 20 20  BIO *bio) {.    
1a60: 53 54 41 43 4b 5f 4f 46 28 47 45 4e 45 52 41 4c  STACK_OF(GENERAL
1a70: 5f 4e 41 4d 45 29 20 2a 6e 61 6d 65 73 3b 0a 20  _NAME) *names;. 
1a80: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74     Tcl_Obj *list
1a90: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
1aa0: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20  tObj(0, NULL);. 
1ab0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
1ac0: 63 68 61 72 20 62 75 66 66 65 72 5b 31 30 32 34  char buffer[1024
1ad0: 5d 3b 0a 0a 20 20 20 20 69 66 20 28 6c 69 73 74  ];..    if (list
1ae0: 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Ptr == NULL) {..
1af0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
1b00: 20 7d 0a 0a 20 20 20 20 69 66 20 28 6e 61 6d 65   }..    if (name
1b10: 73 20 3d 20 58 35 30 39 5f 67 65 74 5f 65 78 74  s = X509_get_ext
1b20: 5f 64 32 69 28 63 65 72 74 2c 20 6e 69 64 2c 20  _d2i(cert, nid, 
1b30: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 7b 0a 09  NULL, NULL)) {..
1b40: 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b 20 69 20  for (int i=0; i 
1b50: 3c 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d  < sk_GENERAL_NAM
1b60: 45 5f 6e 75 6d 28 6e 61 6d 65 73 29 3b 20 69 2b  E_num(names); i+
1b70: 2b 29 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20  +) {..    const 
1b80: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 20 2a 6e 61  GENERAL_NAME *na
1b90: 6d 65 20 3d 20 73 6b 5f 47 45 4e 45 52 41 4c 5f  me = sk_GENERAL_
1ba0: 4e 41 4d 45 5f 76 61 6c 75 65 28 6e 61 6d 65 73  NAME_value(names
1bb0: 2c 20 69 29 3b 0a 0a 09 20 20 20 20 6c 65 6e 20  , i);...    len 
1bc0: 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28  = BIO_to_Buffer(
1bd0: 6e 61 6d 65 20 26 26 20 47 45 4e 45 52 41 4c 5f  name && GENERAL_
1be0: 4e 41 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c 20  NAME_print(bio, 
1bf0: 6e 61 6d 65 29 2c 20 62 69 6f 2c 20 62 75 66 66  name), bio, buff
1c00: 65 72 2c 20 31 30 32 34 29 3b 0a 09 20 20 20 20  er, 1024);..    
1c10: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
1c20: 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 4e 55 4c  rp, listPtr, NUL
1c30: 4c 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b  L, buffer, len);
1c40: 0a 09 7d 0a 09 73 6b 5f 47 45 4e 45 52 41 4c 5f  ..}..sk_GENERAL_
1c50: 4e 41 4d 45 5f 70 6f 70 5f 66 72 65 65 28 6e 61  NAME_pop_free(na
1c60: 6d 65 73 2c 20 47 45 4e 45 52 41 4c 5f 4e 41 4d  mes, GENERAL_NAM
1c70: 45 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20  E_free);.    }. 
1c80: 20 20 20 72 65 74 75 72 6e 20 6c 69 73 74 50 74     return listPt
1c90: 72 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 47 65 74 20  r;.}../*. * Get 
1ca0: 45 58 74 65 6e 64 65 64 20 4b 65 79 20 55 73 61  EXtended Key Usa
1cb0: 67 65 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a  ge. */.Tcl_Obj *
1cc0: 54 6c 73 5f 78 35 30 39 45 78 74 4b 65 79 55 73  Tls_x509ExtKeyUs
1cd0: 61 67 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  age(Tcl_Interp *
1ce0: 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65  interp, X509 *ce
1cf0: 72 74 2c 20 75 69 6e 74 33 32 5f 74 20 78 66 6c  rt, uint32_t xfl
1d00: 61 67 73 29 20 7b 0a 20 20 20 20 75 69 6e 74 33  ags) {.    uint3
1d10: 32 5f 74 20 75 73 61 67 65 20 3d 20 58 35 30 39  2_t usage = X509
1d20: 5f 67 65 74 5f 6b 65 79 5f 75 73 61 67 65 28 63  _get_key_usage(c
1d30: 65 72 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  ert);.    Tcl_Ob
1d40: 6a 20 2a 6c 69 73 74 50 74 72 20 3d 20 54 63 6c  j *listPtr = Tcl
1d50: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
1d60: 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 6c  ULL);..    if (l
1d70: 69 73 74 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20  istPtr == NULL) 
1d80: 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  {..return NULL;.
1d90: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28      }..    if ((
1da0: 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f  xflags & EXFLAG_
1db0: 58 4b 55 53 41 47 45 29 20 26 26 20 75 73 61 67  XKUSAGE) && usag
1dc0: 65 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58 29 20  e < UINT32_MAX) 
1dd0: 7b 0a 09 75 73 61 67 65 20 3d 20 58 35 30 39 5f  {..usage = X509_
1de0: 67 65 74 5f 65 78 74 65 6e 64 65 64 5f 6b 65 79  get_extended_key
1df0: 5f 75 73 61 67 65 28 63 65 72 74 29 3b 0a 0a 09  _usage(cert);...
1e00: 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f  if (usage & XKU_
1e10: 53 53 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09 20  SSL_SERVER) {.. 
1e20: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1e30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1e40: 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c  rp, listPtr, Tcl
1e50: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 54  _NewStringObj("T
1e60: 4c 53 20 57 65 62 20 53 65 72 76 65 72 20 41 75  LS Web Server Au
1e70: 74 68 65 6e 74 69 63 61 74 69 6f 6e 22 2c 20 2d  thentication", -
1e80: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61  1));..}..if (usa
1e90: 67 65 20 26 20 58 4b 55 5f 53 53 4c 5f 43 4c 49  ge & XKU_SSL_CLI
1ea0: 45 4e 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ENT) {..    Tcl_
1eb0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1ec0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
1ed0: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tPtr, Tcl_NewStr
1ee0: 69 6e 67 4f 62 6a 28 22 54 4c 53 20 57 65 62 20  ingObj("TLS Web 
1ef0: 43 6c 69 65 6e 74 20 41 75 74 68 65 6e 74 69 63  Client Authentic
1f00: 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d  ation", -1));..}
1f10: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b  ..if (usage & XK
1f20: 55 5f 53 4d 49 4d 45 29 20 7b 0a 09 20 20 20 20  U_SMIME) {..    
1f30: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1f40: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1f50: 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65   listPtr, Tcl_Ne
1f60: 77 53 74 72 69 6e 67 4f 62 6a 28 22 45 2d 6d 61  wStringObj("E-ma
1f70: 69 6c 20 50 72 6f 74 65 63 74 69 6f 6e 22 2c 20  il Protection", 
1f80: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73  -1));..}..if (us
1f90: 61 67 65 20 26 20 58 4b 55 5f 43 4f 44 45 5f 53  age & XKU_CODE_S
1fa0: 49 47 4e 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  IGN) {..    Tcl_
1fb0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1fc0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
1fd0: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tPtr, Tcl_NewStr
1fe0: 69 6e 67 4f 62 6a 28 22 43 6f 64 65 20 53 69 67  ingObj("Code Sig
1ff0: 6e 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  ning", -1));..}.
2000: 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55  .if (usage & XKU
2010: 5f 53 47 43 29 20 7b 0a 09 20 20 20 20 54 63 6c  _SGC) {..    Tcl
2020: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2030: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
2040: 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  stPtr, Tcl_NewSt
2050: 72 69 6e 67 4f 62 6a 28 22 53 47 43 22 2c 20 2d  ringObj("SGC", -
2060: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61  1));..}..if (usa
2070: 67 65 20 26 20 58 4b 55 5f 4f 43 53 50 5f 53 49  ge & XKU_OCSP_SI
2080: 47 4e 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  GN) {..    Tcl_L
2090: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
20a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  ent(interp, list
20b0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
20c0: 6e 67 4f 62 6a 28 22 4f 43 53 50 20 53 69 67 6e  ngObj("OCSP Sign
20d0: 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  ing", -1));..}..
20e0: 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f  if (usage & XKU_
20f0: 54 49 4d 45 53 54 41 4d 50 29 20 7b 0a 09 20 20  TIMESTAMP) {..  
2100: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2110: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2120: 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f  p, listPtr, Tcl_
2130: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 69  NewStringObj("Ti
2140: 6d 65 20 53 74 61 6d 70 69 6e 67 22 2c 20 2d 31  me Stamping", -1
2150: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67  ));..}..if (usag
2160: 65 20 26 20 58 4b 55 5f 44 56 43 53 20 29 20 7b  e & XKU_DVCS ) {
2170: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
2180: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2190: 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20  nterp, listPtr, 
21a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
21b0: 28 22 44 56 43 53 22 2c 20 2d 31 29 29 3b 0a 09  ("DVCS", -1));..
21c0: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58  }..if (usage & X
21d0: 4b 55 5f 41 4e 59 45 4b 55 29 20 7b 0a 09 20 20  KU_ANYEKU) {..  
21e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
21f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2200: 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f  p, listPtr, Tcl_
2210: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 41 6e  NewStringObj("An
2220: 79 20 45 78 74 65 6e 64 65 64 20 4b 65 79 20 55  y Extended Key U
2230: 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  sage", -1));..}.
2240: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20      } else {..  
2250: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2260: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2270: 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f  p, listPtr, Tcl_
2280: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e  NewStringObj("un
2290: 72 65 73 74 72 69 63 74 65 64 22 2c 20 2d 31 29  restricted", -1)
22a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
22b0: 75 72 6e 20 6c 69 73 74 50 74 72 3b 0a 7d 0a 0a  urn listPtr;.}..
22c0: 2f 2a 0a 20 2a 20 47 65 74 20 43 52 4c 20 44 69  /*. * Get CRL Di
22d0: 73 74 72 69 62 75 74 69 6f 6e 20 50 6f 69 6e 74  stribution Point
22e0: 73 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54  s. */.Tcl_Obj *T
22f0: 6c 73 5f 78 35 30 39 43 72 6c 44 70 28 54 63 6c  ls_x509CrlDp(Tcl
2300: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2310: 20 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20   X509 *cert) {. 
2320: 20 20 20 53 54 41 43 4b 5f 4f 46 28 44 49 53 54     STACK_OF(DIST
2330: 5f 50 4f 49 4e 54 29 20 2a 63 72 6c 3b 0a 20 20  _POINT) *crl;.  
2340: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50    Tcl_Obj *listP
2350: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
2360: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20  Obj(0, NULL);.. 
2370: 20 20 20 69 66 20 28 6c 69 73 74 50 74 72 20 3d     if (listPtr =
2380: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
2390: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
23a0: 20 20 20 69 66 20 28 63 72 6c 20 3d 20 58 35 30     if (crl = X50
23b0: 39 5f 67 65 74 5f 65 78 74 5f 64 32 69 28 63 65  9_get_ext_d2i(ce
23c0: 72 74 2c 20 4e 49 44 5f 63 72 6c 5f 64 69 73 74  rt, NID_crl_dist
23d0: 72 69 62 75 74 69 6f 6e 5f 70 6f 69 6e 74 73 2c  ribution_points,
23e0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 7b 0a   NULL, NULL)) {.
23f0: 09 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b 20 69  .for (int i=0; i
2400: 20 3c 20 73 6b 5f 44 49 53 54 5f 50 4f 49 4e 54   < sk_DIST_POINT
2410: 5f 6e 75 6d 28 63 72 6c 29 3b 20 69 2b 2b 29 20  _num(crl); i++) 
2420: 7b 0a 09 20 20 20 20 44 49 53 54 5f 50 4f 49 4e  {..    DIST_POIN
2430: 54 20 2a 64 70 20 3d 20 73 6b 5f 44 49 53 54 5f  T *dp = sk_DIST_
2440: 50 4f 49 4e 54 5f 76 61 6c 75 65 28 63 72 6c 2c  POINT_value(crl,
2450: 20 69 29 3b 0a 09 20 20 20 20 44 49 53 54 5f 50   i);..    DIST_P
2460: 4f 49 4e 54 5f 4e 41 4d 45 20 2a 64 69 73 74 70  OINT_NAME *distp
2470: 6f 69 6e 74 20 3d 20 64 70 2d 3e 64 69 73 74 70  oint = dp->distp
2480: 6f 69 6e 74 3b 0a 0a 09 20 20 20 20 69 66 20 28  oint;...    if (
2490: 64 69 73 74 70 6f 69 6e 74 2d 3e 74 79 70 65 20  distpoint->type 
24a0: 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 66 75 6c  == 0) {.../* ful
24b0: 6c 2d 6e 61 6d 65 20 47 45 4e 45 52 41 4c 49 5a  l-name GENERALIZ
24c0: 45 44 4e 41 4d 45 20 2a 2f 0a 09 09 66 6f 72 20  EDNAME */...for 
24d0: 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 3c 20  (int j = 0; j < 
24e0: 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f  sk_GENERAL_NAME_
24f0: 6e 75 6d 28 64 69 73 74 70 6f 69 6e 74 2d 3e 6e  num(distpoint->n
2500: 61 6d 65 2e 66 75 6c 6c 6e 61 6d 65 29 3b 20 6a  ame.fullname); j
2510: 2b 2b 29 20 7b 0a 09 09 20 20 20 20 47 45 4e 45  ++) {...    GENE
2520: 52 41 4c 5f 4e 41 4d 45 20 2a 67 65 6e 20 3d 20  RAL_NAME *gen = 
2530: 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f  sk_GENERAL_NAME_
2540: 76 61 6c 75 65 28 64 69 73 74 70 6f 69 6e 74 2d  value(distpoint-
2550: 3e 6e 61 6d 65 2e 66 75 6c 6c 6e 61 6d 65 2c 20  >name.fullname, 
2560: 6a 29 3b 0a 09 09 20 20 20 20 69 6e 74 20 74 79  j);...    int ty
2570: 70 65 3b 0a 09 09 20 20 20 20 41 53 4e 31 5f 53  pe;...    ASN1_S
2580: 54 52 49 4e 47 20 2a 75 72 69 20 3d 20 47 45 4e  TRING *uri = GEN
2590: 45 52 41 4c 5f 4e 41 4d 45 5f 67 65 74 30 5f 76  ERAL_NAME_get0_v
25a0: 61 6c 75 65 28 67 65 6e 2c 20 26 74 79 70 65 29  alue(gen, &type)
25b0: 3b 0a 09 09 20 20 20 20 69 66 20 28 74 79 70 65  ;...    if (type
25c0: 20 3d 3d 20 47 45 4e 5f 55 52 49 29 20 7b 0a 09   == GEN_URI) {..
25d0: 09 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
25e0: 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 4e  terp, listPtr, N
25f0: 55 4c 4c 2c 20 41 53 4e 31 5f 53 54 52 49 4e 47  ULL, ASN1_STRING
2600: 5f 67 65 74 30 5f 64 61 74 61 28 75 72 69 29 2c  _get0_data(uri),
2610: 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c 65 6e   ASN1_STRING_len
2620: 67 74 68 28 75 72 69 29 29 3b 0a 09 09 20 20 20  gth(uri));...   
2630: 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c   }...}..    } el
2640: 73 65 20 69 66 20 28 64 69 73 74 70 6f 69 6e 74  se if (distpoint
2650: 2d 3e 74 79 70 65 20 3d 3d 20 31 29 20 7b 0a 09  ->type == 1) {..
2660: 09 2f 2a 20 72 65 6c 61 74 69 76 65 2d 6e 61 6d  ./* relative-nam
2670: 65 20 58 35 30 39 4e 41 4d 45 20 2a 2f 0a 09 09  e X509NAME */...
2680: 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41  STACK_OF(X509_NA
2690: 4d 45 5f 45 4e 54 52 59 29 20 2a 73 6b 5f 72 65  ME_ENTRY) *sk_re
26a0: 6c 6e 61 6d 65 20 3d 20 64 69 73 74 70 6f 69 6e  lname = distpoin
26b0: 74 2d 3e 6e 61 6d 65 2e 72 65 6c 61 74 69 76 65  t->name.relative
26c0: 6e 61 6d 65 3b 0a 09 09 66 6f 72 20 28 69 6e 74  name;...for (int
26d0: 20 6a 20 3d 20 30 3b 20 6a 20 3c 20 73 6b 5f 58   j = 0; j < sk_X
26e0: 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 5f 6e  509_NAME_ENTRY_n
26f0: 75 6d 28 73 6b 5f 72 65 6c 6e 61 6d 65 29 3b 20  um(sk_relname); 
2700: 6a 2b 2b 29 20 7b 0a 09 09 20 20 20 20 58 35 30  j++) {...    X50
2710: 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 20 2a 65 20  9_NAME_ENTRY *e 
2720: 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 45  = sk_X509_NAME_E
2730: 4e 54 52 59 5f 76 61 6c 75 65 28 73 6b 5f 72 65  NTRY_value(sk_re
2740: 6c 6e 61 6d 65 2c 20 6a 29 3b 0a 09 09 20 20 20  lname, j);...   
2750: 20 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 64 20   ASN1_STRING *d 
2760: 3d 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52  = X509_NAME_ENTR
2770: 59 5f 67 65 74 5f 64 61 74 61 28 65 29 3b 0a 09  Y_get_data(e);..
2780: 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
2790: 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72  (interp, listPtr
27a0: 2c 20 4e 55 4c 4c 2c 20 41 53 4e 31 5f 53 54 52  , NULL, ASN1_STR
27b0: 49 4e 47 5f 64 61 74 61 28 64 29 2c 20 41 53 4e  ING_data(d), ASN
27c0: 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28  1_STRING_length(
27d0: 64 29 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a  d));...}..    }.
27e0: 09 7d 0a 09 43 52 4c 5f 44 49 53 54 5f 50 4f 49  .}..CRL_DIST_POI
27f0: 4e 54 53 5f 66 72 65 65 28 63 72 6c 29 3b 0a 20  NTS_free(crl);. 
2800: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2810: 6c 69 73 74 50 74 72 3b 0a 7d 0a 0a 2f 2a 0a 20  listPtr;.}../*. 
2820: 2a 20 47 65 74 20 4f 6e 2d 6c 69 6e 65 20 43 65  * Get On-line Ce
2830: 72 74 69 66 69 63 61 74 65 20 53 74 61 74 75 73  rtificate Status
2840: 20 50 72 6f 74 6f 63 6f 6c 20 28 4f 53 43 50 29   Protocol (OSCP)
2850: 20 55 52 4c 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a   URL. */.Tcl_Obj
2860: 20 2a 54 6c 73 5f 78 35 30 39 4f 73 63 70 28 54   *Tls_x509Oscp(T
2870: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2880: 70 2c 20 58 35 30 39 20 2a 63 65 72 74 29 20 7b  p, X509 *cert) {
2890: 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 4f 50  .    STACK_OF(OP
28a0: 45 4e 53 53 4c 5f 53 54 52 49 4e 47 29 20 2a 6f  ENSSL_STRING) *o
28b0: 63 73 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  csp;.    Tcl_Obj
28c0: 20 2a 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f   *listPtr = Tcl_
28d0: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
28e0: 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 6c 69  LL);..    if (li
28f0: 73 74 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b  stPtr == NULL) {
2900: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
2910: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6f 63     }..    if (oc
2920: 73 70 20 3d 20 58 35 30 39 5f 67 65 74 31 5f 6f  sp = X509_get1_o
2930: 63 73 70 28 63 65 72 74 29 29 20 7b 0a 09 66 6f  csp(cert)) {..fo
2940: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20  r (int i = 0; i 
2950: 3c 20 73 6b 5f 4f 50 45 4e 53 53 4c 5f 53 54 52  < sk_OPENSSL_STR
2960: 49 4e 47 5f 6e 75 6d 28 6f 63 73 70 29 3b 20 69  ING_num(ocsp); i
2970: 2b 2b 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 45  ++) {..    LAPPE
2980: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6c  ND_STR(interp, l
2990: 69 73 74 50 74 72 2c 20 4e 55 4c 4c 2c 20 73 6b  istPtr, NULL, sk
29a0: 5f 4f 50 45 4e 53 53 4c 5f 53 54 52 49 4e 47 5f  _OPENSSL_STRING_
29b0: 76 61 6c 75 65 28 6f 63 73 70 2c 20 69 29 2c 20  value(ocsp, i), 
29c0: 2d 31 29 3b 0a 09 7d 0a 09 58 35 30 39 5f 65 6d  -1);..}..X509_em
29d0: 61 69 6c 5f 66 72 65 65 28 6f 63 73 70 29 3b 0a  ail_free(ocsp);.
29e0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
29f0: 20 6c 69 73 74 50 74 72 3b 0a 7d 0a 0a 2f 2a 0a   listPtr;.}../*.
2a00: 20 2a 20 47 65 74 20 43 65 72 74 69 66 69 63 61   * Get Certifica
2a10: 74 65 20 41 75 74 68 6f 72 69 74 79 20 28 43 41  te Authority (CA
2a20: 29 20 49 73 73 75 65 72 73 20 55 52 4c 0a 20 2a  ) Issuers URL. *
2a30: 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78  /.Tcl_Obj *Tls_x
2a40: 35 30 39 43 61 49 73 73 75 65 72 73 28 54 63 6c  509CaIssuers(Tcl
2a50: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2a60: 20 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20   X509 *cert) {. 
2a70: 20 20 20 53 54 41 43 4b 5f 4f 46 28 41 43 43 45     STACK_OF(ACCE
2a80: 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 29 20  SS_DESCRIPTION) 
2a90: 2a 61 64 73 3b 0a 20 20 20 20 41 43 43 45 53 53  *ads;.    ACCESS
2aa0: 5f 44 45 53 43 52 49 50 54 49 4f 4e 20 2a 61 64  _DESCRIPTION *ad
2ab0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c  ;.    Tcl_Obj *l
2ac0: 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  istPtr = Tcl_New
2ad0: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
2ae0: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
2af0: 68 61 72 20 2a 62 75 66 3b 0a 20 20 20 20 69 6e  har *buf;.    in
2b00: 74 20 6c 65 6e 3b 0a 0a 20 20 20 20 69 66 20 28  t len;..    if (
2b10: 61 64 73 20 3d 20 58 35 30 39 5f 67 65 74 5f 65  ads = X509_get_e
2b20: 78 74 5f 64 32 69 28 63 65 72 74 2c 20 4e 49 44  xt_d2i(cert, NID
2b30: 5f 69 6e 66 6f 5f 61 63 63 65 73 73 2c 20 4e 55  _info_access, NU
2b40: 4c 4c 2c 20 4e 55 4c 4c 29 29 20 7b 0a 09 66 6f  LL, NULL)) {..fo
2b50: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20  r (int i = 0; i 
2b60: 3c 20 73 6b 5f 41 43 43 45 53 53 5f 44 45 53 43  < sk_ACCESS_DESC
2b70: 52 49 50 54 49 4f 4e 5f 6e 75 6d 28 61 64 73 29  RIPTION_num(ads)
2b80: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 61 64  ; i++) {..    ad
2b90: 20 3d 20 73 6b 5f 41 43 43 45 53 53 5f 44 45 53   = sk_ACCESS_DES
2ba0: 43 52 49 50 54 49 4f 4e 5f 76 61 6c 75 65 28 61  CRIPTION_value(a
2bb0: 64 73 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20  ds, i);..    if 
2bc0: 28 4f 42 4a 5f 6f 62 6a 32 6e 69 64 28 61 64 2d  (OBJ_obj2nid(ad-
2bd0: 3e 6d 65 74 68 6f 64 29 20 3d 3d 20 4e 49 44 5f  >method) == NID_
2be0: 61 64 5f 63 61 5f 69 73 73 75 65 72 73 20 26 26  ad_ca_issuers &&
2bf0: 20 61 64 2d 3e 6c 6f 63 61 74 69 6f 6e 29 20 7b   ad->location) {
2c00: 0a 09 09 69 66 20 28 61 64 2d 3e 6c 6f 63 61 74  ...if (ad->locat
2c10: 69 6f 6e 2d 3e 74 79 70 65 20 3d 3d 20 47 45 4e  ion->type == GEN
2c20: 5f 55 52 49 29 20 7b 0a 09 09 20 20 20 20 6c 65  _URI) {...    le
2c30: 6e 20 3d 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f  n = ASN1_STRING_
2c40: 74 6f 5f 55 54 46 38 28 26 62 75 66 2c 20 61 64  to_UTF8(&buf, ad
2c50: 2d 3e 6c 6f 63 61 74 69 6f 6e 2d 3e 64 2e 75 6e  ->location->d.un
2c60: 69 66 6f 72 6d 52 65 73 6f 75 72 63 65 49 64 65  iformResourceIde
2c70: 6e 74 69 66 69 65 72 29 3b 0a 09 09 20 20 20 20  ntifier);...    
2c80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2c90: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2ca0: 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65   listPtr, Tcl_Ne
2cb0: 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20  wStringObj(buf, 
2cc0: 6c 65 6e 29 29 3b 0a 09 09 20 20 20 20 4f 50 45  len));...    OPE
2cd0: 4e 53 53 4c 5f 66 72 65 65 28 62 75 66 29 3b 0a  NSSL_free(buf);.
2ce0: 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d  ..    break;...}
2cf0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 73  ..    }..}../* s
2d00: 6b 5f 41 43 43 45 53 53 5f 44 45 53 43 52 49 50  k_ACCESS_DESCRIP
2d10: 54 49 4f 4e 5f 70 6f 70 5f 66 72 65 65 28 61 64  TION_pop_free(ad
2d20: 73 2c 20 41 43 43 45 53 53 5f 44 45 53 43 52 49  s, ACCESS_DESCRI
2d30: 50 54 49 4f 4e 5f 66 72 65 65 29 3b 20 2a 2f 0a  PTION_free); */.
2d40: 09 41 55 54 48 4f 52 49 54 59 5f 49 4e 46 4f 5f  .AUTHORITY_INFO_
2d50: 41 43 43 45 53 53 5f 66 72 65 65 28 61 64 73 29  ACCESS_free(ads)
2d60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
2d70: 72 6e 20 6c 69 73 74 50 74 72 3b 0a 7d 0a 0c 0a  rn listPtr;.}...
2d80: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
2d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
2dc0: 20 2a 09 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62   *.Tls_NewX509Ob
2dd0: 6a 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d  j --. *. *.-----
2de0: 2d 2d 2d 2d 2d 2d 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 2a 0a 20 2a 09  -----------*. *.
2e10: 43 6f 6e 76 65 72 74 73 20 61 20 58 35 30 39 20  Converts a X509 
2e20: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 74 6f  certificate into
2e30: 20 61 20 54 63 6c 5f 4f 62 6a 0a 20 2a 09 2d 2d   a Tcl_Obj. *.--
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
2e70: 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63   *. *.Side effec
2e80: 74 73 3a 0a 20 2a 09 09 4e 6f 6e 65 0a 20 2a 0a  ts:. *..None. *.
2e90: 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41   *.Result:. *..A
2ea0: 20 54 63 6c 20 4c 69 73 74 20 4f 62 6a 65 63 74   Tcl List Object
2eb0: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
2ec0: 65 20 70 72 6f 76 69 64 65 64 0a 20 2a 09 09 58  e provided. *..X
2ed0: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 2e  509 certificate.
2ee0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
2f20: 2f 0a 0a 54 63 6c 5f 4f 62 6a 2a 0a 54 6c 73 5f  /..Tcl_Obj*.Tls_
2f30: 4e 65 77 58 35 30 39 4f 62 6a 28 54 63 6c 5f 49  NewX509Obj(Tcl_I
2f40: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58  nterp *interp, X
2f50: 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20  509 *cert) {.   
2f60: 20 54 63 6c 5f 4f 62 6a 20 2a 63 65 72 74 50 74   Tcl_Obj *certPt
2f70: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
2f80: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  bj(0, NULL);.   
2f90: 20 42 49 4f 20 2a 62 69 6f 20 3d 20 42 49 4f 5f   BIO *bio = BIO_
2fa0: 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29  new(BIO_s_mem())
2fb0: 3b 0a 20 20 20 20 69 6e 74 20 6d 64 6e 69 64 2c  ;.    int mdnid,
2fc0: 20 70 6b 6e 69 64 2c 20 62 69 74 73 2c 20 6c 65   pknid, bits, le
2fd0: 6e 3b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20  n;.    uint32_t 
2fe0: 78 66 6c 61 67 73 3b 0a 20 20 20 20 63 68 61 72  xflags;.    char
2ff0: 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b   buffer[BUFSIZ];
3000: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
3010: 61 72 20 6d 64 5b 45 56 50 5f 4d 41 58 5f 4d 44  ar md[EVP_MAX_MD
3020: 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 75 6e 73 69  _SIZE];.    unsi
3030: 67 6e 65 64 20 6c 6f 6e 67 20 66 6c 61 67 73 20  gned long flags 
3040: 3d 20 58 4e 5f 46 4c 41 47 5f 52 46 43 32 32 35  = XN_FLAG_RFC225
3050: 33 20 7c 20 41 53 4e 31 5f 53 54 52 46 4c 47 53  3 | ASN1_STRFLGS
3060: 5f 55 54 46 38 5f 43 4f 4e 56 45 52 54 3b 0a 20  _UTF8_CONVERT;. 
3070: 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 41 53 4e     flags &= ~ASN
3080: 31 5f 53 54 52 46 4c 47 53 5f 45 53 43 5f 4d 53  1_STRFLGS_ESC_MS
3090: 42 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65  B;..    if (inte
30a0: 72 70 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 65  rp == NULL || ce
30b0: 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62 69  rt == NULL || bi
30c0: 6f 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 65 72  o == NULL || cer
30d0: 74 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tPtr == NULL) {.
30e0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
30f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 69 67 6e    }..    /* Sign
3100: 61 74 75 72 65 20 61 6c 67 6f 72 69 74 68 6d 20  ature algorithm 
3110: 61 6e 64 20 76 61 6c 75 65 20 2d 20 52 46 43 20  and value - RFC 
3120: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31  5280 section 4.1
3130: 2e 31 2e 32 20 61 6e 64 20 34 2e 31 2e 31 2e 33  .1.2 and 4.1.1.3
3140: 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 69 67 6e 61   */.    /* signa
3150: 74 75 72 65 41 6c 67 6f 72 69 74 68 6d 20 69 73  tureAlgorithm is
3160: 20 74 68 65 20 69 64 20 6f 66 20 74 68 65 20 63   the id of the c
3170: 72 79 70 74 6f 67 72 61 70 68 69 63 20 61 6c 67  ryptographic alg
3180: 6f 72 69 74 68 6d 20 75 73 65 64 20 62 79 20 74  orithm used by t
3190: 68 65 0a 09 43 41 20 74 6f 20 73 69 67 6e 20 74  he..CA to sign t
31a0: 68 69 73 20 63 65 72 74 2e 20 73 69 67 6e 61 74  his cert. signat
31b0: 75 72 65 56 61 6c 75 65 20 69 73 20 74 68 65 20  ureValue is the 
31c0: 64 69 67 69 74 61 6c 20 73 69 67 6e 61 74 75 72  digital signatur
31d0: 65 20 63 6f 6d 70 75 74 65 64 0a 09 75 70 6f 6e  e computed..upon
31e0: 20 74 68 65 20 41 53 4e 2e 31 20 44 45 52 20 65   the ASN.1 DER e
31f0: 6e 63 6f 64 65 64 20 74 62 73 43 65 72 74 69 66  ncoded tbsCertif
3200: 69 63 61 74 65 2e 20 2a 2f 0a 20 20 20 20 7b 0a  icate. */.    {.
3210: 09 63 6f 6e 73 74 20 58 35 30 39 5f 41 4c 47 4f  .const X509_ALGO
3220: 52 20 2a 73 69 67 5f 61 6c 67 3b 0a 09 63 6f 6e  R *sig_alg;..con
3230: 73 74 20 41 53 4e 31 5f 42 49 54 5f 53 54 52 49  st ASN1_BIT_STRI
3240: 4e 47 20 2a 73 69 67 3b 0a 09 69 6e 74 20 73 69  NG *sig;..int si
3250: 67 5f 6e 69 64 3b 0a 0a 09 58 35 30 39 5f 67 65  g_nid;...X509_ge
3260: 74 30 5f 73 69 67 6e 61 74 75 72 65 28 26 73 69  t0_signature(&si
3270: 67 2c 20 26 73 69 67 5f 61 6c 67 2c 20 63 65 72  g, &sig_alg, cer
3280: 74 29 3b 0a 09 2f 2a 20 73 69 67 5f 6e 69 64 20  t);../* sig_nid 
3290: 3d 20 58 35 30 39 5f 67 65 74 5f 73 69 67 6e 61  = X509_get_signa
32a0: 74 75 72 65 5f 6e 69 64 28 63 65 72 74 29 20 2a  ture_nid(cert) *
32b0: 2f 0a 09 73 69 67 5f 6e 69 64 20 3d 20 4f 42 4a  /..sig_nid = OBJ
32c0: 5f 6f 62 6a 32 6e 69 64 28 73 69 67 5f 61 6c 67  _obj2nid(sig_alg
32d0: 2d 3e 61 6c 67 6f 72 69 74 68 6d 29 3b 0a 09 4c  ->algorithm);..L
32e0: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
32f0: 70 2c 20 63 65 72 74 50 74 72 2c 20 22 73 69 67  p, certPtr, "sig
3300: 6e 61 74 75 72 65 41 6c 67 6f 72 69 74 68 6d 22  natureAlgorithm"
3310: 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 73 69 67  , OBJ_nid2ln(sig
3320: 5f 6e 69 64 29 2c 20 2d 31 29 3b 0a 09 6c 65 6e  _nid), -1);..len
3330: 20 3d 20 28 73 69 67 5f 6e 69 64 20 21 3d 20 4e   = (sig_nid != N
3340: 49 44 5f 75 6e 64 65 66 29 20 3f 20 53 74 72 69  ID_undef) ? Stri
3350: 6e 67 5f 74 6f 5f 48 65 78 28 73 69 67 2d 3e 64  ng_to_Hex(sig->d
3360: 61 74 61 2c 20 73 69 67 2d 3e 6c 65 6e 67 74 68  ata, sig->length
3370: 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a  , buffer, BUFSIZ
3380: 29 20 3a 20 30 3b 0a 09 4c 41 50 50 45 4e 44 5f  ) : 0;..LAPPEND_
3390: 53 54 52 28 69 6e 74 65 72 70 2c 20 63 65 72 74  STR(interp, cert
33a0: 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 56  Ptr, "signatureV
33b0: 61 6c 75 65 22 2c 20 62 75 66 66 65 72 2c 20 6c  alue", buffer, l
33c0: 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  en);.    }..    
33d0: 2f 2a 20 56 65 72 73 69 6f 6e 20 6f 66 20 74 68  /* Version of th
33e0: 65 20 65 6e 63 6f 64 65 64 20 63 65 72 74 69 66  e encoded certif
33f0: 69 63 61 74 65 20 2d 20 52 46 43 20 35 32 38 30  icate - RFC 5280
3400: 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 31   section 4.1.2.1
3410: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
3420: 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 63 65 72  LONG(interp, cer
3430: 74 50 74 72 2c 20 22 76 65 72 73 69 6f 6e 22 2c  tPtr, "version",
3440: 20 58 35 30 39 5f 67 65 74 5f 76 65 72 73 69 6f   X509_get_versio
3450: 6e 28 63 65 72 74 29 2b 31 29 3b 0a 0a 20 20 20  n(cert)+1);..   
3460: 20 2f 2a 20 55 6e 69 71 75 65 20 6e 75 6d 62 65   /* Unique numbe
3470: 72 20 61 73 73 69 67 6e 65 64 20 62 79 20 43 41  r assigned by CA
3480: 20 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 20   to certificate 
3490: 2d 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69  - RFC 5280 secti
34a0: 6f 6e 20 34 2e 31 2e 32 2e 32 20 2a 2f 0a 20 20  on 4.1.2.2 */.  
34b0: 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42    len = BIO_to_B
34c0: 75 66 66 65 72 28 69 32 61 5f 41 53 4e 31 5f 49  uffer(i2a_ASN1_I
34d0: 4e 54 45 47 45 52 28 62 69 6f 2c 20 58 35 30 39  NTEGER(bio, X509
34e0: 5f 67 65 74 30 5f 73 65 72 69 61 6c 4e 75 6d 62  _get0_serialNumb
34f0: 65 72 28 63 65 72 74 29 29 2c 20 62 69 6f 2c 20  er(cert)), bio, 
3500: 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b  buffer, BUFSIZ);
3510: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
3520: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72  (interp, certPtr
3530: 2c 20 22 73 65 72 69 61 6c 4e 75 6d 62 65 72 22  , "serialNumber"
3540: 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a  , buffer, len);.
3550: 0a 20 20 20 20 2f 2a 20 53 69 67 6e 61 74 75 72  .    /* Signatur
3560: 65 20 61 6c 67 6f 72 69 74 68 6d 20 75 73 65 64  e algorithm used
3570: 20 62 79 20 74 68 65 20 43 41 20 74 6f 20 73 69   by the CA to si
3580: 67 6e 20 74 68 65 20 63 65 72 74 69 66 69 63 61  gn the certifica
3590: 74 65 2e 20 4d 75 73 74 20 6d 61 74 63 68 0a 09  te. Must match..
35a0: 73 69 67 6e 61 74 75 72 65 41 6c 67 6f 72 69 74  signatureAlgorit
35b0: 68 6d 2e 20 52 46 43 20 35 32 38 30 20 73 65 63  hm. RFC 5280 sec
35c0: 74 69 6f 6e 20 34 2e 31 2e 32 2e 33 20 2a 2f 0a  tion 4.1.2.3 */.
35d0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
35e0: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c  interp, certPtr,
35f0: 20 22 73 69 67 6e 61 74 75 72 65 22 2c 20 4f 42   "signature", OB
3600: 4a 5f 6e 69 64 32 6c 6e 28 58 35 30 39 5f 67 65  J_nid2ln(X509_ge
3610: 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28  t_signature_nid(
3620: 63 65 72 74 29 29 2c 20 2d 31 29 3b 0a 0a 20 20  cert)), -1);..  
3630: 20 20 2f 2a 20 49 73 73 75 65 72 20 69 64 65 6e    /* Issuer iden
3640: 74 69 66 69 65 73 20 74 68 65 20 65 6e 74 69 74  tifies the entit
3650: 79 20 74 68 61 74 20 73 69 67 6e 65 64 20 61 6e  y that signed an
3660: 64 20 69 73 73 75 65 64 20 74 68 65 20 63 65 72  d issued the cer
3670: 74 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74  t. RFC 5280 sect
3680: 69 6f 6e 20 34 2e 31 2e 32 2e 34 20 2a 2f 0a 20  ion 4.1.2.4 */. 
3690: 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f     len = BIO_to_
36a0: 42 75 66 66 65 72 28 58 35 30 39 5f 4e 41 4d 45  Buffer(X509_NAME
36b0: 5f 70 72 69 6e 74 5f 65 78 28 62 69 6f 2c 20 58  _print_ex(bio, X
36c0: 35 30 39 5f 67 65 74 5f 69 73 73 75 65 72 5f 6e  509_get_issuer_n
36d0: 61 6d 65 28 63 65 72 74 29 2c 20 30 2c 20 66 6c  ame(cert), 0, fl
36e0: 61 67 73 29 2c 20 62 69 6f 2c 20 62 75 66 66 65  ags), bio, buffe
36f0: 72 2c 20 42 55 46 53 49 5a 29 3b 0a 20 20 20 20  r, BUFSIZ);.    
3700: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
3710: 72 70 2c 20 63 65 72 74 50 74 72 2c 20 22 69 73  rp, certPtr, "is
3720: 73 75 65 72 22 2c 20 62 75 66 66 65 72 2c 20 6c  suer", buffer, l
3730: 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 65 72  en);..    /* Cer
3740: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 69 74  tificate validit
3750: 79 20 70 65 72 69 6f 64 20 69 73 20 74 68 65 20  y period is the 
3760: 69 6e 74 65 72 76 61 6c 20 74 68 65 20 43 41 20  interval the CA 
3770: 77 61 72 72 61 6e 74 73 20 74 68 61 74 20 69 74  warrants that it
3780: 20 77 69 6c 6c 0a 09 6d 61 69 6e 74 61 69 6e 20   will..maintain 
3790: 69 6e 66 6f 20 6f 6e 20 74 68 65 20 73 74 61 74  info on the stat
37a0: 75 73 20 6f 66 20 74 68 65 20 63 65 72 74 69 66  us of the certif
37b0: 69 63 61 74 65 2e 20 52 46 43 20 35 32 38 30 20  icate. RFC 5280 
37c0: 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 35 20  section 4.1.2.5 
37d0: 2a 2f 0a 20 20 20 20 2f 2a 20 47 65 74 20 56 61  */.    /* Get Va
37e0: 6c 69 64 69 74 79 20 2d 20 4e 6f 74 20 42 65 66  lidity - Not Bef
37f0: 6f 72 65 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d  ore */.    len =
3800: 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 41   BIO_to_Buffer(A
3810: 53 4e 31 5f 54 49 4d 45 5f 70 72 69 6e 74 28 62  SN1_TIME_print(b
3820: 69 6f 2c 20 58 35 30 39 5f 67 65 74 30 5f 6e 6f  io, X509_get0_no
3830: 74 42 65 66 6f 72 65 28 63 65 72 74 29 29 2c 20  tBefore(cert)), 
3840: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46  bio, buffer, BUF
3850: 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  SIZ);.    LAPPEN
3860: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 63 65  D_STR(interp, ce
3870: 72 74 50 74 72 2c 20 22 6e 6f 74 42 65 66 6f 72  rtPtr, "notBefor
3880: 65 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29  e", buffer, len)
3890: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 56 61  ;..    /* Get Va
38a0: 6c 69 64 69 74 79 20 2d 20 4e 6f 74 20 41 66 74  lidity - Not Aft
38b0: 65 72 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20  er */.    len = 
38c0: 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 41 53  BIO_to_Buffer(AS
38d0: 4e 31 5f 54 49 4d 45 5f 70 72 69 6e 74 28 62 69  N1_TIME_print(bi
38e0: 6f 2c 20 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74  o, X509_get0_not
38f0: 41 66 74 65 72 28 63 65 72 74 29 29 2c 20 62 69  After(cert)), bi
3900: 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49  o, buffer, BUFSI
3910: 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  Z);.    LAPPEND_
3920: 53 54 52 28 69 6e 74 65 72 70 2c 20 63 65 72 74  STR(interp, cert
3930: 50 74 72 2c 20 22 6e 6f 74 41 66 74 65 72 22 2c  Ptr, "notAfter",
3940: 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a   buffer, len);..
3950: 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 69      /* Subject i
3960: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 65 6e  dentifies the en
3970: 74 69 74 79 20 61 73 73 6f 63 69 61 74 65 64 20  tity associated 
3980: 77 69 74 68 20 74 68 65 20 70 75 62 6c 69 63 20  with the public 
3990: 6b 65 79 20 73 74 6f 72 65 64 20 69 6e 0a 09 74  key stored in..t
39a0: 68 65 20 73 75 62 6a 65 63 74 20 70 75 62 6c 69  he subject publi
39b0: 63 20 6b 65 79 20 66 69 65 6c 64 2e 20 52 46 43  c key field. RFC
39c0: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
39d0: 31 2e 32 2e 36 20 2a 2f 0a 20 20 20 20 6c 65 6e  1.2.6 */.    len
39e0: 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72   = BIO_to_Buffer
39f0: 28 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e 74  (X509_NAME_print
3a00: 5f 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67 65  _ex(bio, X509_ge
3a10: 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63  t_subject_name(c
3a20: 65 72 74 29 2c 20 30 2c 20 66 6c 61 67 73 29 2c  ert), 0, flags),
3a30: 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55   bio, buffer, BU
3a40: 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45  FSIZ);.    LAPPE
3a50: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 63  ND_STR(interp, c
3a60: 65 72 74 50 74 72 2c 20 22 73 75 62 6a 65 63 74  ertPtr, "subject
3a70: 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b  ", buffer, len);
3a80: 0a 0a 20 20 20 20 2f 2a 20 53 48 41 31 20 44 69  ..    /* SHA1 Di
3a90: 67 65 73 74 20 28 46 69 6e 67 65 72 70 72 69 6e  gest (Fingerprin
3aa0: 74 29 20 6f 66 20 63 65 72 74 20 2d 20 44 45 52  t) of cert - DER
3ab0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
3ac0: 2a 2f 0a 20 20 20 20 69 66 20 28 58 35 30 39 5f  */.    if (X509_
3ad0: 64 69 67 65 73 74 28 63 65 72 74 2c 20 45 56 50  digest(cert, EVP
3ae0: 5f 73 68 61 31 28 29 2c 20 6d 64 2c 20 26 6c 65  _sha1(), md, &le
3af0: 6e 29 29 20 7b 0a 20 20 20 20 6c 65 6e 20 3d 20  n)) {.    len = 
3b00: 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 6d 64  String_to_Hex(md
3b10: 2c 20 6c 65 6e 2c 20 62 75 66 66 65 72 2c 20 42  , len, buffer, B
3b20: 55 46 53 49 5a 29 3b 0a 09 4c 41 50 50 45 4e 44  UFSIZ);..LAPPEND
3b30: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 63 65 72  _STR(interp, cer
3b40: 74 50 74 72 2c 20 22 73 68 61 31 5f 68 61 73 68  tPtr, "sha1_hash
3b50: 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b  ", buffer, len);
3b60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
3b70: 48 41 32 35 36 20 44 69 67 65 73 74 20 28 46 69  HA256 Digest (Fi
3b80: 6e 67 65 72 70 72 69 6e 74 29 20 6f 66 20 63 65  ngerprint) of ce
3b90: 72 74 20 2d 20 44 45 52 20 72 65 70 72 65 73 65  rt - DER represe
3ba0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  ntation */.    i
3bb0: 66 20 28 58 35 30 39 5f 64 69 67 65 73 74 28 63  f (X509_digest(c
3bc0: 65 72 74 2c 20 45 56 50 5f 73 68 61 32 35 36 28  ert, EVP_sha256(
3bd0: 29 2c 20 6d 64 2c 20 26 6c 65 6e 29 29 20 7b 0a  ), md, &len)) {.
3be0: 20 20 20 20 6c 65 6e 20 3d 20 53 74 72 69 6e 67      len = String
3bf0: 5f 74 6f 5f 48 65 78 28 6d 64 2c 20 6c 65 6e 2c  _to_Hex(md, len,
3c00: 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29   buffer, BUFSIZ)
3c10: 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
3c20: 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20  nterp, certPtr, 
3c30: 22 73 68 61 32 35 36 5f 68 61 73 68 22 2c 20 62  "sha256_hash", b
3c40: 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 20  uffer, len);.   
3c50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65   }..    /* Subje
3c60: 63 74 20 50 75 62 6c 69 63 20 4b 65 79 20 49 6e  ct Public Key In
3c70: 66 6f 20 73 70 65 63 69 66 69 65 73 20 74 68 65  fo specifies the
3c80: 20 70 75 62 6c 69 63 20 6b 65 79 20 61 6e 64 20   public key and 
3c90: 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 0a 09  identifies the..
3ca0: 61 6c 67 6f 72 69 74 68 6d 20 77 69 74 68 20 77  algorithm with w
3cb0: 68 69 63 68 20 74 68 65 20 6b 65 79 20 69 73 20  hich the key is 
3cc0: 75 73 65 64 2e 20 52 46 43 20 35 32 38 30 20 73  used. RFC 5280 s
3cd0: 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 37 20 2a  ection 4.1.2.7 *
3ce0: 2f 0a 20 20 20 20 69 66 20 28 58 35 30 39 5f 67  /.    if (X509_g
3cf0: 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 69 6e 66  et_signature_inf
3d00: 6f 28 63 65 72 74 2c 20 26 6d 64 6e 69 64 2c 20  o(cert, &mdnid, 
3d10: 26 70 6b 6e 69 64 2c 20 26 62 69 74 73 2c 20 26  &pknid, &bits, &
3d20: 78 66 6c 61 67 73 29 29 20 7b 0a 09 41 53 4e 31  xflags)) {..ASN1
3d30: 5f 42 49 54 5f 53 54 52 49 4e 47 20 2a 6b 65 79  _BIT_STRING *key
3d40: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ;..unsigned int 
3d50: 6e 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  n;...LAPPEND_STR
3d60: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72  (interp, certPtr
3d70: 2c 20 22 73 69 67 6e 69 6e 67 44 69 67 65 73 74  , "signingDigest
3d80: 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6d 64  ", OBJ_nid2ln(md
3d90: 6e 69 64 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50  nid), -1);..LAPP
3da0: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
3db0: 63 65 72 74 50 74 72 2c 20 22 70 75 62 6c 69 63  certPtr, "public
3dc0: 4b 65 79 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f  KeyAlgorithm", O
3dd0: 42 4a 5f 6e 69 64 32 6c 6e 28 70 6b 6e 69 64 29  BJ_nid2ln(pknid)
3de0: 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  , -1);..LAPPEND_
3df0: 49 4e 54 28 69 6e 74 65 72 70 2c 20 63 65 72 74  INT(interp, cert
3e00: 50 74 72 2c 20 22 62 69 74 73 22 2c 20 62 69 74  Ptr, "bits", bit
3e10: 73 29 3b 20 2f 2a 20 45 66 66 65 63 74 69 76 65  s); /* Effective
3e20: 20 73 65 63 75 72 69 74 79 20 62 69 74 73 20 2a   security bits *
3e30: 2f 0a 0a 09 6b 65 79 20 3d 20 58 35 30 39 5f 67  /...key = X509_g
3e40: 65 74 30 5f 70 75 62 6b 65 79 5f 62 69 74 73 74  et0_pubkey_bitst
3e50: 72 28 63 65 72 74 29 3b 0a 09 6c 65 6e 20 3d 20  r(cert);..len = 
3e60: 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 6b 65  String_to_Hex(ke
3e70: 79 2d 3e 64 61 74 61 2c 20 6b 65 79 2d 3e 6c 65  y->data, key->le
3e80: 6e 67 74 68 2c 20 62 75 66 66 65 72 2c 20 42 55  ngth, buffer, BU
3e90: 46 53 49 5a 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  FSIZ);..LAPPEND_
3ea0: 53 54 52 28 69 6e 74 65 72 70 2c 20 63 65 72 74  STR(interp, cert
3eb0: 50 74 72 2c 20 22 70 75 62 6c 69 63 4b 65 79 22  Ptr, "publicKey"
3ec0: 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a  , buffer, len);.
3ed0: 0a 09 6c 65 6e 20 3d 20 30 3b 0a 09 69 66 20 28  ..len = 0;..if (
3ee0: 58 35 30 39 5f 70 75 62 6b 65 79 5f 64 69 67 65  X509_pubkey_dige
3ef0: 73 74 28 63 65 72 74 2c 20 45 56 50 5f 67 65 74  st(cert, EVP_get
3f00: 5f 64 69 67 65 73 74 62 79 6e 69 64 28 70 6b 6e  _digestbynid(pkn
3f10: 69 64 29 2c 20 6d 64 2c 20 26 6e 29 29 20 7b 0a  id), md, &n)) {.
3f20: 09 20 20 20 20 6c 65 6e 20 3d 20 53 74 72 69 6e  .    len = Strin
3f30: 67 5f 74 6f 5f 48 65 78 28 6d 64 2c 20 28 69 6e  g_to_Hex(md, (in
3f40: 74 29 6e 2c 20 62 75 66 66 65 72 2c 20 42 55 46  t)n, buffer, BUF
3f50: 53 49 5a 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e  SIZ);..}..LAPPEN
3f60: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 63 65  D_STR(interp, ce
3f70: 72 74 50 74 72 2c 20 22 70 75 62 6c 69 63 4b 65  rtPtr, "publicKe
3f80: 79 48 61 73 68 22 2c 20 62 75 66 66 65 72 2c 20  yHash", buffer, 
3f90: 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 64 69 67 65 73  len);.../* diges
3fa0: 74 20 6f 66 20 74 68 65 20 44 45 52 20 72 65 70  t of the DER rep
3fb0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
3fc0: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  he certificate *
3fd0: 2f 0a 09 6c 65 6e 20 3d 20 30 3b 0a 09 69 66 20  /..len = 0;..if 
3fe0: 28 58 35 30 39 5f 64 69 67 65 73 74 28 63 65 72  (X509_digest(cer
3ff0: 74 2c 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73  t, EVP_get_diges
4000: 74 62 79 6e 69 64 28 6d 64 6e 69 64 29 2c 20 6d  tbynid(mdnid), m
4010: 64 2c 20 26 6e 29 29 20 7b 0a 09 20 20 20 20 6c  d, &n)) {..    l
4020: 65 6e 20 3d 20 53 74 72 69 6e 67 5f 74 6f 5f 48  en = String_to_H
4030: 65 78 28 6d 64 2c 20 28 69 6e 74 29 6e 2c 20 62  ex(md, (int)n, b
4040: 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a  uffer, BUFSIZ);.
4050: 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  .}..LAPPEND_STR(
4060: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c  interp, certPtr,
4070: 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 22   "signatureHash"
4080: 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a  , buffer, len);.
4090: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 65      }..    /* Ce
40a0: 72 74 69 66 69 63 61 74 65 20 50 75 72 70 6f 73  rtificate Purpos
40b0: 65 2e 20 43 61 6c 6c 20 62 65 66 6f 72 65 20 63  e. Call before c
40c0: 68 65 63 6b 69 6e 67 20 66 6f 72 20 65 78 74 65  hecking for exte
40d0: 6e 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 4c  nsions. */.    L
40e0: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
40f0: 70 2c 20 63 65 72 74 50 74 72 2c 20 22 70 75 72  p, certPtr, "pur
4100: 70 6f 73 65 22 2c 20 54 6c 73 5f 78 35 30 39 50  pose", Tls_x509P
4110: 75 72 70 6f 73 65 28 63 65 72 74 29 2c 20 2d 31  urpose(cert), -1
4120: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f  );.    LAPPEND_O
4130: 42 4a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50  BJ(interp, certP
4140: 74 72 2c 20 22 63 65 72 74 69 66 69 63 61 74 65  tr, "certificate
4150: 50 75 72 70 6f 73 65 22 2c 20 54 6c 73 5f 78 35  Purpose", Tls_x5
4160: 30 39 50 75 72 70 6f 73 65 73 28 69 6e 74 65 72  09Purposes(inter
4170: 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 20 20  p, cert));..    
4180: 2f 2a 20 47 65 74 20 65 78 74 65 6e 73 69 6f 6e  /* Get extension
4190: 73 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20 78  s flags */.    x
41a0: 66 6c 61 67 73 20 3d 20 58 35 30 39 5f 67 65 74  flags = X509_get
41b0: 5f 65 78 74 65 6e 73 69 6f 6e 5f 66 6c 61 67 73  _extension_flags
41c0: 28 63 65 72 74 29 3b 0a 20 20 20 20 4c 41 50 50  (cert);.    LAPP
41d0: 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
41e0: 63 65 72 74 50 74 72 2c 20 22 65 78 74 46 6c 61  certPtr, "extFla
41f0: 67 73 22 2c 20 78 66 6c 61 67 73 29 3b 0a 0a 09  gs", xflags);...
4200: 2f 2a 20 43 68 65 63 6b 20 69 66 20 63 65 72 74  /* Check if cert
4210: 20 77 61 73 20 69 73 73 75 65 64 20 62 79 20 43   was issued by C
4220: 41 20 63 65 72 74 20 69 73 73 75 65 72 20 6f 72  A cert issuer or
4230: 20 73 65 6c 66 20 73 69 67 6e 65 64 20 2a 2f 0a   self signed */.
4240: 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c      LAPPEND_BOOL
4250: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72  (interp, certPtr
4260: 2c 20 22 73 65 6c 66 49 73 73 75 65 64 22 2c 20  , "selfIssued", 
4270: 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f  xflags & EXFLAG_
4280: 53 49 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  SI);.    LAPPEND
4290: 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 63 65  _BOOL(interp, ce
42a0: 72 74 50 74 72 2c 20 22 73 65 6c 66 53 69 67 6e  rtPtr, "selfSign
42b0: 65 64 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58  ed", xflags & EX
42c0: 46 4c 41 47 5f 53 53 29 3b 0a 20 20 20 20 4c 41  FLAG_SS);.    LA
42d0: 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
42e0: 70 2c 20 63 65 72 74 50 74 72 2c 20 22 69 73 50  p, certPtr, "isP
42f0: 72 6f 78 79 43 65 72 74 22 2c 20 78 66 6c 61 67  roxyCert", xflag
4300: 73 20 26 20 45 58 46 4c 41 47 5f 50 52 4f 58 59  s & EXFLAG_PROXY
4310: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42  );.    LAPPEND_B
4320: 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 63 65 72 74  OOL(interp, cert
4330: 50 74 72 2c 20 22 65 78 74 49 6e 76 61 6c 69 64  Ptr, "extInvalid
4340: 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c  ", xflags & EXFL
4350: 41 47 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 20  AG_INVALID);.   
4360: 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e   LAPPEND_BOOL(in
4370: 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 22  terp, certPtr, "
4380: 69 73 43 41 43 65 72 74 22 2c 20 58 35 30 39 5f  isCACert", X509_
4390: 63 68 65 63 6b 5f 63 61 28 63 65 72 74 29 29 3b  check_ca(cert));
43a0: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 55 6e 69  ..    /* The Uni
43b0: 71 75 65 20 49 64 73 20 61 72 65 20 75 73 65 64  que Ids are used
43c0: 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 70   to handle the p
43d0: 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20 72 65  ossibility of re
43e0: 75 73 65 20 6f 66 20 73 75 62 6a 65 63 74 0a 09  use of subject..
43f0: 61 6e 64 2f 6f 72 20 69 73 73 75 65 72 20 6e 61  and/or issuer na
4400: 6d 65 73 20 6f 76 65 72 20 74 69 6d 65 2e 20 52  mes over time. R
4410: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20  FC 5280 section 
4420: 34 2e 31 2e 32 2e 38 20 2a 2f 0a 20 20 20 20 7b  4.1.2.8 */.    {
4430: 0a 09 63 6f 6e 73 74 20 41 53 4e 31 5f 42 49 54  ..const ASN1_BIT
4440: 5f 53 54 52 49 4e 47 20 2a 69 75 69 64 2c 20 2a  _STRING *iuid, *
4450: 73 75 69 64 3b 0a 20 20 20 20 20 20 20 20 58 35  suid;.        X5
4460: 30 39 5f 67 65 74 30 5f 75 69 64 73 28 63 65 72  09_get0_uids(cer
4470: 74 2c 20 26 69 75 69 64 2c 20 26 73 75 69 64 29  t, &iuid, &suid)
4480: 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;...Tcl_ListObjA
4490: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
44a0: 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63  erp, certPtr, Tc
44b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
44c0: 69 73 73 75 65 72 55 6e 69 71 75 65 49 64 22 2c  issuerUniqueId",
44d0: 20 2d 31 29 29 3b 0a 09 69 66 20 28 69 75 69 64   -1));..if (iuid
44e0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
44f0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4500: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4510: 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e  , certPtr, Tcl_N
4520: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28  ewByteArrayObj((
4530: 63 68 61 72 20 2a 29 69 75 69 64 2d 3e 64 61 74  char *)iuid->dat
4540: 61 2c 20 69 75 69 64 2d 3e 6c 65 6e 67 74 68 29  a, iuid->length)
4550: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  );..} else {..  
4560: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4570: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4580: 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f  p, certPtr, Tcl_
4590: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c  NewStringObj("",
45a0: 20 2d 31 29 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f   -1));..}...Tcl_
45b0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
45c0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72  ment(interp, cer
45d0: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tPtr, Tcl_NewStr
45e0: 69 6e 67 4f 62 6a 28 22 73 75 62 6a 65 63 74 55  ingObj("subjectU
45f0: 6e 69 71 75 65 49 64 22 2c 20 2d 31 29 29 3b 0a  niqueId", -1));.
4600: 09 69 66 20 28 73 75 69 64 20 21 3d 20 4e 55 4c  .if (suid != NUL
4610: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  L) {..    Tcl_Li
4620: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4630: 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50  nt(interp, certP
4640: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  tr, Tcl_NewByteA
4650: 72 72 61 79 4f 62 6a 28 28 63 68 61 72 20 2a 29  rrayObj((char *)
4660: 73 75 69 64 2d 3e 64 61 74 61 2c 20 73 75 69 64  suid->data, suid
4670: 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a 09 7d 20 65  ->length));..} e
4680: 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  lse {..    Tcl_L
4690: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
46a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74  ent(interp, cert
46b0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
46c0: 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a  ngObj("", -1));.
46d0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
46e0: 20 58 35 30 39 20 76 33 20 45 78 74 65 6e 73 69   X509 v3 Extensi
46f0: 6f 6e 73 20 2d 20 52 46 43 20 35 32 38 30 20 73  ons - RFC 5280 s
4700: 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 39 20 2a  ection 4.1.2.9 *
4710: 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e  /.    LAPPEND_IN
4720: 54 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74  T(interp, certPt
4730: 72 2c 20 22 65 78 74 43 6f 75 6e 74 22 2c 20 58  r, "extCount", X
4740: 35 30 39 5f 67 65 74 5f 65 78 74 5f 63 6f 75 6e  509_get_ext_coun
4750: 74 28 63 65 72 74 29 29 3b 0a 20 20 20 20 4c 41  t(cert));.    LA
4760: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70  PPEND_OBJ(interp
4770: 2c 20 63 65 72 74 50 74 72 2c 20 22 65 78 74 65  , certPtr, "exte
4780: 6e 73 69 6f 6e 73 22 2c 20 54 6c 73 5f 78 35 30  nsions", Tls_x50
4790: 39 45 78 74 65 6e 73 69 6f 6e 73 28 69 6e 74 65  9Extensions(inte
47a0: 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 20  rp, cert));..   
47b0: 20 2f 2a 20 41 75 74 68 6f 72 69 74 79 20 4b 65   /* Authority Ke
47c0: 79 20 49 64 65 6e 74 69 66 69 65 72 20 28 41 4b  y Identifier (AK
47d0: 49 29 20 69 73 20 74 68 65 20 53 75 62 6a 65 63  I) is the Subjec
47e0: 74 20 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72  t Key Identifier
47f0: 20 28 53 4b 49 29 20 6f 66 0a 09 69 74 73 20 73   (SKI) of..its s
4800: 69 67 6e 65 72 20 28 74 68 65 20 43 41 29 2e 20  igner (the CA). 
4810: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e  RFC 5280 section
4820: 20 34 2e 32 2e 31 2e 31 2c 20 4e 49 44 5f 61 75   4.2.1.1, NID_au
4830: 74 68 6f 72 69 74 79 5f 6b 65 79 5f 69 64 65 6e  thority_key_iden
4840: 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 4c 41  tifier */.    LA
4850: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70  PPEND_OBJ(interp
4860: 2c 20 63 65 72 74 50 74 72 2c 20 22 61 75 74 68  , certPtr, "auth
4870: 6f 72 69 74 79 4b 65 79 49 64 65 6e 74 69 66 69  orityKeyIdentifi
4880: 65 72 22 2c 0a 09 54 6c 73 5f 78 35 30 39 49 64  er",..Tls_x509Id
4890: 65 6e 74 69 66 69 65 72 28 58 35 30 39 5f 67 65  entifier(X509_ge
48a0: 74 30 5f 61 75 74 68 6f 72 69 74 79 5f 6b 65 79  t0_authority_key
48b0: 5f 69 64 28 63 65 72 74 29 29 29 3b 0a 0a 20 20  _id(cert)));..  
48c0: 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 4b 65 79    /* Subject Key
48d0: 20 49 64 65 6e 74 69 66 69 65 72 20 28 53 4b 49   Identifier (SKI
48e0: 29 20 69 73 20 75 73 65 64 20 74 6f 20 69 64 65  ) is used to ide
48f0: 6e 74 69 66 79 20 63 65 72 74 69 66 69 63 61 74  ntify certificat
4900: 65 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 0a  es that contain.
4910: 09 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 75  .a particular pu
4920: 62 6c 69 63 20 6b 65 79 2e 20 52 46 43 20 35 32  blic key. RFC 52
4930: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31  80 section 4.2.1
4940: 2e 32 2c 20 4e 49 44 5f 73 75 62 6a 65 63 74 5f  .2, NID_subject_
4950: 6b 65 79 5f 69 64 65 6e 74 69 66 69 65 72 20 2a  key_identifier *
4960: 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42  /.    LAPPEND_OB
4970: 4a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74  J(interp, certPt
4980: 72 2c 20 22 73 75 62 6a 65 63 74 4b 65 79 49 64  r, "subjectKeyId
4990: 65 6e 74 69 66 69 65 72 22 2c 0a 09 54 6c 73 5f  entifier",..Tls_
49a0: 78 35 30 39 49 64 65 6e 74 69 66 69 65 72 28 58  x509Identifier(X
49b0: 35 30 39 5f 67 65 74 30 5f 73 75 62 6a 65 63 74  509_get0_subject
49c0: 5f 6b 65 79 5f 69 64 28 63 65 72 74 29 29 29 3b  _key_id(cert)));
49d0: 0a 0a 20 20 20 20 2f 2a 20 4b 65 79 20 75 73 61  ..    /* Key usa
49e0: 67 65 20 65 78 74 65 6e 73 69 6f 6e 20 64 65 66  ge extension def
49f0: 69 6e 65 73 20 74 68 65 20 70 75 72 70 6f 73 65  ines the purpose
4a00: 20 28 65 2e 67 2e 2c 20 65 6e 63 69 70 68 65 72   (e.g., encipher
4a10: 6d 65 6e 74 2c 20 73 69 67 6e 61 74 75 72 65 2c  ment, signature,
4a20: 20 63 65 72 74 69 66 69 63 61 74 65 0a 09 73 69   certificate..si
4a30: 67 6e 69 6e 67 29 20 6f 66 20 74 68 65 20 6b 65  gning) of the ke
4a40: 79 20 69 6e 20 74 68 65 20 63 65 72 74 69 66 69  y in the certifi
4a50: 63 61 74 65 2e 20 52 46 43 20 35 32 38 30 20 73  cate. RFC 5280 s
4a60: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 33 2c 20  ection 4.2.1.3, 
4a70: 4e 49 44 5f 6b 65 79 5f 75 73 61 67 65 20 2a 2f  NID_key_usage */
4a80: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a  .    LAPPEND_OBJ
4a90: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72  (interp, certPtr
4aa0: 2c 20 22 6b 65 79 55 73 61 67 65 22 2c 20 54 6c  , "keyUsage", Tl
4ab0: 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65 28 69  s_x509KeyUsage(i
4ac0: 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 78 66 6c  nterp, cert, xfl
4ad0: 61 67 73 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ags));..    /* C
4ae0: 65 72 74 69 66 69 63 61 74 65 20 50 6f 6c 69 63  ertificate Polic
4af0: 69 65 73 20 2d 20 69 6e 64 69 63 61 74 65 73 20  ies - indicates 
4b00: 74 68 65 20 69 73 73 75 69 6e 67 20 43 41 20 63  the issuing CA c
4b10: 6f 6e 73 69 64 65 72 73 20 69 74 73 20 69 73 73  onsiders its iss
4b20: 75 65 72 44 6f 6d 61 69 6e 50 6f 6c 69 63 79 0a  uerDomainPolicy.
4b30: 09 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74  .equivalent to t
4b40: 68 65 20 73 75 62 6a 65 63 74 20 43 41 27 73 20  he subject CA's 
4b50: 73 75 62 6a 65 63 74 44 6f 6d 61 69 6e 50 6f 6c  subjectDomainPol
4b60: 69 63 79 2e 20 52 46 43 20 35 32 38 30 20 73 65  icy. RFC 5280 se
4b70: 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 34 2c 20 4e  ction 4.2.1.4, N
4b80: 49 44 5f 63 65 72 74 69 66 69 63 61 74 65 5f 70  ID_certificate_p
4b90: 6f 6c 69 63 69 65 73 20 2a 2f 0a 20 20 20 20 69  olicies */.    i
4ba0: 66 20 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c  f (xflags & EXFL
4bb0: 41 47 5f 49 4e 56 41 4c 49 44 5f 50 4f 4c 49 43  AG_INVALID_POLIC
4bc0: 59 29 20 7b 0a 09 2f 2a 20 52 65 6a 65 63 74 20  Y) {../* Reject 
4bd0: 63 65 72 74 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20  cert */.    }.. 
4be0: 20 20 20 2f 2a 20 50 6f 6c 69 63 79 20 4d 61 70     /* Policy Map
4bf0: 70 69 6e 67 73 20 2d 20 52 46 43 20 35 32 38 30  pings - RFC 5280
4c00: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 35   section 4.2.1.5
4c10: 2c 20 4e 49 44 5f 70 6f 6c 69 63 79 5f 6d 61 70  , NID_policy_map
4c20: 70 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pings */..    /*
4c30: 20 53 75 62 6a 65 63 74 20 41 6c 74 65 72 6e 61   Subject Alterna
4c40: 74 69 76 65 20 4e 61 6d 65 20 28 53 41 4e 29 20  tive Name (SAN) 
4c50: 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f  contains additio
4c60: 6e 61 6c 20 55 52 4c 73 2c 20 44 4e 53 20 6e 61  nal URLs, DNS na
4c70: 6d 65 73 2c 20 6f 72 20 49 50 0a 09 61 64 64 72  mes, or IP..addr
4c80: 65 73 73 65 73 20 62 6f 75 6e 64 20 74 6f 20 63  esses bound to c
4c90: 65 72 74 69 66 69 63 61 74 65 2e 20 52 46 43 20  ertificate. RFC 
4ca0: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32  5280 section 4.2
4cb0: 2e 31 2e 36 2c 20 4e 49 44 5f 73 75 62 6a 65 63  .1.6, NID_subjec
4cc0: 74 5f 61 6c 74 5f 6e 61 6d 65 20 2a 2f 0a 20 20  t_alt_name */.  
4cd0: 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e    LAPPEND_OBJ(in
4ce0: 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 22  terp, certPtr, "
4cf0: 73 75 62 6a 65 63 74 41 6c 74 4e 61 6d 65 22 2c  subjectAltName",
4d00: 20 54 6c 73 5f 78 35 30 39 4e 61 6d 65 73 28 69   Tls_x509Names(i
4d10: 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 4e 49 44  nterp, cert, NID
4d20: 5f 73 75 62 6a 65 63 74 5f 61 6c 74 5f 6e 61 6d  _subject_alt_nam
4d30: 65 2c 20 62 69 6f 29 29 3b 0a 0a 20 20 20 20 2f  e, bio));..    /
4d40: 2a 20 49 73 73 75 65 72 20 41 6c 74 65 72 6e 61  * Issuer Alterna
4d50: 74 69 76 65 20 4e 61 6d 65 20 69 73 20 75 73 65  tive Name is use
4d60: 64 20 74 6f 20 61 73 73 6f 63 69 61 74 65 20 49  d to associate I
4d70: 6e 74 65 72 6e 65 74 20 73 74 79 6c 65 20 69 64  nternet style id
4d80: 65 6e 74 69 74 69 65 73 0a 09 77 69 74 68 20 74  entities..with t
4d90: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69  he certificate i
4da0: 73 73 75 65 72 2e 20 52 46 43 20 35 32 38 30 20  ssuer. RFC 5280 
4db0: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 37 2c  section 4.2.1.7,
4dc0: 20 4e 49 44 5f 69 73 73 75 65 72 5f 61 6c 74 5f   NID_issuer_alt_
4dd0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50  name */.    LAPP
4de0: 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20  END_OBJ(interp, 
4df0: 63 65 72 74 50 74 72 2c 20 22 69 73 73 75 65 72  certPtr, "issuer
4e00: 41 6c 74 4e 61 6d 65 22 2c 20 54 6c 73 5f 78 35  AltName", Tls_x5
4e10: 30 39 4e 61 6d 65 73 28 69 6e 74 65 72 70 2c 20  09Names(interp, 
4e20: 63 65 72 74 2c 20 4e 49 44 5f 69 73 73 75 65 72  cert, NID_issuer
4e30: 5f 61 6c 74 5f 6e 61 6d 65 2c 20 62 69 6f 29 29  _alt_name, bio))
4e40: 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63  ;..    /* Subjec
4e50: 74 20 44 69 72 65 63 74 6f 72 79 20 41 74 74 72  t Directory Attr
4e60: 69 62 75 74 65 73 20 70 72 6f 76 69 64 65 73 20  ibutes provides 
4e70: 69 64 65 6e 74 69 66 69 63 61 74 69 6f 6e 20 61  identification a
4e80: 74 74 72 69 62 75 74 65 73 20 28 65 2e 67 2e 2c  ttributes (e.g.,
4e90: 20 6e 61 74 69 6f 6e 61 6c 69 74 79 29 0a 09 6f   nationality)..o
4ea0: 66 20 74 68 65 20 73 75 62 6a 65 63 74 2e 20 52  f the subject. R
4eb0: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20  FC 5280 section 
4ec0: 34 2e 32 2e 31 2e 38 20 28 73 75 62 6a 65 63 74  4.2.1.8 (subject
4ed0: 44 69 72 65 63 74 6f 72 79 41 74 74 72 69 62 75  DirectoryAttribu
4ee0: 74 65 73 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  tes) */..    /* 
4ef0: 42 61 73 69 63 20 43 6f 6e 73 74 72 61 69 6e 74  Basic Constraint
4f00: 73 20 69 64 65 6e 74 69 66 69 65 73 20 77 68 65  s identifies whe
4f10: 74 68 65 72 20 74 68 65 20 73 75 62 6a 65 63 74  ther the subject
4f20: 20 6f 66 20 74 68 65 20 63 65 72 74 20 69 73 20   of the cert is 
4f30: 61 20 43 41 20 61 6e 64 0a 09 74 68 65 20 6d 61  a CA and..the ma
4f40: 78 20 64 65 70 74 68 20 6f 66 20 76 61 6c 69 64  x depth of valid
4f50: 20 63 65 72 74 20 70 61 74 68 73 20 66 6f 72 20   cert paths for 
4f60: 74 68 69 73 20 63 65 72 74 2e 20 52 46 43 20 35  this cert. RFC 5
4f70: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e  280 section 4.2.
4f80: 31 2e 39 2c 20 4e 49 44 5f 62 61 73 69 63 5f 63  1.9, NID_basic_c
4f90: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
4fa0: 20 20 69 66 20 28 21 28 78 66 6c 61 67 73 20 26    if (!(xflags &
4fb0: 20 45 58 46 4c 41 47 5f 50 52 4f 58 59 29 29 20   EXFLAG_PROXY)) 
4fc0: 7b 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28  {..LAPPEND_LONG(
4fd0: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c  interp, certPtr,
4fe0: 20 22 70 61 74 68 4c 65 6e 22 2c 20 58 35 30 39   "pathLen", X509
4ff0: 5f 67 65 74 5f 70 61 74 68 6c 65 6e 28 63 65 72  _get_pathlen(cer
5000: 74 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  t));.    } else 
5010: 7b 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28  {..LAPPEND_LONG(
5020: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c  interp, certPtr,
5030: 20 22 70 61 74 68 4c 65 6e 22 2c 20 58 35 30 39   "pathLen", X509
5040: 5f 67 65 74 5f 70 72 6f 78 79 5f 70 61 74 68 6c  _get_proxy_pathl
5050: 65 6e 28 63 65 72 74 29 29 3b 0a 20 20 20 20 7d  en(cert));.    }
5060: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f  .    LAPPEND_BOO
5070: 4c 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74  L(interp, certPt
5080: 72 2c 20 22 62 61 73 69 63 43 6f 6e 73 74 72 61  r, "basicConstra
5090: 69 6e 74 73 43 41 22 2c 20 78 66 6c 61 67 73 20  intsCA", xflags 
50a0: 26 20 45 58 46 4c 41 47 5f 43 41 29 3b 0a 0a 20  & EXFLAG_CA);.. 
50b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 43 6f 6e 73 74     /* Name Const
50c0: 72 61 69 6e 74 73 20 69 73 20 6f 6e 6c 79 20 75  raints is only u
50d0: 73 65 64 20 69 6e 20 43 41 20 63 65 72 74 73 20  sed in CA certs 
50e0: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20  to indicate the 
50f0: 6e 61 6d 65 20 73 70 61 63 65 20 66 6f 72 0a 09  name space for..
5100: 61 6c 6c 20 73 75 62 6a 65 63 74 20 6e 61 6d 65  all subject name
5110: 73 20 69 6e 20 73 75 62 73 65 71 75 65 6e 74 20  s in subsequent 
5120: 63 65 72 74 69 66 69 63 61 74 65 73 20 69 6e 20  certificates in 
5130: 61 20 63 65 72 74 69 66 69 63 61 74 69 6f 6e 20  a certification 
5140: 70 61 74 68 0a 09 4d 55 53 54 20 62 65 20 6c 6f  path..MUST be lo
5150: 63 61 74 65 64 2e 20 52 46 43 20 35 32 38 30 20  cated. RFC 5280 
5160: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 30  section 4.2.1.10
5170: 2c 20 4e 49 44 5f 6e 61 6d 65 5f 63 6f 6e 73 74  , NID_name_const
5180: 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 2f  raints */..    /
5190: 2a 20 50 6f 6c 69 63 79 20 43 6f 6e 73 74 72 61  * Policy Constra
51a0: 69 6e 74 73 20 69 73 20 6f 6e 6c 79 20 75 73 65  ints is only use
51b0: 64 20 69 6e 20 43 41 20 63 65 72 74 73 20 74 6f  d in CA certs to
51c0: 20 6c 69 6d 69 74 20 74 68 65 20 6c 65 6e 67 74   limit the lengt
51d0: 68 20 6f 66 20 61 0a 09 63 65 72 74 20 63 68 61  h of a..cert cha
51e0: 69 6e 20 66 6f 72 20 74 68 61 74 20 43 41 2e 20  in for that CA. 
51f0: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e  RFC 5280 section
5200: 20 34 2e 32 2e 31 2e 31 31 2c 20 4e 49 44 5f 70   4.2.1.11, NID_p
5210: 6f 6c 69 63 79 5f 63 6f 6e 73 74 72 61 69 6e 74  olicy_constraint
5220: 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 78 74  s */..    /* Ext
5230: 65 6e 64 65 64 20 4b 65 79 20 55 73 61 67 65 20  ended Key Usage 
5240: 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 70 75  indicates the pu
5250: 72 70 6f 73 65 73 20 74 68 65 20 63 65 72 74 69  rposes the certi
5260: 66 69 65 64 20 70 75 62 6c 69 63 20 6b 65 79 20  fied public key 
5270: 6d 61 79 20 62 65 0a 09 75 73 65 64 2c 20 62 65  may be..used, be
5280: 79 6f 6e 64 20 74 68 65 20 62 61 73 69 63 20 70  yond the basic p
5290: 75 72 70 6f 73 65 73 2e 20 52 46 43 20 35 32 38  urposes. RFC 528
52a0: 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e  0 section 4.2.1.
52b0: 31 32 2c 20 4e 49 44 5f 65 78 74 5f 6b 65 79 5f  12, NID_ext_key_
52c0: 75 73 61 67 65 20 2a 2f 0a 20 20 20 20 4c 41 50  usage */.    LAP
52d0: 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c  PEND_OBJ(interp,
52e0: 20 63 65 72 74 50 74 72 2c 20 22 65 78 74 65 6e   certPtr, "exten
52f0: 64 65 64 4b 65 79 55 73 61 67 65 22 2c 20 54 6c  dedKeyUsage", Tl
5300: 73 5f 78 35 30 39 45 78 74 4b 65 79 55 73 61 67  s_x509ExtKeyUsag
5310: 65 28 69 6e 74 65 72 70 2c 20 63 65 72 74 2c 20  e(interp, cert, 
5320: 78 66 6c 61 67 73 29 29 3b 0a 0a 20 20 20 20 2f  xflags));..    /
5330: 2a 20 43 52 4c 20 44 69 73 74 72 69 62 75 74 69  * CRL Distributi
5340: 6f 6e 20 50 6f 69 6e 74 73 20 69 64 65 6e 74 69  on Points identi
5350: 66 69 65 73 20 77 68 65 72 65 20 43 52 4c 20 69  fies where CRL i
5360: 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 61 6e 20 62  nformation can b
5370: 65 20 6f 62 74 61 69 6e 65 64 2e 0a 09 52 46 43  e obtained...RFC
5380: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e   5280 section 4.
5390: 32 2e 31 2e 31 33 2a 2f 0a 20 20 20 20 4c 41 50  2.1.13*/.    LAP
53a0: 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c  PEND_OBJ(interp,
53b0: 20 63 65 72 74 50 74 72 2c 20 22 63 72 6c 44 69   certPtr, "crlDi
53c0: 73 74 72 69 62 75 74 69 6f 6e 50 6f 69 6e 74 73  stributionPoints
53d0: 22 2c 20 54 6c 73 5f 78 35 30 39 43 72 6c 44 70  ", Tls_x509CrlDp
53e0: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b  (interp, cert));
53f0: 0a 0a 20 20 20 20 2f 2a 20 46 72 65 73 68 65 73  ..    /* Freshes
5400: 74 20 43 52 4c 20 65 78 74 65 6e 73 69 6f 6e 20  t CRL extension 
5410: 2a 2f 0a 20 20 20 20 69 66 20 28 78 66 6c 61 67  */.    if (xflag
5420: 73 20 26 20 45 58 46 4c 41 47 5f 46 52 45 53 48  s & EXFLAG_FRESH
5430: 45 53 54 29 20 7b 0a 20 20 20 20 7d 0a 0a 20 20  EST) {.    }..  
5440: 20 20 2f 2a 20 41 75 74 68 6f 72 69 74 79 20 49    /* Authority I
5450: 6e 66 6f 72 6d 61 74 69 6f 6e 20 41 63 63 65 73  nformation Acces
5460: 73 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20  s indicates how 
5470: 74 6f 20 61 63 63 65 73 73 20 69 6e 66 6f 20 61  to access info a
5480: 6e 64 20 73 65 72 76 69 63 65 73 0a 09 66 6f 72  nd services..for
5490: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
54a0: 20 69 73 73 75 65 72 2e 20 52 46 43 20 35 32 38   issuer. RFC 528
54b0: 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 32 2e  0 section 4.2.2.
54c0: 31 2c 20 4e 49 44 5f 69 6e 66 6f 5f 61 63 63 65  1, NID_info_acce
54d0: 73 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 47 65  ss */..    /* Ge
54e0: 74 20 4f 6e 2d 6c 69 6e 65 20 43 65 72 74 69 66  t On-line Certif
54f0: 69 63 61 74 65 20 53 74 61 74 75 73 20 50 72 6f  icate Status Pro
5500: 74 6f 63 6f 6c 20 28 4f 53 43 50 29 20 52 65 73  tocol (OSCP) Res
5510: 70 6f 6e 64 65 72 73 20 55 52 4c 20 2a 2f 0a 20  ponders URL */. 
5520: 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69     LAPPEND_OBJ(i
5530: 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20  nterp, certPtr, 
5540: 22 6f 63 73 70 52 65 73 70 6f 6e 64 65 72 73 22  "ocspResponders"
5550: 2c 20 54 6c 73 5f 78 35 30 39 4f 73 63 70 28 69  , Tls_x509Oscp(i
5560: 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a  nterp, cert));..
5570: 20 20 20 20 2f 2a 20 47 65 74 20 43 65 72 74 69      /* Get Certi
5580: 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 74 79  ficate Authority
5590: 20 28 43 41 29 20 49 73 73 75 65 72 73 20 55 52   (CA) Issuers UR
55a0: 4c 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44  L */.    LAPPEND
55b0: 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 63 65 72  _OBJ(interp, cer
55c0: 74 50 74 72 2c 20 22 63 61 49 73 73 75 65 72 73  tPtr, "caIssuers
55d0: 22 2c 20 54 6c 73 5f 78 35 30 39 43 61 49 73 73  ", Tls_x509CaIss
55e0: 75 65 72 73 28 69 6e 74 65 72 70 2c 20 63 65 72  uers(interp, cer
55f0: 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62  t));..    /* Sub
5600: 6a 65 63 74 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  ject Information
5610: 20 41 63 63 65 73 73 20 2d 20 52 46 43 20 35 32   Access - RFC 52
5620: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 32  80 section 4.2.2
5630: 2e 32 2c 20 4e 49 44 5f 73 69 6e 66 6f 5f 61 63  .2, NID_sinfo_ac
5640: 63 65 73 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  cess */..    /* 
5650: 43 65 72 74 69 66 69 63 61 74 65 20 41 6c 69 61  Certificate Alia
5660: 73 2e 20 49 66 20 75 73 65 73 20 61 20 50 4b 43  s. If uses a PKC
5670: 53 23 31 32 20 73 74 72 75 63 74 75 72 65 2c 20  S#12 structure, 
5680: 61 6c 69 61 73 20 77 69 6c 6c 20 72 65 66 6c 65  alias will refle
5690: 63 74 20 74 68 65 0a 09 66 72 69 65 6e 64 6c 79  ct the..friendly
56a0: 4e 61 6d 65 20 61 74 74 72 69 62 75 74 65 20 28  Name attribute (
56b0: 52 46 43 20 32 39 38 35 29 2e 20 2a 2f 0a 20 20  RFC 2985). */.  
56c0: 20 20 7b 0a 09 6c 65 6e 20 3d 20 30 3b 0a 20 20    {..len = 0;.  
56d0: 20 20 20 20 20 20 63 68 61 72 20 2a 73 74 72 69        char *stri
56e0: 6e 67 20 3d 20 58 35 30 39 5f 61 6c 69 61 73 5f  ng = X509_alias_
56f0: 67 65 74 30 28 63 65 72 74 2c 20 26 6c 65 6e 29  get0(cert, &len)
5700: 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
5710: 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20  nterp, certPtr, 
5720: 22 61 6c 69 61 73 22 2c 20 73 74 72 69 6e 67 2c  "alias", string,
5730: 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   len);.    }..  
5740: 20 20 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65    /* Certificate
5750: 20 61 6e 64 20 64 75 6d 70 20 61 6c 6c 20 64 61   and dump all da
5760: 74 61 20 2a 2f 0a 20 20 20 20 7b 0a 09 63 68 61  ta */.    {..cha
5770: 72 20 63 65 72 74 53 74 72 5b 43 45 52 54 5f 53  r certStr[CERT_S
5780: 54 52 5f 53 49 5a 45 5d 3b 0a 0a 09 2f 2a 20 47  TR_SIZE];.../* G
5790: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  et certificate *
57a0: 2f 0a 09 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f  /..len = BIO_to_
57b0: 42 75 66 66 65 72 28 50 45 4d 5f 77 72 69 74 65  Buffer(PEM_write
57c0: 5f 62 69 6f 5f 58 35 30 39 28 62 69 6f 2c 20 63  _bio_X509(bio, c
57d0: 65 72 74 29 2c 20 62 69 6f 2c 20 63 65 72 74 53  ert), bio, certS
57e0: 74 72 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 5a  tr, CERT_STR_SIZ
57f0: 45 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  E);..LAPPEND_STR
5800: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72  (interp, certPtr
5810: 2c 20 22 63 65 72 74 69 66 69 63 61 74 65 22 2c  , "certificate",
5820: 20 63 65 72 74 53 74 72 2c 20 6c 65 6e 29 3b 0a   certStr, len);.
5830: 0a 09 2f 2a 20 47 65 74 20 61 6c 6c 20 63 65 72  ../* Get all cer
5840: 74 20 69 6e 66 6f 20 2a 2f 0a 09 6c 65 6e 20 3d  t info */..len =
5850: 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 58   BIO_to_Buffer(X
5860: 35 30 39 5f 70 72 69 6e 74 5f 65 78 28 62 69 6f  509_print_ex(bio
5870: 2c 20 63 65 72 74 2c 20 66 6c 61 67 73 2c 20 30  , cert, flags, 0
5880: 29 2c 20 62 69 6f 2c 20 63 65 72 74 53 74 72 2c  ), bio, certStr,
5890: 20 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 29 3b   CERT_STR_SIZE);
58a0: 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
58b0: 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 22  terp, certPtr, "
58c0: 61 6c 6c 22 2c 20 63 65 72 74 53 74 72 2c 20 6c  all", certStr, l
58d0: 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  en);.    }..    
58e0: 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20  BIO_free(bio);. 
58f0: 20 20 20 72 65 74 75 72 6e 20 63 65 72 74 50 74     return certPt
5900: 72 3b 0a 7d 0a                                   r;.}.