0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 32 30 30 30 20 53 65 (C) 1997-2000 Se
0020: 6e 73 75 73 20 43 6f 6e 73 75 6c 74 69 6e 67 20 nsus Consulting
0030: 4c 74 64 2e 0a 20 2a 20 4d 61 74 74 20 4e 65 77 Ltd.. * Matt New
0040: 6d 61 6e 20 3c 6d 61 74 74 40 73 65 6e 73 75 73 man <matt@sensus
0050: 2e 6f 72 67 3e 0a 20 2a 20 43 6f 70 79 72 69 67 .org>. * Copyrig
0060: 68 74 20 28 43 29 20 32 30 32 33 20 42 72 69 61 ht (C) 2023 Bria
0070: 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 2f 0a 23 69 n O'Hagan. */.#i
0080: 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 nclude <tcl.h>.#
0090: 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 include <stdio.h
00a0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e >.#include <open
00b0: 73 73 6c 2f 62 69 6f 2e 68 3e 0a 23 69 6e 63 6c ssl/bio.h>.#incl
00c0: 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 68 61 ude <openssl/sha
00d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 .h>.#include <op
00e0: 65 6e 73 73 6c 2f 78 35 30 39 2e 68 3e 0a 23 69 enssl/x509.h>.#i
00f0: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0100: 78 35 30 39 76 33 2e 68 3e 0a 23 69 6e 63 6c 75 x509v3.h>.#inclu
0110: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 61 73 6e 31 de <openssl/asn1
0120: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c .h>.#include "tl
0130: 73 49 6e 74 2e 68 22 0a 0a 2f 2a 20 44 65 66 69 sInt.h"../* Defi
0140: 6e 65 20 6d 61 78 69 6d 75 6d 20 63 65 72 74 69 ne maximum certi
0150: 66 69 63 61 74 65 20 73 69 7a 65 2e 20 4d 61 78 ficate size. Max
0160: 20 50 45 4d 20 73 69 7a 65 20 31 30 30 6b 42 20 PEM size 100kB
0170: 61 6e 64 20 44 45 52 20 73 69 7a 65 20 69 73 20 and DER size is
0180: 32 34 6b 42 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 24kB. */.#define
0190: 20 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 20 33 CERT_STR_SIZE 3
01a0: 32 37 36 38 0a 0a 2f 2a 0a 20 2a 20 20 45 6e 73 2768../*. * Ens
01b0: 75 72 65 20 74 68 65 73 65 20 61 72 65 20 6e 6f ure these are no
01c0: 74 20 6d 61 63 72 6f 73 20 2d 20 6b 6e 6f 77 6e t macros - known
01d0: 20 74 6f 20 62 65 20 64 65 66 69 6e 65 64 20 6f to be defined o
01e0: 6e 20 57 69 6e 33 32 0a 20 2a 2f 0a 23 69 66 64 n Win32. */.#ifd
01f0: 65 66 20 6d 69 6e 0a 23 75 6e 64 65 66 20 6d 69 ef min.#undef mi
0200: 6e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 n.#endif..#ifdef
0210: 20 6d 61 78 0a 23 75 6e 64 65 66 20 6d 61 78 0a max.#undef max.
0220: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69 #endif..static i
0230: 6e 74 20 6d 69 6e 28 69 6e 74 20 61 2c 20 69 6e nt min(int a, in
0240: 74 20 62 29 0a 7b 0a 20 20 20 20 72 65 74 75 72 t b).{. retur
0250: 6e 20 28 61 20 3c 20 62 29 20 3f 20 61 20 3a 20 n (a < b) ? a :
0260: 62 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 b;.}..static int
0270: 20 6d 61 78 28 69 6e 74 20 61 2c 20 69 6e 74 20 max(int a, int
0280: 62 29 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 b).{. return
0290: 28 61 20 3e 20 62 29 20 3f 20 61 20 3a 20 62 3b (a > b) ? a : b;
02a0: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 42 69 6e 61 72 79 .}../*. * Binary
02b0: 20 73 74 72 69 6e 67 20 74 6f 20 68 65 78 20 73 string to hex s
02c0: 74 72 69 6e 67 0a 20 2a 2f 0a 69 6e 74 20 53 74 tring. */.int St
02d0: 72 69 6e 67 5f 74 6f 5f 48 65 78 28 63 68 61 72 ring_to_Hex(char
02e0: 2a 20 69 6e 70 75 74 2c 20 69 6e 74 20 6c 65 6e * input, int len
02f0: 2c 20 63 68 61 72 20 2a 6f 75 74 70 75 74 2c 20 , char *output,
0300: 69 6e 74 20 6d 61 78 29 20 7b 0a 20 20 20 20 69 int max) {. i
0310: 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 20 nt count = 0;..
0320: 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 for (int i =
0330: 30 3b 20 69 20 3c 20 6c 65 6e 20 26 26 20 63 6f 0; i < len && co
0340: 75 6e 74 20 3c 20 6d 61 78 20 2d 20 31 3b 20 69 unt < max - 1; i
0350: 2b 2b 2c 20 63 6f 75 6e 74 20 2b 3d 20 32 29 20 ++, count += 2)
0360: 7b 0a 09 73 70 72 69 6e 74 66 28 6f 75 74 70 75 {..sprintf(outpu
0370: 74 20 2b 20 63 6f 75 6e 74 2c 20 22 25 30 32 58 t + count, "%02X
0380: 22 2c 20 69 6e 70 75 74 5b 69 5d 20 26 20 30 78 ", input[i] & 0x
0390: 66 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f ff);. }. o
03a0: 75 74 70 75 74 5b 63 6f 75 6e 74 5d 20 3d 20 30 utput[count] = 0
03b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 6f 75 ;. return cou
03c0: 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 42 49 4f nt;.}../*. * BIO
03d0: 20 74 6f 20 42 75 66 66 65 72 0a 20 2a 2f 0a 69 to Buffer. */.i
03e0: 6e 74 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 nt BIO_to_Buffer
03f0: 28 69 6e 74 20 72 65 73 75 6c 74 2c 20 42 49 4f (int result, BIO
0400: 20 2a 62 69 6f 2c 20 76 6f 69 64 20 2a 62 75 66 *bio, void *buf
0410: 66 65 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 6c fer) {. int l
0420: 65 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20 en = 0;.. if
0430: 28 72 65 73 75 6c 74 29 20 7b 0a 09 6c 65 6e 20 (result) {..len
0440: 3d 20 42 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 = BIO_read(bio,
0450: 62 75 66 66 65 72 2c 20 6d 69 6e 28 42 49 4f 5f buffer, min(BIO_
0460: 70 65 6e 64 69 6e 67 28 62 69 6f 29 2c 20 42 55 pending(bio), BU
0470: 46 53 49 5a 29 29 3b 0a 09 28 76 6f 69 64 29 42 FSIZ));..(void)B
0480: 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09 IO_flush(bio);..
0490: 69 66 20 28 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 if (len < 0) {..
04a0: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a len = 0;..}.
04b0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
04c0: 20 6c 65 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d len;.}.../*. *-
04d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0500: 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 -----*. *. *.Tls
0510: 5f 4e 65 77 58 35 30 39 4f 62 6a 20 2d 2d 0a 20 _NewX509Obj --.
0520: 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *.-----------
0530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0550: 2d 2d 2d 2d 2d 2a 0a 20 2a 09 43 6f 6e 76 65 72 -----*. *.Conver
0560: 74 73 20 61 20 58 35 30 39 20 63 65 72 74 69 66 ts a X509 certif
0570: 69 63 61 74 65 20 69 6e 74 6f 20 61 20 54 63 6c icate into a Tcl
0580: 5f 4f 62 6a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d _Obj. *.--------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
05c0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
05d0: 09 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 09 52 65 73 ..None. *. *.Res
05e0: 75 6c 74 3a 0a 20 2a 09 09 41 20 54 63 6c 20 4c ult:. *..A Tcl L
05f0: 69 73 74 20 4f 62 6a 65 63 74 20 72 65 70 72 65 ist Object repre
0600: 73 65 6e 74 69 6e 67 20 74 68 65 20 70 72 6f 76 senting the prov
0610: 69 64 65 64 0a 20 2a 09 09 58 35 30 39 20 63 65 ided. *..X509 ce
0620: 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 0a 20 2a rtificate.. *. *
0630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0660: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 0a 54 63 ------*. */...Tc
0670: 6c 5f 4f 62 6a 2a 0a 54 6c 73 5f 4e 65 77 58 35 l_Obj*.Tls_NewX5
0680: 30 39 4f 62 6a 28 54 63 6c 5f 49 6e 74 65 72 70 09Obj(Tcl_Interp
0690: 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a *interp, X509 *
06a0: 63 65 72 74 29 20 7b 0a 20 20 20 20 54 63 6c 5f cert) {. Tcl_
06b0: 4f 62 6a 20 2a 63 65 72 74 50 74 72 20 3d 20 54 Obj *certPtr = T
06c0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
06d0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 42 49 4f 20 NULL);. BIO
06e0: 2a 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 *bio = BIO_new(B
06f0: 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 20 20 20 IO_s_mem());.
0700: 20 69 6e 74 20 6d 64 6e 69 64 2c 20 70 6b 6e 69 int mdnid, pkni
0710: 64 2c 20 62 69 74 73 2c 20 6c 65 6e 3b 0a 20 20 d, bits, len;.
0720: 20 20 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 uint32_t xflag
0730: 73 2c 20 75 73 61 67 65 3b 0a 20 20 20 20 63 68 s, usage;. ch
0740: 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a ar buffer[BUFSIZ
0750: 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 ];. unsigned
0760: 63 68 61 72 20 6d 64 5b 45 56 50 5f 4d 41 58 5f char md[EVP_MAX_
0770: 4d 44 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 53 54 MD_SIZE];. ST
0780: 41 43 4b 5f 4f 46 28 47 45 4e 45 52 41 4c 5f 4e ACK_OF(GENERAL_N
0790: 41 4d 45 29 20 2a 73 61 6e 3b 0a 20 20 20 20 53 AME) *san;. S
07a0: 54 41 43 4b 5f 4f 46 28 44 49 53 54 5f 50 4f 49 TACK_OF(DIST_POI
07b0: 4e 54 29 20 2a 63 72 6c 3b 0a 20 20 20 20 53 54 NT) *crl;. ST
07c0: 41 43 4b 5f 4f 46 28 4f 50 45 4e 53 53 4c 5f 53 ACK_OF(OPENSSL_S
07d0: 54 52 49 4e 47 29 20 2a 6f 63 73 70 3b 0a 20 20 TRING) *ocsp;.
07e0: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 unsigned long
07f0: 66 6c 61 67 73 20 3d 20 58 4e 5f 46 4c 41 47 5f flags = XN_FLAG_
0800: 52 46 43 32 32 35 33 20 7c 20 41 53 4e 31 5f 53 RFC2253 | ASN1_S
0810: 54 52 46 4c 47 53 5f 55 54 46 38 5f 43 4f 4e 56 TRFLGS_UTF8_CONV
0820: 45 52 54 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 ERT;. flags &
0830: 3d 20 7e 41 53 4e 31 5f 53 54 52 46 4c 47 53 5f = ~ASN1_STRFLGS_
0840: 45 53 43 5f 4d 53 42 3b 0a 0a 20 20 20 20 69 66 ESC_MSB;.. if
0850: 20 28 62 69 6f 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (bio == NULL ||
0860: 20 63 65 72 74 50 74 72 20 3d 3d 20 4e 55 4c 4c certPtr == NULL
0870: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c ) {..return NULL
0880: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
0890: 53 69 67 6e 61 74 75 72 65 20 61 6c 67 6f 72 69 Signature algori
08a0: 74 68 6d 20 61 6e 64 20 76 61 6c 75 65 20 2d 20 thm and value -
08b0: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e RFC 5280 section
08c0: 20 34 2e 31 2e 31 2e 32 20 61 6e 64 20 34 2e 31 4.1.1.2 and 4.1
08d0: 2e 31 2e 33 20 2a 2f 0a 20 20 20 20 2f 2a 20 54 .1.3 */. /* T
08e0: 68 65 20 73 69 67 6e 61 74 75 72 65 41 6c 67 6f he signatureAlgo
08f0: 72 69 74 68 6d 20 66 69 65 6c 64 20 63 6f 6e 74 rithm field cont
0900: 61 69 6e 73 20 74 68 65 20 69 64 65 6e 74 69 66 ains the identif
0910: 69 65 72 20 66 6f 72 20 74 68 65 20 63 72 79 70 ier for the cryp
0920: 74 6f 67 72 61 70 68 69 63 20 61 6c 67 6f 72 69 tographic algori
0930: 74 68 6d 0a 09 75 73 65 64 20 62 79 20 74 68 65 thm..used by the
0940: 20 43 41 20 74 6f 20 73 69 67 6e 20 74 68 69 73 CA to sign this
0950: 20 63 65 72 74 69 66 69 63 61 74 65 2e 20 54 68 certificate. Th
0960: 65 20 73 69 67 6e 61 74 75 72 65 56 61 6c 75 65 e signatureValue
0970: 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20 field contains
0980: 61 20 64 69 67 69 74 61 6c 0a 09 73 69 67 6e 61 a digital..signa
0990: 74 75 72 65 20 63 6f 6d 70 75 74 65 64 20 75 70 ture computed up
09a0: 6f 6e 20 74 68 65 20 41 53 4e 2e 31 20 44 45 52 on the ASN.1 DER
09b0: 20 65 6e 63 6f 64 65 64 20 74 62 73 43 65 72 74 encoded tbsCert
09c0: 69 66 69 63 61 74 65 2e 20 2a 2f 0a 20 20 20 20 ificate. */.
09d0: 7b 0a 09 63 6f 6e 73 74 20 58 35 30 39 5f 41 4c {..const X509_AL
09e0: 47 4f 52 20 2a 73 69 67 5f 61 6c 67 3b 0a 09 63 GOR *sig_alg;..c
09f0: 6f 6e 73 74 20 41 53 4e 31 5f 42 49 54 5f 53 54 onst ASN1_BIT_ST
0a00: 52 49 4e 47 20 2a 73 69 67 3b 0a 09 69 6e 74 20 RING *sig;..int
0a10: 73 69 67 5f 6e 69 64 3b 0a 0a 09 58 35 30 39 5f sig_nid;...X509_
0a20: 67 65 74 30 5f 73 69 67 6e 61 74 75 72 65 28 26 get0_signature(&
0a30: 73 69 67 2c 20 26 73 69 67 5f 61 6c 67 2c 20 63 sig, &sig_alg, c
0a40: 65 72 74 29 3b 0a 09 2f 2a 20 73 69 67 5f 6e 69 ert);../* sig_ni
0a50: 64 20 3d 20 58 35 30 39 5f 67 65 74 5f 73 69 67 d = X509_get_sig
0a60: 6e 61 74 75 72 65 5f 6e 69 64 28 63 65 72 74 29 nature_nid(cert)
0a70: 20 2a 2f 0a 09 73 69 67 5f 6e 69 64 20 3d 20 4f */..sig_nid = O
0a80: 42 4a 5f 6f 62 6a 32 6e 69 64 28 73 69 67 5f 61 BJ_obj2nid(sig_a
0a90: 6c 67 2d 3e 61 6c 67 6f 72 69 74 68 6d 29 3b 0a lg->algorithm);.
0aa0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
0ab0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
0ac0: 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f p, certPtr, Tcl_
0ad0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 69 NewStringObj("si
0ae0: 67 6e 61 74 75 72 65 41 6c 67 6f 72 69 74 68 6d gnatureAlgorithm
0af0: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
0b00: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
0b10: 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 nt(interp, certP
0b20: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
0b30: 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e 28 gObj(OBJ_nid2ln(
0b40: 73 69 67 5f 6e 69 64 29 2c 2d 31 29 29 3b 0a 0a sig_nid),-1));..
0b50: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
0b60: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
0b70: 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e , certPtr, Tcl_N
0b80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 69 67 ewStringObj("sig
0b90: 6e 61 74 75 72 65 56 61 6c 75 65 22 2c 20 2d 31 natureValue", -1
0ba0: 29 29 3b 0a 09 69 66 20 28 73 69 67 5f 6e 69 64 ));..if (sig_nid
0bb0: 20 21 3d 20 4e 49 44 5f 75 6e 64 65 66 29 20 7b != NID_undef) {
0bc0: 0a 09 20 20 20 20 6c 65 6e 20 3d 20 53 74 72 69 .. len = Stri
0bd0: 6e 67 5f 74 6f 5f 48 65 78 28 73 69 67 2d 3e 64 ng_to_Hex(sig->d
0be0: 61 74 61 2c 20 73 69 67 2d 3e 6c 65 6e 67 74 68 ata, sig->length
0bf0: 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a , buffer, BUFSIZ
0c00: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 );.. Tcl_List
0c10: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
0c20: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 (interp, certPtr
0c30: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
0c40: 62 6a 28 62 75 66 66 65 72 2c 20 6c 65 6e 29 29 bj(buffer, len))
0c50: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ;..} else {..
0c60: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
0c70: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
0c80: 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e , certPtr, Tcl_N
0c90: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 ewStringObj("",
0ca0: 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a -1));..}. }..
0cb0: 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 20 6f /* Version o
0cc0: 66 20 74 68 65 20 65 6e 63 6f 64 65 64 20 63 65 f the encoded ce
0cd0: 72 74 69 66 69 63 61 74 65 20 2d 20 52 46 43 20 rtificate - RFC
0ce0: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 5280 section 4.1
0cf0: 2e 32 2e 31 20 2a 2f 0a 20 20 20 20 54 63 6c 5f .2.1 */. Tcl_
0d00: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
0d10: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 ment(interp, cer
0d20: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tPtr, Tcl_NewStr
0d30: 69 6e 67 4f 62 6a 28 22 76 65 72 73 69 6f 6e 22 ingObj("version"
0d40: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
0d50: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
0d60: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 ment(interp, cer
0d70: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e tPtr, Tcl_NewLon
0d80: 67 4f 62 6a 28 58 35 30 39 5f 67 65 74 5f 76 65 gObj(X509_get_ve
0d90: 72 73 69 6f 6e 28 63 65 72 74 29 2b 31 29 29 3b rsion(cert)+1));
0da0: 0a 0a 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 .. /* Unique
0db0: 6e 75 6d 62 65 72 20 61 73 73 69 67 6e 65 64 20 number assigned
0dc0: 62 79 20 43 41 20 74 6f 20 63 65 72 74 69 66 69 by CA to certifi
0dd0: 63 61 74 65 20 2d 20 52 46 43 20 35 32 38 30 20 cate - RFC 5280
0de0: 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 32 20 section 4.1.2.2
0df0: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f */. len = BIO
0e00: 5f 74 6f 5f 42 75 66 66 65 72 28 69 32 61 5f 41 _to_Buffer(i2a_A
0e10: 53 4e 31 5f 49 4e 54 45 47 45 52 28 62 69 6f 2c SN1_INTEGER(bio,
0e20: 20 58 35 30 39 5f 67 65 74 30 5f 73 65 72 69 61 X509_get0_seria
0e30: 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 29 2c 20 lNumber(cert)),
0e40: 62 69 6f 2c 20 62 75 66 66 65 72 29 3b 0a 20 20 bio, buffer);.
0e50: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
0e60: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
0e70: 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f p, certPtr, Tcl_
0e80: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 NewStringObj("se
0e90: 72 69 61 6c 4e 75 6d 62 65 72 22 2c 20 2d 31 29 rialNumber", -1)
0ea0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
0eb0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
0ec0: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c interp, certPtr,
0ed0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
0ee0: 6a 28 62 75 66 66 65 72 2c 20 6c 65 6e 29 29 3b j(buffer, len));
0ef0: 0a 0a 20 20 20 20 2f 2a 20 53 69 67 6e 61 74 75 .. /* Signatu
0f00: 72 65 20 61 6c 67 6f 72 69 74 68 6d 20 75 73 65 re algorithm use
0f10: 64 20 62 79 20 74 68 65 20 43 41 20 74 6f 20 73 d by the CA to s
0f20: 69 67 6e 20 74 68 65 20 63 65 72 74 69 66 69 63 ign the certific
0f30: 61 74 65 2e 20 4d 75 73 74 20 6d 61 74 63 68 0a ate. Must match.
0f40: 09 73 69 67 6e 61 74 75 72 65 41 6c 67 6f 72 69 .signatureAlgori
0f50: 74 68 6d 2e 20 52 46 43 20 35 32 38 30 20 73 65 thm. RFC 5280 se
0f60: 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 33 20 2a 2f ction 4.1.2.3 */
0f70: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
0f80: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
0f90: 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 terp, certPtr, T
0fa0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
0fb0: 22 73 69 67 6e 61 74 75 72 65 22 2c 20 2d 31 29 "signature", -1)
0fc0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
0fd0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
0fe0: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c interp, certPtr,
0ff0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1000: 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e 28 58 35 30 j(OBJ_nid2ln(X50
1010: 39 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 9_get_signature_
1020: 6e 69 64 28 63 65 72 74 29 29 2c 2d 31 29 29 3b nid(cert)),-1));
1030: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 69 73 73 .. /* The iss
1040: 75 65 72 20 69 64 65 6e 74 69 66 69 65 73 20 74 uer identifies t
1050: 68 65 20 65 6e 74 69 74 79 20 74 68 61 74 20 68 he entity that h
1060: 61 73 20 73 69 67 6e 65 64 20 61 6e 64 20 69 73 as signed and is
1070: 73 75 65 64 20 74 68 65 20 63 65 72 74 69 66 69 sued the certifi
1080: 63 61 74 65 2e 0a 09 52 46 43 20 35 32 38 30 20 cate...RFC 5280
1090: 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 34 20 section 4.1.2.4
10a0: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f */. len = BIO
10b0: 5f 74 6f 5f 42 75 66 66 65 72 28 58 35 30 39 5f _to_Buffer(X509_
10c0: 4e 41 4d 45 5f 70 72 69 6e 74 5f 65 78 28 62 69 NAME_print_ex(bi
10d0: 6f 2c 20 58 35 30 39 5f 67 65 74 5f 69 73 73 75 o, X509_get_issu
10e0: 65 72 5f 6e 61 6d 65 28 63 65 72 74 29 2c 20 30 er_name(cert), 0
10f0: 2c 20 66 6c 61 67 73 29 2c 20 62 69 6f 2c 20 62 , flags), bio, b
1100: 75 66 66 65 72 29 3b 0a 20 20 20 20 54 63 6c 5f uffer);. Tcl_
1110: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1120: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 ment(interp, cer
1130: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tPtr, Tcl_NewStr
1140: 69 6e 67 4f 62 6a 28 22 69 73 73 75 65 72 22 2c ingObj("issuer",
1150: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
1160: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1170: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 ent(interp, cert
1180: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
1190: 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 6c 65 ngObj(buffer, le
11a0: 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 65 72 n));.. /* Cer
11b0: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 69 74 tificate validit
11c0: 79 20 70 65 72 69 6f 64 20 69 73 20 74 68 65 20 y period is the
11d0: 74 69 6d 65 20 69 6e 74 65 72 76 61 6c 20 64 75 time interval du
11e0: 72 69 6e 67 20 77 68 69 63 68 20 74 68 65 20 43 ring which the C
11f0: 41 0a 09 77 61 72 72 61 6e 74 73 20 74 68 61 74 A..warrants that
1200: 20 69 74 20 77 69 6c 6c 20 6d 61 69 6e 74 61 69 it will maintai
1210: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 n information ab
1220: 6f 75 74 20 74 68 65 20 73 74 61 74 75 73 20 6f out the status o
1230: 66 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 f the certificat
1240: 65 2e 0a 09 52 46 43 20 35 32 38 30 20 73 65 63 e...RFC 5280 sec
1250: 74 69 6f 6e 20 34 2e 31 2e 32 2e 35 20 2a 2f 0a tion 4.1.2.5 */.
1260: 20 20 20 20 2f 2a 20 47 65 74 20 56 61 6c 69 64 /* Get Valid
1270: 69 74 79 20 2d 20 4e 6f 74 20 42 65 66 6f 72 65 ity - Not Before
1280: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 */. len = BI
1290: 4f 5f 74 6f 5f 42 75 66 66 65 72 28 41 53 4e 31 O_to_Buffer(ASN1
12a0: 5f 54 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c _TIME_print(bio,
12b0: 20 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74 42 65 X509_get0_notBe
12c0: 66 6f 72 65 28 63 65 72 74 29 29 2c 20 62 69 6f fore(cert)), bio
12d0: 2c 20 62 75 66 66 65 72 29 3b 0a 20 20 20 20 54 , buffer);. T
12e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
12f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
1300: 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 certPtr, Tcl_New
1310: 53 74 72 69 6e 67 4f 62 6a 28 22 6e 6f 74 42 65 StringObj("notBe
1320: 66 6f 72 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 fore", -1));.
1330: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
1340: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
1350: 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e , certPtr, Tcl_N
1360: 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 ewStringObj(buff
1370: 65 72 2c 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 er, len));..
1380: 2f 2a 20 47 65 74 20 56 61 6c 69 64 69 74 79 20 /* Get Validity
1390: 2d 20 4e 6f 74 20 41 66 74 65 72 20 2a 2f 0a 20 - Not After */.
13a0: 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f len = BIO_to_
13b0: 42 75 66 66 65 72 28 41 53 4e 31 5f 54 49 4d 45 Buffer(ASN1_TIME
13c0: 5f 70 72 69 6e 74 28 62 69 6f 2c 20 58 35 30 39 _print(bio, X509
13d0: 5f 67 65 74 30 5f 6e 6f 74 41 66 74 65 72 28 63 _get0_notAfter(c
13e0: 65 72 74 29 29 2c 20 62 69 6f 2c 20 62 75 66 66 ert)), bio, buff
13f0: 65 72 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 er);. Tcl_Lis
1400: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1410: 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 t(interp, certPt
1420: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
1430: 4f 62 6a 28 22 6e 6f 74 41 66 74 65 72 22 2c 20 Obj("notAfter",
1440: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
1450: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1460: 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 nt(interp, certP
1470: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
1480: 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 6c 65 6e gObj(buffer, len
1490: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 ));.. /* The
14a0: 73 75 62 6a 65 63 74 20 69 64 65 6e 74 69 66 69 subject identifi
14b0: 65 73 20 74 68 65 20 65 6e 74 69 74 79 20 61 73 es the entity as
14c0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 sociated with th
14d0: 65 20 70 75 62 6c 69 63 20 6b 65 79 20 73 74 6f e public key sto
14e0: 72 65 64 0a 09 69 6e 20 74 68 65 20 73 75 62 6a red..in the subj
14f0: 65 63 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 ect public key f
1500: 69 65 6c 64 2e 20 52 46 43 20 35 32 38 30 20 73 ield. RFC 5280 s
1510: 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 36 20 2a ection 4.1.2.6 *
1520: 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f /. len = BIO_
1530: 74 6f 5f 42 75 66 66 65 72 28 58 35 30 39 5f 4e to_Buffer(X509_N
1540: 41 4d 45 5f 70 72 69 6e 74 5f 65 78 28 62 69 6f AME_print_ex(bio
1550: 2c 20 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 , X509_get_subje
1560: 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 2c 20 30 ct_name(cert), 0
1570: 2c 20 66 6c 61 67 73 29 2c 20 62 69 6f 2c 20 62 , flags), bio, b
1580: 75 66 66 65 72 29 3b 0a 20 20 20 20 54 63 6c 5f uffer);. Tcl_
1590: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
15a0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 ment(interp, cer
15b0: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tPtr, Tcl_NewStr
15c0: 69 6e 67 4f 62 6a 28 22 73 75 62 6a 65 63 74 22 ingObj("subject"
15d0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
15e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
15f0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 ment(interp, cer
1600: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tPtr, Tcl_NewStr
1610: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 6c ingObj(buffer, l
1620: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 48 en));.. /* SH
1630: 41 31 20 46 69 6e 67 65 72 70 72 69 6e 74 20 6f A1 Fingerprint o
1640: 66 20 63 65 72 74 20 2d 20 44 45 52 20 72 65 70 f cert - DER rep
1650: 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 resentation */.
1660: 20 20 20 69 66 20 28 58 35 30 39 5f 64 69 67 65 if (X509_dige
1670: 73 74 28 63 65 72 74 2c 20 45 56 50 5f 73 68 61 st(cert, EVP_sha
1680: 31 28 29 2c 20 6d 64 2c 20 26 6c 65 6e 29 29 20 1(), md, &len))
1690: 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 53 74 72 69 {. len = Stri
16a0: 6e 67 5f 74 6f 5f 48 65 78 28 6d 64 2c 20 6c 65 ng_to_Hex(md, le
16b0: 6e 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 n, buffer, BUFSI
16c0: 5a 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 Z);. Tcl_List
16d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
16e0: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 (interp, certPtr
16f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
1700: 62 6a 28 22 73 68 61 31 5f 68 61 73 68 22 2c 20 bj("sha1_hash",
1710: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
1720: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1730: 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 nt(interp, certP
1740: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
1750: 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 6c 65 6e gObj(buffer, len
1760: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ));. }.. /
1770: 2a 20 53 48 41 32 35 36 20 46 69 6e 67 65 72 70 * SHA256 Fingerp
1780: 72 69 6e 74 20 6f 66 20 63 65 72 74 20 2d 20 44 rint of cert - D
1790: 45 52 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f ER representatio
17a0: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35 30 n */. if (X50
17b0: 39 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 45 9_digest(cert, E
17c0: 56 50 5f 73 68 61 32 35 36 28 29 2c 20 6d 64 2c VP_sha256(), md,
17d0: 20 26 6c 65 6e 29 29 20 7b 0a 20 20 20 20 6c 65 &len)) {. le
17e0: 6e 20 3d 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 n = String_to_He
17f0: 78 28 6d 64 2c 20 6c 65 6e 2c 20 62 75 66 66 65 x(md, len, buffe
1800: 72 2c 20 42 55 46 53 49 5a 29 3b 0a 20 20 20 20 r, BUFSIZ);.
1810: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1820: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1830: 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 certPtr, Tcl_Ne
1840: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 68 61 32 wStringObj("sha2
1850: 35 36 5f 68 61 73 68 22 2c 20 2d 31 29 29 3b 0a 56_hash", -1));.
1860: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
1870: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
1880: 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 erp, certPtr, Tc
1890: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 l_NewStringObj(b
18a0: 75 66 66 65 72 2c 20 6c 65 6e 29 29 3b 0a 20 20 uffer, len));.
18b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a }.. /* Subj
18c0: 65 63 74 20 50 75 62 6c 69 63 20 4b 65 79 20 49 ect Public Key I
18d0: 6e 66 6f 20 73 70 65 63 69 66 69 65 73 20 74 68 nfo specifies th
18e0: 65 20 70 75 62 6c 69 63 20 6b 65 79 20 61 6e 64 e public key and
18f0: 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 0a identifies the.
1900: 09 61 6c 67 6f 72 69 74 68 6d 20 77 69 74 68 20 .algorithm with
1910: 77 68 69 63 68 20 74 68 65 20 6b 65 79 20 69 73 which the key is
1920: 20 75 73 65 64 2e 20 52 46 43 20 35 32 38 30 20 used. RFC 5280
1930: 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 37 20 section 4.1.2.7
1940: 2a 2f 0a 20 20 20 20 69 66 20 28 58 35 30 39 5f */. if (X509_
1950: 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 69 6e get_signature_in
1960: 66 6f 28 63 65 72 74 2c 20 26 6d 64 6e 69 64 2c fo(cert, &mdnid,
1970: 20 26 70 6b 6e 69 64 2c 20 26 62 69 74 73 2c 20 &pknid, &bits,
1980: 26 78 66 6c 61 67 73 29 20 3d 3d 20 31 29 20 7b &xflags) == 1) {
1990: 0a 09 41 53 4e 31 5f 42 49 54 5f 53 54 52 49 4e ..ASN1_BIT_STRIN
19a0: 47 20 2a 6b 65 79 3b 0a 09 75 6e 73 69 67 6e 65 G *key;..unsigne
19b0: 64 20 69 6e 74 20 6e 3b 0a 0a 09 54 63 6c 5f 4c d int n;...Tcl_L
19c0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
19d0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 ent(interp, cert
19e0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
19f0: 6e 67 4f 62 6a 28 22 73 69 67 6e 69 6e 67 44 69 ngObj("signingDi
1a00: 67 65 73 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 gest", -1));..Tc
1a10: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
1a20: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
1a30: 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 ertPtr, Tcl_NewS
1a40: 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 tringObj(OBJ_nid
1a50: 32 6c 6e 28 6d 64 6e 69 64 29 2c 2d 31 29 29 3b 2ln(mdnid),-1));
1a60: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
1a70: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1a80: 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f p, certPtr, Tcl_
1a90: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 75 NewStringObj("pu
1aa0: 62 6c 69 63 4b 65 79 41 6c 67 6f 72 69 74 68 6d blicKeyAlgorithm
1ab0: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
1ac0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1ad0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 nt(interp, certP
1ae0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
1af0: 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e 28 gObj(OBJ_nid2ln(
1b00: 70 6b 6e 69 64 29 2c 2d 31 29 29 3b 0a 09 2f 2a pknid),-1));../*
1b10: 20 45 66 66 65 63 74 69 76 65 20 73 65 63 75 72 Effective secur
1b20: 69 74 79 20 62 69 74 73 20 2a 2f 0a 09 54 63 6c ity bits */..Tcl
1b30: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1b40: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 ement(interp, ce
1b50: 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 rtPtr, Tcl_NewSt
1b60: 72 69 6e 67 4f 62 6a 28 22 62 69 74 73 22 2c 20 ringObj("bits",
1b70: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
1b80: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1b90: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c interp, certPtr,
1ba0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 62 Tcl_NewIntObj(b
1bb0: 69 74 73 29 29 3b 0a 0a 09 6b 65 79 20 3d 20 58 its));...key = X
1bc0: 35 30 39 5f 67 65 74 30 5f 70 75 62 6b 65 79 5f 509_get0_pubkey_
1bd0: 62 69 74 73 74 72 28 63 65 72 74 29 3b 0a 09 6c bitstr(cert);..l
1be0: 65 6e 20 3d 20 53 74 72 69 6e 67 5f 74 6f 5f 48 en = String_to_H
1bf0: 65 78 28 6b 65 79 2d 3e 64 61 74 61 2c 20 6b 65 ex(key->data, ke
1c00: 79 2d 3e 6c 65 6e 67 74 68 2c 20 62 75 66 66 65 y->length, buffe
1c10: 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 54 63 6c r, BUFSIZ);..Tcl
1c20: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1c30: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 ement(interp, ce
1c40: 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 rtPtr, Tcl_NewSt
1c50: 72 69 6e 67 4f 62 6a 28 22 70 75 62 6c 69 63 4b ringObj("publicK
1c60: 65 79 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f ey", -1));..Tcl_
1c70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1c80: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 ment(interp, cer
1c90: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tPtr, Tcl_NewStr
1ca0: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 6c ingObj(buffer, l
1cb0: 65 6e 29 29 3b 0a 0a 09 2f 2a 20 43 68 65 63 6b en));.../* Check
1cc0: 20 69 66 20 63 65 72 74 20 77 61 73 20 69 73 73 if cert was iss
1cd0: 75 65 64 20 62 79 20 43 41 20 63 65 72 74 20 69 ued by CA cert i
1ce0: 73 73 75 65 72 20 6f 72 20 73 65 6c 66 20 73 69 ssuer or self si
1cf0: 67 6e 65 64 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 gned */..Tcl_Lis
1d00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1d10: 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 t(interp, certPt
1d20: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
1d30: 4f 62 6a 28 22 73 65 6c 66 5f 73 69 67 6e 65 64 Obj("self_signed
1d40: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
1d50: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1d60: 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 nt(interp, certP
1d70: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 tr, Tcl_NewBoole
1d80: 61 6e 4f 62 6a 28 58 35 30 39 5f 63 68 65 63 6b anObj(X509_check
1d90: 5f 69 73 73 75 65 64 28 63 65 72 74 2c 20 63 65 _issued(cert, ce
1da0: 72 74 29 20 3d 3d 20 58 35 30 39 5f 56 5f 4f 4b rt) == X509_V_OK
1db0: 29 29 3b 0a 0a 09 69 66 20 28 58 35 30 39 5f 64 ));...if (X509_d
1dc0: 69 67 65 73 74 28 63 65 72 74 2c 20 45 56 50 5f igest(cert, EVP_
1dd0: 67 65 74 5f 64 69 67 65 73 74 62 79 6e 69 64 28 get_digestbynid(
1de0: 6d 64 6e 69 64 29 2c 20 6d 64 2c 20 26 6e 29 29 mdnid), md, &n))
1df0: 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 53 74 {.. len = St
1e00: 72 69 6e 67 5f 74 6f 5f 48 65 78 28 6d 64 2c 20 ring_to_Hex(md,
1e10: 28 69 6e 74 29 6e 2c 20 62 75 66 66 65 72 2c 20 (int)n, buffer,
1e20: 42 55 46 53 49 5a 29 3b 0a 09 7d 20 65 6c 73 65 BUFSIZ);..} else
1e30: 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 30 3b {.. len = 0;
1e40: 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ..}..Tcl_ListObj
1e50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1e60: 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 terp, certPtr, T
1e70: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1e80: 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 22 2c "signatureHash",
1e90: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
1ea0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1eb0: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 (interp, certPtr
1ec0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
1ed0: 62 6a 28 62 75 66 66 65 72 2c 20 6c 65 6e 29 29 bj(buffer, len))
1ee0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 78 66 6c ;. }.. xfl
1ef0: 61 67 73 20 3d 20 58 35 30 39 5f 67 65 74 5f 65 ags = X509_get_e
1f00: 78 74 65 6e 73 69 6f 6e 5f 66 6c 61 67 73 28 63 xtension_flags(c
1f10: 65 72 74 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f ert);..Tcl_ListO
1f20: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1f30: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c interp, certPtr,
1f40: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1f50: 6a 28 22 65 78 74 65 6e 73 69 6f 6e 5f 66 6c 61 j("extension_fla
1f60: 67 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f gs", -1));..Tcl_
1f70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1f80: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 ment(interp, cer
1f90: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 tPtr, Tcl_NewInt
1fa0: 4f 62 6a 28 78 66 6c 61 67 73 29 29 3b 0a 0a 09 Obj(xflags));...
1fb0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 63 65 72 74 /* Check if cert
1fc0: 20 77 61 73 20 69 73 73 75 65 64 20 62 79 20 43 was issued by C
1fd0: 41 20 63 65 72 74 20 69 73 73 75 65 72 20 6f 72 A cert issuer or
1fe0: 20 73 65 6c 66 20 73 69 67 6e 65 64 20 2a 2f 0a self signed */.
1ff0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
2000: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2010: 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e , certPtr, Tcl_N
2020: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 6c ewStringObj("sel
2030: 66 49 73 73 75 65 64 22 2c 20 2d 31 29 29 3b 0a fIssued", -1));.
2040: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
2050: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2060: 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e , certPtr, Tcl_N
2070: 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 78 66 6c ewBooleanObj(xfl
2080: 61 67 73 20 26 20 45 58 46 4c 41 47 5f 53 49 29 ags & EXFLAG_SI)
2090: 29 3b 0a 0a 09 2f 2a 20 43 68 65 63 6b 20 69 66 );.../* Check if
20a0: 20 63 65 72 74 20 77 61 73 20 69 73 73 75 65 64 cert was issued
20b0: 20 62 79 20 43 41 20 63 65 72 74 20 69 73 73 75 by CA cert issu
20c0: 65 72 20 6f 72 20 73 65 6c 66 20 73 69 67 6e 65 er or self signe
20d0: 64 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 d */..Tcl_ListOb
20e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
20f0: 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 nterp, certPtr,
2100: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2110: 28 22 73 65 6c 66 53 69 67 6e 65 64 22 2c 20 2d ("selfSigned", -
2120: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
2130: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2140: 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 nterp, certPtr,
2150: 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 Tcl_NewBooleanOb
2160: 6a 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 j(xflags & EXFLA
2170: 47 5f 53 53 29 29 3b 0a 0a 0a 20 20 20 20 2f 2a G_SS));... /*
2180: 20 55 6e 69 71 75 65 20 49 64 73 20 2d 20 20 54 Unique Ids - T
2190: 68 65 20 75 6e 69 71 75 65 20 69 64 65 6e 74 69 he unique identi
21a0: 66 69 65 72 73 20 61 72 65 20 70 72 65 73 65 6e fiers are presen
21b0: 74 20 69 6e 20 74 68 65 20 63 65 72 74 69 66 69 t in the certifi
21c0: 63 61 74 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 cate to handle t
21d0: 68 65 0a 09 70 6f 73 73 69 62 69 6c 69 74 79 20 he..possibility
21e0: 6f 66 20 72 65 75 73 65 20 6f 66 20 73 75 62 6a of reuse of subj
21f0: 65 63 74 20 61 6e 64 2f 6f 72 20 69 73 73 75 65 ect and/or issue
2200: 72 20 6e 61 6d 65 73 20 6f 76 65 72 20 74 69 6d r names over tim
2210: 65 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 e. RFC 5280 sect
2220: 69 6f 6e 20 34 2e 31 2e 32 2e 38 20 2a 2f 0a 20 ion 4.1.2.8 */.
2230: 20 20 20 7b 0a 09 63 6f 6e 73 74 20 41 53 4e 31 {..const ASN1
2240: 5f 42 49 54 5f 53 54 52 49 4e 47 20 2a 69 75 69 _BIT_STRING *iui
2250: 64 2c 20 2a 73 75 69 64 3b 0a 20 20 20 20 20 20 d, *suid;.
2260: 20 20 58 35 30 39 5f 67 65 74 30 5f 75 69 64 73 X509_get0_uids
2270: 28 63 65 72 74 2c 20 26 69 75 69 64 2c 20 26 73 (cert, &iuid, &s
2280: 75 69 64 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f uid);..Tcl_ListO
2290: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
22a0: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c interp, certPtr,
22b0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
22c0: 6a 28 22 69 73 73 75 65 72 55 6e 69 71 75 65 49 j("issuerUniqueI
22d0: 64 22 2c 20 2d 31 29 29 3b 0a 09 69 66 20 28 69 d", -1));..if (i
22e0: 75 69 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 uid != NULL) {..
22f0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2300: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2310: 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 erp, certPtr, Tc
2320: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 l_NewByteArrayOb
2330: 6a 28 28 63 68 61 72 20 2a 29 69 75 69 64 2d 3e j((char *)iuid->
2340: 64 61 74 61 2c 20 69 75 69 64 2d 3e 6c 65 6e 67 data, iuid->leng
2350: 74 68 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a th));..} else {.
2360: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2370: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2380: 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 terp, certPtr, T
2390: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
23a0: 22 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 0a 09 54 "", -1));..}...T
23b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
23c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
23d0: 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 certPtr, Tcl_New
23e0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 75 62 6a 65 StringObj("subje
23f0: 63 74 55 6e 69 71 75 65 49 64 22 2c 20 2d 31 29 ctUniqueId", -1)
2400: 29 3b 0a 09 69 66 20 28 73 75 69 64 20 21 3d 20 );..if (suid !=
2410: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c NULL) {.. Tcl
2420: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
2430: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 ement(interp, ce
2440: 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 rtPtr, Tcl_NewBy
2450: 74 65 41 72 72 61 79 4f 62 6a 28 28 63 68 61 72 teArrayObj((char
2460: 20 2a 29 73 75 69 64 2d 3e 64 61 74 61 2c 20 73 *)suid->data, s
2470: 75 69 64 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a 09 uid->length));..
2480: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 } else {.. Tc
2490: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
24a0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
24b0: 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 ertPtr, Tcl_NewS
24c0: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 tringObj("", -1)
24d0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
24e0: 20 2f 2a 20 58 35 30 39 20 76 33 20 45 78 74 65 /* X509 v3 Exte
24f0: 6e 73 69 6f 6e 73 20 2d 20 52 46 43 20 35 32 38 nsions - RFC 528
2500: 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 0 section 4.1.2.
2510: 39 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 58 9 */. len = X
2520: 35 30 39 5f 67 65 74 5f 65 78 74 5f 63 6f 75 6e 509_get_ext_coun
2530: 74 28 63 65 72 74 29 3b 0a 20 20 20 20 54 63 6c t(cert);. Tcl
2540: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
2550: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 ement(interp, ce
2560: 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 rtPtr, Tcl_NewSt
2570: 72 69 6e 67 4f 62 6a 28 22 6e 75 6d 5f 65 78 74 ringObj("num_ext
2580: 65 6e 73 69 6f 6e 73 22 2c 20 2d 31 29 29 3b 0a ensions", -1));.
2590: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
25a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
25b0: 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 erp, certPtr, Tc
25c0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6c 65 6e 29 l_NewIntObj(len)
25d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
25e0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
25f0: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c interp, certPtr,
2600: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
2610: 6a 28 22 65 78 74 65 6e 73 69 6f 6e 73 22 2c 20 j("extensions",
2620: 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 -1));. if (le
2630: 6e 20 3e 20 30 29 20 7b 0a 09 54 63 6c 5f 4f 62 n > 0) {..Tcl_Ob
2640: 6a 20 2a 65 78 74 73 50 74 72 20 3d 20 54 63 6c j *extsPtr = Tcl
2650: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
2660: 55 4c 4c 29 3b 0a 09 63 6f 6e 73 74 20 53 54 41 ULL);..const STA
2670: 43 4b 5f 4f 46 28 58 35 30 39 5f 45 58 54 45 4e CK_OF(X509_EXTEN
2680: 53 49 4f 4e 29 20 2a 65 78 74 73 3b 0a 09 65 78 SION) *exts;..ex
2690: 74 73 20 3d 20 58 35 30 39 5f 67 65 74 30 5f 65 ts = X509_get0_e
26a0: 78 74 65 6e 73 69 6f 6e 73 28 63 65 72 74 29 3b xtensions(cert);
26b0: 0a 0a 09 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b ...for (int i=0;
26c0: 20 69 20 3c 20 6c 65 6e 3b 20 69 2b 2b 29 20 7b i < len; i++) {
26d0: 0a 09 20 20 20 20 58 35 30 39 5f 45 58 54 45 4e .. X509_EXTEN
26e0: 53 49 4f 4e 20 2a 65 78 20 3d 20 73 6b 5f 58 35 SION *ex = sk_X5
26f0: 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 76 61 6c 09_EXTENSION_val
2700: 75 65 28 65 78 74 73 2c 20 69 29 3b 0a 09 20 20 ue(exts, i);..
2710: 20 20 41 53 4e 31 5f 4f 42 4a 45 43 54 20 2a 6f ASN1_OBJECT *o
2720: 62 6a 20 3d 20 58 35 30 39 5f 45 58 54 45 4e 53 bj = X509_EXTENS
2730: 49 4f 4e 5f 67 65 74 5f 6f 62 6a 65 63 74 28 65 ION_get_object(e
2740: 78 29 3b 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 x);.. unsigne
2750: 64 20 6e 69 64 32 20 3d 20 4f 42 4a 5f 6f 62 6a d nid2 = OBJ_obj
2760: 32 6e 69 64 28 6f 62 6a 29 3b 0a 09 20 20 20 20 2nid(obj);..
2770: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2780: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2790: 20 65 78 74 73 50 74 72 2c 20 54 63 6c 5f 4e 65 extsPtr, Tcl_Ne
27a0: 77 53 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e wStringObj(OBJ_n
27b0: 69 64 32 6c 6e 28 6e 69 64 32 29 2c 20 2d 31 29 id2ln(nid2), -1)
27c0: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f );..}..Tcl_ListO
27d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
27e0: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c interp, certPtr,
27f0: 20 65 78 74 73 50 74 72 29 3b 0a 20 20 20 20 7d extsPtr);. }
2800: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 else {..Tcl_Lis
2810: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2820: 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 t(interp, certPt
2830: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
2840: 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 20 20 Obj("", -1));.
2850: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 75 74 68 }.. /* Auth
2860: 6f 72 69 74 79 20 4b 65 79 20 49 64 65 6e 74 69 ority Key Identi
2870: 66 69 65 72 20 28 41 4b 49 29 20 6f 66 20 61 20 fier (AKI) of a
2880: 63 65 72 74 69 66 69 63 61 74 65 20 73 68 6f 75 certificate shou
2890: 6c 64 20 62 65 20 74 68 65 20 53 75 62 6a 65 63 ld be the Subjec
28a0: 74 20 4b 65 79 0a 09 49 64 65 6e 74 69 66 69 65 t Key..Identifie
28b0: 72 20 28 53 4b 49 29 20 6f 66 20 69 74 73 20 73 r (SKI) of its s
28c0: 69 67 6e 65 72 20 28 74 68 65 20 43 41 29 2e 20 igner (the CA).
28d0: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e RFC 5280 section
28e0: 20 34 2e 32 2e 31 2e 31 2c 20 4e 49 44 5f 61 75 4.2.1.1, NID_au
28f0: 74 68 6f 72 69 74 79 5f 6b 65 79 5f 69 64 65 6e thority_key_iden
2900: 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 7b 0a tifier */. {.
2910: 09 41 53 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49 .ASN1_OCTET_STRI
2920: 4e 47 20 2a 61 73 74 72 69 6e 67 20 3d 20 58 35 NG *astring = X5
2930: 30 39 5f 67 65 74 30 5f 61 75 74 68 6f 72 69 74 09_get0_authorit
2940: 79 5f 6b 65 79 5f 69 64 28 63 65 72 74 29 3b 0a y_key_id(cert);.
2950: 09 69 66 20 28 61 73 74 72 69 6e 67 20 21 3d 20 .if (astring !=
2960: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6c 65 6e NULL) {.. len
2970: 20 3d 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 = String_to_Hex
2980: 28 28 63 68 61 72 20 2a 29 41 53 4e 31 5f 53 54 ((char *)ASN1_ST
2990: 52 49 4e 47 5f 67 65 74 30 5f 64 61 74 61 28 61 RING_get0_data(a
29a0: 73 74 72 69 6e 67 29 2c 20 41 53 4e 31 5f 53 54 string), ASN1_ST
29b0: 52 49 4e 47 5f 6c 65 6e 67 74 68 28 61 73 74 72 RING_length(astr
29c0: 69 6e 67 29 2c 20 62 75 66 66 65 72 2c 20 42 55 ing), buffer, BU
29d0: 46 53 49 5a 29 3b 0a 09 7d 20 65 6c 73 65 20 7b FSIZ);..} else {
29e0: 0a 09 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 09 .. len = 0;..
29f0: 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 }..Tcl_ListObjAp
2a00: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2a10: 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c rp, certPtr, Tcl
2a20: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 _NewStringObj("a
2a30: 75 74 68 6f 72 69 74 79 4b 65 79 49 64 65 6e 74 uthorityKeyIdent
2a40: 69 66 69 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 ifier", -1));..T
2a50: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2a60: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2a70: 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 certPtr, Tcl_New
2a80: 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 StringObj(buffer
2a90: 2c 20 6c 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 0a , len));. }..
2aa0: 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 4b /* Subject K
2ab0: 65 79 20 49 64 65 6e 74 69 66 69 65 72 20 28 53 ey Identifier (S
2ac0: 4b 49 29 20 70 72 6f 76 69 64 65 73 20 61 20 6d KI) provides a m
2ad0: 65 61 6e 73 20 6f 66 20 69 64 65 6e 74 69 66 79 eans of identify
2ae0: 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 73 ing certificates
2af0: 0a 09 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 61 ..that contain a
2b00: 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 62 6c particular publ
2b10: 69 63 20 6b 65 79 2e 20 52 46 43 20 35 32 38 30 ic key. RFC 5280
2b20: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 32 section 4.2.1.2
2b30: 2c 20 4e 49 44 5f 73 75 62 6a 65 63 74 5f 6b 65 , NID_subject_ke
2b40: 79 5f 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a y_identifier */.
2b50: 20 20 20 20 7b 0a 09 41 53 4e 31 5f 4f 43 54 45 {..ASN1_OCTE
2b60: 54 5f 53 54 52 49 4e 47 20 2a 61 73 74 72 69 6e T_STRING *astrin
2b70: 67 20 3d 20 58 35 30 39 5f 67 65 74 30 5f 73 75 g = X509_get0_su
2b80: 62 6a 65 63 74 5f 6b 65 79 5f 69 64 28 63 65 72 bject_key_id(cer
2b90: 74 29 3b 0a 09 69 66 20 28 61 73 74 72 69 6e 67 t);..if (astring
2ba0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
2bb0: 20 6c 65 6e 20 3d 20 53 74 72 69 6e 67 5f 74 6f len = String_to
2bc0: 5f 48 65 78 28 28 63 68 61 72 20 2a 29 41 53 4e _Hex((char *)ASN
2bd0: 31 5f 53 54 52 49 4e 47 5f 67 65 74 30 5f 64 61 1_STRING_get0_da
2be0: 74 61 28 61 73 74 72 69 6e 67 29 2c 20 41 53 4e ta(astring), ASN
2bf0: 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 1_STRING_length(
2c00: 61 73 74 72 69 6e 67 29 2c 20 62 75 66 66 65 72 astring), buffer
2c10: 2c 20 42 55 46 53 49 5a 29 3b 0a 09 7d 20 65 6c , BUFSIZ);..} el
2c20: 73 65 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 se {.. len =
2c30: 30 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 0;..}..Tcl_ListO
2c40: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2c50: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c interp, certPtr,
2c60: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
2c70: 6a 28 22 73 75 62 6a 65 63 74 4b 65 79 49 64 65 j("subjectKeyIde
2c80: 6e 74 69 66 69 65 72 22 2c 20 2d 31 29 29 3b 0a ntifier", -1));.
2c90: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
2ca0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2cb0: 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e , certPtr, Tcl_N
2cc0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 ewStringObj(buff
2cd0: 65 72 2c 20 6c 65 6e 29 29 3b 0a 20 20 20 20 7d er, len));. }
2ce0: 0a 0a 20 20 20 20 2f 2a 20 4b 65 79 20 75 73 61 .. /* Key usa
2cf0: 67 65 20 65 78 74 65 6e 73 69 6f 6e 20 64 65 66 ge extension def
2d00: 69 6e 65 73 20 74 68 65 20 70 75 72 70 6f 73 65 ines the purpose
2d10: 20 28 65 2e 67 2e 2c 20 65 6e 63 69 70 68 65 72 (e.g., encipher
2d20: 6d 65 6e 74 2c 20 73 69 67 6e 61 74 75 72 65 2c ment, signature,
2d30: 20 63 65 72 74 69 66 69 63 61 74 65 0a 09 73 69 certificate..si
2d40: 67 6e 69 6e 67 29 20 6f 66 20 74 68 65 20 6b 65 gning) of the ke
2d50: 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 y contained in t
2d60: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 2e 20 he certificate.
2d70: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e RFC 5280 section
2d80: 20 34 2e 32 2e 31 2e 33 2c 20 4e 49 44 5f 6b 65 4.2.1.3, NID_ke
2d90: 79 5f 75 73 61 67 65 20 2a 2f 0a 20 20 20 20 54 y_usage */. T
2da0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2db0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2dc0: 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 certPtr, Tcl_New
2dd0: 53 74 72 69 6e 67 4f 62 6a 28 22 6b 65 79 55 73 StringObj("keyUs
2de0: 61 67 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 age", -1));.
2df0: 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 74 usage = X509_get
2e00: 5f 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74 29 _key_usage(cert)
2e10: 3b 0a 20 20 20 20 69 66 20 28 78 66 6c 61 67 73 ;. if (xflags
2e20: 20 26 20 45 58 46 4c 41 47 5f 4b 55 53 41 47 45 & EXFLAG_KUSAGE
2e30: 20 26 26 20 75 73 61 67 65 20 3c 20 30 78 66 66 && usage < 0xff
2e40: 66 66 66 66 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a ffff) {..Tcl_Obj
2e50: 20 2a 74 6d 70 50 74 72 20 3d 20 54 63 6c 5f 4e *tmpPtr = Tcl_N
2e60: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
2e70: 4c 29 3b 0a 09 69 66 20 28 75 73 61 67 65 20 26 L);..if (usage &
2e80: 20 4b 55 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e KU_DIGITAL_SIGN
2e90: 41 54 55 52 45 29 20 7b 0a 09 20 20 20 20 54 63 ATURE) {.. Tc
2ea0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2eb0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 74 lement(interp, t
2ec0: 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mpPtr, Tcl_NewSt
2ed0: 72 69 6e 67 4f 62 6a 28 22 44 69 67 69 74 61 6c ringObj("Digital
2ee0: 20 53 69 67 6e 61 74 75 72 65 22 2c 20 2d 31 29 Signature", -1)
2ef0: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 );..}..if (usage
2f00: 20 26 20 4b 55 5f 4e 4f 4e 5f 52 45 50 55 44 49 & KU_NON_REPUDI
2f10: 41 54 49 4f 4e 29 20 7b 0a 09 20 20 20 20 54 63 ATION) {.. Tc
2f20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2f30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 74 lement(interp, t
2f40: 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mpPtr, Tcl_NewSt
2f50: 72 69 6e 67 4f 62 6a 28 22 4e 6f 6e 2d 52 65 70 ringObj("Non-Rep
2f60: 75 64 69 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b udiation", -1));
2f70: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 ..}..if (usage &
2f80: 20 4b 55 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52 KU_KEY_ENCIPHER
2f90: 4d 45 4e 54 29 20 7b 0a 09 20 20 20 20 54 63 6c MENT) {.. Tcl
2fa0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
2fb0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 74 6d ement(interp, tm
2fc0: 70 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 pPtr, Tcl_NewStr
2fd0: 69 6e 67 4f 62 6a 28 22 4b 65 79 20 45 6e 63 69 ingObj("Key Enci
2fe0: 70 68 65 72 6d 65 6e 74 22 2c 20 2d 31 29 29 3b pherment", -1));
2ff0: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 ..}..if (usage &
3000: 20 4b 55 5f 44 41 54 41 5f 45 4e 43 49 50 48 45 KU_DATA_ENCIPHE
3010: 52 4d 45 4e 54 29 20 7b 0a 09 20 20 20 20 54 63 RMENT) {.. Tc
3020: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3030: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 74 lement(interp, t
3040: 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mpPtr, Tcl_NewSt
3050: 72 69 6e 67 4f 62 6a 28 22 44 61 74 61 20 45 6e ringObj("Data En
3060: 63 69 70 68 65 72 6d 65 6e 74 22 2c 20 2d 31 29 cipherment", -1)
3070: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 );..}..if (usage
3080: 20 26 20 4b 55 5f 4b 45 59 5f 41 47 52 45 45 4d & KU_KEY_AGREEM
3090: 45 4e 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f ENT) {.. Tcl_
30a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
30b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 74 6d 70 ment(interp, tmp
30c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
30d0: 6e 67 4f 62 6a 28 22 4b 65 79 20 41 67 72 65 65 ngObj("Key Agree
30e0: 6d 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a ment", -1));..}.
30f0: 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f .if (usage & KU_
3100: 4b 45 59 5f 43 45 52 54 5f 53 49 47 4e 29 20 7b KEY_CERT_SIGN) {
3110: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
3120: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3130: 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 2c 20 54 nterp, tmpPtr, T
3140: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
3150: 22 43 65 72 74 69 66 69 63 61 74 65 20 53 69 67 "Certificate Sig
3160: 6e 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a ning", -1));..}.
3170: 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f .if (usage & KU_
3180: 43 52 4c 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 CRL_SIGN) {..
3190: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
31a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
31b0: 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65 , tmpPtr, Tcl_Ne
31c0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 43 52 4c 20 wStringObj("CRL
31d0: 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 3b 0a Signing", -1));.
31e0: 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 .}..if (usage &
31f0: 4b 55 5f 45 4e 43 49 50 48 45 52 5f 4f 4e 4c 59 KU_ENCIPHER_ONLY
3200: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
3210: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3220: 74 28 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 t(interp, tmpPtr
3230: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
3240: 62 6a 28 22 45 6e 63 69 70 68 65 72 20 4f 6e 6c bj("Encipher Onl
3250: 79 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 y", -1));..}..if
3260: 20 28 75 73 61 67 65 20 26 20 4b 55 5f 44 45 43 (usage & KU_DEC
3270: 49 50 48 45 52 5f 4f 4e 4c 59 29 20 7b 0a 09 20 IPHER_ONLY) {..
3280: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3290: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
32a0: 72 70 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c 5f rp, tmpPtr, Tcl_
32b0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 44 65 NewStringObj("De
32c0: 63 69 70 68 65 72 20 4f 6e 6c 79 22 2c 20 2d 31 cipher Only", -1
32d0: 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 ));..}..Tcl_List
32e0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
32f0: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 (interp, certPtr
3300: 2c 20 74 6d 70 50 74 72 29 3b 0a 20 20 20 20 7d , tmpPtr);. }
3310: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 else {..Tcl_Lis
3320: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3330: 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 t(interp, certPt
3340: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
3350: 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 20 20 Obj("", -1));.
3360: 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 50 75 72 }... /* Pur
3370: 70 6f 73 65 20 2a 2f 0a 20 20 20 20 7b 0a 09 63 pose */. {..c
3380: 68 61 72 20 2a 70 75 72 70 6f 73 65 20 3d 20 4e har *purpose = N
3390: 55 4c 4c 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f ULL;...Tcl_ListO
33a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
33b0: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c interp, certPtr,
33c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
33d0: 6a 28 22 70 75 72 70 6f 73 65 22 2c 20 2d 31 29 j("purpose", -1)
33e0: 29 3b 0a 09 69 66 20 28 58 35 30 39 5f 63 68 65 );..if (X509_che
33f0: 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c ck_purpose(cert,
3400: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 53 53 X509_PURPOSE_SS
3410: 4c 5f 43 4c 49 45 4e 54 2c 20 30 29 20 3e 20 30 L_CLIENT, 0) > 0
3420: 29 20 7b 0a 09 20 20 20 20 70 75 72 70 6f 73 65 ) {.. purpose
3430: 20 3d 20 22 53 53 4c 20 43 6c 69 65 6e 74 22 3b = "SSL Client";
3440: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 ..} else if (X50
3450: 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 9_check_purpose(
3460: 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f cert, X509_PURPO
3470: 53 45 5f 53 53 4c 5f 53 45 52 56 45 52 2c 20 30 SE_SSL_SERVER, 0
3480: 29 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 70 75 ) > 0) {.. pu
3490: 72 70 6f 73 65 20 3d 20 22 53 53 4c 20 53 65 72 rpose = "SSL Ser
34a0: 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 ver";..} else if
34b0: 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 (X509_check_pur
34c0: 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f pose(cert, X509_
34d0: 50 55 52 50 4f 53 45 5f 4e 53 5f 53 53 4c 5f 53 PURPOSE_NS_SSL_S
34e0: 45 52 56 45 52 2c 20 30 29 20 3e 20 30 29 20 7b ERVER, 0) > 0) {
34f0: 0a 09 20 20 20 20 70 75 72 70 6f 73 65 20 3d 20 .. purpose =
3500: 22 4d 53 53 20 53 53 4c 20 53 65 72 76 65 72 22 "MSS SSL Server"
3510: 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 58 35 ;..} else if (X5
3520: 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 09_check_purpose
3530: 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 (cert, X509_PURP
3540: 4f 53 45 5f 53 4d 49 4d 45 5f 53 49 47 4e 2c 20 OSE_SMIME_SIGN,
3550: 30 29 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 70 0) > 0) {.. p
3560: 75 72 70 6f 73 65 20 3d 20 22 53 4d 49 4d 45 20 urpose = "SMIME
3570: 53 69 67 6e 69 6e 67 22 3b 0a 09 7d 20 65 6c 73 Signing";..} els
3580: 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b e if (X509_check
3590: 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 _purpose(cert, X
35a0: 35 30 39 5f 50 55 52 50 4f 53 45 5f 53 4d 49 4d 509_PURPOSE_SMIM
35b0: 45 5f 45 4e 43 52 59 50 54 2c 20 30 29 20 3e 20 E_ENCRYPT, 0) >
35c0: 30 29 20 7b 0a 09 20 20 20 20 70 75 72 70 6f 73 0) {.. purpos
35d0: 65 20 3d 20 22 53 4d 49 4d 45 20 45 6e 63 72 79 e = "SMIME Encry
35e0: 70 74 69 6f 6e 22 3b 0a 09 7d 20 65 6c 73 65 20 ption";..} else
35f0: 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 if (X509_check_p
3600: 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 urpose(cert, X50
3610: 39 5f 50 55 52 50 4f 53 45 5f 43 52 4c 5f 53 49 9_PURPOSE_CRL_SI
3620: 47 4e 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 20 GN, 0) > 0) {..
3630: 20 20 20 70 75 72 70 6f 73 65 20 3d 20 22 43 52 purpose = "CR
3640: 4c 20 53 69 67 6e 69 6e 67 22 3b 0a 09 7d 20 65 L Signing";..} e
3650: 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 lse if (X509_che
3660: 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c ck_purpose(cert,
3670: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 41 4e X509_PURPOSE_AN
3680: 59 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 20 20 Y, 0) > 0) {..
3690: 20 20 70 75 72 70 6f 73 65 20 3d 20 22 41 6e 79 purpose = "Any
36a0: 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 58 ";..} else if (X
36b0: 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 509_check_purpos
36c0: 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 e(cert, X509_PUR
36d0: 50 4f 53 45 5f 4f 43 53 50 5f 48 45 4c 50 45 52 POSE_OCSP_HELPER
36e0: 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 20 20 20 , 0) > 0) {..
36f0: 20 70 75 72 70 6f 73 65 20 3d 20 22 4f 43 53 50 purpose = "OCSP
3700: 20 48 65 6c 70 65 72 22 3b 0a 09 7d 20 65 6c 73 Helper";..} els
3710: 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b e if (X509_check
3720: 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 _purpose(cert, X
3730: 35 30 39 5f 50 55 52 50 4f 53 45 5f 54 49 4d 45 509_PURPOSE_TIME
3740: 53 54 41 4d 50 5f 53 49 47 4e 2c 20 30 29 20 3e STAMP_SIGN, 0) >
3750: 20 30 29 20 7b 0a 09 20 20 20 20 70 75 72 70 6f 0) {.. purpo
3760: 73 65 20 3d 20 22 54 69 6d 65 73 74 61 6d 70 20 se = "Timestamp
3770: 53 69 67 6e 69 6e 67 22 3b 0a 09 7d 20 65 6c 73 Signing";..} els
3780: 65 20 7b 0a 09 20 20 20 20 70 75 72 70 6f 73 65 e {.. purpose
3790: 20 3d 20 22 22 3b 0a 09 7d 0a 09 54 63 6c 5f 4c = "";..}..Tcl_L
37a0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
37b0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 ent(interp, cert
37c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
37d0: 6e 67 4f 62 6a 28 70 75 72 70 6f 73 65 2c 20 2d ngObj(purpose, -
37e0: 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 1));. }..
37f0: 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 70 75 72 70 {..Tcl_Obj *purp
3800: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
3810: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 tObj(0, NULL);..
3820: 66 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20 for (int j = 0;
3830: 6a 20 3c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 j < X509_PURPOSE
3840: 5f 67 65 74 5f 63 6f 75 6e 74 28 29 3b 20 6a 2b _get_count(); j+
3850: 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 50 +) {.. X509_P
3860: 55 52 50 4f 53 45 20 2a 70 74 6d 70 20 3d 20 58 URPOSE *ptmp = X
3870: 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 30 509_PURPOSE_get0
3880: 28 6a 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 (j);.. Tcl_Ob
3890: 6a 20 2a 74 6d 70 50 74 72 20 3d 20 54 63 6c 5f j *tmpPtr = Tcl_
38a0: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
38b0: 4c 4c 29 3b 0a 0a 09 20 20 20 20 66 6f 72 20 28 LL);... for (
38c0: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 32 int i = 0; i < 2
38d0: 3b 20 69 2b 2b 29 20 7b 0a 09 09 69 6e 74 20 69 ; i++) {...int i
38e0: 64 72 65 74 20 3d 20 58 35 30 39 5f 63 68 65 63 dret = X509_chec
38f0: 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 k_purpose(cert,
3900: 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 X509_PURPOSE_get
3910: 5f 69 64 28 70 74 6d 70 29 2c 20 69 29 3b 0a 09 _id(ptmp), i);..
3920: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
3930: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3940: 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65 , tmpPtr, Tcl_Ne
3950: 77 53 74 72 69 6e 67 4f 62 6a 28 69 20 3f 20 22 wStringObj(i ? "
3960: 43 41 22 20 3a 20 22 6e 6f 6e 43 41 22 2c 20 2d CA" : "nonCA", -
3970: 31 29 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 1));...Tcl_ListO
3980: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3990: 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 2c 20 interp, tmpPtr,
39a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
39b0: 28 69 64 72 65 74 20 3d 3d 20 31 20 3f 20 22 59 (idret == 1 ? "Y
39c0: 65 73 22 20 3a 20 22 4e 6f 22 2c 20 2d 31 29 29 es" : "No", -1))
39d0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 ;.. }.. Tc
39e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
39f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 lement(interp, p
3a00: 75 72 70 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 urpPtr, Tcl_NewS
3a10: 74 72 69 6e 67 4f 62 6a 28 58 35 30 39 5f 50 55 tringObj(X509_PU
3a20: 52 50 4f 53 45 5f 67 65 74 30 5f 6e 61 6d 65 28 RPOSE_get0_name(
3a30: 70 74 6d 70 29 2c 20 2d 31 29 29 3b 0a 09 20 20 ptmp), -1));..
3a40: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
3a50: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
3a60: 70 2c 20 70 75 72 70 50 74 72 2c 20 74 6d 70 50 p, purpPtr, tmpP
3a70: 74 72 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 tr);..}..Tcl_Lis
3a80: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3a90: 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 t(interp, certPt
3aa0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
3ab0: 4f 62 6a 28 22 63 65 72 74 69 66 69 63 61 74 65 Obj("certificate
3ac0: 50 75 72 70 6f 73 65 22 2c 20 2d 31 29 29 3b 0a Purpose", -1));.
3ad0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
3ae0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3af0: 2c 20 63 65 72 74 50 74 72 2c 20 70 75 72 70 50 , certPtr, purpP
3b00: 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 tr);. }..
3b10: 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65 20 50 /* Certificate P
3b20: 6f 6c 69 63 69 65 73 20 2d 20 69 6e 64 69 63 61 olicies - indica
3b30: 74 65 73 20 74 68 65 20 69 73 73 75 69 6e 67 20 tes the issuing
3b40: 43 41 20 63 6f 6e 73 69 64 65 72 73 20 69 74 73 CA considers its
3b50: 20 69 73 73 75 65 72 44 6f 6d 61 69 6e 50 6f 6c issuerDomainPol
3b60: 69 63 79 0a 09 65 71 75 69 76 61 6c 65 6e 74 20 icy..equivalent
3b70: 74 6f 20 74 68 65 20 73 75 62 6a 65 63 74 20 43 to the subject C
3b80: 41 27 73 20 73 75 62 6a 65 63 74 44 6f 6d 61 69 A's subjectDomai
3b90: 6e 50 6f 6c 69 63 79 2e 20 52 46 43 20 35 32 38 nPolicy. RFC 528
3ba0: 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 0 section 4.2.1.
3bb0: 34 2c 20 4e 49 44 5f 63 65 72 74 69 66 69 63 61 4, NID_certifica
3bc0: 74 65 5f 70 6f 6c 69 63 69 65 73 20 2a 2f 0a 20 te_policies */.
3bd0: 20 20 20 69 66 20 28 78 66 6c 61 67 73 20 26 20 if (xflags &
3be0: 45 58 46 4c 41 47 5f 49 4e 56 41 4c 49 44 5f 50 EXFLAG_INVALID_P
3bf0: 4f 4c 49 43 59 29 20 7b 0a 09 2f 2a 20 52 65 6a OLICY) {../* Rej
3c00: 65 63 74 20 63 65 72 74 20 2a 2f 0a 20 20 20 20 ect cert */.
3c10: 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 6c 69 63 79 }.. /* Policy
3c20: 20 4d 61 70 70 69 6e 67 73 20 2d 20 52 46 43 20 Mappings - RFC
3c30: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 5280 section 4.2
3c40: 2e 31 2e 35 2c 20 4e 49 44 5f 70 6f 6c 69 63 79 .1.5, NID_policy
3c50: 5f 6d 61 70 70 69 6e 67 73 20 2a 2f 0a 0a 20 20 _mappings */..
3c60: 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 41 6c 74 /* Subject Alt
3c70: 65 72 6e 61 74 69 76 65 20 4e 61 6d 65 20 28 53 ernative Name (S
3c80: 41 4e 29 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 AN) contains add
3c90: 69 74 69 6f 6e 61 6c 20 55 52 4c 73 2c 20 44 4e itional URLs, DN
3ca0: 53 20 6e 61 6d 65 2c 20 6f 72 20 49 50 0a 09 61 S name, or IP..a
3cb0: 64 64 72 65 73 73 65 73 20 62 6f 75 6e 64 20 74 ddresses bound t
3cc0: 6f 20 63 65 72 74 69 66 69 63 61 74 65 2e 20 52 o certificate. R
3cd0: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 FC 5280 section
3ce0: 34 2e 32 2e 31 2e 36 2c 20 4e 49 44 5f 73 75 62 4.2.1.6, NID_sub
3cf0: 6a 65 63 74 5f 61 6c 74 5f 6e 61 6d 65 20 2a 2f ject_alt_name */
3d00: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
3d10: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
3d20: 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 terp, certPtr, T
3d30: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
3d40: 22 73 75 62 6a 65 63 74 41 6c 74 4e 61 6d 65 22 "subjectAltName"
3d50: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 73 61 6e 20 , -1));. san
3d60: 3d 20 58 35 30 39 5f 67 65 74 5f 65 78 74 5f 64 = X509_get_ext_d
3d70: 32 69 28 63 65 72 74 2c 20 4e 49 44 5f 73 75 62 2i(cert, NID_sub
3d80: 6a 65 63 74 5f 61 6c 74 5f 6e 61 6d 65 2c 20 4e ject_alt_name, N
3d90: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 ULL, NULL);.
3da0: 69 66 20 28 73 61 6e 29 20 7b 0a 09 54 63 6c 5f if (san) {..Tcl_
3db0: 4f 62 6a 20 2a 6e 61 6d 65 73 50 74 72 20 3d 20 Obj *namesPtr =
3dc0: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
3dd0: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 66 6f 72 20 28 , NULL);...for (
3de0: 69 6e 74 20 69 3d 30 3b 20 69 20 3c 20 73 6b 5f int i=0; i < sk_
3df0: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 6e 75 6d GENERAL_NAME_num
3e00: 28 73 61 6e 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 (san); i++) {..
3e10: 20 20 20 63 6f 6e 73 74 20 47 45 4e 45 52 41 4c const GENERAL
3e20: 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b _NAME *name = sk
3e30: 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 76 61 _GENERAL_NAME_va
3e40: 6c 75 65 28 73 61 6e 2c 20 69 29 3b 0a 0a 09 20 lue(san, i);...
3e50: 20 20 20 69 66 20 28 6e 61 6d 65 20 26 26 20 62 if (name && b
3e60: 69 6f 29 20 7b 0a 09 09 69 66 20 28 47 45 4e 45 io) {...if (GENE
3e70: 52 41 4c 5f 4e 41 4d 45 5f 70 72 69 6e 74 28 62 RAL_NAME_print(b
3e80: 69 6f 2c 20 6e 61 6d 65 29 29 20 7b 0a 09 09 20 io, name)) {...
3e90: 20 20 20 69 6e 74 20 6e 20 3d 20 42 49 4f 5f 72 int n = BIO_r
3ea0: 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c ead(bio, buffer,
3eb0: 20 6d 69 6e 28 42 49 4f 5f 70 65 6e 64 69 6e 67 min(BIO_pending
3ec0: 28 62 69 6f 29 2c 20 42 55 46 53 49 5a 29 29 3b (bio), BUFSIZ));
3ed0: 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 6d 61 ... buffer[ma
3ee0: 78 28 6e 2c 20 30 29 5d 20 3d 20 30 3b 0a 09 09 x(n, 0)] = 0;...
3ef0: 20 20 20 20 28 76 6f 69 64 29 42 49 4f 5f 66 6c (void)BIO_fl
3f00: 75 73 68 28 62 69 6f 29 3b 0a 09 09 20 20 20 20 ush(bio);...
3f10: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
3f20: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
3f30: 20 6e 61 6d 65 73 50 74 72 2c 20 54 63 6c 5f 4e namesPtr, Tcl_N
3f40: 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 ewStringObj(buff
3f50: 65 72 2c 20 6e 29 29 3b 0a 09 09 7d 0a 09 20 20 er, n));...}..
3f60: 20 20 7d 0a 09 7d 0a 09 73 6b 5f 47 45 4e 45 52 }..}..sk_GENER
3f70: 41 4c 5f 4e 41 4d 45 5f 70 6f 70 5f 66 72 65 65 AL_NAME_pop_free
3f80: 28 73 61 6e 2c 20 47 45 4e 45 52 41 4c 5f 4e 41 (san, GENERAL_NA
3f90: 4d 45 5f 66 72 65 65 29 3b 0a 09 54 63 6c 5f 4c ME_free);..Tcl_L
3fa0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
3fb0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 ent(interp, cert
3fc0: 50 74 72 2c 20 6e 61 6d 65 73 50 74 72 29 3b 0a Ptr, namesPtr);.
3fd0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 } else {..Tc
3fe0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3ff0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
4000: 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 ertPtr, Tcl_NewS
4010: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 tringObj("", -1)
4020: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
4030: 20 49 73 73 75 65 72 20 41 6c 74 65 72 6e 61 74 Issuer Alternat
4040: 69 76 65 20 4e 61 6d 65 20 28 69 73 73 75 65 72 ive Name (issuer
4050: 41 6c 74 4e 61 6d 65 29 20 69 73 20 75 73 65 64 AltName) is used
4060: 20 74 6f 20 61 73 73 6f 63 69 61 74 65 20 49 6e to associate In
4070: 74 65 72 6e 65 74 0a 09 73 74 79 6c 65 20 69 64 ternet..style id
4080: 65 6e 74 69 74 69 65 73 20 77 69 74 68 20 74 68 entities with th
4090: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 e certificate is
40a0: 73 75 65 72 2e 20 52 46 43 20 35 32 38 30 20 73 suer. RFC 5280 s
40b0: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 37 2c 20 ection 4.2.1.7,
40c0: 4e 49 44 5f 69 73 73 75 65 72 5f 61 6c 74 5f 6e NID_issuer_alt_n
40d0: 61 6d 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c ame */. Tcl_L
40e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
40f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 ent(interp, cert
4100: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
4110: 6e 67 4f 62 6a 28 22 69 73 73 75 65 72 41 6c 74 ngObj("issuerAlt
4120: 4e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 Name", -1));.
4130: 20 73 61 6e 20 3d 20 58 35 30 39 5f 67 65 74 5f san = X509_get_
4140: 65 78 74 5f 64 32 69 28 63 65 72 74 2c 20 4e 49 ext_d2i(cert, NI
4150: 44 5f 69 73 73 75 65 72 5f 61 6c 74 5f 6e 61 6d D_issuer_alt_nam
4160: 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a e, NULL, NULL);.
4170: 20 20 20 20 69 66 20 28 73 61 6e 29 20 7b 0a 09 if (san) {..
4180: 54 63 6c 5f 4f 62 6a 20 2a 6e 61 6d 65 73 50 74 Tcl_Obj *namesPt
4190: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
41a0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 66 bj(0, NULL);...f
41b0: 6f 72 20 28 69 6e 74 20 69 3d 30 3b 20 69 20 3c or (int i=0; i <
41c0: 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 sk_GENERAL_NAME
41d0: 5f 6e 75 6d 28 73 61 6e 29 3b 20 69 2b 2b 29 20 _num(san); i++)
41e0: 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20 47 45 4e {.. const GEN
41f0: 45 52 41 4c 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 ERAL_NAME *name
4200: 3d 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d = sk_GENERAL_NAM
4210: 45 5f 76 61 6c 75 65 28 73 61 6e 2c 20 69 29 3b E_value(san, i);
4220: 0a 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 20 ... if (name
4230: 26 26 20 62 69 6f 29 20 7b 0a 09 09 69 66 20 28 && bio) {...if (
4240: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70 72 69 GENERAL_NAME_pri
4250: 6e 74 28 62 69 6f 2c 20 6e 61 6d 65 29 29 20 7b nt(bio, name)) {
4260: 0a 09 09 20 20 20 20 69 6e 74 20 6e 20 3d 20 42 ... int n = B
4270: 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 62 75 66 IO_read(bio, buf
4280: 66 65 72 2c 20 6d 69 6e 28 42 49 4f 5f 70 65 6e fer, min(BIO_pen
4290: 64 69 6e 67 28 62 69 6f 29 2c 20 42 55 46 53 49 ding(bio), BUFSI
42a0: 5a 29 29 3b 0a 09 09 20 20 20 20 62 75 66 66 65 Z));... buffe
42b0: 72 5b 6d 61 78 28 6e 2c 20 30 29 5d 20 3d 20 30 r[max(n, 0)] = 0
42c0: 3b 0a 09 09 20 20 20 20 28 76 6f 69 64 29 42 49 ;... (void)BI
42d0: 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09 09 O_flush(bio);...
42e0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
42f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4300: 65 72 70 2c 20 6e 61 6d 65 73 50 74 72 2c 20 54 erp, namesPtr, T
4310: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
4320: 62 75 66 66 65 72 2c 20 6e 29 29 3b 0a 09 09 7d buffer, n));...}
4330: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 73 6b 5f 47 .. }..}..sk_G
4340: 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70 6f 70 5f ENERAL_NAME_pop_
4350: 66 72 65 65 28 73 61 6e 2c 20 47 45 4e 45 52 41 free(san, GENERA
4360: 4c 5f 4e 41 4d 45 5f 66 72 65 65 29 3b 0a 09 54 L_NAME_free);..T
4370: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
4380: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
4390: 63 65 72 74 50 74 72 2c 20 6e 61 6d 65 73 50 74 certPtr, namesPt
43a0: 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b r);. } else {
43b0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
43c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
43d0: 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f p, certPtr, Tcl_
43e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c NewStringObj("",
43f0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 -1));. }..
4400: 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 44 69 72 /* Subject Dir
4410: 65 63 74 6f 72 79 20 41 74 74 72 69 62 75 74 65 ectory Attribute
4420: 73 20 70 72 6f 76 69 64 65 73 20 69 64 65 6e 74 s provides ident
4430: 69 66 69 63 61 74 69 6f 6e 20 61 74 74 72 69 62 ification attrib
4440: 75 74 65 73 20 28 65 2e 67 2e 2c 20 6e 61 74 69 utes (e.g., nati
4450: 6f 6e 61 6c 69 74 79 29 0a 09 6f 66 20 74 68 65 onality)..of the
4460: 20 73 75 62 6a 65 63 74 2e 20 52 46 43 20 35 32 subject. RFC 52
4470: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 80 section 4.2.1
4480: 2e 38 20 28 73 75 62 6a 65 63 74 44 69 72 65 63 .8 (subjectDirec
4490: 74 6f 72 79 41 74 74 72 69 62 75 74 65 73 29 20 toryAttributes)
44a0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 42 61 73 69 63 */.. /* Basic
44b0: 20 43 6f 6e 73 74 72 61 69 6e 74 73 20 69 64 65 Constraints ide
44c0: 6e 74 69 66 69 65 73 20 77 68 65 74 68 65 72 20 ntifies whether
44d0: 74 68 65 20 73 75 62 6a 65 63 74 20 6f 66 20 74 the subject of t
44e0: 68 65 20 63 65 72 74 20 69 73 20 61 20 43 41 20 he cert is a CA
44f0: 61 6e 64 0a 09 74 68 65 20 6d 61 78 20 64 65 70 and..the max dep
4500: 74 68 20 6f 66 20 76 61 6c 69 64 20 63 65 72 74 th of valid cert
4510: 20 70 61 74 68 73 20 74 68 61 74 20 69 6e 63 6c paths that incl
4520: 75 64 65 20 74 68 69 73 20 63 65 72 74 2e 0a 09 ude this cert...
4530: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e RFC 5280 section
4540: 20 34 2e 32 2e 31 2e 39 20 28 62 61 73 69 63 43 4.2.1.9 (basicC
4550: 6f 6e 73 74 72 61 69 6e 74 73 2c 20 4e 49 44 5f onstraints, NID_
4560: 62 61 73 69 63 5f 63 6f 6e 73 74 72 61 69 6e 74 basic_constraint
4570: 73 29 20 2a 2f 0a 20 20 20 20 69 66 20 28 78 66 s) */. if (xf
4580: 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 42 43 lags & EXFLAG_BC
4590: 4f 4e 53 20 7c 7c 20 78 66 6c 61 67 73 20 26 20 ONS || xflags &
45a0: 45 58 46 4c 41 47 5f 43 41 29 20 7b 0a 20 20 20 EXFLAG_CA) {.
45b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 20 }.. /* Name
45c0: 43 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20 6f Constraints is o
45d0: 6e 6c 79 20 75 73 65 64 20 69 6e 20 43 41 20 63 nly used in CA c
45e0: 65 72 74 73 20 74 6f 20 69 6e 64 69 63 61 74 65 erts to indicate
45f0: 20 61 20 6e 61 6d 65 20 73 70 61 63 65 20 77 69 a name space wi
4600: 74 68 69 6e 0a 09 77 68 69 63 68 20 61 6c 6c 20 thin..which all
4610: 73 75 62 6a 65 63 74 20 6e 61 6d 65 73 20 69 6e subject names in
4620: 20 73 75 62 73 65 71 75 65 6e 74 20 63 65 72 74 subsequent cert
4630: 69 66 69 63 61 74 65 73 20 69 6e 20 61 20 63 65 ificates in a ce
4640: 72 74 69 66 69 63 61 74 69 6f 6e 20 70 61 74 68 rtification path
4650: 0a 09 4d 55 53 54 20 62 65 20 6c 6f 63 61 74 65 ..MUST be locate
4660: 64 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 d. RFC 5280 sect
4670: 69 6f 6e 20 34 2e 32 2e 31 2e 31 30 2c 20 4e 49 ion 4.2.1.10, NI
4680: 44 5f 6e 61 6d 65 5f 63 6f 6e 73 74 72 61 69 6e D_name_constrain
4690: 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 50 6f ts */.. /* Po
46a0: 6c 69 63 79 20 43 6f 6e 73 74 72 61 69 6e 74 73 licy Constraints
46b0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e is only used in
46c0: 20 43 41 20 63 65 72 74 73 20 74 6f 20 6c 69 6d CA certs to lim
46d0: 69 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 it the length of
46e0: 20 61 0a 09 63 65 72 74 20 63 68 61 69 6e 20 74 a..cert chain t
46f0: 68 61 74 20 6d 61 79 20 62 65 20 69 73 73 75 65 hat may be issue
4700: 64 20 66 72 6f 6d 20 74 68 61 74 20 43 41 2e 20 d from that CA.
4710: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e RFC 5280 section
4720: 20 34 2e 32 2e 31 2e 31 31 2c 20 4e 49 44 5f 70 4.2.1.11, NID_p
4730: 6f 6c 69 63 79 5f 63 6f 6e 73 74 72 61 69 6e 74 olicy_constraint
4740: 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 78 74 s */.. /* Ext
4750: 65 6e 64 65 64 20 4b 65 79 20 55 73 61 67 65 20 ended Key Usage
4760: 69 6e 64 69 63 61 74 65 73 20 6f 6e 65 20 6f 72 indicates one or
4770: 20 6d 6f 72 65 20 70 75 72 70 6f 73 65 73 20 66 more purposes f
4780: 6f 72 20 77 68 69 63 68 20 74 68 65 20 63 65 72 or which the cer
4790: 74 69 66 69 65 64 0a 09 70 75 62 6c 69 63 20 6b tified..public k
47a0: 65 79 20 6d 61 79 20 62 65 20 75 73 65 64 2c 20 ey may be used,
47b0: 69 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 6f in addition to o
47c0: 72 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 r in place of th
47d0: 65 20 62 61 73 69 63 20 70 75 72 70 6f 73 65 73 e basic purposes
47e0: 2e 0a 09 52 46 43 20 35 32 38 30 20 73 65 63 74 ...RFC 5280 sect
47f0: 69 6f 6e 20 34 2e 32 2e 31 2e 31 32 2c 20 4e 49 ion 4.2.1.12, NI
4800: 44 5f 65 78 74 5f 6b 65 79 5f 75 73 61 67 65 20 D_ext_key_usage
4810: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f */. Tcl_ListO
4820: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
4830: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c interp, certPtr,
4840: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
4850: 6a 28 22 65 78 74 65 6e 64 65 64 4b 65 79 55 73 j("extendedKeyUs
4860: 61 67 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 age", -1));.
4870: 69 66 20 28 78 66 6c 61 67 73 20 26 20 45 58 46 if (xflags & EXF
4880: 4c 41 47 5f 58 4b 55 53 41 47 45 29 20 7b 0a 20 LAG_XKUSAGE) {.
4890: 20 20 20 75 73 61 67 65 20 3d 20 58 35 30 39 5f usage = X509_
48a0: 67 65 74 5f 65 78 74 65 6e 64 65 64 5f 6b 65 79 get_extended_key
48b0: 5f 75 73 61 67 65 28 63 65 72 74 29 3b 0a 09 54 _usage(cert);..T
48c0: 63 6c 5f 4f 62 6a 20 2a 74 6d 70 50 74 72 20 3d cl_Obj *tmpPtr =
48d0: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
48e0: 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 75 0, NULL);..if (u
48f0: 73 61 67 65 20 26 20 58 4b 55 5f 53 53 4c 5f 53 sage & XKU_SSL_S
4900: 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 54 63 ERVER) {.. Tc
4910: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
4920: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 74 lement(interp, t
4930: 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mpPtr, Tcl_NewSt
4940: 72 69 6e 67 4f 62 6a 28 22 54 4c 53 20 57 65 62 ringObj("TLS Web
4950: 20 53 65 72 76 65 72 20 41 75 74 68 65 6e 74 69 Server Authenti
4960: 63 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 cation", -1));..
4970: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 }..if (usage & X
4980: 4b 55 5f 53 53 4c 5f 43 4c 49 45 4e 54 29 20 7b KU_SSL_CLIENT) {
4990: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
49a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
49b0: 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 2c 20 54 nterp, tmpPtr, T
49c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
49d0: 22 54 4c 53 20 57 65 62 20 43 6c 69 65 6e 74 20 "TLS Web Client
49e0: 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 22 2c Authentication",
49f0: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 -1));..}..if (u
4a00: 73 61 67 65 20 26 20 58 4b 55 5f 53 4d 49 4d 45 sage & XKU_SMIME
4a10: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
4a20: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4a30: 74 28 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 t(interp, tmpPtr
4a40: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
4a50: 62 6a 28 22 45 2d 6d 61 69 6c 20 50 72 6f 74 65 bj("E-mail Prote
4a60: 63 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d ction", -1));..}
4a70: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b ..if (usage & XK
4a80: 55 5f 43 4f 44 45 5f 53 49 47 4e 29 20 7b 0a 09 U_CODE_SIGN) {..
4a90: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4aa0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4ab0: 65 72 70 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c erp, tmpPtr, Tcl
4ac0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 43 _NewStringObj("C
4ad0: 6f 64 65 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 ode Signing", -1
4ae0: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 ));..}..if (usag
4af0: 65 20 26 20 58 4b 55 5f 53 47 43 29 20 7b 0a 09 e & XKU_SGC) {..
4b00: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4b10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4b20: 65 72 70 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c erp, tmpPtr, Tcl
4b30: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 53 _NewStringObj("S
4b40: 47 43 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 GC", -1));..}..i
4b50: 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f 4f f (usage & XKU_O
4b60: 43 53 50 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 CSP_SIGN) {..
4b70: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4b80: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4b90: 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65 , tmpPtr, Tcl_Ne
4ba0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 4f 43 53 50 wStringObj("OCSP
4bb0: 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 3b Signing", -1));
4bc0: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 ..}..if (usage &
4bd0: 20 58 4b 55 5f 54 49 4d 45 53 54 41 4d 50 29 20 XKU_TIMESTAMP)
4be0: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
4bf0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
4c00: 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 2c 20 interp, tmpPtr,
4c10: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
4c20: 28 22 54 69 6d 65 20 53 74 61 6d 70 69 6e 67 22 ("Time Stamping"
4c30: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
4c40: 75 73 61 67 65 20 26 20 58 4b 55 5f 44 56 43 53 usage & XKU_DVCS
4c50: 20 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 ) {.. Tcl_Li
4c60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4c70: 6e 74 28 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 nt(interp, tmpPt
4c80: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
4c90: 4f 62 6a 28 22 44 56 43 53 22 2c 20 2d 31 29 29 Obj("DVCS", -1))
4ca0: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 ;..}..if (usage
4cb0: 26 20 58 4b 55 5f 41 4e 59 45 4b 55 29 20 7b 0a & XKU_ANYEKU) {.
4cc0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4cd0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4ce0: 74 65 72 70 2c 20 74 6d 70 50 74 72 2c 20 54 63 terp, tmpPtr, Tc
4cf0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
4d00: 41 6e 79 20 45 78 74 65 6e 64 65 64 20 4b 65 79 Any Extended Key
4d10: 20 55 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 09 Usage", -1));..
4d20: 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 }..Tcl_ListObjAp
4d30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
4d40: 72 70 2c 20 63 65 72 74 50 74 72 2c 20 74 6d 70 rp, certPtr, tmp
4d50: 50 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 Ptr);. } else
4d60: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
4d70: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4d80: 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 erp, certPtr, Tc
4d90: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
4da0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a ", -1));. }..
4db0: 20 20 20 20 2f 2a 20 43 52 4c 20 44 69 73 74 72 /* CRL Distr
4dc0: 69 62 75 74 69 6f 6e 20 50 6f 69 6e 74 73 20 65 ibution Points e
4dd0: 78 74 65 6e 73 69 6f 6e 20 69 64 65 6e 74 69 66 xtension identif
4de0: 69 65 73 20 68 6f 77 20 43 52 4c 20 69 6e 66 6f ies how CRL info
4df0: 72 6d 61 74 69 6f 6e 20 69 73 0a 09 6f 62 74 61 rmation is..obta
4e00: 69 6e 65 64 2e 20 52 46 43 20 35 32 38 30 20 73 ined. RFC 5280 s
4e10: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 33 2a ection 4.2.1.13*
4e20: 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 /. Tcl_ListOb
4e30: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
4e40: 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 nterp, certPtr,
4e50: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
4e60: 28 22 63 72 6c 44 69 73 74 72 69 62 75 74 69 6f ("crlDistributio
4e70: 6e 50 6f 69 6e 74 73 22 2c 20 2d 31 29 29 3b 0a nPoints", -1));.
4e80: 20 20 20 20 63 72 6c 20 3d 20 58 35 30 39 5f 67 crl = X509_g
4e90: 65 74 5f 65 78 74 5f 64 32 69 28 63 65 72 74 2c et_ext_d2i(cert,
4ea0: 20 4e 49 44 5f 63 72 6c 5f 64 69 73 74 72 69 62 NID_crl_distrib
4eb0: 75 74 69 6f 6e 5f 70 6f 69 6e 74 73 2c 20 4e 55 ution_points, NU
4ec0: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 LL, NULL);. i
4ed0: 66 20 28 63 72 6c 29 20 7b 0a 09 54 63 6c 5f 4f f (crl) {..Tcl_O
4ee0: 62 6a 20 2a 6e 61 6d 65 73 50 74 72 20 3d 20 54 bj *namesPtr = T
4ef0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
4f00: 20 4e 55 4c 4c 29 3b 0a 0a 09 66 6f 72 20 28 69 NULL);...for (i
4f10: 6e 74 20 69 3d 30 3b 20 69 20 3c 20 73 6b 5f 44 nt i=0; i < sk_D
4f20: 49 53 54 5f 50 4f 49 4e 54 5f 6e 75 6d 28 63 72 IST_POINT_num(cr
4f30: 6c 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 l); i++) {..
4f40: 44 49 53 54 5f 50 4f 49 4e 54 20 2a 64 70 20 3d DIST_POINT *dp =
4f50: 20 73 6b 5f 44 49 53 54 5f 50 4f 49 4e 54 5f 76 sk_DIST_POINT_v
4f60: 61 6c 75 65 28 63 72 6c 2c 20 69 29 3b 0a 09 20 alue(crl, i);..
4f70: 20 20 20 44 49 53 54 5f 50 4f 49 4e 54 5f 4e 41 DIST_POINT_NA
4f80: 4d 45 20 2a 64 69 73 74 70 6f 69 6e 74 20 3d 20 ME *distpoint =
4f90: 64 70 2d 3e 64 69 73 74 70 6f 69 6e 74 3b 0a 0a dp->distpoint;..
4fa0: 09 20 20 20 20 69 66 20 28 64 69 73 74 70 6f 69 . if (distpoi
4fb0: 6e 74 2d 3e 74 79 70 65 20 3d 3d 20 30 29 20 7b nt->type == 0) {
4fc0: 0a 09 09 2f 2a 20 66 75 6c 6c 6e 61 6d 65 20 47 .../* fullname G
4fd0: 45 4e 45 52 41 4c 49 5a 45 44 4e 41 4d 45 20 2a ENERALIZEDNAME *
4fe0: 2f 0a 09 09 66 6f 72 20 28 69 6e 74 20 6a 20 3d /...for (int j =
4ff0: 20 30 3b 20 6a 20 3c 20 73 6b 5f 47 45 4e 45 52 0; j < sk_GENER
5000: 41 4c 5f 4e 41 4d 45 5f 6e 75 6d 28 64 69 73 74 AL_NAME_num(dist
5010: 70 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c point->name.full
5020: 6e 61 6d 65 29 3b 20 6a 2b 2b 29 20 7b 0a 09 09 name); j++) {...
5030: 20 20 20 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 GENERAL_NAME
5040: 20 2a 67 65 6e 20 3d 20 73 6b 5f 47 45 4e 45 52 *gen = sk_GENER
5050: 41 4c 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 64 69 AL_NAME_value(di
5060: 73 74 70 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 66 75 stpoint->name.fu
5070: 6c 6c 6e 61 6d 65 2c 20 6a 29 3b 0a 09 09 20 20 llname, j);...
5080: 20 20 69 6e 74 20 74 79 70 65 3b 0a 09 09 20 20 int type;...
5090: 20 20 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 75 ASN1_STRING *u
50a0: 72 69 20 3d 20 47 45 4e 45 52 41 4c 5f 4e 41 4d ri = GENERAL_NAM
50b0: 45 5f 67 65 74 30 5f 76 61 6c 75 65 28 67 65 6e E_get0_value(gen
50c0: 2c 20 26 74 79 70 65 29 3b 0a 09 09 20 20 20 20 , &type);...
50d0: 69 66 20 28 74 79 70 65 20 3d 3d 20 47 45 4e 5f if (type == GEN_
50e0: 55 52 49 29 20 7b 0a 09 09 09 54 63 6c 5f 4c 69 URI) {....Tcl_Li
50f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
5100: 6e 74 28 69 6e 74 65 72 70 2c 20 6e 61 6d 65 73 nt(interp, names
5110: 50 74 72 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f Ptr,.... Tcl_
5120: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 NewStringObj((ch
5130: 61 72 2a 29 41 53 4e 31 5f 53 54 52 49 4e 47 5f ar*)ASN1_STRING_
5140: 67 65 74 30 5f 64 61 74 61 28 75 72 69 29 2c 20 get0_data(uri),
5150: 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 ASN1_STRING_leng
5160: 74 68 28 75 72 69 29 29 29 3b 0a 09 09 20 20 20 th(uri)));...
5170: 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c }...}.. } el
5180: 73 65 20 69 66 20 28 64 69 73 74 70 6f 69 6e 74 se if (distpoint
5190: 2d 3e 74 79 70 65 20 3d 3d 20 31 29 20 7b 0a 09 ->type == 1) {..
51a0: 09 2f 2a 20 72 65 6c 61 74 69 76 65 6e 61 6d 65 ./* relativename
51b0: 20 58 35 30 39 4e 41 4d 45 20 2a 2f 0a 09 09 53 X509NAME */...S
51c0: 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d TACK_OF(X509_NAM
51d0: 45 5f 45 4e 54 52 59 29 20 2a 73 6b 5f 72 65 6c E_ENTRY) *sk_rel
51e0: 6e 61 6d 65 20 3d 20 64 69 73 74 70 6f 69 6e 74 name = distpoint
51f0: 2d 3e 6e 61 6d 65 2e 72 65 6c 61 74 69 76 65 6e ->name.relativen
5200: 61 6d 65 3b 0a 09 09 66 6f 72 20 28 69 6e 74 20 ame;...for (int
5210: 6a 20 3d 20 30 3b 20 6a 20 3c 20 73 6b 5f 58 35 j = 0; j < sk_X5
5220: 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 5f 6e 75 09_NAME_ENTRY_nu
5230: 6d 28 73 6b 5f 72 65 6c 6e 61 6d 65 29 3b 20 6a m(sk_relname); j
5240: 2b 2b 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 ++) {... X509
5250: 5f 4e 41 4d 45 5f 45 4e 54 52 59 20 2a 65 20 3d _NAME_ENTRY *e =
5260: 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 45 4e sk_X509_NAME_EN
5270: 54 52 59 5f 76 61 6c 75 65 28 73 6b 5f 72 65 6c TRY_value(sk_rel
5280: 6e 61 6d 65 2c 20 6a 29 3b 0a 09 09 20 20 20 20 name, j);...
5290: 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 64 20 3d ASN1_STRING *d =
52a0: 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 X509_NAME_ENTRY
52b0: 5f 67 65 74 5f 64 61 74 61 28 65 29 3b 0a 09 09 _get_data(e);...
52c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
52d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
52e0: 65 72 70 2c 20 6e 61 6d 65 73 50 74 72 2c 20 54 erp, namesPtr, T
52f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
5300: 28 63 68 61 72 2a 29 41 53 4e 31 5f 53 54 52 49 (char*)ASN1_STRI
5310: 4e 47 5f 64 61 74 61 28 64 29 2c 20 41 53 4e 31 NG_data(d), ASN1
5320: 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 64 _STRING_length(d
5330: 29 29 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a )));...}.. }.
5340: 09 7d 0a 09 43 52 4c 5f 44 49 53 54 5f 50 4f 49 .}..CRL_DIST_POI
5350: 4e 54 53 5f 66 72 65 65 28 63 72 6c 29 3b 0a 09 NTS_free(crl);..
5360: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
5370: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
5380: 20 63 65 72 74 50 74 72 2c 20 6e 61 6d 65 73 50 certPtr, namesP
5390: 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 tr);. } else
53a0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
53b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
53c0: 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c rp, certPtr, Tcl
53d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 _NewStringObj(""
53e0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 , -1));. }..
53f0: 20 20 20 2f 2a 20 46 72 65 73 68 65 73 74 20 43 /* Freshest C
5400: 52 4c 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a RL extension */.
5410: 20 20 20 20 69 66 20 28 78 66 6c 61 67 73 20 26 if (xflags &
5420: 20 45 58 46 4c 41 47 5f 46 52 45 53 48 45 53 54 EXFLAG_FRESHEST
5430: 29 20 7b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ) {. }.. /
5440: 2a 20 41 75 74 68 6f 72 69 74 79 20 49 6e 66 6f * Authority Info
5450: 72 6d 61 74 69 6f 6e 20 41 63 63 65 73 73 20 69 rmation Access i
5460: 6e 64 69 63 61 74 65 73 20 68 6f 77 20 74 6f 20 ndicates how to
5470: 61 63 63 65 73 73 20 69 6e 66 6f 20 61 6e 64 20 access info and
5480: 73 65 72 76 69 63 65 73 0a 09 66 6f 72 20 74 68 services..for th
5490: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 e certificate is
54a0: 73 75 65 72 2e 20 54 48 69 73 20 69 6e 63 6c 75 suer. THis inclu
54b0: 64 65 73 20 6f 6e 2d 6c 69 6e 65 20 76 61 6c 69 des on-line vali
54c0: 64 61 74 69 6f 6e 20 73 65 72 76 69 63 65 73 0a dation services.
54d0: 09 61 6e 64 20 43 41 20 70 6f 6c 69 63 79 20 64 .and CA policy d
54e0: 61 74 61 2e 20 52 46 43 20 35 32 38 30 20 73 65 ata. RFC 5280 se
54f0: 63 74 69 6f 6e 20 34 2e 32 2e 32 2e 31 2c 20 4e ction 4.2.2.1, N
5500: 49 44 5f 69 6e 66 6f 5f 61 63 63 65 73 73 20 2a ID_info_access *
5510: 2f 0a 20 20 20 20 2f 2a 20 47 65 74 20 4f 6e 2d /. /* Get On-
5520: 6c 69 6e 65 20 43 65 72 74 69 66 69 63 61 74 65 line Certificate
5530: 20 53 74 61 74 75 73 20 50 72 6f 74 6f 63 6f 6c Status Protocol
5540: 20 28 4f 53 43 50 29 20 55 52 4c 20 2a 2f 0a 20 (OSCP) URL */.
5550: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
5560: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
5570: 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c rp, certPtr, Tcl
5580: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6f _NewStringObj("o
5590: 63 73 70 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 csp", -1));.
55a0: 6f 63 73 70 20 3d 20 58 35 30 39 5f 67 65 74 31 ocsp = X509_get1
55b0: 5f 6f 63 73 70 28 63 65 72 74 29 3b 0a 20 20 20 _ocsp(cert);.
55c0: 20 69 66 20 28 6f 63 73 70 29 20 7b 0a 09 54 63 if (ocsp) {..Tc
55d0: 6c 5f 4f 62 6a 20 2a 75 72 6c 73 50 74 72 20 3d l_Obj *urlsPtr =
55e0: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
55f0: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 66 6f 72 20 0, NULL);...for
5600: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 (int i = 0; i <
5610: 73 6b 5f 4f 50 45 4e 53 53 4c 5f 53 54 52 49 4e sk_OPENSSL_STRIN
5620: 47 5f 6e 75 6d 28 6f 63 73 70 29 3b 20 69 2b 2b G_num(ocsp); i++
5630: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
5640: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
5650: 74 28 69 6e 74 65 72 70 2c 20 75 72 6c 73 50 74 t(interp, urlsPt
5660: 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72 69 r,...Tcl_NewStri
5670: 6e 67 4f 62 6a 28 73 6b 5f 4f 50 45 4e 53 53 4c ngObj(sk_OPENSSL
5680: 5f 53 54 52 49 4e 47 5f 76 61 6c 75 65 28 6f 63 _STRING_value(oc
5690: 73 70 2c 20 69 29 2c 20 2d 31 29 29 3b 0a 09 7d sp, i), -1));..}
56a0: 0a 0a 09 58 35 30 39 5f 65 6d 61 69 6c 5f 66 72 ...X509_email_fr
56b0: 65 65 28 6f 63 73 70 29 3b 0a 09 2f 2a 20 73 6b ee(ocsp);../* sk
56c0: 5f 4f 50 45 4e 53 53 4c 5f 53 54 52 49 4e 47 5f _OPENSSL_STRING_
56d0: 66 72 65 65 28 6f 63 73 70 29 3b 20 2a 2f 0a 09 free(ocsp); */..
56e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
56f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
5700: 20 63 65 72 74 50 74 72 2c 20 75 72 6c 73 50 74 certPtr, urlsPt
5710: 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b r);. } else {
5720: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
5730: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
5740: 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f p, certPtr, Tcl_
5750: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c NewStringObj("",
5760: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 -1));. }..
5770: 20 20 2f 2a 20 43 41 20 49 73 73 75 65 72 73 20 /* CA Issuers
5780: 55 52 4c 20 63 61 49 73 73 75 65 72 73 20 2a 2f URL caIssuers */
5790: 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 .. /* Subject
57a0: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 41 63 63 Information Acc
57b0: 65 73 73 20 2d 20 52 46 43 20 35 32 38 30 20 73 ess - RFC 5280 s
57c0: 65 63 74 69 6f 6e 20 34 2e 32 2e 32 2e 32 2c 20 ection 4.2.2.2,
57d0: 4e 49 44 5f 73 69 6e 66 6f 5f 61 63 63 65 73 73 NID_sinfo_access
57e0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 */.. /* Cert
57f0: 69 66 69 63 61 74 65 20 41 6c 69 61 73 20 61 73 ificate Alias as
5800: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e 20 49 UTF-8 string. I
5810: 66 20 75 73 65 73 20 61 20 50 4b 43 53 23 31 32 f uses a PKCS#12
5820: 20 73 74 72 75 63 74 75 72 65 2c 20 61 6c 69 61 structure, alia
5830: 73 0a 09 77 69 6c 6c 20 72 65 66 6c 65 63 74 20 s..will reflect
5840: 74 68 65 20 66 72 69 65 6e 64 6c 79 4e 61 6d 65 the friendlyName
5850: 20 61 74 74 72 69 62 75 74 65 20 28 52 46 43 20 attribute (RFC
5860: 32 39 38 35 29 2e 20 2a 2f 0a 20 20 20 20 7b 0a 2985). */. {.
5870: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a .unsigned char *
5880: 62 73 74 72 69 6e 67 3b 0a 09 6c 65 6e 20 3d 20 bstring;..len =
5890: 30 3b 0a 09 62 73 74 72 69 6e 67 20 3d 20 58 35 0;..bstring = X5
58a0: 30 39 5f 61 6c 69 61 73 5f 67 65 74 30 28 63 65 09_alias_get0(ce
58b0: 72 74 2c 20 26 6c 65 6e 29 3b 0a 09 54 63 6c 5f rt, &len);..Tcl_
58c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
58d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 ment(interp, cer
58e0: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tPtr, Tcl_NewStr
58f0: 69 6e 67 4f 62 6a 28 22 61 6c 69 61 73 22 2c 20 ingObj("alias",
5900: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
5910: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
5920: 69 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c interp, certPtr,
5930: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
5940: 6a 28 28 63 68 61 72 20 2a 29 62 73 74 72 69 6e j((char *)bstrin
5950: 67 2c 20 6c 65 6e 29 29 3b 0a 20 20 20 20 7d 0a g, len));. }.
5960: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61 . /* All data
5970: 20 2a 2f 0a 20 20 20 20 7b 0a 09 63 68 61 72 20 */. {..char
5980: 63 65 72 74 53 74 72 5b 43 45 52 54 5f 53 54 52 certStr[CERT_STR
5990: 5f 53 49 5a 45 5d 3b 0a 09 6c 65 6e 20 3d 20 30 _SIZE];..len = 0
59a0: 3b 0a 0a 09 2f 2a 20 47 65 74 20 63 65 72 74 69 ;.../* Get certi
59b0: 66 69 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 50 ficate */..if (P
59c0: 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 EM_write_bio_X50
59d0: 39 28 62 69 6f 2c 20 63 65 72 74 29 29 20 7b 0a 9(bio, cert)) {.
59e0: 09 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 72 . len = BIO_r
59f0: 65 61 64 28 62 69 6f 2c 20 63 65 72 74 53 74 72 ead(bio, certStr
5a00: 2c 20 6d 69 6e 28 42 49 4f 5f 70 65 6e 64 69 6e , min(BIO_pendin
5a10: 67 28 62 69 6f 29 2c 20 43 45 52 54 5f 53 54 52 g(bio), CERT_STR
5a20: 5f 53 49 5a 45 29 29 3b 0a 09 20 20 20 20 28 76 _SIZE));.. (v
5a30: 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28 62 69 oid)BIO_flush(bi
5a40: 6f 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e o);.. if (len
5a50: 20 3c 20 30 29 20 7b 6c 65 6e 20 3d 20 30 3b 7d < 0) {len = 0;}
5a60: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
5a70: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
5a80: 6e 74 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 nterp, certPtr,
5a90: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
5aa0: 28 22 63 65 72 74 69 66 69 63 61 74 65 22 2c 20 ("certificate",
5ab0: 2d 31 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c -1));.. Tcl_L
5ac0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5ad0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 65 72 74 ent(interp, cert
5ae0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
5af0: 6e 67 4f 62 6a 28 63 65 72 74 53 74 72 2c 20 6c ngObj(certStr, l
5b00: 65 6e 29 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 en));..}.../* Ge
5b10: 74 20 61 6c 6c 20 63 65 72 74 20 69 6e 66 6f 20 t all cert info
5b20: 2a 2f 0a 09 69 66 20 28 58 35 30 39 5f 70 72 69 */..if (X509_pri
5b30: 6e 74 5f 65 78 28 62 69 6f 2c 20 63 65 72 74 2c nt_ex(bio, cert,
5b40: 20 66 6c 61 67 73 2c 20 30 29 29 20 7b 0a 09 20 flags, 0)) {..
5b50: 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 72 65 61 len = BIO_rea
5b60: 64 28 62 69 6f 2c 20 63 65 72 74 53 74 72 2c 20 d(bio, certStr,
5b70: 6d 69 6e 28 42 49 4f 5f 70 65 6e 64 69 6e 67 28 min(BIO_pending(
5b80: 62 69 6f 29 2c 20 43 45 52 54 5f 53 54 52 5f 53 bio), CERT_STR_S
5b90: 49 5a 45 29 29 3b 0a 09 20 20 20 20 28 76 6f 69 IZE));.. (voi
5ba0: 64 29 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 d)BIO_flush(bio)
5bb0: 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3c ;.. if (len <
5bc0: 20 30 29 20 7b 6c 65 6e 20 3d 20 30 3b 7d 0a 09 0) {len = 0;}..
5bd0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
5be0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
5bf0: 65 72 70 2c 20 63 65 72 74 50 74 72 2c 20 54 63 erp, certPtr, Tc
5c00: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
5c10: 61 6c 6c 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 all", -1));..
5c20: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5c30: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5c40: 2c 20 63 65 72 74 50 74 72 2c 20 54 63 6c 5f 4e , certPtr, Tcl_N
5c50: 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 65 72 74 ewStringObj(cert
5c60: 53 74 72 2c 20 6c 65 6e 29 29 3b 0a 09 7d 0a 20 Str, len));..}.
5c70: 20 20 20 7d 0a 0a 20 20 20 20 42 49 4f 5f 66 72 }.. BIO_fr
5c80: 65 65 28 62 69 6f 29 3b 0a 20 20 20 20 72 65 74 ee(bio);. ret
5c90: 75 72 6e 20 63 65 72 74 50 74 72 3b 0a 7d 0a urn certPtr;.}.