0000: 2f 2a 0a 20 2a 20 50 61 72 73 65 20 58 2e 35 30 /*. * Parse X.50
0010: 39 20 63 65 72 74 69 66 69 63 61 74 65 73 20 61 9 certificates a
0020: 6e 64 20 72 65 74 75 72 6e 20 63 6f 6e 74 65 6e nd return conten
0030: 74 73 20 61 73 20 61 20 54 43 4c 20 6b 65 79 2d ts as a TCL key-
0040: 76 61 6c 75 65 20 6c 69 73 74 2e 0a 20 2a 0a 20 value list.. *.
0050: 2a 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 * Copyright (C)
0060: 31 39 39 37 2d 32 30 30 30 20 53 65 6e 73 75 73 1997-2000 Sensus
0070: 20 43 6f 6e 73 75 6c 74 69 6e 67 20 4c 74 64 2e Consulting Ltd.
0080: 0a 20 2a 20 4d 61 74 74 20 4e 65 77 6d 61 6e 20 . * Matt Newman
0090: 3c 6d 61 74 74 40 73 65 6e 73 75 73 2e 6f 72 67 <matt@sensus.org
00a0: 3e 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 >. * Copyright (
00b0: 43 29 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 C) 2023 Brian O'
00c0: 48 61 67 61 6e 0a 20 2a 2f 0a 23 69 6e 63 6c 75 Hagan. */.#inclu
00d0: 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e 63 6c de <tcl.h>.#incl
00e0: 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 ude <stdio.h>.#i
00f0: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0100: 62 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 bio.h>.#include
0110: 3c 6f 70 65 6e 73 73 6c 2f 73 68 61 2e 68 3e 0a <openssl/sha.h>.
0120: 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 #include <openss
0130: 6c 2f 78 35 30 39 2e 68 3e 0a 23 69 6e 63 6c 75 l/x509.h>.#inclu
0140: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 78 35 30 39 de <openssl/x509
0150: 76 33 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c v3.h>.#include <
0160: 6f 70 65 6e 73 73 6c 2f 78 35 30 39 5f 76 66 79 openssl/x509_vfy
0170: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 .h>.#include <op
0180: 65 6e 73 73 6c 2f 61 73 6e 31 2e 68 3e 0a 23 69 enssl/asn1.h>.#i
0190: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 nclude "tlsInt.h
01a0: 22 0a 0a 2f 2a 20 44 65 66 69 6e 65 20 6d 61 78 "../* Define max
01b0: 69 6d 75 6d 20 63 65 72 74 69 66 69 63 61 74 65 imum certificate
01c0: 20 73 69 7a 65 2e 20 4d 61 78 20 50 45 4d 20 73 size. Max PEM s
01d0: 69 7a 65 20 31 30 30 6b 42 20 61 6e 64 20 44 45 ize 100kB and DE
01e0: 52 20 73 69 7a 65 20 69 73 20 32 34 6b 42 2e 20 R size is 24kB.
01f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 45 52 54 5f */.#define CERT_
0200: 53 54 52 5f 53 49 5a 45 20 32 34 35 37 36 0a 0a STR_SIZE 24576..
0210: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
0220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0260: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 72 69 6e ----. *. * Strin
0270: 67 5f 74 6f 5f 48 65 78 20 2d 2d 0a 20 2a 0a 20 g_to_Hex --. *.
0280: 2a 09 46 6f 72 6d 61 74 20 63 6f 6e 74 65 6e 74 *.Format content
0290: 73 20 6f 66 20 61 20 62 69 6e 61 72 79 20 73 74 s of a binary st
02a0: 72 69 6e 67 20 61 73 20 61 20 68 65 78 20 73 74 ring as a hex st
02b0: 72 69 6e 67 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ring. *. * Resul
02c0: 74 73 3a 0a 20 2a 09 54 43 4c 20 62 79 74 65 20 ts:. *.TCL byte
02d0: 61 72 72 61 79 20 6f 62 6a 65 63 74 20 77 69 74 array object wit
02e0: 68 20 78 35 30 39 20 69 64 65 6e 74 69 66 69 65 h x509 identifie
02f0: 72 20 61 73 20 61 20 68 65 78 20 73 74 72 69 6e r as a hex strin
0300: 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 45 66 66 g. *. * Side Eff
0310: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ects:. *.None. *
0320: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
0330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0370: 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 53 74 . */.Tcl_Obj *St
0380: 72 69 6e 67 5f 74 6f 5f 48 65 78 28 75 6e 73 69 ring_to_Hex(unsi
0390: 67 6e 65 64 20 63 68 61 72 2a 20 69 6e 70 75 74 gned char* input
03a0: 2c 20 69 6e 74 20 69 6c 65 6e 29 20 7b 0a 20 20 , int ilen) {.
03b0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
03c0: 2a 69 70 74 72 20 3d 20 69 6e 70 75 74 3b 0a 20 *iptr = input;.
03d0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 Tcl_Obj *resu
03e0: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 ltObj = Tcl_NewB
03f0: 79 74 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c yteArrayObj(NULL
0400: 2c 20 30 29 3b 0a 20 20 20 20 75 6e 73 69 67 6e , 0);. unsign
0410: 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 ed char *data =
0420: 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 Tcl_SetByteArray
0430: 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a Length(resultObj
0440: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 69 6c 65 6e , (Tcl_Size)ilen
0450: 2a 32 29 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 *2);. unsigne
0460: 64 20 63 68 61 72 20 2a 64 70 74 72 20 3d 20 26 d char *dptr = &
0470: 64 61 74 61 5b 30 5d 3b 0a 20 20 20 20 63 6f 6e data[0];. con
0480: 73 74 20 63 68 61 72 20 2a 68 65 78 20 3d 20 22 st char *hex = "
0490: 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 0123456789abcdef
04a0: 22 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 ";.. if (resu
04b0: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b ltObj == NULL) {
04c0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
04d0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 69 }.. for (i
04e0: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 69 6c nt i = 0; i < il
04f0: 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 2a 64 70 74 en; i++) {..*dpt
0500: 72 2b 2b 20 3d 20 68 65 78 5b 28 2a 69 70 74 72 r++ = hex[(*iptr
0510: 3e 3e 34 29 26 30 78 46 5d 3b 0a 09 2a 64 70 74 >>4)&0xF];..*dpt
0520: 72 2b 2b 20 3d 20 68 65 78 5b 28 2a 69 70 74 72 r++ = hex[(*iptr
0530: 2b 2b 29 26 30 78 46 5d 3b 0a 20 20 20 20 7d 0a ++)&0xF];. }.
0540: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c return resul
0550: 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d tObj;.}../*. *--
0560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
05b0: 2a 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 20 * BIO_to_Buffer
05c0: 2d 2d 0a 20 2a 0a 20 2a 09 4f 75 74 70 75 74 20 --. *. *.Output
05d0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 42 49 contents of a BI
05e0: 4f 20 74 6f 20 61 20 62 75 66 66 65 72 0a 20 2a O to a buffer. *
05f0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
0600: 52 65 74 75 72 6e 73 20 6c 65 6e 67 74 68 20 6f Returns length o
0610: 66 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66 66 f string in buff
0620: 65 72 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 er. *. * Side ef
0630: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 fects:. *.None.
0640: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
0650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0690: 2d 0a 20 2a 2f 0a 54 63 6c 5f 53 69 7a 65 20 42 -. */.Tcl_Size B
06a0: 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 69 6e 74 IO_to_Buffer(int
06b0: 20 72 65 73 75 6c 74 2c 20 42 49 4f 20 2a 62 69 result, BIO *bi
06c0: 6f 2c 20 76 6f 69 64 20 2a 6f 75 74 70 75 74 2c o, void *output,
06d0: 20 69 6e 74 20 6f 6c 65 6e 29 20 7b 0a 20 20 20 int olen) {.
06e0: 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 20 3d 20 Tcl_Size len =
06f0: 30 3b 0a 20 20 20 20 69 6e 74 20 70 65 6e 64 69 0;. int pendi
0700: 6e 67 20 3d 20 42 49 4f 5f 70 65 6e 64 69 6e 67 ng = BIO_pending
0710: 28 62 69 6f 29 3b 0a 0a 20 20 20 20 69 66 20 28 (bio);.. if (
0720: 72 65 73 75 6c 74 29 20 7b 0a 09 6c 65 6e 20 3d result) {..len =
0730: 20 28 54 63 6c 5f 53 69 7a 65 29 20 42 49 4f 5f (Tcl_Size) BIO_
0740: 72 65 61 64 28 62 69 6f 2c 20 6f 75 74 70 75 74 read(bio, output
0750: 2c 20 28 70 65 6e 64 69 6e 67 20 3c 20 6f 6c 65 , (pending < ole
0760: 6e 29 20 3f 20 70 65 6e 64 69 6e 67 20 3a 20 6f n) ? pending : o
0770: 6c 65 6e 29 3b 0a 09 28 76 6f 69 64 29 42 49 4f len);..(void)BIO
0780: 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09 69 66 _flush(bio);..if
0790: 20 28 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 20 20 (len < 0) {..
07a0: 20 20 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 20 20 len = 0;..}.
07b0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c }. return l
07c0: 65 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d en;.}.../*. *---
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
0820: 20 54 6c 73 5f 78 35 30 39 45 78 74 65 6e 73 69 Tls_x509Extensi
0830: 6f 6e 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 ons --. *. *.Get
0840: 20 6c 69 73 74 20 6f 66 20 58 2e 35 30 39 20 43 list of X.509 C
0850: 65 72 74 69 66 69 63 61 74 65 20 45 78 74 65 6e ertificate Exten
0860: 73 69 6f 6e 73 0a 20 2a 0a 20 2a 20 52 65 73 75 sions. *. * Resu
0870: 6c 74 73 3a 0a 20 2a 09 54 43 4c 20 6c 69 73 74 lts:. *.TCL list
0880: 20 6f 66 20 65 78 74 65 6e 73 69 6f 6e 73 20 61 of extensions a
0890: 6e 64 20 62 6f 6f 6c 65 61 6e 20 63 72 69 74 69 nd boolean criti
08a0: 63 61 6c 20 73 74 61 74 75 73 0a 20 2a 0a 20 2a cal status. *. *
08b0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
08c0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d *.None. *. *----
08d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
08e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
08f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 ---------. */.Tc
0920: 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 45 l_Obj *Tls_x509E
0930: 78 74 65 6e 73 69 6f 6e 73 28 54 63 6c 5f 49 6e xtensions(Tcl_In
0940: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 terp *interp, X5
0950: 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 09 *cert) {.
0960: 63 6f 6e 73 74 20 53 54 41 43 4b 5f 4f 46 28 58 const STACK_OF(X
0970: 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e 29 20 2a 509_EXTENSION) *
0980: 65 78 74 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 exts;. Tcl_Ob
0990: 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 j *resultObj = T
09a0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
09b0: 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 NULL);.. if
09c0: 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 (resultObj == NU
09d0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 LL) {..return NU
09e0: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 LL;. }.. i
09f0: 66 20 28 28 65 78 74 73 20 3d 20 58 35 30 39 5f f ((exts = X509_
0a00: 67 65 74 30 5f 65 78 74 65 6e 73 69 6f 6e 73 28 get0_extensions(
0a10: 63 65 72 74 29 29 20 21 3d 20 4e 55 4c 4c 29 20 cert)) != NULL)
0a20: 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b {..for (int i=0;
0a30: 20 69 20 3c 20 58 35 30 39 5f 67 65 74 5f 65 78 i < X509_get_ex
0a40: 74 5f 63 6f 75 6e 74 28 63 65 72 74 29 3b 20 69 t_count(cert); i
0a50: 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f ++) {.. X509_
0a60: 45 58 54 45 4e 53 49 4f 4e 20 2a 65 78 20 3d 20 EXTENSION *ex =
0a70: 73 6b 5f 58 35 30 39 5f 45 58 54 45 4e 53 49 4f sk_X509_EXTENSIO
0a80: 4e 5f 76 61 6c 75 65 28 65 78 74 73 2c 20 69 29 N_value(exts, i)
0a90: 3b 0a 09 20 20 20 20 41 53 4e 31 5f 4f 42 4a 45 ;.. ASN1_OBJE
0aa0: 43 54 20 2a 6f 62 6a 20 3d 20 58 35 30 39 5f 45 CT *obj = X509_E
0ab0: 58 54 45 4e 53 49 4f 4e 5f 67 65 74 5f 6f 62 6a XTENSION_get_obj
0ac0: 65 63 74 28 65 78 29 3b 0a 09 20 20 20 20 2f 2a ect(ex);.. /*
0ad0: 20 41 53 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49 ASN1_OCTET_STRI
0ae0: 4e 47 20 2a 64 61 74 61 20 3d 20 58 35 30 39 5f NG *data = X509_
0af0: 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74 5f 64 61 EXTENSION_get_da
0b00: 74 61 28 65 78 29 3b 20 2a 2f 0a 09 20 20 20 20 ta(ex); */..
0b10: 69 6e 74 20 63 72 69 74 69 63 61 6c 20 3d 20 58 int critical = X
0b20: 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65 509_EXTENSION_ge
0b30: 74 5f 63 72 69 74 69 63 61 6c 28 65 78 29 3b 0a t_critical(ex);.
0b40: 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f . LAPPEND_BOO
0b50: 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 L(interp, result
0b60: 4f 62 6a 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 Obj, OBJ_nid2ln(
0b70: 4f 42 4a 5f 6f 62 6a 32 6e 69 64 28 6f 62 6a 29 OBJ_obj2nid(obj)
0b80: 29 2c 20 63 72 69 74 69 63 61 6c 29 3b 0a 09 7d ), critical);..}
0b90: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
0ba0: 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a n resultObj;.}..
0bb0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
0bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c00: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 --. *. * Tls_x50
0c10: 39 49 64 65 6e 74 69 66 69 65 72 20 2d 2d 0a 20 9Identifier --.
0c20: 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30 39 20 63 *. *.Get X.509 c
0c30: 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f ertificate Autho
0c40: 72 69 74 79 20 6f 72 20 53 75 62 6a 65 63 74 20 rity or Subject
0c50: 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 73 0a Key Identifiers.
0c60: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
0c70: 2a 09 54 43 4c 20 62 79 74 65 20 61 72 72 61 79 *.TCL byte array
0c80: 20 6f 62 6a 65 63 74 20 77 69 74 68 20 78 35 30 object with x50
0c90: 39 20 69 64 65 6e 74 69 66 69 65 72 20 61 73 20 9 identifier as
0ca0: 61 20 68 65 78 20 73 74 72 69 6e 67 0a 20 2a 0a a hex string. *.
0cb0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
0cc0: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d . *.None. *. *--
0cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
0d20: 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 Tcl_Obj *Tls_x50
0d30: 39 49 64 65 6e 74 69 66 69 65 72 28 63 6f 6e 73 9Identifier(cons
0d40: 74 20 41 53 4e 31 5f 4f 43 54 45 54 5f 53 54 52 t ASN1_OCTET_STR
0d50: 49 4e 47 20 2a 61 73 74 72 69 6e 67 29 20 7b 0a ING *astring) {.
0d60: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 Tcl_Obj *res
0d70: 75 6c 74 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 0a ultObj = NULL;..
0d80: 20 20 20 20 69 66 20 28 61 73 74 72 69 6e 67 20 if (astring
0d90: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 75 != NULL) {..resu
0da0: 6c 74 4f 62 6a 20 3d 20 53 74 72 69 6e 67 5f 74 ltObj = String_t
0db0: 6f 5f 48 65 78 28 28 75 6e 73 69 67 6e 65 64 20 o_Hex((unsigned
0dc0: 63 68 61 72 20 2a 29 41 53 4e 31 5f 53 54 52 49 char *)ASN1_STRI
0dd0: 4e 47 5f 67 65 74 30 5f 64 61 74 61 28 61 73 74 NG_get0_data(ast
0de0: 72 69 6e 67 29 2c 0a 09 20 20 20 20 41 53 4e 31 ring),.. ASN1
0df0: 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 61 _STRING_length(a
0e00: 73 74 72 69 6e 67 29 29 3b 0a 20 20 20 20 7d 0a string));. }.
0e10: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c return resul
0e20: 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d tObj;.}../*. *--
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
0e80: 2a 20 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 * Tls_x509KeyUsa
0e90: 67 65 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 ge --. *. *.Get
0ea0: 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 X.509 certificat
0eb0: 65 20 6b 65 79 20 75 73 61 67 65 20 74 79 70 65 e key usage type
0ec0: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
0ed0: 0a 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 . *.Tcl list of
0ee0: 74 79 70 65 73 0a 20 2a 0a 20 2a 20 53 69 64 65 types. *. * Side
0ef0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
0f00: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
0f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f50: 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a ----. */.Tcl_Obj
0f60: 20 2a 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 *Tls_x509KeyUsa
0f70: 67 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 ge(Tcl_Interp *i
0f80: 6e 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 nterp, X509 *cer
0f90: 74 2c 20 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 t, uint32_t xfla
0fa0: 67 73 29 20 7b 0a 20 20 20 20 75 69 6e 74 33 32 gs) {. uint32
0fb0: 5f 74 20 75 73 61 67 65 20 3d 20 58 35 30 39 5f _t usage = X509_
0fc0: 67 65 74 5f 6b 65 79 5f 75 73 61 67 65 28 63 65 get_key_usage(ce
0fd0: 72 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a rt);. Tcl_Obj
0fe0: 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 *resultObj = Tc
0ff0: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
1000: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 NULL);.. if (
1010: 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c resultObj == NUL
1020: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c L) {..return NUL
1030: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 L;. }.. if
1040: 20 28 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c ((xflags & EXFL
1050: 41 47 5f 4b 55 53 41 47 45 29 20 26 26 20 75 73 AG_KUSAGE) && us
1060: 61 67 65 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58 age < UINT32_MAX
1070: 29 20 7b 0a 09 69 66 20 28 75 73 61 67 65 20 26 ) {..if (usage &
1080: 20 4b 55 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e KU_DIGITAL_SIGN
1090: 41 54 55 52 45 29 20 7b 0a 09 20 20 20 20 54 63 ATURE) {.. Tc
10a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 lement(interp, r
10c0: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 esultObj, Tcl_Ne
10d0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 44 69 67 69 wStringObj("Digi
10e0: 74 61 6c 20 53 69 67 6e 61 74 75 72 65 22 2c 20 tal Signature",
10f0: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 -1));..}..if (us
1100: 61 67 65 20 26 20 4b 55 5f 4e 4f 4e 5f 52 45 50 age & KU_NON_REP
1110: 55 44 49 41 54 49 4f 4e 29 20 7b 0a 09 20 20 20 UDIATION) {..
1120: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
1130: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
1140: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c , resultObj, Tcl
1150: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e _NewStringObj("N
1160: 6f 6e 2d 52 65 70 75 64 69 61 74 69 6f 6e 22 2c on-Repudiation",
1170: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 -1));..}..if (u
1180: 73 61 67 65 20 26 20 4b 55 5f 4b 45 59 5f 45 4e sage & KU_KEY_EN
1190: 43 49 50 48 45 52 4d 45 4e 54 29 20 7b 0a 09 20 CIPHERMENT) {..
11a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
11b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
11c0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 rp, resultObj, T
11d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
11e0: 22 4b 65 79 20 45 6e 63 69 70 68 65 72 6d 65 6e "Key Enciphermen
11f0: 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 t", -1));..}..if
1200: 20 28 75 73 61 67 65 20 26 20 4b 55 5f 44 41 54 (usage & KU_DAT
1210: 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 29 20 A_ENCIPHERMENT)
1220: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
1230: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1240: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
1250: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 j, Tcl_NewString
1260: 4f 62 6a 28 22 44 61 74 61 20 45 6e 63 69 70 68 Obj("Data Enciph
1270: 65 72 6d 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 erment", -1));..
1280: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b }..if (usage & K
1290: 55 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 29 U_KEY_AGREEMENT)
12a0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
12b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
12c0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
12d0: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e bj, Tcl_NewStrin
12e0: 67 4f 62 6a 28 22 4b 65 79 20 41 67 72 65 65 6d gObj("Key Agreem
12f0: 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 ent", -1));..}..
1300: 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f 4b if (usage & KU_K
1310: 45 59 5f 43 45 52 54 5f 53 49 47 4e 29 20 7b 0a EY_CERT_SIGN) {.
1320: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1330: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1340: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
1350: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1360: 6a 28 22 43 65 72 74 69 66 69 63 61 74 65 20 53 j("Certificate S
1370: 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 igning", -1));..
1380: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b }..if (usage & K
1390: 55 5f 43 52 4c 5f 53 49 47 4e 29 20 7b 0a 09 20 U_CRL_SIGN) {..
13a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
13b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
13c0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 rp, resultObj, T
13d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
13e0: 22 43 52 4c 20 53 69 67 6e 69 6e 67 22 2c 20 2d "CRL Signing", -
13f0: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 1));..}..if (usa
1400: 67 65 20 26 20 4b 55 5f 45 4e 43 49 50 48 45 52 ge & KU_ENCIPHER
1410: 5f 4f 4e 4c 59 29 20 7b 0a 09 20 20 20 20 54 63 _ONLY) {.. Tc
1420: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
1430: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 lement(interp, r
1440: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 esultObj, Tcl_Ne
1450: 77 53 74 72 69 6e 67 4f 62 6a 28 22 45 6e 63 69 wStringObj("Enci
1460: 70 68 65 72 20 4f 6e 6c 79 22 2c 20 2d 31 29 29 pher Only", -1))
1470: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 ;..}..if (usage
1480: 26 20 4b 55 5f 44 45 43 49 50 48 45 52 5f 4f 4e & KU_DECIPHER_ON
1490: 4c 59 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c LY) {.. Tcl_L
14a0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
14b0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 ent(interp, resu
14c0: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 ltObj, Tcl_NewSt
14d0: 72 69 6e 67 4f 62 6a 28 22 44 65 63 69 70 68 65 ringObj("Deciphe
14e0: 72 20 4f 6e 6c 79 22 2c 20 2d 31 29 29 3b 0a 09 r Only", -1));..
14f0: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 }. } else {..
1500: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
1510: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
1520: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
1530: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1540: 28 22 75 6e 72 65 73 74 72 69 63 74 65 64 22 2c ("unrestricted",
1550: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 -1));. }.
1560: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 return resultOb
1570: 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d j;.}../*. *-----
1580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
15d0: 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 65 20 2d ls_x509Purpose -
15e0: 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30 -. *. *.Get X.50
15f0: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75 9 certificate pu
1600: 72 70 6f 73 65 0a 20 2a 0a 20 2a 20 52 65 73 75 rpose. *. * Resu
1610: 6c 74 73 3a 0a 20 2a 09 50 75 72 70 6f 73 65 20 lts:. *.Purpose
1620: 73 74 72 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 string. *. * Sid
1630: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
1640: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ne. *. *--------
1650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1690: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 63 68 61 72 20 2a -----. */.char *
16a0: 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 65 28 Tls_x509Purpose(
16b0: 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 X509 *cert) {.
16c0: 20 20 63 68 61 72 20 2a 70 75 72 70 6f 73 65 20 char *purpose
16d0: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 = NULL;.. if
16e0: 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 (X509_check_purp
16f0: 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 ose(cert, X509_P
1700: 55 52 50 4f 53 45 5f 53 53 4c 5f 43 4c 49 45 4e URPOSE_SSL_CLIEN
1710: 54 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 T, 0) > 0) {..pu
1720: 72 70 6f 73 65 20 3d 20 22 53 53 4c 20 43 6c 69 rpose = "SSL Cli
1730: 65 6e 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ent";. } else
1740: 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f if (X509_check_
1750: 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 purpose(cert, X5
1760: 30 39 5f 50 55 52 50 4f 53 45 5f 53 53 4c 5f 53 09_PURPOSE_SSL_S
1770: 45 52 56 45 52 2c 20 30 29 20 3e 20 30 29 20 7b ERVER, 0) > 0) {
1780: 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 53 53 4c ..purpose = "SSL
1790: 20 53 65 72 76 65 72 22 3b 0a 20 20 20 20 7d 20 Server";. }
17a0: 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 else if (X509_ch
17b0: 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 eck_purpose(cert
17c0: 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 4e , X509_PURPOSE_N
17d0: 53 5f 53 53 4c 5f 53 45 52 56 45 52 2c 20 30 29 S_SSL_SERVER, 0)
17e0: 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 > 0) {..purpose
17f0: 20 3d 20 22 4d 53 53 20 53 53 4c 20 53 65 72 76 = "MSS SSL Serv
1800: 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 er";. } else
1810: 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 if (X509_check_p
1820: 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 urpose(cert, X50
1830: 39 5f 50 55 52 50 4f 53 45 5f 53 4d 49 4d 45 5f 9_PURPOSE_SMIME_
1840: 53 49 47 4e 2c 20 30 29 20 3e 20 30 29 20 7b 0a SIGN, 0) > 0) {.
1850: 09 70 75 72 70 6f 73 65 20 3d 20 22 53 4d 49 4d .purpose = "SMIM
1860: 45 20 53 69 67 6e 69 6e 67 22 3b 0a 20 20 20 20 E Signing";.
1870: 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f } else if (X509_
1880: 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 check_purpose(ce
1890: 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 rt, X509_PURPOSE
18a0: 5f 53 4d 49 4d 45 5f 45 4e 43 52 59 50 54 2c 20 _SMIME_ENCRYPT,
18b0: 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 0) > 0) {..purpo
18c0: 73 65 20 3d 20 22 53 4d 49 4d 45 20 45 6e 63 72 se = "SMIME Encr
18d0: 79 70 74 69 6f 6e 22 3b 0a 20 20 20 20 7d 20 65 yption";. } e
18e0: 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 lse if (X509_che
18f0: 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c ck_purpose(cert,
1900: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 43 52 X509_PURPOSE_CR
1910: 4c 5f 53 49 47 4e 2c 20 30 29 20 3e 20 30 29 20 L_SIGN, 0) > 0)
1920: 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 43 52 {..purpose = "CR
1930: 4c 20 53 69 67 6e 69 6e 67 22 3b 0a 20 20 20 20 L Signing";.
1940: 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f } else if (X509_
1950: 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 check_purpose(ce
1960: 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 rt, X509_PURPOSE
1970: 5f 41 4e 59 2c 20 30 29 20 3e 20 30 29 20 7b 0a _ANY, 0) > 0) {.
1980: 09 70 75 72 70 6f 73 65 20 3d 20 22 41 6e 79 22 .purpose = "Any"
1990: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
19a0: 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 (X509_check_purp
19b0: 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 ose(cert, X509_P
19c0: 55 52 50 4f 53 45 5f 4f 43 53 50 5f 48 45 4c 50 URPOSE_OCSP_HELP
19d0: 45 52 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 ER, 0) > 0) {..p
19e0: 75 72 70 6f 73 65 20 3d 20 22 4f 43 53 50 20 48 urpose = "OCSP H
19f0: 65 6c 70 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c elper";. } el
1a00: 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 se if (X509_chec
1a10: 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 k_purpose(cert,
1a20: 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 54 49 4d X509_PURPOSE_TIM
1a30: 45 53 54 41 4d 50 5f 53 49 47 4e 2c 20 30 29 20 ESTAMP_SIGN, 0)
1a40: 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 > 0) {..purpose
1a50: 3d 20 22 54 69 6d 65 73 74 61 6d 70 20 53 69 67 = "Timestamp Sig
1a60: 6e 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73 ning";. } els
1a70: 65 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 e {..purpose = "
1a80: 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 ";. }. ret
1a90: 75 72 6e 20 70 75 72 70 6f 73 65 3b 0a 7d 0a 0a urn purpose;.}..
1aa0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
1ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1af0: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 --. *. * Tls_x50
1b00: 39 50 75 72 70 6f 73 65 73 20 2d 2d 0a 20 2a 0a 9Purposes --. *.
1b10: 20 2a 09 47 65 74 20 58 2e 35 30 39 20 63 65 72 *.Get X.509 cer
1b20: 74 69 66 69 63 61 74 65 20 70 75 72 70 6f 73 65 tificate purpose
1b30: 20 74 79 70 65 73 0a 20 2a 0a 20 2a 20 52 65 73 types. *. * Res
1b40: 75 6c 74 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 ults:. *.Tcl lis
1b50: 74 20 6f 66 20 65 61 63 68 20 70 75 72 70 6f 73 t of each purpos
1b60: 65 20 61 6e 64 20 77 68 65 74 68 65 72 20 69 74 e and whether it
1b70: 20 69 73 20 43 41 20 6f 72 20 6e 6f 6e 2d 43 41 is CA or non-CA
1b80: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
1b90: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a cts:. *.None. *.
1ba0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
1bf0: 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 */.Tcl_Obj *Tls
1c00: 5f 78 35 30 39 50 75 72 70 6f 73 65 73 28 54 63 _x509Purposes(Tc
1c10: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
1c20: 2c 20 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a , X509 *cert) {.
1c30: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 Tcl_Obj *res
1c40: 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 ultObj = Tcl_New
1c50: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
1c60: 3b 0a 20 20 20 20 58 35 30 39 5f 50 55 52 50 4f ;. X509_PURPO
1c70: 53 45 20 2a 70 74 6d 70 3b 0a 0a 20 20 20 20 69 SE *ptmp;.. i
1c80: 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 f (resultObj ==
1c90: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
1ca0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
1cb0: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b for (int i = 0;
1cc0: 20 69 20 3c 20 58 35 30 39 5f 50 55 52 50 4f 53 i < X509_PURPOS
1cd0: 45 5f 67 65 74 5f 63 6f 75 6e 74 28 29 3b 20 69 E_get_count(); i
1ce0: 2b 2b 29 20 7b 0a 09 70 74 6d 70 20 3d 20 58 35 ++) {..ptmp = X5
1cf0: 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 30 28 09_PURPOSE_get0(
1d00: 69 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 74 6d i);..Tcl_Obj *tm
1d10: 70 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 pPtr = Tcl_NewLi
1d20: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
1d30: 0a 09 66 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30 ..for (int j = 0
1d40: 3b 20 6a 20 3c 20 32 3b 20 6a 2b 2b 29 20 7b 0a ; j < 2; j++) {.
1d50: 09 20 20 20 20 69 6e 74 20 69 64 72 65 74 20 3d . int idret =
1d60: 20 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 X509_check_purp
1d70: 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 ose(cert, X509_P
1d80: 55 52 50 4f 53 45 5f 67 65 74 5f 69 64 28 70 74 URPOSE_get_id(pt
1d90: 6d 70 29 2c 20 6a 29 3b 0a 09 20 20 20 20 54 63 mp), j);.. Tc
1da0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
1db0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 74 lement(interp, t
1dc0: 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mpPtr, Tcl_NewSt
1dd0: 72 69 6e 67 4f 62 6a 28 6a 20 3f 20 22 43 41 22 ringObj(j ? "CA"
1de0: 20 3a 20 22 6e 6f 6e 43 41 22 2c 20 2d 31 29 29 : "nonCA", -1))
1df0: 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f ;.. Tcl_ListO
1e00: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1e10: 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 2c 20 interp, tmpPtr,
1e20: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1e30: 28 69 64 72 65 74 20 3d 3d 20 31 20 3f 20 22 59 (idret == 1 ? "Y
1e40: 65 73 22 20 3a 20 22 4e 6f 22 2c 20 2d 31 29 29 es" : "No", -1))
1e50: 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 ;..}..LAPPEND_OB
1e60: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 J(interp, result
1e70: 4f 62 6a 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 Obj, X509_PURPOS
1e80: 45 5f 67 65 74 30 5f 6e 61 6d 65 28 70 74 6d 70 E_get0_name(ptmp
1e90: 29 2c 20 74 6d 70 50 74 72 29 3b 0a 20 20 20 20 ), tmpPtr);.
1ea0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 }. return res
1eb0: 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a ultObj;.}../*. *
1ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
1f10: 0a 20 2a 20 54 6c 73 5f 78 35 30 39 4e 61 6d 65 . * Tls_x509Name
1f20: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 61 s --. *. *.Get a
1f30: 20 6c 69 73 74 20 6f 66 20 53 75 62 6a 65 63 74 list of Subject
1f40: 20 41 6c 74 65 72 6e 61 74 65 20 4e 61 6d 65 73 Alternate Names
1f50: 20 28 53 41 4e 29 20 6f 72 20 49 73 73 75 65 72 (SAN) or Issuer
1f60: 20 41 6c 74 65 72 6e 61 74 65 20 4e 61 6d 65 73 Alternate Names
1f70: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
1f80: 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 61 *.Tcl list of a
1f90: 6c 74 65 72 6e 61 74 65 20 6e 61 6d 65 73 0a 20 lternate names.
1fa0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
1fb0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
2010: 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 /.Tcl_Obj *Tls_x
2020: 35 30 39 4e 61 6d 65 73 28 54 63 6c 5f 49 6e 74 509Names(Tcl_Int
2030: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 erp *interp, X50
2040: 39 20 2a 63 65 72 74 2c 20 69 6e 74 20 6e 69 64 9 *cert, int nid
2050: 2c 20 42 49 4f 20 2a 62 69 6f 29 20 7b 0a 20 20 , BIO *bio) {.
2060: 20 20 53 54 41 43 4b 5f 4f 46 28 47 45 4e 45 52 STACK_OF(GENER
2070: 41 4c 5f 4e 41 4d 45 29 20 2a 6e 61 6d 65 73 3b AL_NAME) *names;
2080: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 . Tcl_Obj *re
2090: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 sultObj = Tcl_Ne
20a0: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
20b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 );. Tcl_Size
20c0: 6c 65 6e 3b 0a 20 20 20 20 63 68 61 72 20 62 75 len;. char bu
20d0: 66 66 65 72 5b 31 30 32 34 5d 3b 0a 0a 20 20 20 ffer[1024];..
20e0: 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d if (resultObj =
20f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
2100: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 n NULL;. }..
2110: 20 20 20 69 66 20 28 28 6e 61 6d 65 73 20 3d 20 if ((names =
2120: 58 35 30 39 5f 67 65 74 5f 65 78 74 5f 64 32 69 X509_get_ext_d2i
2130: 28 63 65 72 74 2c 20 6e 69 64 2c 20 4e 55 4c 4c (cert, nid, NULL
2140: 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c , NULL)) != NULL
2150: 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69 3d ) {..for (int i=
2160: 30 3b 20 69 20 3c 20 73 6b 5f 47 45 4e 45 52 41 0; i < sk_GENERA
2170: 4c 5f 4e 41 4d 45 5f 6e 75 6d 28 6e 61 6d 65 73 L_NAME_num(names
2180: 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 63 ); i++) {.. c
2190: 6f 6e 73 74 20 47 45 4e 45 52 41 4c 5f 4e 41 4d onst GENERAL_NAM
21a0: 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 47 45 4e E *name = sk_GEN
21b0: 45 52 41 4c 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 ERAL_NAME_value(
21c0: 6e 61 6d 65 73 2c 20 69 29 3b 0a 0a 09 20 20 20 names, i);...
21d0: 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 len = BIO_to_Bu
21e0: 66 66 65 72 28 6e 61 6d 65 20 26 26 20 47 45 4e ffer(name && GEN
21f0: 45 52 41 4c 5f 4e 41 4d 45 5f 70 72 69 6e 74 28 ERAL_NAME_print(
2200: 62 69 6f 2c 20 28 47 45 4e 45 52 41 4c 5f 4e 41 bio, (GENERAL_NA
2210: 4d 45 20 2a 29 20 6e 61 6d 65 29 2c 20 62 69 6f ME *) name), bio
2220: 2c 20 62 75 66 66 65 72 2c 20 31 30 32 34 29 3b , buffer, 1024);
2230: 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 .. LAPPEND_ST
2240: 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 R(interp, result
2250: 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 62 75 66 66 65 Obj, NULL, buffe
2260: 72 2c 20 6c 65 6e 29 3b 0a 09 7d 0a 09 73 6b 5f r, len);..}..sk_
2270: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70 6f 70 GENERAL_NAME_pop
2280: 5f 66 72 65 65 28 6e 61 6d 65 73 2c 20 47 45 4e _free(names, GEN
2290: 45 52 41 4c 5f 4e 41 4d 45 5f 66 72 65 65 29 3b ERAL_NAME_free);
22a0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
22b0: 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a n resultObj;.}..
22c0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2310: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 --. *. * Tls_x50
2320: 39 45 78 74 4b 65 79 55 73 61 67 65 20 2d 2d 0a 9ExtKeyUsage --.
2330: 20 2a 0a 20 2a 09 47 65 74 20 61 20 6c 69 73 74 *. *.Get a list
2340: 20 6f 66 20 45 78 74 65 6e 64 65 64 20 4b 65 79 of Extended Key
2350: 20 55 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52 65 Usages. *. * Re
2360: 74 75 72 6e 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 turns:. *.Tcl li
2370: 73 74 20 6f 66 20 75 73 61 67 65 73 0a 20 2a 0a st of usages. *.
2380: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
2390: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d . *.None. *. *--
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
23f0: 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 Tcl_Obj *Tls_x50
2400: 39 45 78 74 4b 65 79 55 73 61 67 65 28 54 63 6c 9ExtKeyUsage(Tcl
2410: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
2420: 20 58 35 30 39 20 2a 63 65 72 74 2c 20 75 69 6e X509 *cert, uin
2430: 74 33 32 5f 74 20 78 66 6c 61 67 73 29 20 7b 0a t32_t xflags) {.
2440: 20 20 20 20 75 69 6e 74 33 32 5f 74 20 75 73 61 uint32_t usa
2450: 67 65 20 3d 20 58 35 30 39 5f 67 65 74 5f 6b 65 ge = X509_get_ke
2460: 79 5f 75 73 61 67 65 28 63 65 72 74 29 3b 0a 20 y_usage(cert);.
2470: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 Tcl_Obj *resu
2480: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c ltObj = Tcl_NewL
2490: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
24a0: 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 .. if (result
24b0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Obj == NULL) {..
24c0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
24d0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 78 66 6c }.. if ((xfl
24e0: 61 67 73 20 26 20 45 58 46 4c 41 47 5f 58 4b 55 ags & EXFLAG_XKU
24f0: 53 41 47 45 29 20 26 26 20 75 73 61 67 65 20 3c SAGE) && usage <
2500: 20 55 49 4e 54 33 32 5f 4d 41 58 29 20 7b 0a 09 UINT32_MAX) {..
2510: 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 74 usage = X509_get
2520: 5f 65 78 74 65 6e 64 65 64 5f 6b 65 79 5f 75 73 _extended_key_us
2530: 61 67 65 28 63 65 72 74 29 3b 0a 0a 09 69 66 20 age(cert);...if
2540: 28 75 73 61 67 65 20 26 20 58 4b 55 5f 53 53 4c (usage & XKU_SSL
2550: 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 _SERVER) {..
2560: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2570: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2580: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f resultObj, Tcl_
2590: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 4c NewStringObj("TL
25a0: 53 20 57 65 62 20 53 65 72 76 65 72 20 41 75 74 S Web Server Aut
25b0: 68 65 6e 74 69 63 61 74 69 6f 6e 22 2c 20 2d 31 hentication", -1
25c0: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 ));..}..if (usag
25d0: 65 20 26 20 58 4b 55 5f 53 53 4c 5f 43 4c 49 45 e & XKU_SSL_CLIE
25e0: 4e 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c NT) {.. Tcl_L
25f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2600: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 ent(interp, resu
2610: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 ltObj, Tcl_NewSt
2620: 72 69 6e 67 4f 62 6a 28 22 54 4c 53 20 57 65 62 ringObj("TLS Web
2630: 20 43 6c 69 65 6e 74 20 41 75 74 68 65 6e 74 69 Client Authenti
2640: 63 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 cation", -1));..
2650: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 }..if (usage & X
2660: 4b 55 5f 53 4d 49 4d 45 29 20 7b 0a 09 20 20 20 KU_SMIME) {..
2670: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2680: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2690: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c , resultObj, Tcl
26a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 45 _NewStringObj("E
26b0: 2d 6d 61 69 6c 20 50 72 6f 74 65 63 74 69 6f 6e -mail Protection
26c0: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 ", -1));..}..if
26d0: 28 75 73 61 67 65 20 26 20 58 4b 55 5f 43 4f 44 (usage & XKU_COD
26e0: 45 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 20 54 E_SIGN) {.. T
26f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2700: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2710: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e resultObj, Tcl_N
2720: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 43 6f 64 ewStringObj("Cod
2730: 65 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 e Signing", -1))
2740: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 ;..}..if (usage
2750: 26 20 58 4b 55 5f 53 47 43 29 20 7b 0a 09 20 20 & XKU_SGC) {..
2760: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2770: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2780: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 p, resultObj, Tc
2790: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
27a0: 53 47 43 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 SGC", -1));..}..
27b0: 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f if (usage & XKU_
27c0: 4f 43 53 50 5f 53 49 47 4e 29 20 7b 0a 09 20 20 OCSP_SIGN) {..
27d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
27e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
27f0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 p, resultObj, Tc
2800: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
2810: 4f 43 53 50 20 53 69 67 6e 69 6e 67 22 2c 20 2d OCSP Signing", -
2820: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 1));..}..if (usa
2830: 67 65 20 26 20 58 4b 55 5f 54 49 4d 45 53 54 41 ge & XKU_TIMESTA
2840: 4d 50 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c MP) {.. Tcl_L
2850: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2860: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 ent(interp, resu
2870: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 ltObj, Tcl_NewSt
2880: 72 69 6e 67 4f 62 6a 28 22 54 69 6d 65 20 53 74 ringObj("Time St
2890: 61 6d 70 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 amping", -1));..
28a0: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 }..if (usage & X
28b0: 4b 55 5f 44 56 43 53 20 29 20 7b 0a 09 20 20 20 KU_DVCS ) {..
28c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
28d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
28e0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c , resultObj, Tcl
28f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 44 _NewStringObj("D
2900: 56 43 53 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 VCS", -1));..}..
2910: 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f if (usage & XKU_
2920: 41 4e 59 45 4b 55 29 20 7b 0a 09 20 20 20 20 54 ANYEKU) {.. T
2930: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2940: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2950: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e resultObj, Tcl_N
2960: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 41 6e 79 ewStringObj("Any
2970: 20 45 78 74 65 6e 64 65 64 20 4b 65 79 20 55 73 Extended Key Us
2980: 61 67 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 age", -1));..}.
2990: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 } else {..
29a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
29b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
29c0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c , resultObj, Tcl
29d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 _NewStringObj("u
29e0: 6e 72 65 73 74 72 69 63 74 65 64 22 2c 20 2d 31 nrestricted", -1
29f0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 ));. }. re
2a00: 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a turn resultObj;.
2a10: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
2a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a60: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
2a70: 78 35 30 39 43 72 6c 44 70 20 2d 2d 0a 20 2a 0a x509CrlDp --. *.
2a80: 20 2a 09 47 65 74 20 6c 69 73 74 20 6f 66 20 43 *.Get list of C
2a90: 52 4c 20 44 69 73 74 72 69 62 75 74 69 6f 6e 20 RL Distribution
2aa0: 50 6f 69 6e 74 73 0a 20 2a 0a 20 2a 20 52 65 74 Points. *. * Ret
2ab0: 75 72 6e 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 urns:. *.Tcl lis
2ac0: 74 20 6f 66 20 55 52 49 73 20 61 6e 64 20 72 65 t of URIs and re
2ad0: 6c 61 74 69 76 65 2d 6e 61 6d 65 73 0a 20 2a 0a lative-names. *.
2ae0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
2af0: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d . *.None. *. *--
2b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
2b50: 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 Tcl_Obj *Tls_x50
2b60: 39 43 72 6c 44 70 28 54 63 6c 5f 49 6e 74 65 72 9CrlDp(Tcl_Inter
2b70: 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20 p *interp, X509
2b80: 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 53 54 41 *cert) {. STA
2b90: 43 4b 5f 4f 46 28 44 49 53 54 5f 50 4f 49 4e 54 CK_OF(DIST_POINT
2ba0: 29 20 2a 63 72 6c 3b 0a 20 20 20 20 54 63 6c 5f ) *crl;. Tcl_
2bb0: 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d Obj *resultObj =
2bc0: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
2bd0: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 0, NULL);.. i
2be0: 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 f (resultObj ==
2bf0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
2c00: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
2c10: 20 69 66 20 28 28 63 72 6c 20 3d 20 58 35 30 39 if ((crl = X509
2c20: 5f 67 65 74 5f 65 78 74 5f 64 32 69 28 63 65 72 _get_ext_d2i(cer
2c30: 74 2c 20 4e 49 44 5f 63 72 6c 5f 64 69 73 74 72 t, NID_crl_distr
2c40: 69 62 75 74 69 6f 6e 5f 70 6f 69 6e 74 73 2c 20 ibution_points,
2c50: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 NULL, NULL)) !=
2c60: 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e NULL) {..for (in
2c70: 74 20 69 3d 30 3b 20 69 20 3c 20 73 6b 5f 44 49 t i=0; i < sk_DI
2c80: 53 54 5f 50 4f 49 4e 54 5f 6e 75 6d 28 63 72 6c ST_POINT_num(crl
2c90: 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 44 ); i++) {.. D
2ca0: 49 53 54 5f 50 4f 49 4e 54 20 2a 64 70 20 3d 20 IST_POINT *dp =
2cb0: 73 6b 5f 44 49 53 54 5f 50 4f 49 4e 54 5f 76 61 sk_DIST_POINT_va
2cc0: 6c 75 65 28 63 72 6c 2c 20 69 29 3b 0a 09 20 20 lue(crl, i);..
2cd0: 20 20 44 49 53 54 5f 50 4f 49 4e 54 5f 4e 41 4d DIST_POINT_NAM
2ce0: 45 20 2a 64 69 73 74 70 6f 69 6e 74 20 3d 20 64 E *distpoint = d
2cf0: 70 2d 3e 64 69 73 74 70 6f 69 6e 74 3b 0a 0a 09 p->distpoint;...
2d00: 20 20 20 20 69 66 20 28 64 69 73 74 70 6f 69 6e if (distpoin
2d10: 74 2d 3e 74 79 70 65 20 3d 3d 20 30 29 20 7b 0a t->type == 0) {.
2d20: 09 09 2f 2a 20 66 75 6c 6c 2d 6e 61 6d 65 20 47 ../* full-name G
2d30: 45 4e 45 52 41 4c 49 5a 45 44 4e 41 4d 45 20 2a ENERALIZEDNAME *
2d40: 2f 0a 09 09 66 6f 72 20 28 69 6e 74 20 6a 20 3d /...for (int j =
2d50: 20 30 3b 20 6a 20 3c 20 73 6b 5f 47 45 4e 45 52 0; j < sk_GENER
2d60: 41 4c 5f 4e 41 4d 45 5f 6e 75 6d 28 64 69 73 74 AL_NAME_num(dist
2d70: 70 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c point->name.full
2d80: 6e 61 6d 65 29 3b 20 6a 2b 2b 29 20 7b 0a 09 09 name); j++) {...
2d90: 20 20 20 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 GENERAL_NAME
2da0: 20 2a 67 65 6e 20 3d 20 73 6b 5f 47 45 4e 45 52 *gen = sk_GENER
2db0: 41 4c 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 64 69 AL_NAME_value(di
2dc0: 73 74 70 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 66 75 stpoint->name.fu
2dd0: 6c 6c 6e 61 6d 65 2c 20 6a 29 3b 0a 09 09 20 20 llname, j);...
2de0: 20 20 69 6e 74 20 74 79 70 65 3b 0a 09 09 20 20 int type;...
2df0: 20 20 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 75 ASN1_STRING *u
2e00: 72 69 20 3d 20 47 45 4e 45 52 41 4c 5f 4e 41 4d ri = GENERAL_NAM
2e10: 45 5f 67 65 74 30 5f 76 61 6c 75 65 28 67 65 6e E_get0_value(gen
2e20: 2c 20 26 74 79 70 65 29 3b 0a 09 09 20 20 20 20 , &type);...
2e30: 69 66 20 28 74 79 70 65 20 3d 3d 20 47 45 4e 5f if (type == GEN_
2e40: 55 52 49 29 20 7b 0a 09 09 09 4c 41 50 50 45 4e URI) {....LAPPEN
2e50: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 D_STR(interp, re
2e60: 73 75 6c 74 4f 62 6a 2c 20 28 63 68 61 72 20 2a sultObj, (char *
2e70: 29 20 4e 55 4c 4c 2c 20 28 63 68 61 72 20 2a 29 ) NULL, (char *)
2e80: 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74 ASN1_STRING_get
2e90: 30 5f 64 61 74 61 28 75 72 69 29 2c 20 28 54 63 0_data(uri), (Tc
2ea0: 6c 5f 53 69 7a 65 29 20 41 53 4e 31 5f 53 54 52 l_Size) ASN1_STR
2eb0: 49 4e 47 5f 6c 65 6e 67 74 68 28 75 72 69 29 29 ING_length(uri))
2ec0: 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 ;... }...}..
2ed0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 69 } else if (di
2ee0: 73 74 70 6f 69 6e 74 2d 3e 74 79 70 65 20 3d 3d stpoint->type ==
2ef0: 20 31 29 20 7b 0a 09 09 2f 2a 20 72 65 6c 61 74 1) {.../* relat
2f00: 69 76 65 2d 6e 61 6d 65 20 58 35 30 39 4e 41 4d ive-name X509NAM
2f10: 45 20 2a 2f 0a 09 09 53 54 41 43 4b 5f 4f 46 28 E */...STACK_OF(
2f20: 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 29 X509_NAME_ENTRY)
2f30: 20 2a 73 6b 5f 72 65 6c 6e 61 6d 65 20 3d 20 64 *sk_relname = d
2f40: 69 73 74 70 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 72 istpoint->name.r
2f50: 65 6c 61 74 69 76 65 6e 61 6d 65 3b 0a 09 09 66 elativename;...f
2f60: 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a or (int j = 0; j
2f70: 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f < sk_X509_NAME_
2f80: 45 4e 54 52 59 5f 6e 75 6d 28 73 6b 5f 72 65 6c ENTRY_num(sk_rel
2f90: 6e 61 6d 65 29 3b 20 6a 2b 2b 29 20 7b 0a 09 09 name); j++) {...
2fa0: 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e X509_NAME_EN
2fb0: 54 52 59 20 2a 65 20 3d 20 73 6b 5f 58 35 30 39 TRY *e = sk_X509
2fc0: 5f 4e 41 4d 45 5f 45 4e 54 52 59 5f 76 61 6c 75 _NAME_ENTRY_valu
2fd0: 65 28 73 6b 5f 72 65 6c 6e 61 6d 65 2c 20 6a 29 e(sk_relname, j)
2fe0: 3b 0a 09 09 20 20 20 20 41 53 4e 31 5f 53 54 52 ;... ASN1_STR
2ff0: 49 4e 47 20 2a 64 20 3d 20 58 35 30 39 5f 4e 41 ING *d = X509_NA
3000: 4d 45 5f 45 4e 54 52 59 5f 67 65 74 5f 64 61 74 ME_ENTRY_get_dat
3010: 61 28 65 29 3b 0a 09 09 20 20 20 20 4c 41 50 50 a(e);... LAPP
3020: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
3030: 72 65 73 75 6c 74 4f 62 6a 2c 20 28 63 68 61 72 resultObj, (char
3040: 20 2a 29 20 4e 55 4c 4c 2c 20 28 63 68 61 72 20 *) NULL, (char
3050: 2a 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67 *) ASN1_STRING_g
3060: 65 74 30 5f 64 61 74 61 28 64 29 2c 20 28 54 63 et0_data(d), (Tc
3070: 6c 5f 53 69 7a 65 29 20 41 53 4e 31 5f 53 54 52 l_Size) ASN1_STR
3080: 49 4e 47 5f 6c 65 6e 67 74 68 28 64 29 29 3b 0a ING_length(d));.
3090: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 43 ..}.. }..}..C
30a0: 52 4c 5f 44 49 53 54 5f 50 4f 49 4e 54 53 5f 66 RL_DIST_POINTS_f
30b0: 72 65 65 28 63 72 6c 29 3b 0a 20 20 20 20 7d 0a ree(crl);. }.
30c0: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c return resul
30d0: 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d tObj;.}../*. *--
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
3130: 2a 20 54 6c 73 5f 78 35 30 39 4f 73 63 70 0a 20 * Tls_x509Oscp.
3140: 2a 0a 20 2a 09 47 65 74 20 6c 69 73 74 20 6f 66 *. *.Get list of
3150: 20 4f 6e 2d 6c 69 6e 65 20 43 65 72 74 69 66 69 On-line Certifi
3160: 63 61 74 65 20 53 74 61 74 75 73 20 50 72 6f 74 cate Status Prot
3170: 6f 63 6f 6c 20 28 4f 53 43 50 29 20 55 52 49 73 ocol (OSCP) URIs
3180: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
3190: 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 55 *.Tcl list of U
31a0: 52 49 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 RIs. *. * Side e
31b0: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a ffects:. *.None.
31c0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
31d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3210: 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a --. */.Tcl_Obj *
3220: 54 6c 73 5f 78 35 30 39 4f 73 63 70 28 54 63 6c Tls_x509Oscp(Tcl
3230: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
3240: 20 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 X509 *cert) {.
3250: 20 20 20 53 54 41 43 4b 5f 4f 46 28 4f 50 45 4e STACK_OF(OPEN
3260: 53 53 4c 5f 53 54 52 49 4e 47 29 20 2a 6f 63 73 SSL_STRING) *ocs
3270: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a p;. Tcl_Obj *
3280: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f resultObj = Tcl_
3290: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
32a0: 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 LL);.. if (re
32b0: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 sultObj == NULL)
32c0: 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b {..return NULL;
32d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
32e0: 28 6f 63 73 70 20 3d 20 58 35 30 39 5f 67 65 74 (ocsp = X509_get
32f0: 31 5f 6f 63 73 70 28 63 65 72 74 29 29 20 21 3d 1_ocsp(cert)) !=
3300: 20 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 NULL) {..for (i
3310: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b nt i = 0; i < sk
3320: 5f 4f 50 45 4e 53 53 4c 5f 53 54 52 49 4e 47 5f _OPENSSL_STRING_
3330: 6e 75 6d 28 6f 63 73 70 29 3b 20 69 2b 2b 29 20 num(ocsp); i++)
3340: 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 {.. LAPPEND_S
3350: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c TR(interp, resul
3360: 74 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 73 6b 5f 4f tObj, NULL, sk_O
3370: 50 45 4e 53 53 4c 5f 53 54 52 49 4e 47 5f 76 61 PENSSL_STRING_va
3380: 6c 75 65 28 6f 63 73 70 2c 20 69 29 2c 20 2d 31 lue(ocsp, i), -1
3390: 29 3b 0a 09 7d 0a 09 58 35 30 39 5f 65 6d 61 69 );..}..X509_emai
33a0: 6c 5f 66 72 65 65 28 6f 63 73 70 29 3b 0a 20 20 l_free(ocsp);.
33b0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 }. return r
33c0: 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a esultObj;.}../*.
33d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3420: 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39 43 61 *. * Tls_x509Ca
3430: 49 73 73 75 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a Issuers --. *. *
3440: 09 47 65 74 20 6c 69 73 74 20 6f 66 20 43 65 72 .Get list of Cer
3450: 74 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 tificate Authori
3460: 74 79 20 28 43 41 29 20 49 73 73 75 65 72 20 55 ty (CA) Issuer U
3470: 52 49 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 RIs. *. * Result
3480: 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f s:. *.Tcl list o
3490: 66 20 43 41 20 69 73 73 75 65 72 20 55 52 49 73 f CA issuer URIs
34a0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
34b0: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a cts:. *.None. *.
34c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3510: 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 */.Tcl_Obj *Tls
3520: 5f 78 35 30 39 43 61 49 73 73 75 65 72 73 28 54 _x509CaIssuers(T
3530: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
3540: 70 2c 20 58 35 30 39 20 2a 63 65 72 74 29 20 7b p, X509 *cert) {
3550: 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 41 43 . STACK_OF(AC
3560: 43 45 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e CESS_DESCRIPTION
3570: 29 20 2a 61 64 73 3b 0a 20 20 20 20 41 43 43 45 ) *ads;. ACCE
3580: 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 20 2a SS_DESCRIPTION *
3590: 61 64 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 ad;. Tcl_Obj
35a0: 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c *resultObj = Tcl
35b0: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
35c0: 55 4c 4c 29 3b 0a 20 20 20 20 75 6e 73 69 67 6e ULL);. unsign
35d0: 65 64 20 63 68 61 72 20 2a 62 75 66 3b 0a 0a 20 ed char *buf;..
35e0: 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a if (resultObj
35f0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
3600: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
3610: 0a 20 20 20 20 69 66 20 28 28 61 64 73 20 3d 20 . if ((ads =
3620: 58 35 30 39 5f 67 65 74 5f 65 78 74 5f 64 32 69 X509_get_ext_d2i
3630: 28 63 65 72 74 2c 20 4e 49 44 5f 69 6e 66 6f 5f (cert, NID_info_
3640: 61 63 63 65 73 73 2c 20 4e 55 4c 4c 2c 20 4e 55 access, NULL, NU
3650: 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a LL)) != NULL) {.
3660: 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b .for (int i = 0;
3670: 20 69 20 3c 20 73 6b 5f 41 43 43 45 53 53 5f 44 i < sk_ACCESS_D
3680: 45 53 43 52 49 50 54 49 4f 4e 5f 6e 75 6d 28 61 ESCRIPTION_num(a
3690: 64 73 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 ds); i++) {..
36a0: 20 61 64 20 3d 20 73 6b 5f 41 43 43 45 53 53 5f ad = sk_ACCESS_
36b0: 44 45 53 43 52 49 50 54 49 4f 4e 5f 76 61 6c 75 DESCRIPTION_valu
36c0: 65 28 61 64 73 2c 20 69 29 3b 0a 09 20 20 20 20 e(ads, i);..
36d0: 69 66 20 28 4f 42 4a 5f 6f 62 6a 32 6e 69 64 28 if (OBJ_obj2nid(
36e0: 61 64 2d 3e 6d 65 74 68 6f 64 29 20 3d 3d 20 4e ad->method) == N
36f0: 49 44 5f 61 64 5f 63 61 5f 69 73 73 75 65 72 73 ID_ad_ca_issuers
3700: 20 26 26 20 61 64 2d 3e 6c 6f 63 61 74 69 6f 6e && ad->location
3710: 29 20 7b 0a 09 09 69 66 20 28 61 64 2d 3e 6c 6f ) {...if (ad->lo
3720: 63 61 74 69 6f 6e 2d 3e 74 79 70 65 20 3d 3d 20 cation->type ==
3730: 47 45 4e 5f 55 52 49 29 20 7b 0a 09 09 20 20 20 GEN_URI) {...
3740: 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 20 3d 20 Tcl_Size len =
3750: 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31 5f (Tcl_Size) ASN1_
3760: 53 54 52 49 4e 47 5f 74 6f 5f 55 54 46 38 28 26 STRING_to_UTF8(&
3770: 62 75 66 2c 20 61 64 2d 3e 6c 6f 63 61 74 69 6f buf, ad->locatio
3780: 6e 2d 3e 64 2e 75 6e 69 66 6f 72 6d 52 65 73 6f n->d.uniformReso
3790: 75 72 63 65 49 64 65 6e 74 69 66 69 65 72 29 3b urceIdentifier);
37a0: 0a 09 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f ... Tcl_ListO
37b0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
37c0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
37d0: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 j, Tcl_NewString
37e0: 4f 62 6a 28 28 63 68 61 72 20 2a 29 20 62 75 66 Obj((char *) buf
37f0: 2c 20 6c 65 6e 29 29 3b 0a 09 09 20 20 20 20 4f , len));... O
3800: 50 45 4e 53 53 4c 5f 66 72 65 65 28 62 75 66 29 PENSSL_free(buf)
3810: 3b 0a 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 ;... break;..
3820: 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a .}.. }..}../*
3830: 20 73 6b 5f 41 43 43 45 53 53 5f 44 45 53 43 52 sk_ACCESS_DESCR
3840: 49 50 54 49 4f 4e 5f 70 6f 70 5f 66 72 65 65 28 IPTION_pop_free(
3850: 61 64 73 2c 20 41 43 43 45 53 53 5f 44 45 53 43 ads, ACCESS_DESC
3860: 52 49 50 54 49 4f 4e 5f 66 72 65 65 29 3b 20 2a RIPTION_free); *
3870: 2f 0a 09 41 55 54 48 4f 52 49 54 59 5f 49 4e 46 /..AUTHORITY_INF
3880: 4f 5f 41 43 43 45 53 53 5f 66 72 65 65 28 61 64 O_ACCESS_free(ad
3890: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 s);. }. re
38a0: 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a turn resultObj;.
38b0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
38c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3900: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
3910: 5f 4e 65 77 58 35 30 39 4f 62 6a 20 2d 2d 0a 20 _NewX509Obj --.
3920: 2a 0a 20 2a 09 50 61 72 73 65 73 20 61 20 58 35 *. *.Parses a X5
3930: 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61 09 certificate a
3940: 6e 64 20 72 65 74 75 72 6e 73 20 63 6f 6e 74 65 nd returns conte
3950: 6e 74 73 20 61 73 20 61 20 6b 65 79 2d 76 61 6c nts as a key-val
3960: 75 65 20 54 63 6c 20 6c 69 73 74 2e 0a 20 2a 0a ue Tcl list.. *.
3970: 20 2a 20 52 65 73 75 6c 74 3a 0a 20 2a 09 41 20 * Result:. *.A
3980: 54 63 6c 20 4c 69 73 74 20 77 69 74 68 20 74 68 Tcl List with th
3990: 65 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61 e X509 certifica
39a0: 74 65 20 69 6e 66 6f 20 61 73 20 61 20 6b 65 79 te info as a key
39b0: 2d 76 61 6c 75 65 20 6c 69 73 74 0a 20 2a 0a 20 -value list. *.
39c0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
39d0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *.None. *. *---
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 ----------. */.T
3a30: 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 4e 65 77 58 cl_Obj *Tls_NewX
3a40: 35 30 39 4f 62 6a 28 54 63 6c 5f 49 6e 74 65 72 509Obj(Tcl_Inter
3a50: 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20 p *interp, X509
3a60: 2a 63 65 72 74 2c 20 69 6e 74 20 61 6c 6c 29 20 *cert, int all)
3a70: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 {. Tcl_Obj *r
3a80: 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e esultObj = Tcl_N
3a90: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
3aa0: 4c 29 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f L);. BIO *bio
3ab0: 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 = BIO_new(BIO_s
3ac0: 5f 6d 65 6d 28 29 29 3b 0a 20 20 20 20 69 6e 74 _mem());. int
3ad0: 20 6d 64 6e 69 64 2c 20 70 6b 6e 69 64 2c 20 62 mdnid, pknid, b
3ae0: 69 74 73 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a its;. Tcl_Siz
3af0: 65 20 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 e len;. unsig
3b00: 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 20 20 ned int ulen;.
3b10: 20 20 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 uint32_t xflag
3b20: 73 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 s;. unsigned
3b30: 6c 6f 6e 67 20 66 6c 61 67 73 20 3d 20 58 4e 5f long flags = XN_
3b40: 46 4c 41 47 5f 52 46 43 32 32 35 33 20 7c 20 41 FLAG_RFC2253 | A
3b50: 53 4e 31 5f 53 54 52 46 4c 47 53 5f 55 54 46 38 SN1_STRFLGS_UTF8
3b60: 5f 43 4f 4e 56 45 52 54 3b 0a 20 20 20 20 66 6c _CONVERT;. fl
3b70: 61 67 73 20 26 3d 20 7e 41 53 4e 31 5f 53 54 52 ags &= ~ASN1_STR
3b80: 46 4c 47 53 5f 45 53 43 5f 4d 53 42 3b 0a 0a 20 FLGS_ESC_MSB;..
3b90: 20 20 20 63 68 61 72 20 2a 62 75 66 66 65 72 20 char *buffer
3ba0: 3d 20 63 6b 61 6c 6c 6f 63 28 42 55 46 53 49 5a = ckalloc(BUFSIZ
3bb0: 20 3e 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 > EVP_MAX_MD_SI
3bc0: 5a 45 20 3f 20 42 55 46 53 49 5a 20 3a 20 45 56 ZE ? BUFSIZ : EV
3bd0: 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 29 3b 0a P_MAX_MD_SIZE);.
3be0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
3bf0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
3c00: 28 69 6e 74 65 72 70 20 3d 3d 20 4e 55 4c 4c 20 (interp == NULL
3c10: 7c 7c 20 63 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 || cert == NULL
3c20: 7c 7c 20 62 69 6f 20 3d 3d 20 4e 55 4c 4c 20 7c || bio == NULL |
3c30: 7c 20 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e | resultObj == N
3c40: 55 4c 4c 20 7c 7c 20 62 75 66 66 65 72 20 3d 3d ULL || buffer ==
3c50: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 NULL) {..Tcl_De
3c60: 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c crRefCount(resul
3c70: 74 4f 62 6a 29 3b 0a 09 42 49 4f 5f 66 72 65 65 tObj);..BIO_free
3c80: 28 62 69 6f 29 3b 0a 09 69 66 20 28 62 75 66 66 (bio);..if (buff
3c90: 65 72 20 21 3d 20 4e 55 4c 4c 29 20 63 6b 66 72 er != NULL) ckfr
3ca0: 65 65 28 62 75 66 66 65 72 29 3b 0a 09 72 65 74 ee(buffer);..ret
3cb0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
3cc0: 0a 20 20 20 20 2f 2a 20 53 69 67 6e 61 74 75 72 . /* Signatur
3cd0: 65 20 61 6c 67 6f 72 69 74 68 6d 20 61 6e 64 20 e algorithm and
3ce0: 76 61 6c 75 65 20 2d 20 52 46 43 20 35 32 38 30 value - RFC 5280
3cf0: 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 31 2e 32 section 4.1.1.2
3d00: 20 61 6e 64 20 34 2e 31 2e 31 2e 33 20 2a 2f 0a and 4.1.1.3 */.
3d10: 20 20 20 20 2f 2a 20 73 69 67 6e 61 74 75 72 65 /* signature
3d20: 41 6c 67 6f 72 69 74 68 6d 20 69 73 20 74 68 65 Algorithm is the
3d30: 20 69 64 20 6f 66 20 74 68 65 20 63 72 79 70 74 id of the crypt
3d40: 6f 67 72 61 70 68 69 63 20 61 6c 67 6f 72 69 74 ographic algorit
3d50: 68 6d 20 75 73 65 64 20 62 79 20 74 68 65 0a 09 hm used by the..
3d60: 43 41 20 74 6f 20 73 69 67 6e 20 74 68 69 73 20 CA to sign this
3d70: 63 65 72 74 2e 20 73 69 67 6e 61 74 75 72 65 56 cert. signatureV
3d80: 61 6c 75 65 20 69 73 20 74 68 65 20 64 69 67 69 alue is the digi
3d90: 74 61 6c 20 73 69 67 6e 61 74 75 72 65 20 63 6f tal signature co
3da0: 6d 70 75 74 65 64 0a 09 75 70 6f 6e 20 74 68 65 mputed..upon the
3db0: 20 41 53 4e 2e 31 20 44 45 52 20 65 6e 63 6f 64 ASN.1 DER encod
3dc0: 65 64 20 74 62 73 43 65 72 74 69 66 69 63 61 74 ed tbsCertificat
3dd0: 65 2e 20 2a 2f 0a 20 20 20 20 7b 0a 09 63 6f 6e e. */. {..con
3de0: 73 74 20 58 35 30 39 5f 41 4c 47 4f 52 20 2a 73 st X509_ALGOR *s
3df0: 69 67 5f 61 6c 67 3b 0a 09 63 6f 6e 73 74 20 41 ig_alg;..const A
3e00: 53 4e 31 5f 42 49 54 5f 53 54 52 49 4e 47 20 2a SN1_BIT_STRING *
3e10: 73 69 67 3b 0a 09 69 6e 74 20 73 69 67 5f 6e 69 sig;..int sig_ni
3e20: 64 3b 0a 0a 09 58 35 30 39 5f 67 65 74 30 5f 73 d;...X509_get0_s
3e30: 69 67 6e 61 74 75 72 65 28 26 73 69 67 2c 20 26 ignature(&sig, &
3e40: 73 69 67 5f 61 6c 67 2c 20 63 65 72 74 29 3b 0a sig_alg, cert);.
3e50: 09 2f 2a 20 73 69 67 5f 6e 69 64 20 3d 20 58 35 ./* sig_nid = X5
3e60: 30 39 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 09_get_signature
3e70: 5f 6e 69 64 28 63 65 72 74 29 20 2a 2f 0a 09 73 _nid(cert) */..s
3e80: 69 67 5f 6e 69 64 20 3d 20 4f 42 4a 5f 6f 62 6a ig_nid = OBJ_obj
3e90: 32 6e 69 64 28 73 69 67 5f 61 6c 67 2d 3e 61 6c 2nid(sig_alg->al
3ea0: 67 6f 72 69 74 68 6d 29 3b 0a 09 4c 41 50 50 45 gorithm);..LAPPE
3eb0: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 ND_STR(interp, r
3ec0: 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 esultObj, "signa
3ed0: 74 75 72 65 41 6c 67 6f 72 69 74 68 6d 22 2c 20 tureAlgorithm",
3ee0: 4f 42 4a 5f 6e 69 64 32 6c 6e 28 73 69 67 5f 6e OBJ_nid2ln(sig_n
3ef0: 69 64 29 2c 20 2d 31 29 3b 0a 09 69 66 20 28 73 id), -1);..if (s
3f00: 69 67 5f 6e 69 64 20 21 3d 20 4e 49 44 5f 75 6e ig_nid != NID_un
3f10: 64 65 66 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 def) {.. LAPP
3f20: 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 END_OBJ(interp,
3f30: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e resultObj, "sign
3f40: 61 74 75 72 65 56 61 6c 75 65 22 2c 20 53 74 72 atureValue", Str
3f50: 69 6e 67 5f 74 6f 5f 48 65 78 28 73 69 67 2d 3e ing_to_Hex(sig->
3f60: 64 61 74 61 2c 20 73 69 67 2d 3e 6c 65 6e 67 74 data, sig->lengt
3f70: 68 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 h));..} else {..
3f80: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
3f90: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
3fa0: 6a 2c 20 22 73 69 67 6e 61 74 75 72 65 56 61 6c j, "signatureVal
3fb0: 75 65 22 2c 20 22 22 2c 20 30 29 3b 0a 09 7d 0a ue", "", 0);..}.
3fc0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 }.. /* Ve
3fd0: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 63 rsion of the enc
3fe0: 6f 64 65 64 20 63 65 72 74 69 66 69 63 61 74 65 oded certificate
3ff0: 20 2d 20 52 46 43 20 35 32 38 30 20 73 65 63 74 - RFC 5280 sect
4000: 69 6f 6e 20 34 2e 31 2e 32 2e 31 20 2a 2f 0a 20 ion 4.1.2.1 */.
4010: 20 20 20 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 LAPPEND_LONG(
4020: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
4030: 6a 2c 20 22 76 65 72 73 69 6f 6e 22 2c 20 58 35 j, "version", X5
4040: 30 39 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 09_get_version(c
4050: 65 72 74 29 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a ert)+1);.. /*
4060: 20 55 6e 69 71 75 65 20 6e 75 6d 62 65 72 20 61 Unique number a
4070: 73 73 69 67 6e 65 64 20 62 79 20 43 41 20 74 6f ssigned by CA to
4080: 20 63 65 72 74 69 66 69 63 61 74 65 20 2d 20 52 certificate - R
4090: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 FC 5280 section
40a0: 34 2e 31 2e 32 2e 32 20 2a 2f 0a 20 20 20 20 6c 4.1.2.2 */. l
40b0: 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 en = BIO_to_Buff
40c0: 65 72 28 69 32 61 5f 41 53 4e 31 5f 49 4e 54 45 er(i2a_ASN1_INTE
40d0: 47 45 52 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 GER(bio, X509_ge
40e0: 74 30 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 t0_serialNumber(
40f0: 63 65 72 74 29 29 2c 20 62 69 6f 2c 20 62 75 66 cert)), bio, buf
4100: 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 20 20 fer, BUFSIZ);.
4110: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
4120: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
4130: 20 22 73 65 72 69 61 6c 4e 75 6d 62 65 72 22 2c "serialNumber",
4140: 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a buffer, len);..
4150: 20 20 20 20 2f 2a 20 53 69 67 6e 61 74 75 72 65 /* Signature
4160: 20 61 6c 67 6f 72 69 74 68 6d 20 75 73 65 64 20 algorithm used
4170: 62 79 20 74 68 65 20 43 41 20 74 6f 20 73 69 67 by the CA to sig
4180: 6e 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 n the certificat
4190: 65 2e 20 4d 75 73 74 20 6d 61 74 63 68 0a 09 73 e. Must match..s
41a0: 69 67 6e 61 74 75 72 65 41 6c 67 6f 72 69 74 68 ignatureAlgorith
41b0: 6d 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 m. RFC 5280 sect
41c0: 69 6f 6e 20 34 2e 31 2e 32 2e 33 20 2a 2f 0a 20 ion 4.1.2.3 */.
41d0: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
41e0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
41f0: 2c 20 22 73 69 67 6e 61 74 75 72 65 22 2c 20 4f , "signature", O
4200: 42 4a 5f 6e 69 64 32 6c 6e 28 58 35 30 39 5f 67 BJ_nid2ln(X509_g
4210: 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 et_signature_nid
4220: 28 63 65 72 74 29 29 2c 20 2d 31 29 3b 0a 0a 20 (cert)), -1);..
4230: 20 20 20 2f 2a 20 49 73 73 75 65 72 20 69 64 65 /* Issuer ide
4240: 6e 74 69 66 69 65 73 20 74 68 65 20 65 6e 74 69 ntifies the enti
4250: 74 79 20 74 68 61 74 20 73 69 67 6e 65 64 20 61 ty that signed a
4260: 6e 64 20 69 73 73 75 65 64 20 74 68 65 20 63 65 nd issued the ce
4270: 72 74 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 rt. RFC 5280 sec
4280: 74 69 6f 6e 20 34 2e 31 2e 32 2e 34 20 2a 2f 0a tion 4.1.2.4 */.
4290: 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f len = BIO_to
42a0: 5f 42 75 66 66 65 72 28 58 35 30 39 5f 4e 41 4d _Buffer(X509_NAM
42b0: 45 5f 70 72 69 6e 74 5f 65 78 28 62 69 6f 2c 20 E_print_ex(bio,
42c0: 58 35 30 39 5f 67 65 74 5f 69 73 73 75 65 72 5f X509_get_issuer_
42d0: 6e 61 6d 65 28 63 65 72 74 29 2c 20 30 2c 20 66 name(cert), 0, f
42e0: 6c 61 67 73 29 2c 20 62 69 6f 2c 20 62 75 66 66 lags), bio, buff
42f0: 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 20 20 20 er, BUFSIZ);.
4300: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
4310: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
4320: 22 69 73 73 75 65 72 22 2c 20 62 75 66 66 65 72 "issuer", buffer
4330: 2c 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 , len);.. /*
4340: 43 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 Certificate vali
4350: 64 69 74 79 20 70 65 72 69 6f 64 20 69 73 20 74 dity period is t
4360: 68 65 20 69 6e 74 65 72 76 61 6c 20 74 68 65 20 he interval the
4370: 43 41 20 77 61 72 72 61 6e 74 73 20 74 68 61 74 CA warrants that
4380: 20 69 74 20 77 69 6c 6c 0a 09 6d 61 69 6e 74 61 it will..mainta
4390: 69 6e 20 69 6e 66 6f 20 6f 6e 20 74 68 65 20 73 in info on the s
43a0: 74 61 74 75 73 20 6f 66 20 74 68 65 20 63 65 72 tatus of the cer
43b0: 74 69 66 69 63 61 74 65 2e 20 52 46 43 20 35 32 tificate. RFC 52
43c0: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 80 section 4.1.2
43d0: 2e 35 20 2a 2f 0a 20 20 20 20 2f 2a 20 47 65 74 .5 */. /* Get
43e0: 20 56 61 6c 69 64 69 74 79 20 2d 20 4e 6f 74 20 Validity - Not
43f0: 42 65 66 6f 72 65 20 2a 2f 0a 20 20 20 20 6c 65 Before */. le
4400: 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 n = BIO_to_Buffe
4410: 72 28 41 53 4e 31 5f 54 49 4d 45 5f 70 72 69 6e r(ASN1_TIME_prin
4420: 74 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 74 30 t(bio, X509_get0
4430: 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 _notBefore(cert)
4440: 29 2c 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 ), bio, buffer,
4450: 42 55 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 BUFSIZ);. LAP
4460: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
4470: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6e 6f 74 resultObj, "not
4480: 42 65 66 6f 72 65 22 2c 20 62 75 66 66 65 72 2c Before", buffer,
4490: 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 len);.. /* G
44a0: 65 74 20 56 61 6c 69 64 69 74 79 20 2d 20 4e 6f et Validity - No
44b0: 74 20 41 66 74 65 72 20 2a 2f 0a 20 20 20 20 6c t After */. l
44c0: 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 en = BIO_to_Buff
44d0: 65 72 28 41 53 4e 31 5f 54 49 4d 45 5f 70 72 69 er(ASN1_TIME_pri
44e0: 6e 74 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 74 nt(bio, X509_get
44f0: 30 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 0_notAfter(cert)
4500: 29 2c 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 ), bio, buffer,
4510: 42 55 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 BUFSIZ);. LAP
4520: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
4530: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6e 6f 74 resultObj, "not
4540: 41 66 74 65 72 22 2c 20 62 75 66 66 65 72 2c 20 After", buffer,
4550: 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 len);.. /* Su
4560: 62 6a 65 63 74 20 69 64 65 6e 74 69 66 69 65 73 bject identifies
4570: 20 74 68 65 20 65 6e 74 69 74 79 20 61 73 73 6f the entity asso
4580: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 ciated with the
4590: 70 75 62 6c 69 63 20 6b 65 79 20 73 74 6f 72 65 public key store
45a0: 64 20 69 6e 0a 09 74 68 65 20 73 75 62 6a 65 63 d in..the subjec
45b0: 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 65 t public key fie
45c0: 6c 64 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 ld. RFC 5280 sec
45d0: 74 69 6f 6e 20 34 2e 31 2e 32 2e 36 20 2a 2f 0a tion 4.1.2.6 */.
45e0: 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f len = BIO_to
45f0: 5f 42 75 66 66 65 72 28 58 35 30 39 5f 4e 41 4d _Buffer(X509_NAM
4600: 45 5f 70 72 69 6e 74 5f 65 78 28 62 69 6f 2c 20 E_print_ex(bio,
4610: 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 X509_get_subject
4620: 5f 6e 61 6d 65 28 63 65 72 74 29 2c 20 30 2c 20 _name(cert), 0,
4630: 66 6c 61 67 73 29 2c 20 62 69 6f 2c 20 62 75 66 flags), bio, buf
4640: 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 20 20 fer, BUFSIZ);.
4650: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
4660: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
4670: 20 22 73 75 62 6a 65 63 74 22 2c 20 62 75 66 66 "subject", buff
4680: 65 72 2c 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f er, len);.. /
4690: 2a 20 53 48 41 31 20 44 69 67 65 73 74 20 28 46 * SHA1 Digest (F
46a0: 69 6e 67 65 72 70 72 69 6e 74 29 20 6f 66 20 63 ingerprint) of c
46b0: 65 72 74 20 2d 20 44 45 52 20 72 65 70 72 65 73 ert - DER repres
46c0: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 entation */.
46d0: 69 66 20 28 58 35 30 39 5f 64 69 67 65 73 74 28 if (X509_digest(
46e0: 63 65 72 74 2c 20 45 56 50 5f 73 68 61 31 28 29 cert, EVP_sha1()
46f0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 , (unsigned char
4700: 20 2a 29 62 75 66 66 65 72 2c 20 26 75 6c 65 6e *)buffer, &ulen
4710: 29 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 )) {..LAPPEND_OB
4720: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 J(interp, result
4730: 4f 62 6a 2c 20 22 73 68 61 31 5f 68 61 73 68 22 Obj, "sha1_hash"
4740: 2c 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 , String_to_Hex(
4750: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a (unsigned char *
4760: 29 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20 75 )buffer, (int) u
4770: 6c 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 len));. }..
4780: 20 20 2f 2a 20 53 48 41 32 35 36 20 44 69 67 65 /* SHA256 Dige
4790: 73 74 20 28 46 69 6e 67 65 72 70 72 69 6e 74 29 st (Fingerprint)
47a0: 20 6f 66 20 63 65 72 74 20 2d 20 44 45 52 20 72 of cert - DER r
47b0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f epresentation */
47c0: 0a 20 20 20 20 69 66 20 28 58 35 30 39 5f 64 69 . if (X509_di
47d0: 67 65 73 74 28 63 65 72 74 2c 20 45 56 50 5f 73 gest(cert, EVP_s
47e0: 68 61 32 35 36 28 29 2c 20 28 75 6e 73 69 67 6e ha256(), (unsign
47f0: 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 72 ed char *)buffer
4800: 2c 20 26 75 6c 65 6e 29 29 20 7b 0a 09 4c 41 50 , &ulen)) {..LAP
4810: 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c PEND_OBJ(interp,
4820: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 68 61 resultObj, "sha
4830: 32 35 36 5f 68 61 73 68 22 2c 20 53 74 72 69 6e 256_hash", Strin
4840: 67 5f 74 6f 5f 48 65 78 28 28 75 6e 73 69 67 6e g_to_Hex((unsign
4850: 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 72 ed char *)buffer
4860: 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a , (int) ulen));.
4870: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 75 }.. /* Su
4880: 62 6a 65 63 74 20 50 75 62 6c 69 63 20 4b 65 79 bject Public Key
4890: 20 49 6e 66 6f 20 73 70 65 63 69 66 69 65 73 20 Info specifies
48a0: 74 68 65 20 70 75 62 6c 69 63 20 6b 65 79 20 61 the public key a
48b0: 6e 64 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 nd identifies th
48c0: 65 0a 09 61 6c 67 6f 72 69 74 68 6d 20 77 69 74 e..algorithm wit
48d0: 68 20 77 68 69 63 68 20 74 68 65 20 6b 65 79 20 h which the key
48e0: 69 73 20 75 73 65 64 2e 20 52 46 43 20 35 32 38 is used. RFC 528
48f0: 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 0 section 4.1.2.
4900: 37 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35 30 7 */. if (X50
4910: 39 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 9_get_signature_
4920: 69 6e 66 6f 28 63 65 72 74 2c 20 26 6d 64 6e 69 info(cert, &mdni
4930: 64 2c 20 26 70 6b 6e 69 64 2c 20 26 62 69 74 73 d, &pknid, &bits
4940: 2c 20 26 78 66 6c 61 67 73 29 29 20 7b 0a 09 41 , &xflags)) {..A
4950: 53 4e 31 5f 42 49 54 5f 53 54 52 49 4e 47 20 2a SN1_BIT_STRING *
4960: 6b 65 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 key;..unsigned i
4970: 6e 74 20 6e 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f nt n;...LAPPEND_
4980: 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 STR(interp, resu
4990: 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 69 6e 67 44 ltObj, "signingD
49a0: 69 67 65 73 74 22 2c 20 4f 42 4a 5f 6e 69 64 32 igest", OBJ_nid2
49b0: 6c 6e 28 6d 64 6e 69 64 29 2c 20 2d 31 29 3b 0a ln(mdnid), -1);.
49c0: 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
49d0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
49e0: 22 70 75 62 6c 69 63 4b 65 79 41 6c 67 6f 72 69 "publicKeyAlgori
49f0: 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e thm", OBJ_nid2ln
4a00: 28 70 6b 6e 69 64 29 2c 20 2d 31 29 3b 0a 09 4c (pknid), -1);..L
4a10: 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
4a20: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 62 p, resultObj, "b
4a30: 69 74 73 22 2c 20 62 69 74 73 29 3b 20 2f 2a 20 its", bits); /*
4a40: 45 66 66 65 63 74 69 76 65 20 73 65 63 75 72 69 Effective securi
4a50: 74 79 20 62 69 74 73 20 2a 2f 0a 0a 09 6b 65 79 ty bits */...key
4a60: 20 3d 20 58 35 30 39 5f 67 65 74 30 5f 70 75 62 = X509_get0_pub
4a70: 6b 65 79 5f 62 69 74 73 74 72 28 63 65 72 74 29 key_bitstr(cert)
4a80: 3b 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 ;..LAPPEND_OBJ(i
4a90: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
4aa0: 2c 20 22 70 75 62 6c 69 63 4b 65 79 22 2c 20 53 , "publicKey", S
4ab0: 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 6b 65 79 tring_to_Hex(key
4ac0: 2d 3e 64 61 74 61 2c 20 6b 65 79 2d 3e 6c 65 6e ->data, key->len
4ad0: 67 74 68 29 29 3b 0a 0a 09 69 66 20 28 58 35 30 gth));...if (X50
4ae0: 39 5f 70 75 62 6b 65 79 5f 64 69 67 65 73 74 28 9_pubkey_digest(
4af0: 63 65 72 74 2c 20 45 56 50 5f 67 65 74 5f 64 69 cert, EVP_get_di
4b00: 67 65 73 74 62 79 6e 69 64 28 70 6b 6e 69 64 29 gestbynid(pknid)
4b10: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 , (unsigned char
4b20: 20 2a 29 62 75 66 66 65 72 2c 20 26 6e 29 29 20 *)buffer, &n))
4b30: 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f {.. LAPPEND_O
4b40: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c BJ(interp, resul
4b50: 74 4f 62 6a 2c 20 22 70 75 62 6c 69 63 4b 65 79 tObj, "publicKey
4b60: 48 61 73 68 22 2c 20 53 74 72 69 6e 67 5f 74 6f Hash", String_to
4b70: 5f 48 65 78 28 28 75 6e 73 69 67 6e 65 64 20 63 _Hex((unsigned c
4b80: 68 61 72 20 2a 29 62 75 66 66 65 72 2c 20 28 69 har *)buffer, (i
4b90: 6e 74 29 20 6e 29 29 3b 0a 09 7d 20 65 6c 73 65 nt) n));..} else
4ba0: 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f {.. LAPPEND_
4bb0: 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 STR(interp, resu
4bc0: 6c 74 4f 62 6a 2c 20 22 70 75 62 6c 69 63 4b 65 ltObj, "publicKe
4bd0: 79 48 61 73 68 22 2c 20 22 22 2c 20 30 29 3b 0a yHash", "", 0);.
4be0: 09 7d 0a 0a 09 2f 2a 20 64 69 67 65 73 74 20 6f .}.../* digest o
4bf0: 66 20 74 68 65 20 44 45 52 20 72 65 70 72 65 73 f the DER repres
4c00: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 entation of the
4c10: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 certificate */..
4c20: 69 66 20 28 58 35 30 39 5f 64 69 67 65 73 74 28 if (X509_digest(
4c30: 63 65 72 74 2c 20 45 56 50 5f 67 65 74 5f 64 69 cert, EVP_get_di
4c40: 67 65 73 74 62 79 6e 69 64 28 6d 64 6e 69 64 29 gestbynid(mdnid)
4c50: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 , (unsigned char
4c60: 20 2a 29 62 75 66 66 65 72 2c 20 26 6e 29 29 20 *)buffer, &n))
4c70: 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f {.. LAPPEND_O
4c80: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c BJ(interp, resul
4c90: 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75 72 65 tObj, "signature
4ca0: 48 61 73 68 22 2c 20 53 74 72 69 6e 67 5f 74 6f Hash", String_to
4cb0: 5f 48 65 78 28 28 75 6e 73 69 67 6e 65 64 20 63 _Hex((unsigned c
4cc0: 68 61 72 20 2a 29 62 75 66 66 65 72 2c 20 28 69 har *)buffer, (i
4cd0: 6e 74 29 20 6e 29 29 3b 0a 09 7d 20 65 6c 73 65 nt) n));..} else
4ce0: 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f {.. LAPPEND_
4cf0: 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 STR(interp, resu
4d00: 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75 72 ltObj, "signatur
4d10: 65 48 61 73 68 22 2c 20 22 22 2c 20 30 29 3b 0a eHash", "", 0);.
4d20: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
4d30: 20 43 65 72 74 69 66 69 63 61 74 65 20 50 75 72 Certificate Pur
4d40: 70 6f 73 65 2e 20 43 61 6c 6c 20 62 65 66 6f 72 pose. Call befor
4d50: 65 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 65 e checking for e
4d60: 78 74 65 6e 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 xtensions. */.
4d70: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
4d80: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
4d90: 20 22 70 75 72 70 6f 73 65 22 2c 20 54 6c 73 5f "purpose", Tls_
4da0: 78 35 30 39 50 75 72 70 6f 73 65 28 63 65 72 74 x509Purpose(cert
4db0: 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 ), -1);. LAPP
4dc0: 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 END_OBJ(interp,
4dd0: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 63 65 72 74 resultObj, "cert
4de0: 69 66 69 63 61 74 65 50 75 72 70 6f 73 65 22 2c ificatePurpose",
4df0: 20 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 65 Tls_x509Purpose
4e00: 73 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 s(interp, cert))
4e10: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 65 78 ;.. /* Get ex
4e20: 74 65 6e 73 69 6f 6e 73 20 66 6c 61 67 73 20 2a tensions flags *
4e30: 2f 0a 20 20 20 20 78 66 6c 61 67 73 20 3d 20 58 /. xflags = X
4e40: 35 30 39 5f 67 65 74 5f 65 78 74 65 6e 73 69 6f 509_get_extensio
4e50: 6e 5f 66 6c 61 67 73 28 63 65 72 74 29 3b 0a 20 n_flags(cert);.
4e60: 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 LAPPEND_INT(i
4e70: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
4e80: 2c 20 22 65 78 74 46 6c 61 67 73 22 2c 20 78 66 , "extFlags", xf
4e90: 6c 61 67 73 29 3b 0a 0a 09 2f 2a 20 43 68 65 63 lags);.../* Chec
4ea0: 6b 20 69 66 20 63 65 72 74 20 77 61 73 20 69 73 k if cert was is
4eb0: 73 75 65 64 20 62 79 20 43 41 20 63 65 72 74 20 sued by CA cert
4ec0: 69 73 73 75 65 72 20 6f 72 20 73 65 6c 66 20 73 issuer or self s
4ed0: 69 67 6e 65 64 20 2a 2f 0a 20 20 20 20 4c 41 50 igned */. LAP
4ee0: 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 PEND_BOOL(interp
4ef0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 65 , resultObj, "se
4f00: 6c 66 49 73 73 75 65 64 22 2c 20 78 66 6c 61 67 lfIssued", xflag
4f10: 73 20 26 20 45 58 46 4c 41 47 5f 53 49 29 3b 0a s & EXFLAG_SI);.
4f20: 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c LAPPEND_BOOL
4f30: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
4f40: 62 6a 2c 20 22 73 65 6c 66 53 69 67 6e 65 64 22 bj, "selfSigned"
4f50: 2c 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 , xflags & EXFLA
4f60: 47 5f 53 53 29 3b 0a 20 20 20 20 4c 41 50 50 45 G_SS);. LAPPE
4f70: 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
4f80: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 69 73 50 72 resultObj, "isPr
4f90: 6f 78 79 43 65 72 74 22 2c 20 78 66 6c 61 67 73 oxyCert", xflags
4fa0: 20 26 20 45 58 46 4c 41 47 5f 50 52 4f 58 59 29 & EXFLAG_PROXY)
4fb0: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f ;. LAPPEND_BO
4fc0: 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c OL(interp, resul
4fd0: 74 4f 62 6a 2c 20 22 65 78 74 49 6e 76 61 6c 69 tObj, "extInvali
4fe0: 64 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58 46 d", xflags & EXF
4ff0: 4c 41 47 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 LAG_INVALID);.
5000: 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 LAPPEND_BOOL(i
5010: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
5020: 2c 20 22 69 73 43 41 43 65 72 74 22 2c 20 58 35 , "isCACert", X5
5030: 30 39 5f 63 68 65 63 6b 5f 63 61 28 63 65 72 74 09_check_ca(cert
5040: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 ));.. /* The
5050: 55 6e 69 71 75 65 20 49 64 73 20 61 72 65 20 75 Unique Ids are u
5060: 73 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 sed to handle th
5070: 65 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 e possibility of
5080: 20 72 65 75 73 65 20 6f 66 20 73 75 62 6a 65 63 reuse of subjec
5090: 74 0a 09 61 6e 64 2f 6f 72 20 69 73 73 75 65 72 t..and/or issuer
50a0: 20 6e 61 6d 65 73 20 6f 76 65 72 20 74 69 6d 65 names over time
50b0: 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 . RFC 5280 secti
50c0: 6f 6e 20 34 2e 31 2e 32 2e 38 20 2a 2f 0a 20 20 on 4.1.2.8 */.
50d0: 20 20 7b 0a 09 63 6f 6e 73 74 20 41 53 4e 31 5f {..const ASN1_
50e0: 42 49 54 5f 53 54 52 49 4e 47 20 2a 69 75 69 64 BIT_STRING *iuid
50f0: 2c 20 2a 73 75 69 64 3b 0a 09 58 35 30 39 5f 67 , *suid;..X509_g
5100: 65 74 30 5f 75 69 64 73 28 63 65 72 74 2c 20 26 et0_uids(cert, &
5110: 69 75 69 64 2c 20 26 73 75 69 64 29 3b 0a 0a 09 iuid, &suid);...
5120: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
5130: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
5140: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f resultObj, Tcl_
5150: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 73 NewStringObj("is
5160: 73 75 65 72 55 6e 69 71 75 65 49 64 22 2c 20 2d suerUniqueId", -
5170: 31 29 29 3b 0a 09 69 66 20 28 69 75 69 64 20 21 1));..if (iuid !
5180: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 = NULL) {.. T
5190: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
51a0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
51b0: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e resultObj, Tcl_N
51c0: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 ewByteArrayObj((
51d0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
51e0: 68 61 72 20 2a 29 69 75 69 64 2d 3e 64 61 74 61 har *)iuid->data
51f0: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 69 75 69 , (Tcl_Size) iui
5200: 64 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a 09 7d 20 d->length));..}
5210: 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f else {.. Tcl_
5220: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5230: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 ment(interp, res
5240: 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 ultObj, Tcl_NewS
5250: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 tringObj("", -1)
5260: 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 4c 69 73 74 );..}...Tcl_List
5270: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
5280: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
5290: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e bj, Tcl_NewStrin
52a0: 67 4f 62 6a 28 22 73 75 62 6a 65 63 74 55 6e 69 gObj("subjectUni
52b0: 71 75 65 49 64 22 2c 20 2d 31 29 29 3b 0a 09 69 queId", -1));..i
52c0: 66 20 28 73 75 69 64 20 21 3d 20 4e 55 4c 4c 29 f (suid != NULL)
52d0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
52e0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
52f0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
5300: 62 6a 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 bj, Tcl_NewByteA
5310: 72 72 61 79 4f 62 6a 28 28 63 6f 6e 73 74 20 75 rrayObj((const u
5320: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 nsigned char *)s
5330: 75 69 64 2d 3e 64 61 74 61 2c 20 28 54 63 6c 5f uid->data, (Tcl_
5340: 53 69 7a 65 29 20 73 75 69 64 2d 3e 6c 65 6e 67 Size) suid->leng
5350: 74 68 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a th));..} else {.
5360: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
5370: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
5380: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
5390: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
53a0: 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 j("", -1));..}.
53b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 58 35 30 }.. /* X50
53c0: 39 20 76 33 20 45 78 74 65 6e 73 69 6f 6e 73 20 9 v3 Extensions
53d0: 2d 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 - RFC 5280 secti
53e0: 6f 6e 20 34 2e 31 2e 32 2e 39 20 2a 2f 0a 20 20 on 4.1.2.9 */.
53f0: 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e LAPPEND_INT(in
5400: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
5410: 20 22 65 78 74 43 6f 75 6e 74 22 2c 20 58 35 30 "extCount", X50
5420: 39 5f 67 65 74 5f 65 78 74 5f 63 6f 75 6e 74 28 9_get_ext_count(
5430: 63 65 72 74 29 29 3b 0a 20 20 20 20 4c 41 50 50 cert));. LAPP
5440: 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 END_OBJ(interp,
5450: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74 65 resultObj, "exte
5460: 6e 73 69 6f 6e 73 22 2c 20 54 6c 73 5f 78 35 30 nsions", Tls_x50
5470: 39 45 78 74 65 6e 73 69 6f 6e 73 28 69 6e 74 65 9Extensions(inte
5480: 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 20 rp, cert));..
5490: 20 2f 2a 20 41 75 74 68 6f 72 69 74 79 20 4b 65 /* Authority Ke
54a0: 79 20 49 64 65 6e 74 69 66 69 65 72 20 28 41 4b y Identifier (AK
54b0: 49 29 20 69 73 20 74 68 65 20 53 75 62 6a 65 63 I) is the Subjec
54c0: 74 20 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 t Key Identifier
54d0: 20 28 53 4b 49 29 20 6f 66 0a 09 69 74 73 20 73 (SKI) of..its s
54e0: 69 67 6e 65 72 20 28 74 68 65 20 43 41 29 2e 20 igner (the CA).
54f0: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e RFC 5280 section
5500: 20 34 2e 32 2e 31 2e 31 2c 20 4e 49 44 5f 61 75 4.2.1.1, NID_au
5510: 74 68 6f 72 69 74 79 5f 6b 65 79 5f 69 64 65 6e thority_key_iden
5520: 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 4c 41 tifier */. LA
5530: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 PPEND_OBJ(interp
5540: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 61 75 , resultObj, "au
5550: 74 68 6f 72 69 74 79 4b 65 79 49 64 65 6e 74 69 thorityKeyIdenti
5560: 66 69 65 72 22 2c 0a 09 54 6c 73 5f 78 35 30 39 fier",..Tls_x509
5570: 49 64 65 6e 74 69 66 69 65 72 28 58 35 30 39 5f Identifier(X509_
5580: 67 65 74 30 5f 61 75 74 68 6f 72 69 74 79 5f 6b get0_authority_k
5590: 65 79 5f 69 64 28 63 65 72 74 29 29 29 3b 0a 0a ey_id(cert)));..
55a0: 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 4b /* Subject K
55b0: 65 79 20 49 64 65 6e 74 69 66 69 65 72 20 28 53 ey Identifier (S
55c0: 4b 49 29 20 69 73 20 75 73 65 64 20 74 6f 20 69 KI) is used to i
55d0: 64 65 6e 74 69 66 79 20 63 65 72 74 69 66 69 63 dentify certific
55e0: 61 74 65 73 20 74 68 61 74 20 63 6f 6e 74 61 69 ates that contai
55f0: 6e 0a 09 61 20 70 61 72 74 69 63 75 6c 61 72 20 n..a particular
5600: 70 75 62 6c 69 63 20 6b 65 79 2e 20 52 46 43 20 public key. RFC
5610: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 5280 section 4.2
5620: 2e 31 2e 32 2c 20 4e 49 44 5f 73 75 62 6a 65 63 .1.2, NID_subjec
5630: 74 5f 6b 65 79 5f 69 64 65 6e 74 69 66 69 65 72 t_key_identifier
5640: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f */. LAPPEND_
5650: 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 OBJ(interp, resu
5660: 6c 74 4f 62 6a 2c 20 22 73 75 62 6a 65 63 74 4b ltObj, "subjectK
5670: 65 79 49 64 65 6e 74 69 66 69 65 72 22 2c 0a 09 eyIdentifier",..
5680: 54 6c 73 5f 78 35 30 39 49 64 65 6e 74 69 66 69 Tls_x509Identifi
5690: 65 72 28 58 35 30 39 5f 67 65 74 30 5f 73 75 62 er(X509_get0_sub
56a0: 6a 65 63 74 5f 6b 65 79 5f 69 64 28 63 65 72 74 ject_key_id(cert
56b0: 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4b 65 79 )));.. /* Key
56c0: 20 75 73 61 67 65 20 65 78 74 65 6e 73 69 6f 6e usage extension
56d0: 20 64 65 66 69 6e 65 73 20 74 68 65 20 70 75 72 defines the pur
56e0: 70 6f 73 65 20 28 65 2e 67 2e 2c 20 65 6e 63 69 pose (e.g., enci
56f0: 70 68 65 72 6d 65 6e 74 2c 20 73 69 67 6e 61 74 pherment, signat
5700: 75 72 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 ure, certificate
5710: 0a 09 73 69 67 6e 69 6e 67 29 20 6f 66 20 74 68 ..signing) of th
5720: 65 20 6b 65 79 20 69 6e 20 74 68 65 20 63 65 72 e key in the cer
5730: 74 69 66 69 63 61 74 65 2e 20 52 46 43 20 35 32 tificate. RFC 52
5740: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 80 section 4.2.1
5750: 2e 33 2c 20 4e 49 44 5f 6b 65 79 5f 75 73 61 67 .3, NID_key_usag
5760: 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 e */. LAPPEND
5770: 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 _OBJ(interp, res
5780: 75 6c 74 4f 62 6a 2c 20 22 6b 65 79 55 73 61 67 ultObj, "keyUsag
5790: 65 22 2c 20 54 6c 73 5f 78 35 30 39 4b 65 79 55 e", Tls_x509KeyU
57a0: 73 61 67 65 28 69 6e 74 65 72 70 2c 20 63 65 72 sage(interp, cer
57b0: 74 2c 20 78 66 6c 61 67 73 29 29 3b 0a 0a 20 20 t, xflags));..
57c0: 20 20 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65 /* Certificate
57d0: 20 50 6f 6c 69 63 69 65 73 20 2d 20 69 6e 64 69 Policies - indi
57e0: 63 61 74 65 73 20 74 68 65 20 69 73 73 75 69 6e cates the issuin
57f0: 67 20 43 41 20 63 6f 6e 73 69 64 65 72 73 20 69 g CA considers i
5800: 74 73 20 69 73 73 75 65 72 44 6f 6d 61 69 6e 50 ts issuerDomainP
5810: 6f 6c 69 63 79 0a 09 65 71 75 69 76 61 6c 65 6e olicy..equivalen
5820: 74 20 74 6f 20 74 68 65 20 73 75 62 6a 65 63 74 t to the subject
5830: 20 43 41 27 73 20 73 75 62 6a 65 63 74 44 6f 6d CA's subjectDom
5840: 61 69 6e 50 6f 6c 69 63 79 2e 20 52 46 43 20 35 ainPolicy. RFC 5
5850: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 280 section 4.2.
5860: 31 2e 34 2c 20 4e 49 44 5f 63 65 72 74 69 66 69 1.4, NID_certifi
5870: 63 61 74 65 5f 70 6f 6c 69 63 69 65 73 20 2a 2f cate_policies */
5880: 0a 20 20 20 20 69 66 20 28 78 66 6c 61 67 73 20 . if (xflags
5890: 26 20 45 58 46 4c 41 47 5f 49 4e 56 41 4c 49 44 & EXFLAG_INVALID
58a0: 5f 50 4f 4c 49 43 59 29 20 7b 0a 09 2f 2a 20 52 _POLICY) {../* R
58b0: 65 6a 65 63 74 20 63 65 72 74 20 2a 2f 0a 20 20 eject cert */.
58c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 6c 69 }.. /* Poli
58d0: 63 79 20 4d 61 70 70 69 6e 67 73 20 2d 20 52 46 cy Mappings - RF
58e0: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 C 5280 section 4
58f0: 2e 32 2e 31 2e 35 2c 20 4e 49 44 5f 70 6f 6c 69 .2.1.5, NID_poli
5900: 63 79 5f 6d 61 70 70 69 6e 67 73 20 2a 2f 0a 0a cy_mappings */..
5910: 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 41 /* Subject A
5920: 6c 74 65 72 6e 61 74 69 76 65 20 4e 61 6d 65 20 lternative Name
5930: 28 53 41 4e 29 20 63 6f 6e 74 61 69 6e 73 20 61 (SAN) contains a
5940: 64 64 69 74 69 6f 6e 61 6c 20 55 52 4c 73 2c 20 dditional URLs,
5950: 44 4e 53 20 6e 61 6d 65 73 2c 20 6f 72 20 49 50 DNS names, or IP
5960: 0a 09 61 64 64 72 65 73 73 65 73 20 62 6f 75 6e ..addresses boun
5970: 64 20 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 d to certificate
5980: 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 . RFC 5280 secti
5990: 6f 6e 20 34 2e 32 2e 31 2e 36 2c 20 4e 49 44 5f on 4.2.1.6, NID_
59a0: 73 75 62 6a 65 63 74 5f 61 6c 74 5f 6e 61 6d 65 subject_alt_name
59b0: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f */. LAPPEND_
59c0: 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 OBJ(interp, resu
59d0: 6c 74 4f 62 6a 2c 20 22 73 75 62 6a 65 63 74 41 ltObj, "subjectA
59e0: 6c 74 4e 61 6d 65 22 2c 20 54 6c 73 5f 78 35 30 ltName", Tls_x50
59f0: 39 4e 61 6d 65 73 28 69 6e 74 65 72 70 2c 20 63 9Names(interp, c
5a00: 65 72 74 2c 20 4e 49 44 5f 73 75 62 6a 65 63 74 ert, NID_subject
5a10: 5f 61 6c 74 5f 6e 61 6d 65 2c 20 62 69 6f 29 29 _alt_name, bio))
5a20: 3b 0a 0a 20 20 20 20 2f 2a 20 49 73 73 75 65 72 ;.. /* Issuer
5a30: 20 41 6c 74 65 72 6e 61 74 69 76 65 20 4e 61 6d Alternative Nam
5a40: 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 e is used to ass
5a50: 6f 63 69 61 74 65 20 49 6e 74 65 72 6e 65 74 20 ociate Internet
5a60: 73 74 79 6c 65 20 69 64 65 6e 74 69 74 69 65 73 style identities
5a70: 0a 09 77 69 74 68 20 74 68 65 20 63 65 72 74 69 ..with the certi
5a80: 66 69 63 61 74 65 20 69 73 73 75 65 72 2e 20 52 ficate issuer. R
5a90: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 FC 5280 section
5aa0: 34 2e 32 2e 31 2e 37 2c 20 4e 49 44 5f 69 73 73 4.2.1.7, NID_iss
5ab0: 75 65 72 5f 61 6c 74 5f 6e 61 6d 65 20 2a 2f 0a uer_alt_name */.
5ac0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 LAPPEND_OBJ(
5ad0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
5ae0: 6a 2c 20 22 69 73 73 75 65 72 41 6c 74 4e 61 6d j, "issuerAltNam
5af0: 65 22 2c 20 54 6c 73 5f 78 35 30 39 4e 61 6d 65 e", Tls_x509Name
5b00: 73 28 69 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 s(interp, cert,
5b10: 4e 49 44 5f 69 73 73 75 65 72 5f 61 6c 74 5f 6e NID_issuer_alt_n
5b20: 61 6d 65 2c 20 62 69 6f 29 29 3b 0a 0a 20 20 20 ame, bio));..
5b30: 20 2f 2a 20 53 75 62 6a 65 63 74 20 44 69 72 65 /* Subject Dire
5b40: 63 74 6f 72 79 20 41 74 74 72 69 62 75 74 65 73 ctory Attributes
5b50: 20 70 72 6f 76 69 64 65 73 20 69 64 65 6e 74 69 provides identi
5b60: 66 69 63 61 74 69 6f 6e 20 61 74 74 72 69 62 75 fication attribu
5b70: 74 65 73 20 28 65 2e 67 2e 2c 20 6e 61 74 69 6f tes (e.g., natio
5b80: 6e 61 6c 69 74 79 29 0a 09 6f 66 20 74 68 65 20 nality)..of the
5b90: 73 75 62 6a 65 63 74 2e 20 52 46 43 20 35 32 38 subject. RFC 528
5ba0: 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 0 section 4.2.1.
5bb0: 38 20 28 73 75 62 6a 65 63 74 44 69 72 65 63 74 8 (subjectDirect
5bc0: 6f 72 79 41 74 74 72 69 62 75 74 65 73 29 20 2a oryAttributes) *
5bd0: 2f 0a 0a 20 20 20 20 2f 2a 20 42 61 73 69 63 20 /.. /* Basic
5be0: 43 6f 6e 73 74 72 61 69 6e 74 73 20 69 64 65 6e Constraints iden
5bf0: 74 69 66 69 65 73 20 77 68 65 74 68 65 72 20 74 tifies whether t
5c00: 68 65 20 73 75 62 6a 65 63 74 20 6f 66 20 74 68 he subject of th
5c10: 65 20 63 65 72 74 20 69 73 20 61 20 43 41 20 61 e cert is a CA a
5c20: 6e 64 0a 09 74 68 65 20 6d 61 78 20 64 65 70 74 nd..the max dept
5c30: 68 20 6f 66 20 76 61 6c 69 64 20 63 65 72 74 20 h of valid cert
5c40: 70 61 74 68 73 20 66 6f 72 20 74 68 69 73 20 63 paths for this c
5c50: 65 72 74 2e 20 52 46 43 20 35 32 38 30 20 73 65 ert. RFC 5280 se
5c60: 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 39 2c 20 4e ction 4.2.1.9, N
5c70: 49 44 5f 62 61 73 69 63 5f 63 6f 6e 73 74 72 61 ID_basic_constra
5c80: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 ints */. if (
5c90: 21 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 !(xflags & EXFLA
5ca0: 47 5f 50 52 4f 58 59 29 29 20 7b 0a 09 4c 41 50 G_PROXY)) {..LAP
5cb0: 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 PEND_LONG(interp
5cc0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 61 , resultObj, "pa
5cd0: 74 68 4c 65 6e 22 2c 20 58 35 30 39 5f 67 65 74 thLen", X509_get
5ce0: 5f 70 61 74 68 6c 65 6e 28 63 65 72 74 29 29 3b _pathlen(cert));
5cf0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 4c . } else {..L
5d00: 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 APPEND_LONG(inte
5d10: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
5d20: 70 61 74 68 4c 65 6e 22 2c 20 58 35 30 39 5f 67 pathLen", X509_g
5d30: 65 74 5f 70 72 6f 78 79 5f 70 61 74 68 6c 65 6e et_proxy_pathlen
5d40: 28 63 65 72 74 29 29 3b 0a 20 20 20 20 7d 0a 20 (cert));. }.
5d50: 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 LAPPEND_BOOL(
5d60: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
5d70: 6a 2c 20 22 62 61 73 69 63 43 6f 6e 73 74 72 61 j, "basicConstra
5d80: 69 6e 74 73 43 41 22 2c 20 78 66 6c 61 67 73 20 intsCA", xflags
5d90: 26 20 45 58 46 4c 41 47 5f 43 41 29 3b 0a 0a 20 & EXFLAG_CA);..
5da0: 20 20 20 2f 2a 20 4e 61 6d 65 20 43 6f 6e 73 74 /* Name Const
5db0: 72 61 69 6e 74 73 20 69 73 20 6f 6e 6c 79 20 75 raints is only u
5dc0: 73 65 64 20 69 6e 20 43 41 20 63 65 72 74 73 20 sed in CA certs
5dd0: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 to indicate the
5de0: 6e 61 6d 65 20 73 70 61 63 65 20 66 6f 72 0a 09 name space for..
5df0: 61 6c 6c 20 73 75 62 6a 65 63 74 20 6e 61 6d 65 all subject name
5e00: 73 20 69 6e 20 73 75 62 73 65 71 75 65 6e 74 20 s in subsequent
5e10: 63 65 72 74 69 66 69 63 61 74 65 73 20 69 6e 20 certificates in
5e20: 61 20 63 65 72 74 69 66 69 63 61 74 69 6f 6e 20 a certification
5e30: 70 61 74 68 0a 09 4d 55 53 54 20 62 65 20 6c 6f path..MUST be lo
5e40: 63 61 74 65 64 2e 20 52 46 43 20 35 32 38 30 20 cated. RFC 5280
5e50: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 30 section 4.2.1.10
5e60: 2c 20 4e 49 44 5f 6e 61 6d 65 5f 63 6f 6e 73 74 , NID_name_const
5e70: 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 2f raints */.. /
5e80: 2a 20 50 6f 6c 69 63 79 20 43 6f 6e 73 74 72 61 * Policy Constra
5e90: 69 6e 74 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 ints is only use
5ea0: 64 20 69 6e 20 43 41 20 63 65 72 74 73 20 74 6f d in CA certs to
5eb0: 20 6c 69 6d 69 74 20 74 68 65 20 6c 65 6e 67 74 limit the lengt
5ec0: 68 20 6f 66 20 61 0a 09 63 65 72 74 20 63 68 61 h of a..cert cha
5ed0: 69 6e 20 66 6f 72 20 74 68 61 74 20 43 41 2e 20 in for that CA.
5ee0: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e RFC 5280 section
5ef0: 20 34 2e 32 2e 31 2e 31 31 2c 20 4e 49 44 5f 70 4.2.1.11, NID_p
5f00: 6f 6c 69 63 79 5f 63 6f 6e 73 74 72 61 69 6e 74 olicy_constraint
5f10: 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 78 74 s */.. /* Ext
5f20: 65 6e 64 65 64 20 4b 65 79 20 55 73 61 67 65 20 ended Key Usage
5f30: 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 70 75 indicates the pu
5f40: 72 70 6f 73 65 73 20 74 68 65 20 63 65 72 74 69 rposes the certi
5f50: 66 69 65 64 20 70 75 62 6c 69 63 20 6b 65 79 20 fied public key
5f60: 6d 61 79 20 62 65 0a 09 75 73 65 64 2c 20 62 65 may be..used, be
5f70: 79 6f 6e 64 20 74 68 65 20 62 61 73 69 63 20 70 yond the basic p
5f80: 75 72 70 6f 73 65 73 2e 20 52 46 43 20 35 32 38 urposes. RFC 528
5f90: 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 0 section 4.2.1.
5fa0: 31 32 2c 20 4e 49 44 5f 65 78 74 5f 6b 65 79 5f 12, NID_ext_key_
5fb0: 75 73 61 67 65 20 2a 2f 0a 20 20 20 20 4c 41 50 usage */. LAP
5fc0: 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c PEND_OBJ(interp,
5fd0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74 resultObj, "ext
5fe0: 65 6e 64 65 64 4b 65 79 55 73 61 67 65 22 2c 20 endedKeyUsage",
5ff0: 54 6c 73 5f 78 35 30 39 45 78 74 4b 65 79 55 73 Tls_x509ExtKeyUs
6000: 61 67 65 28 69 6e 74 65 72 70 2c 20 63 65 72 74 age(interp, cert
6010: 2c 20 78 66 6c 61 67 73 29 29 3b 0a 0a 20 20 20 , xflags));..
6020: 20 2f 2a 20 43 52 4c 20 44 69 73 74 72 69 62 75 /* CRL Distribu
6030: 74 69 6f 6e 20 50 6f 69 6e 74 73 20 69 64 65 6e tion Points iden
6040: 74 69 66 69 65 73 20 77 68 65 72 65 20 43 52 4c tifies where CRL
6050: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 61 6e information can
6060: 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 09 52 be obtained...R
6070: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 FC 5280 section
6080: 34 2e 32 2e 31 2e 31 33 2a 2f 0a 20 20 20 20 4c 4.2.1.13*/. L
6090: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 APPEND_OBJ(inter
60a0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 63 p, resultObj, "c
60b0: 72 6c 44 69 73 74 72 69 62 75 74 69 6f 6e 50 6f rlDistributionPo
60c0: 69 6e 74 73 22 2c 20 54 6c 73 5f 78 35 30 39 43 ints", Tls_x509C
60d0: 72 6c 44 70 28 69 6e 74 65 72 70 2c 20 63 65 72 rlDp(interp, cer
60e0: 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 72 65 t));.. /* Fre
60f0: 73 68 65 73 74 20 43 52 4c 20 65 78 74 65 6e 73 shest CRL extens
6100: 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 78 ion */. if (x
6110: 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 46 flags & EXFLAG_F
6120: 52 45 53 48 45 53 54 29 20 7b 0a 20 20 20 20 7d RESHEST) {. }
6130: 0a 0a 20 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 .. /* Authori
6140: 74 79 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 41 ty Information A
6150: 63 63 65 73 73 20 69 6e 64 69 63 61 74 65 73 20 ccess indicates
6160: 68 6f 77 20 74 6f 20 61 63 63 65 73 73 20 69 6e how to access in
6170: 66 6f 20 61 6e 64 20 73 65 72 76 69 63 65 73 0a fo and services.
6180: 09 66 6f 72 20 74 68 65 20 63 65 72 74 69 66 69 .for the certifi
6190: 63 61 74 65 20 69 73 73 75 65 72 2e 20 52 46 43 cate issuer. RFC
61a0: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 5280 section 4.
61b0: 32 2e 32 2e 31 2c 20 4e 49 44 5f 69 6e 66 6f 5f 2.2.1, NID_info_
61c0: 61 63 63 65 73 73 20 2a 2f 0a 0a 20 20 20 20 2f access */.. /
61d0: 2a 20 4f 6e 2d 6c 69 6e 65 20 43 65 72 74 69 66 * On-line Certif
61e0: 69 63 61 74 65 20 53 74 61 74 75 73 20 50 72 6f icate Status Pro
61f0: 74 6f 63 6f 6c 20 28 4f 53 43 50 29 20 52 65 73 tocol (OSCP) Res
6200: 70 6f 6e 64 65 72 73 20 55 52 4c 20 2a 2f 0a 20 ponders URL */.
6210: 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 LAPPEND_OBJ(i
6220: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
6230: 2c 20 22 6f 63 73 70 52 65 73 70 6f 6e 64 65 72 , "ocspResponder
6240: 73 22 2c 20 54 6c 73 5f 78 35 30 39 4f 73 63 70 s", Tls_x509Oscp
6250: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b (interp, cert));
6260: 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 .. /* Certifi
6270: 63 61 74 65 20 41 75 74 68 6f 72 69 74 79 20 28 cate Authority (
6280: 43 41 29 20 49 73 73 75 65 72 73 20 55 52 4c 20 CA) Issuers URL
6290: 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f */. LAPPEND_O
62a0: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c BJ(interp, resul
62b0: 74 4f 62 6a 2c 20 22 63 61 49 73 73 75 65 72 73 tObj, "caIssuers
62c0: 22 2c 20 54 6c 73 5f 78 35 30 39 43 61 49 73 73 ", Tls_x509CaIss
62d0: 75 65 72 73 28 69 6e 74 65 72 70 2c 20 63 65 72 uers(interp, cer
62e0: 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62 t));.. /* Sub
62f0: 6a 65 63 74 20 49 6e 66 6f 72 6d 61 74 69 6f 6e ject Information
6300: 20 41 63 63 65 73 73 20 2d 20 52 46 43 20 35 32 Access - RFC 52
6310: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 32 80 section 4.2.2
6320: 2e 32 2c 20 4e 49 44 5f 73 69 6e 66 6f 5f 61 63 .2, NID_sinfo_ac
6330: 63 65 73 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 cess */.. /*
6340: 43 65 72 74 69 66 69 63 61 74 65 20 41 6c 69 61 Certificate Alia
6350: 73 2e 20 49 66 20 75 73 65 73 20 61 20 50 4b 43 s. If uses a PKC
6360: 53 23 31 32 20 73 74 72 75 63 74 75 72 65 2c 20 S#12 structure,
6370: 61 6c 69 61 73 20 77 69 6c 6c 20 72 65 66 6c 65 alias will refle
6380: 63 74 20 74 68 65 0a 09 66 72 69 65 6e 64 6c 79 ct the..friendly
6390: 4e 61 6d 65 20 61 74 74 72 69 62 75 74 65 20 28 Name attribute (
63a0: 52 46 43 20 32 39 38 35 29 2e 20 2a 2f 0a 20 20 RFC 2985). */.
63b0: 20 20 7b 0a 09 69 6e 74 20 69 6c 65 6e 20 3d 20 {..int ilen =
63c0: 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 0;..unsigned cha
63d0: 72 20 2a 73 74 72 69 6e 67 20 3d 20 58 35 30 39 r *string = X509
63e0: 5f 61 6c 69 61 73 5f 67 65 74 30 28 63 65 72 74 _alias_get0(cert
63f0: 2c 20 26 69 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 , &ilen);..LAPPE
6400: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 ND_STR(interp, r
6410: 65 73 75 6c 74 4f 62 6a 2c 20 22 61 6c 69 61 73 esultObj, "alias
6420: 22 2c 20 28 63 68 61 72 20 2a 29 20 73 74 72 69 ", (char *) stri
6430: 6e 67 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 69 ng, (Tcl_Size) i
6440: 6c 65 6e 29 3b 0a 09 73 74 72 69 6e 67 20 3d 20 len);..string =
6450: 58 35 30 39 5f 6b 65 79 69 64 5f 67 65 74 30 28 X509_keyid_get0(
6460: 63 65 72 74 2c 20 26 69 6c 65 6e 29 3b 0a 09 4c cert, &ilen);..L
6470: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
6480: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6b p, resultObj, "k
6490: 65 79 49 64 22 2c 20 28 63 68 61 72 20 2a 29 20 eyId", (char *)
64a0: 73 74 72 69 6e 67 2c 20 28 54 63 6c 5f 53 69 7a string, (Tcl_Siz
64b0: 65 29 20 69 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a e) ilen);. }.
64c0: 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63 . /* Certific
64d0: 61 74 65 20 61 6e 64 20 64 75 6d 70 20 61 6c 6c ate and dump all
64e0: 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 data */. if
64f0: 28 61 6c 6c 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a (all) {..Tcl_Obj
6500: 20 2a 61 6c 6c 4f 62 6a 20 3d 20 54 63 6c 5f 4e *allObj = Tcl_N
6510: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 4e ewByteArrayObj(N
6520: 55 4c 4c 2c 20 30 29 3b 0a 09 54 63 6c 5f 4f 62 ULL, 0);..Tcl_Ob
6530: 6a 20 2a 63 65 72 74 4f 62 6a 20 3d 20 54 63 6c j *certObj = Tcl
6540: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a _NewByteArrayObj
6550: 28 4e 55 4c 4c 2c 20 30 29 3b 0a 09 75 6e 73 69 (NULL, 0);..unsi
6560: 67 6e 65 64 20 63 68 61 72 20 2a 61 6c 6c 53 74 gned char *allSt
6570: 72 2c 20 2a 63 65 72 74 53 74 72 3b 0a 0a 09 69 r, *certStr;...i
6580: 66 20 28 61 6c 6c 4f 62 6a 20 3d 3d 20 4e 55 4c f (allObj == NUL
6590: 4c 20 7c 7c 20 63 65 72 74 4f 62 6a 20 3d 3d 20 L || certObj ==
65a0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c NULL) {.. Tcl
65b0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 61 6c _DecrRefCount(al
65c0: 6c 4f 62 6a 29 3b 0a 09 20 20 20 20 42 49 4f 5f lObj);.. BIO_
65d0: 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 free(bio);..
65e0: 63 6b 66 72 65 65 28 62 75 66 66 65 72 29 3b 0a ckfree(buffer);.
65f0: 09 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 . return resu
6600: 6c 74 4f 62 6a 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 ltObj;..}.../* G
6610: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a et certificate *
6620: 2f 0a 09 63 65 72 74 53 74 72 20 3d 20 54 63 6c /..certStr = Tcl
6630: 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e _SetByteArrayLen
6640: 67 74 68 28 63 65 72 74 4f 62 6a 2c 20 43 45 52 gth(certObj, CER
6650: 54 5f 53 54 52 5f 53 49 5a 45 29 3b 0a 09 6c 65 T_STR_SIZE);..le
6660: 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 n = BIO_to_Buffe
6670: 72 28 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f r(PEM_write_bio_
6680: 58 35 30 39 28 62 69 6f 2c 20 63 65 72 74 29 2c X509(bio, cert),
6690: 20 62 69 6f 2c 20 63 65 72 74 53 74 72 2c 20 43 bio, certStr, C
66a0: 45 52 54 5f 53 54 52 5f 53 49 5a 45 29 3b 0a 09 ERT_STR_SIZE);..
66b0: 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 Tcl_SetByteArray
66c0: 4c 65 6e 67 74 68 28 63 65 72 74 4f 62 6a 2c 20 Length(certObj,
66d0: 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 4f len);..LAPPEND_O
66e0: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c BJ(interp, resul
66f0: 74 4f 62 6a 2c 20 22 63 65 72 74 69 66 69 63 61 tObj, "certifica
6700: 74 65 22 2c 20 63 65 72 74 4f 62 6a 29 0a 0a 09 te", certObj)...
6710: 2f 2a 20 47 65 74 20 61 6c 6c 20 69 6e 66 6f 20 /* Get all info
6720: 6f 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 2a on certificate *
6730: 2f 0a 09 61 6c 6c 53 74 72 20 3d 20 54 63 6c 5f /..allStr = Tcl_
6740: 53 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 SetByteArrayLeng
6750: 74 68 28 61 6c 6c 4f 62 6a 2c 20 43 45 52 54 5f th(allObj, CERT_
6760: 53 54 52 5f 53 49 5a 45 20 2a 20 32 29 3b 0a 09 STR_SIZE * 2);..
6770: 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 len = BIO_to_Buf
6780: 66 65 72 28 58 35 30 39 5f 70 72 69 6e 74 5f 65 fer(X509_print_e
6790: 78 28 62 69 6f 2c 20 63 65 72 74 2c 20 66 6c 61 x(bio, cert, fla
67a0: 67 73 2c 20 30 29 2c 20 62 69 6f 2c 20 61 6c 6c gs, 0), bio, all
67b0: 53 74 72 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 Str, CERT_STR_SI
67c0: 5a 45 20 2a 20 32 29 3b 0a 09 54 63 6c 5f 53 65 ZE * 2);..Tcl_Se
67d0: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 tByteArrayLength
67e0: 28 61 6c 6c 4f 62 6a 2c 20 6c 65 6e 29 3b 0a 09 (allObj, len);..
67f0: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 LAPPEND_OBJ(inte
6800: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
6810: 61 6c 6c 22 2c 20 61 6c 6c 4f 62 6a 29 0a 20 20 all", allObj).
6820: 20 20 7d 0a 0a 20 20 20 20 42 49 4f 5f 66 72 65 }.. BIO_fre
6830: 65 28 62 69 6f 29 3b 0a 20 20 20 20 63 6b 66 72 e(bio);. ckfr
6840: 65 65 28 62 75 66 66 65 72 29 3b 0a 20 20 20 20 ee(buffer);.
6850: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a return resultObj
6860: 3b 0a 7d 0a ;.}.