0000: 2f 2a 0a 20 2a 20 50 61 72 73 65 20 58 2e 35 30 /*. * Parse X.50
0010: 39 20 63 65 72 74 69 66 69 63 61 74 65 73 20 61 9 certificates a
0020: 6e 64 20 72 65 74 75 72 6e 20 63 6f 6e 74 65 6e nd return conten
0030: 74 73 20 61 73 20 61 20 54 43 4c 20 6b 65 79 2d ts as a TCL key-
0040: 76 61 6c 75 65 20 6c 69 73 74 2e 0a 20 2a 0a 20 value list.. *.
0050: 2a 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 * Copyright (C)
0060: 31 39 39 37 2d 32 30 30 30 20 53 65 6e 73 75 73 1997-2000 Sensus
0070: 20 43 6f 6e 73 75 6c 74 69 6e 67 20 4c 74 64 2e Consulting Ltd.
0080: 0a 20 2a 20 4d 61 74 74 20 4e 65 77 6d 61 6e 20 . * Matt Newman
0090: 3c 6d 61 74 74 40 73 65 6e 73 75 73 2e 6f 72 67 <matt@sensus.org
00a0: 3e 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 >. * Copyright (
00b0: 43 29 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 C) 2023 Brian O'
00c0: 48 61 67 61 6e 0a 20 2a 2f 0a 23 69 6e 63 6c 75 Hagan. */.#inclu
00d0: 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e 63 6c de <tcl.h>.#incl
00e0: 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 ude <stdio.h>.#i
00f0: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0100: 62 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 bio.h>.#include
0110: 3c 6f 70 65 6e 73 73 6c 2f 73 68 61 2e 68 3e 0a <openssl/sha.h>.
0120: 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 #include <openss
0130: 6c 2f 78 35 30 39 2e 68 3e 0a 23 69 6e 63 6c 75 l/x509.h>.#inclu
0140: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 78 35 30 39 de <openssl/x509
0150: 76 33 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c v3.h>.#include <
0160: 6f 70 65 6e 73 73 6c 2f 78 35 30 39 5f 76 66 79 openssl/x509_vfy
0170: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 .h>.#include <op
0180: 65 6e 73 73 6c 2f 61 73 6e 31 2e 68 3e 0a 23 69 enssl/asn1.h>.#i
0190: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 nclude "tlsInt.h
01a0: 22 0a 0a 2f 2a 20 44 65 66 69 6e 65 20 6d 61 78 "../* Define max
01b0: 69 6d 75 6d 20 63 65 72 74 69 66 69 63 61 74 65 imum certificate
01c0: 20 73 69 7a 65 2e 20 4d 61 78 20 50 45 4d 20 73 size. Max PEM s
01d0: 69 7a 65 20 31 30 30 6b 42 20 61 6e 64 20 44 45 ize 100kB and DE
01e0: 52 20 73 69 7a 65 20 69 73 20 32 34 6b 42 2e 20 R size is 24kB.
01f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 45 52 54 5f */.#define CERT_
0200: 53 54 52 5f 53 49 5a 45 20 32 34 35 37 36 0a 0a STR_SIZE 24576..
0210: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
0220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0260: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 72 69 6e ----. *. * Strin
0270: 67 5f 74 6f 5f 48 65 78 20 2d 2d 0a 20 2a 0a 20 g_to_Hex --. *.
0280: 2a 09 46 6f 72 6d 61 74 20 63 6f 6e 74 65 6e 74 *.Format content
0290: 73 20 6f 66 20 61 20 62 69 6e 61 72 79 20 73 74 s of a binary st
02a0: 72 69 6e 67 20 61 73 20 61 20 68 65 78 20 73 74 ring as a hex st
02b0: 72 69 6e 67 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ring. *. * Resul
02c0: 74 73 3a 0a 20 2a 09 54 43 4c 20 62 79 74 65 20 ts:. *.TCL byte
02d0: 61 72 72 61 79 20 6f 62 6a 65 63 74 20 77 69 74 array object wit
02e0: 68 20 78 35 30 39 20 69 64 65 6e 74 69 66 69 65 h x509 identifie
02f0: 72 20 61 73 20 61 20 68 65 78 20 73 74 72 69 6e r as a hex strin
0300: 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 45 66 66 g. *. * Side Eff
0310: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ects:. *.None. *
0320: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
0330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0370: 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 53 74 . */.Tcl_Obj *St
0380: 72 69 6e 67 5f 74 6f 5f 48 65 78 28 75 6e 73 69 ring_to_Hex(unsi
0390: 67 6e 65 64 20 63 68 61 72 2a 20 69 6e 70 75 74 gned char* input
03a0: 2c 20 69 6e 74 20 69 6c 65 6e 29 20 7b 0a 20 20 , int ilen) {.
03b0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
03c0: 2a 69 70 74 72 20 3d 20 69 6e 70 75 74 3b 0a 20 *iptr = input;.
03d0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 Tcl_Obj *resu
03e0: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 ltObj = Tcl_NewB
03f0: 79 74 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c yteArrayObj(NULL
0400: 2c 20 30 29 3b 0a 20 20 20 20 75 6e 73 69 67 6e , 0);. unsign
0410: 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 ed char *data =
0420: 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 Tcl_SetByteArray
0430: 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a Length(resultObj
0440: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 69 6c 65 6e , (Tcl_Size)ilen
0450: 2a 32 29 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 *2);. unsigne
0460: 64 20 63 68 61 72 20 2a 64 70 74 72 20 3d 20 26 d char *dptr = &
0470: 64 61 74 61 5b 30 5d 3b 0a 20 20 20 20 63 6f 6e data[0];. con
0480: 73 74 20 63 68 61 72 20 2a 68 65 78 20 3d 20 22 st char *hex = "
0490: 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 0123456789abcdef
04a0: 22 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 ";.. if (resu
04b0: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b ltObj == NULL) {
04c0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
04d0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 69 }.. for (i
04e0: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 69 6c nt i = 0; i < il
04f0: 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 2a 64 70 74 en; i++) {..*dpt
0500: 72 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 r++ = (unsigned
0510: 63 68 61 72 29 68 65 78 5b 28 2a 69 70 74 72 3e char)hex[(*iptr>
0520: 3e 34 29 26 30 78 46 5d 3b 0a 09 2a 64 70 74 72 >4)&0xF];..*dptr
0530: 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 ++ = (unsigned c
0540: 68 61 72 29 68 65 78 5b 28 2a 69 70 74 72 2b 2b har)hex[(*iptr++
0550: 29 26 30 78 46 5d 3b 0a 20 20 20 20 7d 0a 20 20 )&0xF];. }.
0560: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f return resultO
0570: 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d bj;.}../*. *----
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
05d0: 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 20 2d 2d BIO_to_Buffer --
05e0: 0a 20 2a 0a 20 2a 09 4f 75 74 70 75 74 20 63 6f . *. *.Output co
05f0: 6e 74 65 6e 74 73 20 6f 66 20 61 20 42 49 4f 20 ntents of a BIO
0600: 74 6f 20 61 20 62 75 66 66 65 72 0a 20 2a 0a 20 to a buffer. *.
0610: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 * Results:. *.Re
0620: 74 75 72 6e 73 20 6c 65 6e 67 74 68 20 6f 66 20 turns length of
0630: 73 74 72 69 6e 67 20 69 6e 20 62 75 66 66 65 72 string in buffer
0640: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
0650: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a cts:. *.None. *.
0660: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
06b0: 20 2a 2f 0a 54 63 6c 5f 53 69 7a 65 20 42 49 4f */.Tcl_Size BIO
06c0: 5f 74 6f 5f 42 75 66 66 65 72 28 69 6e 74 20 72 _to_Buffer(int r
06d0: 65 73 75 6c 74 2c 20 42 49 4f 20 2a 62 69 6f 2c esult, BIO *bio,
06e0: 20 76 6f 69 64 20 2a 6f 75 74 70 75 74 2c 20 69 void *output, i
06f0: 6e 74 20 6f 6c 65 6e 29 20 7b 0a 20 20 20 20 54 nt olen) {. T
0700: 63 6c 5f 53 69 7a 65 20 6c 65 6e 20 3d 20 30 3b cl_Size len = 0;
0710: 0a 20 20 20 20 69 6e 74 20 70 65 6e 64 69 6e 67 . int pending
0720: 20 3d 20 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 = BIO_pending(b
0730: 69 6f 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 io);.. if (re
0740: 73 75 6c 74 29 20 7b 0a 09 6c 65 6e 20 3d 20 28 sult) {..len = (
0750: 54 63 6c 5f 53 69 7a 65 29 20 42 49 4f 5f 72 65 Tcl_Size) BIO_re
0760: 61 64 28 62 69 6f 2c 20 6f 75 74 70 75 74 2c 20 ad(bio, output,
0770: 28 70 65 6e 64 69 6e 67 20 3c 20 6f 6c 65 6e 29 (pending < olen)
0780: 20 3f 20 70 65 6e 64 69 6e 67 20 3a 20 6f 6c 65 ? pending : ole
0790: 6e 29 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f 66 n);..(void)BIO_f
07a0: 6c 75 73 68 28 62 69 6f 29 3b 0a 09 69 66 20 28 lush(bio);..if (
07b0: 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 20 20 20 20 len < 0) {..
07c0: 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 20 20 20 20 len = 0;..}.
07d0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e }. return len
07e0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0830: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
0840: 6c 73 5f 78 35 30 39 45 78 74 65 6e 73 69 6f 6e ls_x509Extension
0850: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 6c s --. *. *.Get l
0860: 69 73 74 20 6f 66 20 58 2e 35 30 39 20 43 65 72 ist of X.509 Cer
0870: 74 69 66 69 63 61 74 65 20 45 78 74 65 6e 73 69 tificate Extensi
0880: 6f 6e 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ons. *. * Result
0890: 73 3a 0a 20 2a 09 54 43 4c 20 6c 69 73 74 20 6f s:. *.TCL list o
08a0: 66 20 65 78 74 65 6e 73 69 6f 6e 73 20 61 6e 64 f extensions and
08b0: 20 62 6f 6f 6c 65 61 6e 20 63 72 69 74 69 63 61 boolean critica
08c0: 6c 20 73 74 61 74 75 73 0a 20 2a 0a 20 2a 20 53 l status. *. * S
08d0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
08e0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d None. *. *------
08f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f -------. */.Tcl_
0940: 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 45 78 74 Obj *Tls_x509Ext
0950: 65 6e 73 69 6f 6e 73 28 54 63 6c 5f 49 6e 74 65 ensions(Tcl_Inte
0960: 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 rp *interp, X509
0970: 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 63 6f *cert) {. co
0980: 6e 73 74 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 nst STACK_OF(X50
0990: 39 5f 45 58 54 45 4e 53 49 4f 4e 29 20 2a 65 78 9_EXTENSION) *ex
09a0: 74 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 ts;. Tcl_Obj
09b0: 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c *resultObj = Tcl
09c0: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
09d0: 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 ULL);.. if (r
09e0: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c esultObj == NULL
09f0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c ) {..return NULL
0a00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
0a10: 28 28 65 78 74 73 20 3d 20 58 35 30 39 5f 67 65 ((exts = X509_ge
0a20: 74 30 5f 65 78 74 65 6e 73 69 6f 6e 73 28 63 65 t0_extensions(ce
0a30: 72 74 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a rt)) != NULL) {.
0a40: 09 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b 20 69 .for (int i=0; i
0a50: 20 3c 20 58 35 30 39 5f 67 65 74 5f 65 78 74 5f < X509_get_ext_
0a60: 63 6f 75 6e 74 28 63 65 72 74 29 3b 20 69 2b 2b count(cert); i++
0a70: 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 45 58 ) {.. X509_EX
0a80: 54 45 4e 53 49 4f 4e 20 2a 65 78 20 3d 20 73 6b TENSION *ex = sk
0a90: 5f 58 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f _X509_EXTENSION_
0aa0: 76 61 6c 75 65 28 65 78 74 73 2c 20 69 29 3b 0a value(exts, i);.
0ab0: 09 20 20 20 20 41 53 4e 31 5f 4f 42 4a 45 43 54 . ASN1_OBJECT
0ac0: 20 2a 6f 62 6a 20 3d 20 58 35 30 39 5f 45 58 54 *obj = X509_EXT
0ad0: 45 4e 53 49 4f 4e 5f 67 65 74 5f 6f 62 6a 65 63 ENSION_get_objec
0ae0: 74 28 65 78 29 3b 0a 09 20 20 20 20 2f 2a 20 41 t(ex);.. /* A
0af0: 53 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49 4e 47 SN1_OCTET_STRING
0b00: 20 2a 64 61 74 61 20 3d 20 58 35 30 39 5f 45 58 *data = X509_EX
0b10: 54 45 4e 53 49 4f 4e 5f 67 65 74 5f 64 61 74 61 TENSION_get_data
0b20: 28 65 78 29 3b 20 2a 2f 0a 09 20 20 20 20 69 6e (ex); */.. in
0b30: 74 20 63 72 69 74 69 63 61 6c 20 3d 20 58 35 30 t critical = X50
0b40: 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74 5f 9_EXTENSION_get_
0b50: 63 72 69 74 69 63 61 6c 28 65 78 29 3b 0a 09 20 critical(ex);..
0b60: 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 LAPPEND_BOOL(
0b70: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
0b80: 6a 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 4f 42 j, OBJ_nid2ln(OB
0b90: 4a 5f 6f 62 6a 32 6e 69 64 28 6f 62 6a 29 29 2c J_obj2nid(obj)),
0ba0: 20 63 72 69 74 69 63 61 6c 29 3b 0a 09 7d 0a 20 critical);..}.
0bb0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
0bc0: 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a resultObj;.}../*
0bd0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c20: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39 49 . *. * Tls_x509I
0c30: 64 65 6e 74 69 66 69 65 72 20 2d 2d 0a 20 2a 0a dentifier --. *.
0c40: 20 2a 09 47 65 74 20 58 2e 35 30 39 20 63 65 72 *.Get X.509 cer
0c50: 74 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 tificate Authori
0c60: 74 79 20 6f 72 20 53 75 62 6a 65 63 74 20 4b 65 ty or Subject Ke
0c70: 79 20 49 64 65 6e 74 69 66 69 65 72 73 0a 20 2a y Identifiers. *
0c80: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
0c90: 54 43 4c 20 62 79 74 65 20 61 72 72 61 79 20 6f TCL byte array o
0ca0: 62 6a 65 63 74 20 77 69 74 68 20 78 35 30 39 20 bject with x509
0cb0: 69 64 65 6e 74 69 66 69 65 72 20 61 73 20 61 20 identifier as a
0cc0: 68 65 78 20 73 74 72 69 6e 67 0a 20 2a 0a 20 2a hex string. *. *
0cd0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
0ce0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d *.None. *. *----
0cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 ---------. */.Tc
0d40: 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 49 l_Obj *Tls_x509I
0d50: 64 65 6e 74 69 66 69 65 72 28 63 6f 6e 73 74 20 dentifier(const
0d60: 41 53 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49 4e ASN1_OCTET_STRIN
0d70: 47 20 2a 61 73 74 72 69 6e 67 29 20 7b 0a 20 20 G *astring) {.
0d80: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c Tcl_Obj *resul
0d90: 74 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 tObj = NULL;..
0da0: 20 20 69 66 20 28 61 73 74 72 69 6e 67 20 21 3d if (astring !=
0db0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 75 6c 74 NULL) {..result
0dc0: 4f 62 6a 20 3d 20 53 74 72 69 6e 67 5f 74 6f 5f Obj = String_to_
0dd0: 48 65 78 28 28 75 6e 73 69 67 6e 65 64 20 63 68 Hex((unsigned ch
0de0: 61 72 20 2a 29 41 53 4e 31 5f 53 54 52 49 4e 47 ar *)ASN1_STRING
0df0: 5f 67 65 74 30 5f 64 61 74 61 28 61 73 74 72 69 _get0_data(astri
0e00: 6e 67 29 2c 0a 09 20 20 20 20 41 53 4e 31 5f 53 ng),.. ASN1_S
0e10: 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 61 73 74 TRING_length(ast
0e20: 72 69 6e 67 29 29 3b 0a 20 20 20 20 7d 0a 20 20 ring));. }.
0e30: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f return resultO
0e40: 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d bj;.}../*. *----
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
0ea0: 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65 Tls_x509KeyUsage
0eb0: 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 58 2e --. *. *.Get X.
0ec0: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 509 certificate
0ed0: 6b 65 79 20 75 73 61 67 65 20 74 79 70 65 73 0a key usage types.
0ee0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
0ef0: 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 74 79 *.Tcl list of ty
0f00: 70 65 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 pes. *. * Side e
0f10: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a ffects:. *.None.
0f20: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f70: 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a --. */.Tcl_Obj *
0f80: 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65 Tls_x509KeyUsage
0f90: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
0fa0: 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c erp, X509 *cert,
0fb0: 20 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 73 uint32_t xflags
0fc0: 29 20 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 ) {. uint32_t
0fd0: 20 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 usage = X509_ge
0fe0: 74 5f 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74 t_key_usage(cert
0ff0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a );. Tcl_Obj *
1000: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f resultObj = Tcl_
1010: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
1020: 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 LL);.. if (re
1030: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 sultObj == NULL)
1040: 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b {..return NULL;
1050: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
1060: 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 (xflags & EXFLAG
1070: 5f 4b 55 53 41 47 45 29 20 26 26 20 75 73 61 67 _KUSAGE) && usag
1080: 65 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58 29 20 e < UINT32_MAX)
1090: 7b 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b {..if (usage & K
10a0: 55 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 54 U_DIGITAL_SIGNAT
10b0: 55 52 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f URE) {.. Tcl_
10c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 ment(interp, res
10e0: 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 ultObj, Tcl_NewS
10f0: 74 72 69 6e 67 4f 62 6a 28 22 44 69 67 69 74 61 tringObj("Digita
1100: 6c 20 53 69 67 6e 61 74 75 72 65 22 2c 20 2d 31 l Signature", -1
1110: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 ));..}..if (usag
1120: 65 20 26 20 4b 55 5f 4e 4f 4e 5f 52 45 50 55 44 e & KU_NON_REPUD
1130: 49 41 54 49 4f 4e 29 20 7b 0a 09 20 20 20 20 54 IATION) {.. T
1140: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1150: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
1160: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e resultObj, Tcl_N
1170: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 6f 6e ewStringObj("Non
1180: 2d 52 65 70 75 64 69 61 74 69 6f 6e 22 2c 20 2d -Repudiation", -
1190: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 1));..}..if (usa
11a0: 67 65 20 26 20 4b 55 5f 4b 45 59 5f 45 4e 43 49 ge & KU_KEY_ENCI
11b0: 50 48 45 52 4d 45 4e 54 29 20 7b 0a 09 20 20 20 PHERMENT) {..
11c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
11d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11e0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c , resultObj, Tcl
11f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4b _NewStringObj("K
1200: 65 79 20 45 6e 63 69 70 68 65 72 6d 65 6e 74 22 ey Encipherment"
1210: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
1220: 75 73 61 67 65 20 26 20 4b 55 5f 44 41 54 41 5f usage & KU_DATA_
1230: 45 4e 43 49 50 48 45 52 4d 45 4e 54 29 20 7b 0a ENCIPHERMENT) {.
1240: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1250: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1260: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
1270: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1280: 6a 28 22 44 61 74 61 20 45 6e 63 69 70 68 65 72 j("Data Encipher
1290: 6d 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a ment", -1));..}.
12a0: 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f .if (usage & KU_
12b0: 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 29 20 7b KEY_AGREEMENT) {
12c0: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
12d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
12e0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
12f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
1300: 62 6a 28 22 4b 65 79 20 41 67 72 65 65 6d 65 6e bj("Key Agreemen
1310: 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 t", -1));..}..if
1320: 20 28 75 73 61 67 65 20 26 20 4b 55 5f 4b 45 59 (usage & KU_KEY
1330: 5f 43 45 52 54 5f 53 49 47 4e 29 20 7b 0a 09 20 _CERT_SIGN) {..
1340: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
1350: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
1360: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 rp, resultObj, T
1370: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1380: 22 43 65 72 74 69 66 69 63 61 74 65 20 53 69 67 "Certificate Sig
1390: 6e 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a ning", -1));..}.
13a0: 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f .if (usage & KU_
13b0: 43 52 4c 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 CRL_SIGN) {..
13c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
13d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
13e0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c , resultObj, Tcl
13f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 43 _NewStringObj("C
1400: 52 4c 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 RL Signing", -1)
1410: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 );..}..if (usage
1420: 20 26 20 4b 55 5f 45 4e 43 49 50 48 45 52 5f 4f & KU_ENCIPHER_O
1430: 4e 4c 59 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f NLY) {.. Tcl_
1440: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1450: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 ment(interp, res
1460: 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 ultObj, Tcl_NewS
1470: 74 72 69 6e 67 4f 62 6a 28 22 45 6e 63 69 70 68 tringObj("Enciph
1480: 65 72 20 4f 6e 6c 79 22 2c 20 2d 31 29 29 3b 0a er Only", -1));.
1490: 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 .}..if (usage &
14a0: 4b 55 5f 44 45 43 49 50 48 45 52 5f 4f 4e 4c 59 KU_DECIPHER_ONLY
14b0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
14c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
14d0: 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 t(interp, result
14e0: 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Obj, Tcl_NewStri
14f0: 6e 67 4f 62 6a 28 22 44 65 63 69 70 68 65 72 20 ngObj("Decipher
1500: 4f 6e 6c 79 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a Only", -1));..}.
1510: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 } else {..
1520: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
1530: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1540: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 p, resultObj, Tc
1550: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
1560: 75 6e 72 65 73 74 72 69 63 74 65 64 22 2c 20 2d unrestricted", -
1570: 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 1));. }. r
1580: 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b eturn resultObj;
1590: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
15a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
15f0: 5f 78 35 30 39 50 75 72 70 6f 73 65 20 2d 2d 0a _x509Purpose --.
1600: 20 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30 39 20 *. *.Get X.509
1610: 63 65 72 74 69 66 69 63 61 74 65 20 70 75 72 70 certificate purp
1620: 6f 73 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ose. *. * Result
1630: 73 3a 0a 20 2a 09 50 75 72 70 6f 73 65 20 73 74 s:. *.Purpose st
1640: 72 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ring. *. * Side
1650: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
1660: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
1670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b0: 2d 2d 2d 0a 20 2a 2f 0a 63 6f 6e 73 74 20 63 68 ---. */.const ch
16c0: 61 72 20 2a 54 6c 73 5f 78 35 30 39 50 75 72 70 ar *Tls_x509Purp
16d0: 6f 73 65 28 58 35 30 39 20 2a 63 65 72 74 29 20 ose(X509 *cert)
16e0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 {. const char
16f0: 20 2a 70 75 72 70 6f 73 65 20 3d 20 4e 55 4c 4c *purpose = NULL
1700: 3b 0a 0a 20 20 20 20 69 66 20 28 58 35 30 39 5f ;.. if (X509_
1710: 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 check_purpose(ce
1720: 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 rt, X509_PURPOSE
1730: 5f 53 53 4c 5f 43 4c 49 45 4e 54 2c 20 30 29 20 _SSL_CLIENT, 0)
1740: 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 > 0) {..purpose
1750: 3d 20 22 53 53 4c 20 43 6c 69 65 6e 74 22 3b 0a = "SSL Client";.
1760: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 58 } else if (X
1770: 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 509_check_purpos
1780: 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 e(cert, X509_PUR
1790: 50 4f 53 45 5f 53 53 4c 5f 53 45 52 56 45 52 2c POSE_SSL_SERVER,
17a0: 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 0) > 0) {..purp
17b0: 6f 73 65 20 3d 20 22 53 53 4c 20 53 65 72 76 65 ose = "SSL Serve
17c0: 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 r";. } else i
17d0: 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 f (X509_check_pu
17e0: 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 rpose(cert, X509
17f0: 5f 50 55 52 50 4f 53 45 5f 4e 53 5f 53 53 4c 5f _PURPOSE_NS_SSL_
1800: 53 45 52 56 45 52 2c 20 30 29 20 3e 20 30 29 20 SERVER, 0) > 0)
1810: 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 4d 53 {..purpose = "MS
1820: 53 20 53 53 4c 20 53 65 72 76 65 72 22 3b 0a 20 S SSL Server";.
1830: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35 } else if (X5
1840: 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 09_check_purpose
1850: 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 (cert, X509_PURP
1860: 4f 53 45 5f 53 4d 49 4d 45 5f 53 49 47 4e 2c 20 OSE_SMIME_SIGN,
1870: 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 0) > 0) {..purpo
1880: 73 65 20 3d 20 22 53 4d 49 4d 45 20 53 69 67 6e se = "SMIME Sign
1890: 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ing";. } else
18a0: 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f if (X509_check_
18b0: 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 purpose(cert, X5
18c0: 30 39 5f 50 55 52 50 4f 53 45 5f 53 4d 49 4d 45 09_PURPOSE_SMIME
18d0: 5f 45 4e 43 52 59 50 54 2c 20 30 29 20 3e 20 30 _ENCRYPT, 0) > 0
18e0: 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 ) {..purpose = "
18f0: 53 4d 49 4d 45 20 45 6e 63 72 79 70 74 69 6f 6e SMIME Encryption
1900: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ";. } else if
1910: 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 (X509_check_pur
1920: 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f pose(cert, X509_
1930: 50 55 52 50 4f 53 45 5f 43 52 4c 5f 53 49 47 4e PURPOSE_CRL_SIGN
1940: 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 , 0) > 0) {..pur
1950: 70 6f 73 65 20 3d 20 22 43 52 4c 20 53 69 67 6e pose = "CRL Sign
1960: 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ing";. } else
1970: 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f if (X509_check_
1980: 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 purpose(cert, X5
1990: 30 39 5f 50 55 52 50 4f 53 45 5f 41 4e 59 2c 20 09_PURPOSE_ANY,
19a0: 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 0) > 0) {..purpo
19b0: 73 65 20 3d 20 22 41 6e 79 22 3b 0a 20 20 20 20 se = "Any";.
19c0: 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f } else if (X509_
19d0: 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 check_purpose(ce
19e0: 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 rt, X509_PURPOSE
19f0: 5f 4f 43 53 50 5f 48 45 4c 50 45 52 2c 20 30 29 _OCSP_HELPER, 0)
1a00: 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 > 0) {..purpose
1a10: 20 3d 20 22 4f 43 53 50 20 48 65 6c 70 65 72 22 = "OCSP Helper"
1a20: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
1a30: 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 (X509_check_purp
1a40: 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 ose(cert, X509_P
1a50: 55 52 50 4f 53 45 5f 54 49 4d 45 53 54 41 4d 50 URPOSE_TIMESTAMP
1a60: 5f 53 49 47 4e 2c 20 30 29 20 3e 20 30 29 20 7b _SIGN, 0) > 0) {
1a70: 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 54 69 6d ..purpose = "Tim
1a80: 65 73 74 61 6d 70 20 53 69 67 6e 69 6e 67 22 3b estamp Signing";
1a90: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 . } else {..p
1aa0: 75 72 70 6f 73 65 20 3d 20 22 22 3b 0a 20 20 20 urpose = "";.
1ab0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 75 }. return pu
1ac0: 72 70 6f 73 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d rpose;.}../*. *-
1ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
1b20: 20 2a 20 54 6c 73 5f 78 35 30 39 50 75 72 70 6f * Tls_x509Purpo
1b30: 73 65 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 ses --. *. *.Get
1b40: 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 X.509 certifica
1b50: 74 65 20 70 75 72 70 6f 73 65 20 74 79 70 65 73 te purpose types
1b60: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
1b70: 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 65 *.Tcl list of e
1b80: 61 63 68 20 70 75 72 70 6f 73 65 20 61 6e 64 20 ach purpose and
1b90: 77 68 65 74 68 65 72 20 69 74 20 69 73 20 43 41 whether it is CA
1ba0: 20 6f 72 20 6e 6f 6e 2d 43 41 0a 20 2a 0a 20 2a or non-CA. *. *
1bb0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
1bc0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d *.None. *. *----
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 ---------. */.Tc
1c20: 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 50 l_Obj *Tls_x509P
1c30: 75 72 70 6f 73 65 73 28 54 63 6c 5f 49 6e 74 65 urposes(Tcl_Inte
1c40: 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 rp *interp, X509
1c50: 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 54 63 *cert) {. Tc
1c60: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a l_Obj *resultObj
1c70: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
1c80: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 j(0, NULL);.
1c90: 58 35 30 39 5f 50 55 52 50 4f 53 45 20 2a 70 74 X509_PURPOSE *pt
1ca0: 6d 70 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 mp;.. if (res
1cb0: 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 ultObj == NULL)
1cc0: 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a {..return NULL;.
1cd0: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 }.. for (
1ce0: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 58 int i = 0; i < X
1cf0: 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 5f 509_PURPOSE_get_
1d00: 63 6f 75 6e 74 28 29 3b 20 69 2b 2b 29 20 7b 0a count(); i++) {.
1d10: 09 70 74 6d 70 20 3d 20 58 35 30 39 5f 50 55 52 .ptmp = X509_PUR
1d20: 50 4f 53 45 5f 67 65 74 30 28 69 29 3b 0a 09 54 POSE_get0(i);..T
1d30: 63 6c 5f 4f 62 6a 20 2a 74 6d 70 50 74 72 20 3d cl_Obj *tmpPtr =
1d40: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
1d50: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 66 6f 72 20 0, NULL);...for
1d60: 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 3c 20 (int j = 0; j <
1d70: 32 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 69 2; j++) {.. i
1d80: 6e 74 20 69 64 72 65 74 20 3d 20 58 35 30 39 5f nt idret = X509_
1d90: 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 check_purpose(ce
1da0: 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 rt, X509_PURPOSE
1db0: 5f 67 65 74 5f 69 64 28 70 74 6d 70 29 2c 20 6a _get_id(ptmp), j
1dc0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 );.. Tcl_List
1dd0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1de0: 28 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 2c (interp, tmpPtr,
1df0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1e00: 6a 28 6a 20 3f 20 22 43 41 22 20 3a 20 22 6e 6f j(j ? "CA" : "no
1e10: 6e 43 41 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 nCA", -1));..
1e20: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
1e30: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
1e40: 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65 , tmpPtr, Tcl_Ne
1e50: 77 53 74 72 69 6e 67 4f 62 6a 28 69 64 72 65 74 wStringObj(idret
1e60: 20 3d 3d 20 31 20 3f 20 22 59 65 73 22 20 3a 20 == 1 ? "Yes" :
1e70: 22 4e 6f 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 "No", -1));..}..
1e80: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 LAPPEND_OBJ(inte
1e90: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 58 rp, resultObj, X
1ea0: 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 30 509_PURPOSE_get0
1eb0: 5f 6e 61 6d 65 28 70 74 6d 70 29 2c 20 74 6d 70 _name(ptmp), tmp
1ec0: 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 Ptr);. }.
1ed0: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a return resultObj
1ee0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
1ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
1f40: 73 5f 78 35 30 39 4e 61 6d 65 73 20 2d 2d 0a 20 s_x509Names --.
1f50: 2a 0a 20 2a 09 47 65 74 20 61 20 6c 69 73 74 20 *. *.Get a list
1f60: 6f 66 20 53 75 62 6a 65 63 74 20 41 6c 74 65 72 of Subject Alter
1f70: 6e 61 74 65 20 4e 61 6d 65 73 20 28 53 41 4e 29 nate Names (SAN)
1f80: 20 6f 72 20 49 73 73 75 65 72 20 41 6c 74 65 72 or Issuer Alter
1f90: 6e 61 74 65 20 4e 61 6d 65 73 0a 20 2a 0a 20 2a nate Names. *. *
1fa0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 6c Results:. *.Tcl
1fb0: 20 6c 69 73 74 20 6f 66 20 61 6c 74 65 72 6e 61 list of alterna
1fc0: 74 65 20 6e 61 6d 65 73 0a 20 2a 0a 20 2a 20 53 te names. *. * S
1fd0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
1fe0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d None. *. *------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2030: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f -------. */.Tcl_
2040: 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 4e 61 6d Obj *Tls_x509Nam
2050: 65 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 es(Tcl_Interp *i
2060: 6e 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 nterp, X509 *cer
2070: 74 2c 20 69 6e 74 20 6e 69 64 2c 20 42 49 4f 20 t, int nid, BIO
2080: 2a 62 69 6f 29 20 7b 0a 20 20 20 20 53 54 41 43 *bio) {. STAC
2090: 4b 5f 4f 46 28 47 45 4e 45 52 41 4c 5f 4e 41 4d K_OF(GENERAL_NAM
20a0: 45 29 20 2a 6e 61 6d 65 73 3b 0a 20 20 20 20 54 E) *names;. T
20b0: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 cl_Obj *resultOb
20c0: 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f j = Tcl_NewListO
20d0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 bj(0, NULL);.
20e0: 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 Tcl_Size len;.
20f0: 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 char buffer[1
2100: 30 32 34 5d 3b 0a 0a 20 20 20 20 69 66 20 28 72 024];.. if (r
2110: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c esultObj == NULL
2120: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c ) {..return NULL
2130: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
2140: 28 28 6e 61 6d 65 73 20 3d 20 28 53 54 41 43 4b ((names = (STACK
2150: 5f 4f 46 28 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 _OF(GENERAL_NAME
2160: 29 20 2a 29 58 35 30 39 5f 67 65 74 5f 65 78 74 ) *)X509_get_ext
2170: 5f 64 32 69 28 63 65 72 74 2c 20 6e 69 64 2c 20 _d2i(cert, nid,
2180: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 NULL, NULL)) !=
2190: 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e NULL) {..for (in
21a0: 74 20 69 3d 30 3b 20 69 20 3c 20 73 6b 5f 47 45 t i=0; i < sk_GE
21b0: 4e 45 52 41 4c 5f 4e 41 4d 45 5f 6e 75 6d 28 6e NERAL_NAME_num(n
21c0: 61 6d 65 73 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 ames); i++) {..
21d0: 20 20 20 63 6f 6e 73 74 20 47 45 4e 45 52 41 4c const GENERAL
21e0: 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b _NAME *name = sk
21f0: 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 76 61 _GENERAL_NAME_va
2200: 6c 75 65 28 6e 61 6d 65 73 2c 20 69 29 3b 0a 0a lue(names, i);..
2210: 09 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 . len = BIO_t
2220: 6f 5f 42 75 66 66 65 72 28 6e 61 6d 65 20 26 26 o_Buffer(name &&
2230: 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70 72 GENERAL_NAME_pr
2240: 69 6e 74 28 62 69 6f 2c 20 28 47 45 4e 45 52 41 int(bio, (GENERA
2250: 4c 5f 4e 41 4d 45 20 2a 29 20 6e 61 6d 65 29 2c L_NAME *) name),
2260: 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 31 30 bio, buffer, 10
2270: 32 34 29 3b 0a 09 20 20 20 20 4c 41 50 50 45 4e 24);.. LAPPEN
2280: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 D_STR(interp, re
2290: 73 75 6c 74 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 62 sultObj, NULL, b
22a0: 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 09 7d 0a uffer, len);..}.
22b0: 09 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 .sk_GENERAL_NAME
22c0: 5f 70 6f 70 5f 66 72 65 65 28 6e 61 6d 65 73 2c _pop_free(names,
22d0: 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 66 72 GENERAL_NAME_fr
22e0: 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ee);. }. r
22f0: 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b eturn resultObj;
2300: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
2310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2350: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
2360: 5f 78 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 _x509ExtKeyUsage
2370: 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 61 20 --. *. *.Get a
2380: 6c 69 73 74 20 6f 66 20 45 78 74 65 6e 64 65 64 list of Extended
2390: 20 4b 65 79 20 55 73 61 67 65 73 0a 20 2a 0a 20 Key Usages. *.
23a0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 63 * Returns:. *.Tc
23b0: 6c 20 6c 69 73 74 20 6f 66 20 75 73 61 67 65 73 l list of usages
23c0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
23d0: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a cts:. *.None. *.
23e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
23f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2430: 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 */.Tcl_Obj *Tls
2440: 5f 78 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 _x509ExtKeyUsage
2450: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
2460: 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c erp, X509 *cert,
2470: 20 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 73 uint32_t xflags
2480: 29 20 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 ) {. uint32_t
2490: 20 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 usage = X509_ge
24a0: 74 5f 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74 t_key_usage(cert
24b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a );. Tcl_Obj *
24c0: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f resultObj = Tcl_
24d0: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
24e0: 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 LL);.. if (re
24f0: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 sultObj == NULL)
2500: 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b {..return NULL;
2510: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
2520: 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 (xflags & EXFLAG
2530: 5f 58 4b 55 53 41 47 45 29 20 26 26 20 75 73 61 _XKUSAGE) && usa
2540: 67 65 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58 29 ge < UINT32_MAX)
2550: 20 7b 0a 09 75 73 61 67 65 20 3d 20 58 35 30 39 {..usage = X509
2560: 5f 67 65 74 5f 65 78 74 65 6e 64 65 64 5f 6b 65 _get_extended_ke
2570: 79 5f 75 73 61 67 65 28 63 65 72 74 29 3b 0a 0a y_usage(cert);..
2580: 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 .if (usage & XKU
2590: 5f 53 53 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09 _SSL_SERVER) {..
25a0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
25b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
25c0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
25d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
25e0: 28 22 54 4c 53 20 57 65 62 20 53 65 72 76 65 72 ("TLS Web Server
25f0: 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 22 Authentication"
2600: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
2610: 75 73 61 67 65 20 26 20 58 4b 55 5f 53 53 4c 5f usage & XKU_SSL_
2620: 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 54 CLIENT) {.. T
2630: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2640: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2650: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e resultObj, Tcl_N
2660: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 4c 53 ewStringObj("TLS
2670: 20 57 65 62 20 43 6c 69 65 6e 74 20 41 75 74 68 Web Client Auth
2680: 65 6e 74 69 63 61 74 69 6f 6e 22 2c 20 2d 31 29 entication", -1)
2690: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 );..}..if (usage
26a0: 20 26 20 58 4b 55 5f 53 4d 49 4d 45 29 20 7b 0a & XKU_SMIME) {.
26b0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
26c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
26d0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
26e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
26f0: 6a 28 22 45 2d 6d 61 69 6c 20 50 72 6f 74 65 63 j("E-mail Protec
2700: 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a tion", -1));..}.
2710: 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 .if (usage & XKU
2720: 5f 43 4f 44 45 5f 53 49 47 4e 29 20 7b 0a 09 20 _CODE_SIGN) {..
2730: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2740: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2750: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 rp, resultObj, T
2760: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
2770: 22 43 6f 64 65 20 53 69 67 6e 69 6e 67 22 2c 20 "Code Signing",
2780: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 -1));..}..if (us
2790: 61 67 65 20 26 20 58 4b 55 5f 53 47 43 29 20 7b age & XKU_SGC) {
27a0: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
27b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
27c0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
27d0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
27e0: 62 6a 28 22 53 47 43 22 2c 20 2d 31 29 29 3b 0a bj("SGC", -1));.
27f0: 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 .}..if (usage &
2800: 58 4b 55 5f 4f 43 53 50 5f 53 49 47 4e 29 20 7b XKU_OCSP_SIGN) {
2810: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
2820: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2830: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
2840: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
2850: 62 6a 28 22 4f 43 53 50 20 53 69 67 6e 69 6e 67 bj("OCSP Signing
2860: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 ", -1));..}..if
2870: 28 75 73 61 67 65 20 26 20 58 4b 55 5f 54 49 4d (usage & XKU_TIM
2880: 45 53 54 41 4d 50 29 20 7b 0a 09 20 20 20 20 54 ESTAMP) {.. T
2890: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
28a0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
28b0: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e resultObj, Tcl_N
28c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 69 6d ewStringObj("Tim
28d0: 65 20 53 74 61 6d 70 69 6e 67 22 2c 20 2d 31 29 e Stamping", -1)
28e0: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 );..}..if (usage
28f0: 20 26 20 58 4b 55 5f 44 56 43 53 20 29 20 7b 0a & XKU_DVCS ) {.
2900: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2910: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2920: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
2930: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
2940: 6a 28 22 44 56 43 53 22 2c 20 2d 31 29 29 3b 0a j("DVCS", -1));.
2950: 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 .}..if (usage &
2960: 58 4b 55 5f 41 4e 59 45 4b 55 29 20 7b 0a 09 20 XKU_ANYEKU) {..
2970: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2980: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2990: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 rp, resultObj, T
29a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
29b0: 22 41 6e 79 20 45 78 74 65 6e 64 65 64 20 4b 65 "Any Extended Ke
29c0: 79 20 55 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a y Usage", -1));.
29d0: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a .}. } else {.
29e0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
29f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2a00: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
2a10: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
2a20: 6a 28 22 75 6e 72 65 73 74 72 69 63 74 65 64 22 j("unrestricted"
2a30: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 , -1));. }.
2a40: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f return resultO
2a50: 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d bj;.}../*. *----
2a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
2ab0: 54 6c 73 5f 78 35 30 39 43 72 6c 44 70 20 2d 2d Tls_x509CrlDp --
2ac0: 0a 20 2a 0a 20 2a 09 47 65 74 20 6c 69 73 74 20 . *. *.Get list
2ad0: 6f 66 20 43 52 4c 20 44 69 73 74 72 69 62 75 74 of CRL Distribut
2ae0: 69 6f 6e 20 50 6f 69 6e 74 73 0a 20 2a 0a 20 2a ion Points. *. *
2af0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 63 6c Returns:. *.Tcl
2b00: 20 6c 69 73 74 20 6f 66 20 55 52 49 73 20 61 6e list of URIs an
2b10: 64 20 72 65 6c 61 74 69 76 65 2d 6e 61 6d 65 73 d relative-names
2b20: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
2b30: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a cts:. *.None. *.
2b40: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
2b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2b90: 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 */.Tcl_Obj *Tls
2ba0: 5f 78 35 30 39 43 72 6c 44 70 28 54 63 6c 5f 49 _x509CrlDp(Tcl_I
2bb0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 nterp *interp, X
2bc0: 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 509 *cert) {.
2bd0: 20 53 54 41 43 4b 5f 4f 46 28 44 49 53 54 5f 50 STACK_OF(DIST_P
2be0: 4f 49 4e 54 29 20 2a 63 72 6c 3b 0a 20 20 20 20 OINT) *crl;.
2bf0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f Tcl_Obj *resultO
2c00: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 bj = Tcl_NewList
2c10: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 Obj(0, NULL);..
2c20: 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a if (resultObj
2c30: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
2c40: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
2c50: 0a 20 20 20 20 69 66 20 28 28 63 72 6c 20 3d 20 . if ((crl =
2c60: 28 53 54 41 43 4b 5f 4f 46 28 44 49 53 54 5f 50 (STACK_OF(DIST_P
2c70: 4f 49 4e 54 29 20 2a 29 58 35 30 39 5f 67 65 74 OINT) *)X509_get
2c80: 5f 65 78 74 5f 64 32 69 28 63 65 72 74 2c 20 4e _ext_d2i(cert, N
2c90: 49 44 5f 63 72 6c 5f 64 69 73 74 72 69 62 75 74 ID_crl_distribut
2ca0: 69 6f 6e 5f 70 6f 69 6e 74 73 2c 20 4e 55 4c 4c ion_points, NULL
2cb0: 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c , NULL)) != NULL
2cc0: 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69 3d ) {..for (int i=
2cd0: 30 3b 20 69 20 3c 20 73 6b 5f 44 49 53 54 5f 50 0; i < sk_DIST_P
2ce0: 4f 49 4e 54 5f 6e 75 6d 28 63 72 6c 29 3b 20 69 OINT_num(crl); i
2cf0: 2b 2b 29 20 7b 0a 09 20 20 20 20 44 49 53 54 5f ++) {.. DIST_
2d00: 50 4f 49 4e 54 20 2a 64 70 20 3d 20 73 6b 5f 44 POINT *dp = sk_D
2d10: 49 53 54 5f 50 4f 49 4e 54 5f 76 61 6c 75 65 28 IST_POINT_value(
2d20: 63 72 6c 2c 20 69 29 3b 0a 09 20 20 20 20 44 49 crl, i);.. DI
2d30: 53 54 5f 50 4f 49 4e 54 5f 4e 41 4d 45 20 2a 64 ST_POINT_NAME *d
2d40: 69 73 74 70 6f 69 6e 74 20 3d 20 64 70 2d 3e 64 istpoint = dp->d
2d50: 69 73 74 70 6f 69 6e 74 3b 0a 0a 09 20 20 20 20 istpoint;...
2d60: 69 66 20 28 64 69 73 74 70 6f 69 6e 74 2d 3e 74 if (distpoint->t
2d70: 79 70 65 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a ype == 0) {.../*
2d80: 20 66 75 6c 6c 2d 6e 61 6d 65 20 47 45 4e 45 52 full-name GENER
2d90: 41 4c 49 5a 45 44 4e 41 4d 45 20 2a 2f 0a 09 09 ALIZEDNAME */...
2da0: 66 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20 for (int j = 0;
2db0: 6a 20 3c 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e j < sk_GENERAL_N
2dc0: 41 4d 45 5f 6e 75 6d 28 64 69 73 74 70 6f 69 6e AME_num(distpoin
2dd0: 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c 6e 61 6d 65 t->name.fullname
2de0: 29 3b 20 6a 2b 2b 29 20 7b 0a 09 09 20 20 20 20 ); j++) {...
2df0: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 20 2a 67 65 GENERAL_NAME *ge
2e00: 6e 20 3d 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e n = sk_GENERAL_N
2e10: 41 4d 45 5f 76 61 6c 75 65 28 64 69 73 74 70 6f AME_value(distpo
2e20: 69 6e 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c 6e 61 int->name.fullna
2e30: 6d 65 2c 20 6a 29 3b 0a 09 09 20 20 20 20 69 6e me, j);... in
2e40: 74 20 74 79 70 65 3b 0a 09 09 20 20 20 20 41 53 t type;... AS
2e50: 4e 31 5f 53 54 52 49 4e 47 20 2a 75 72 69 20 3d N1_STRING *uri =
2e60: 20 28 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 29 (ASN1_STRING *)
2e70: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 67 65 74 GENERAL_NAME_get
2e80: 30 5f 76 61 6c 75 65 28 67 65 6e 2c 20 26 74 79 0_value(gen, &ty
2e90: 70 65 29 3b 0a 09 09 20 20 20 20 69 66 20 28 74 pe);... if (t
2ea0: 79 70 65 20 3d 3d 20 47 45 4e 5f 55 52 49 29 20 ype == GEN_URI)
2eb0: 7b 0a 09 09 09 4c 41 50 50 45 4e 44 5f 53 54 52 {....LAPPEND_STR
2ec0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
2ed0: 62 6a 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c bj, (char *) NUL
2ee0: 4c 2c 20 28 63 68 61 72 20 2a 29 20 41 53 4e 31 L, (char *) ASN1
2ef0: 5f 53 54 52 49 4e 47 5f 67 65 74 30 5f 64 61 74 _STRING_get0_dat
2f00: 61 28 75 72 69 29 2c 20 28 54 63 6c 5f 53 69 7a a(uri), (Tcl_Siz
2f10: 65 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c e) ASN1_STRING_l
2f20: 65 6e 67 74 68 28 75 72 69 29 29 3b 0a 09 09 20 ength(uri));...
2f30: 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 20 }...}.. }
2f40: 65 6c 73 65 20 69 66 20 28 64 69 73 74 70 6f 69 else if (distpoi
2f50: 6e 74 2d 3e 74 79 70 65 20 3d 3d 20 31 29 20 7b nt->type == 1) {
2f60: 0a 09 09 2f 2a 20 72 65 6c 61 74 69 76 65 2d 6e .../* relative-n
2f70: 61 6d 65 20 58 35 30 39 4e 41 4d 45 20 2a 2f 0a ame X509NAME */.
2f80: 09 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f ..STACK_OF(X509_
2f90: 4e 41 4d 45 5f 45 4e 54 52 59 29 20 2a 73 6b 5f NAME_ENTRY) *sk_
2fa0: 72 65 6c 6e 61 6d 65 20 3d 20 64 69 73 74 70 6f relname = distpo
2fb0: 69 6e 74 2d 3e 6e 61 6d 65 2e 72 65 6c 61 74 69 int->name.relati
2fc0: 76 65 6e 61 6d 65 3b 0a 09 09 66 6f 72 20 28 69 vename;...for (i
2fd0: 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 3c 20 73 6b nt j = 0; j < sk
2fe0: 5f 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 _X509_NAME_ENTRY
2ff0: 5f 6e 75 6d 28 73 6b 5f 72 65 6c 6e 61 6d 65 29 _num(sk_relname)
3000: 3b 20 6a 2b 2b 29 20 7b 0a 09 09 20 20 20 20 58 ; j++) {... X
3010: 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 20 2a 509_NAME_ENTRY *
3020: 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 e = sk_X509_NAME
3030: 5f 45 4e 54 52 59 5f 76 61 6c 75 65 28 73 6b 5f _ENTRY_value(sk_
3040: 72 65 6c 6e 61 6d 65 2c 20 6a 29 3b 0a 09 09 20 relname, j);...
3050: 20 20 20 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a ASN1_STRING *
3060: 64 20 3d 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e d = X509_NAME_EN
3070: 54 52 59 5f 67 65 74 5f 64 61 74 61 28 65 29 3b TRY_get_data(e);
3080: 0a 09 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 ... LAPPEND_S
3090: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c TR(interp, resul
30a0: 74 4f 62 6a 2c 20 28 63 68 61 72 20 2a 29 20 4e tObj, (char *) N
30b0: 55 4c 4c 2c 20 28 63 68 61 72 20 2a 29 20 41 53 ULL, (char *) AS
30c0: 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74 30 5f 64 N1_STRING_get0_d
30d0: 61 74 61 28 64 29 2c 20 28 54 63 6c 5f 53 69 7a ata(d), (Tcl_Siz
30e0: 65 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c e) ASN1_STRING_l
30f0: 65 6e 67 74 68 28 64 29 29 3b 0a 09 09 7d 0a 09 ength(d));...}..
3100: 20 20 20 20 7d 0a 09 7d 0a 09 43 52 4c 5f 44 49 }..}..CRL_DI
3110: 53 54 5f 50 4f 49 4e 54 53 5f 66 72 65 65 28 63 ST_POINTS_free(c
3120: 72 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 rl);. }. r
3130: 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b eturn resultObj;
3140: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3190: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
31a0: 5f 78 35 30 39 4f 73 63 70 0a 20 2a 0a 20 2a 09 _x509Oscp. *. *.
31b0: 47 65 74 20 6c 69 73 74 20 6f 66 20 4f 6e 2d 6c Get list of On-l
31c0: 69 6e 65 20 43 65 72 74 69 66 69 63 61 74 65 20 ine Certificate
31d0: 53 74 61 74 75 73 20 50 72 6f 74 6f 63 6f 6c 20 Status Protocol
31e0: 28 4f 53 43 50 29 20 55 52 49 73 0a 20 2a 0a 20 (OSCP) URIs. *.
31f0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 * Results:. *.Tc
3200: 6c 20 6c 69 73 74 20 6f 66 20 55 52 49 73 0a 20 l list of URIs.
3210: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
3220: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
3230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
3280: 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 /.Tcl_Obj *Tls_x
3290: 35 30 39 4f 73 63 70 28 54 63 6c 5f 49 6e 74 65 509Oscp(Tcl_Inte
32a0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 rp *interp, X509
32b0: 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 53 54 *cert) {. ST
32c0: 41 43 4b 5f 4f 46 28 4f 50 45 4e 53 53 4c 5f 53 ACK_OF(OPENSSL_S
32d0: 54 52 49 4e 47 29 20 2a 6f 63 73 70 3b 0a 20 20 TRING) *ocsp;.
32e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c Tcl_Obj *resul
32f0: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 tObj = Tcl_NewLi
3300: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
3310: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f . if (resultO
3320: 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 bj == NULL) {..r
3330: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
3340: 7d 0a 0a 20 20 20 20 69 66 20 28 28 6f 63 73 70 }.. if ((ocsp
3350: 20 3d 20 58 35 30 39 5f 67 65 74 31 5f 6f 63 73 = X509_get1_ocs
3360: 70 28 63 65 72 74 29 29 20 21 3d 20 4e 55 4c 4c p(cert)) != NULL
3370: 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 ) {..for (int i
3380: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 4f 50 45 4e = 0; i < sk_OPEN
3390: 53 53 4c 5f 53 54 52 49 4e 47 5f 6e 75 6d 28 6f SSL_STRING_num(o
33a0: 63 73 70 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 csp); i++) {..
33b0: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
33c0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
33d0: 20 4e 55 4c 4c 2c 20 73 6b 5f 4f 50 45 4e 53 53 NULL, sk_OPENSS
33e0: 4c 5f 53 54 52 49 4e 47 5f 76 61 6c 75 65 28 6f L_STRING_value(o
33f0: 63 73 70 2c 20 69 29 2c 20 2d 31 29 3b 0a 09 7d csp, i), -1);..}
3400: 0a 09 58 35 30 39 5f 65 6d 61 69 6c 5f 66 72 65 ..X509_email_fre
3410: 65 28 6f 63 73 70 29 3b 0a 20 20 20 20 7d 0a 20 e(ocsp);. }.
3420: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 return result
3430: 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d Obj;.}../*. *---
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
3490: 20 54 6c 73 5f 78 35 30 39 43 61 49 73 73 75 65 Tls_x509CaIssue
34a0: 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 rs --. *. *.Get
34b0: 6c 69 73 74 20 6f 66 20 43 65 72 74 69 66 69 63 list of Certific
34c0: 61 74 65 20 41 75 74 68 6f 72 69 74 79 20 28 43 ate Authority (C
34d0: 41 29 20 49 73 73 75 65 72 20 55 52 49 73 0a 20 A) Issuer URIs.
34e0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
34f0: 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 43 41 20 .Tcl list of CA
3500: 69 73 73 75 65 72 20 55 52 49 73 0a 20 2a 0a 20 issuer URIs. *.
3510: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
3520: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *.None. *. *---
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 ----------. */.T
3580: 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 cl_Obj *Tls_x509
3590: 43 61 49 73 73 75 65 72 73 28 54 63 6c 5f 49 6e CaIssuers(Tcl_In
35a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 terp *interp, X5
35b0: 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 09 *cert) {.
35c0: 53 54 41 43 4b 5f 4f 46 28 41 43 43 45 53 53 5f STACK_OF(ACCESS_
35d0: 44 45 53 43 52 49 50 54 49 4f 4e 29 20 2a 61 64 DESCRIPTION) *ad
35e0: 73 3b 0a 20 20 20 20 41 43 43 45 53 53 5f 44 45 s;. ACCESS_DE
35f0: 53 43 52 49 50 54 49 4f 4e 20 2a 61 64 3b 0a 20 SCRIPTION *ad;.
3600: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 Tcl_Obj *resu
3610: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c ltObj = Tcl_NewL
3620: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
3630: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
3640: 61 72 20 2a 62 75 66 3b 0a 0a 20 20 20 20 69 66 ar *buf;.. if
3650: 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e (resultObj == N
3660: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e ULL) {..return N
3670: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
3680: 69 66 20 28 28 61 64 73 20 3d 20 28 53 54 41 43 if ((ads = (STAC
3690: 4b 5f 4f 46 28 41 43 43 45 53 53 5f 44 45 53 43 K_OF(ACCESS_DESC
36a0: 52 49 50 54 49 4f 4e 29 20 2a 29 58 35 30 39 5f RIPTION) *)X509_
36b0: 67 65 74 5f 65 78 74 5f 64 32 69 28 63 65 72 74 get_ext_d2i(cert
36c0: 2c 20 4e 49 44 5f 69 6e 66 6f 5f 61 63 63 65 73 , NID_info_acces
36d0: 73 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 s, NULL, NULL))
36e0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 != NULL) {..for
36f0: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 (int i = 0; i <
3700: 73 6b 5f 41 43 43 45 53 53 5f 44 45 53 43 52 49 sk_ACCESS_DESCRI
3710: 50 54 49 4f 4e 5f 6e 75 6d 28 61 64 73 29 3b 20 PTION_num(ads);
3720: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 61 64 20 3d i++) {.. ad =
3730: 20 28 41 43 43 45 53 53 5f 44 45 53 43 52 49 50 (ACCESS_DESCRIP
3740: 54 49 4f 4e 20 2a 29 73 6b 5f 41 43 43 45 53 53 TION *)sk_ACCESS
3750: 5f 44 45 53 43 52 49 50 54 49 4f 4e 5f 76 61 6c _DESCRIPTION_val
3760: 75 65 28 61 64 73 2c 20 69 29 3b 0a 09 20 20 20 ue(ads, i);..
3770: 20 69 66 20 28 4f 42 4a 5f 6f 62 6a 32 6e 69 64 if (OBJ_obj2nid
3780: 28 61 64 2d 3e 6d 65 74 68 6f 64 29 20 3d 3d 20 (ad->method) ==
3790: 4e 49 44 5f 61 64 5f 63 61 5f 69 73 73 75 65 72 NID_ad_ca_issuer
37a0: 73 20 26 26 20 61 64 2d 3e 6c 6f 63 61 74 69 6f s && ad->locatio
37b0: 6e 29 20 7b 0a 09 09 69 66 20 28 61 64 2d 3e 6c n) {...if (ad->l
37c0: 6f 63 61 74 69 6f 6e 2d 3e 74 79 70 65 20 3d 3d ocation->type ==
37d0: 20 47 45 4e 5f 55 52 49 29 20 7b 0a 09 09 20 20 GEN_URI) {...
37e0: 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 20 3d Tcl_Size len =
37f0: 20 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31 (Tcl_Size) ASN1
3800: 5f 53 54 52 49 4e 47 5f 74 6f 5f 55 54 46 38 28 _STRING_to_UTF8(
3810: 26 62 75 66 2c 20 61 64 2d 3e 6c 6f 63 61 74 69 &buf, ad->locati
3820: 6f 6e 2d 3e 64 2e 75 6e 69 66 6f 72 6d 52 65 73 on->d.uniformRes
3830: 6f 75 72 63 65 49 64 65 6e 74 69 66 69 65 72 29 ourceIdentifier)
3840: 3b 0a 09 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 ;... Tcl_List
3850: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3860: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
3870: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e bj, Tcl_NewStrin
3880: 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 20 62 75 gObj((char *) bu
3890: 66 2c 20 6c 65 6e 29 29 3b 0a 09 09 20 20 20 20 f, len));...
38a0: 4f 50 45 4e 53 53 4c 5f 66 72 65 65 28 62 75 66 OPENSSL_free(buf
38b0: 29 3b 0a 09 09 20 20 20 20 62 72 65 61 6b 3b 0a );... break;.
38c0: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f ..}.. }..}../
38d0: 2a 20 73 6b 5f 41 43 43 45 53 53 5f 44 45 53 43 * sk_ACCESS_DESC
38e0: 52 49 50 54 49 4f 4e 5f 70 6f 70 5f 66 72 65 65 RIPTION_pop_free
38f0: 28 61 64 73 2c 20 41 43 43 45 53 53 5f 44 45 53 (ads, ACCESS_DES
3900: 43 52 49 50 54 49 4f 4e 5f 66 72 65 65 29 3b 20 CRIPTION_free);
3910: 2a 2f 0a 09 41 55 54 48 4f 52 49 54 59 5f 49 4e */..AUTHORITY_IN
3920: 46 4f 5f 41 43 43 45 53 53 5f 66 72 65 65 28 61 FO_ACCESS_free(a
3930: 64 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ds);. }. r
3940: 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b eturn resultObj;
3950: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
39b0: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 20 2d 2d 0a s_NewX509Obj --.
39c0: 20 2a 0a 20 2a 09 50 61 72 73 65 73 20 61 20 58 *. *.Parses a X
39d0: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 509 certificate
39e0: 61 6e 64 20 72 65 74 75 72 6e 73 20 63 6f 6e 74 and returns cont
39f0: 65 6e 74 73 20 61 73 20 61 20 6b 65 79 2d 76 61 ents as a key-va
3a00: 6c 75 65 20 54 63 6c 20 6c 69 73 74 2e 0a 20 2a lue Tcl list.. *
3a10: 0a 20 2a 20 52 65 73 75 6c 74 3a 0a 20 2a 09 41 . * Result:. *.A
3a20: 20 54 63 6c 20 4c 69 73 74 20 77 69 74 68 20 74 Tcl List with t
3a30: 68 65 20 58 35 30 39 20 63 65 72 74 69 66 69 63 he X509 certific
3a40: 61 74 65 20 69 6e 66 6f 20 61 73 20 61 20 6b 65 ate info as a ke
3a50: 79 2d 76 61 6c 75 65 20 6c 69 73 74 0a 20 2a 0a y-value list. *.
3a60: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
3a70: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d . *.None. *. *--
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
3ad0: 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 4e 65 77 Tcl_Obj *Tls_New
3ae0: 58 35 30 39 4f 62 6a 28 54 63 6c 5f 49 6e 74 65 X509Obj(Tcl_Inte
3af0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 rp *interp, X509
3b00: 20 2a 63 65 72 74 2c 20 69 6e 74 20 61 6c 6c 29 *cert, int all)
3b10: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
3b20: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f resultObj = Tcl_
3b30: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
3b40: 4c 4c 29 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 LL);. BIO *bi
3b50: 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f o = BIO_new(BIO_
3b60: 73 5f 6d 65 6d 28 29 29 3b 0a 20 20 20 20 69 6e s_mem());. in
3b70: 74 20 6d 64 6e 69 64 2c 20 70 6b 6e 69 64 2c 20 t mdnid, pknid,
3b80: 62 69 74 73 3b 0a 20 20 20 20 54 63 6c 5f 53 69 bits;. Tcl_Si
3b90: 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 ze len;. unsi
3ba0: 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 20 gned int ulen;.
3bb0: 20 20 20 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 uint32_t xfla
3bc0: 67 73 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 gs;. unsigned
3bd0: 20 6c 6f 6e 67 20 66 6c 61 67 73 20 3d 20 58 4e long flags = XN
3be0: 5f 46 4c 41 47 5f 52 46 43 32 32 35 33 20 7c 20 _FLAG_RFC2253 |
3bf0: 41 53 4e 31 5f 53 54 52 46 4c 47 53 5f 55 54 46 ASN1_STRFLGS_UTF
3c00: 38 5f 43 4f 4e 56 45 52 54 3b 0a 20 20 20 20 66 8_CONVERT;. f
3c10: 6c 61 67 73 20 26 3d 20 7e 28 75 6e 73 69 67 6e lags &= ~(unsign
3c20: 65 64 20 6c 6f 6e 67 29 41 53 4e 31 5f 53 54 52 ed long)ASN1_STR
3c30: 46 4c 47 53 5f 45 53 43 5f 4d 53 42 3b 0a 0a 20 FLGS_ESC_MSB;..
3c40: 20 20 20 63 68 61 72 20 2a 62 75 66 66 65 72 20 char *buffer
3c50: 3d 20 28 63 68 61 72 20 2a 29 54 63 6c 5f 41 6c = (char *)Tcl_Al
3c60: 6c 6f 63 28 42 55 46 53 49 5a 20 3e 20 45 56 50 loc(BUFSIZ > EVP
3c70: 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 20 3f 20 42 _MAX_MD_SIZE ? B
3c80: 55 46 53 49 5a 20 3a 20 45 56 50 5f 4d 41 58 5f UFSIZ : EVP_MAX_
3c90: 4d 44 5f 53 49 5a 45 29 3b 0a 0a 20 20 20 20 64 MD_SIZE);.. d
3ca0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
3cb0: 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 ;.. if (inter
3cc0: 70 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 65 72 p == NULL || cer
3cd0: 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62 69 6f t == NULL || bio
3ce0: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 65 73 75 == NULL || resu
3cf0: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 20 7c 7c ltObj == NULL ||
3d00: 20 62 75 66 66 65 72 20 3d 3d 20 4e 55 4c 4c 29 buffer == NULL)
3d10: 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 {..Tcl_DecrRefC
3d20: 6f 75 6e 74 28 72 65 73 75 6c 74 4f 62 6a 29 3b ount(resultObj);
3d30: 0a 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b ..BIO_free(bio);
3d40: 0a 09 69 66 20 28 62 75 66 66 65 72 20 21 3d 20 ..if (buffer !=
3d50: 4e 55 4c 4c 29 20 54 63 6c 5f 46 72 65 65 28 62 NULL) Tcl_Free(b
3d60: 75 66 66 65 72 29 3b 0a 09 72 65 74 75 72 6e 20 uffer);..return
3d70: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
3d80: 20 2f 2a 20 53 69 67 6e 61 74 75 72 65 20 61 6c /* Signature al
3d90: 67 6f 72 69 74 68 6d 20 61 6e 64 20 76 61 6c 75 gorithm and valu
3da0: 65 20 2d 20 52 46 43 20 35 32 38 30 20 73 65 63 e - RFC 5280 sec
3db0: 74 69 6f 6e 20 34 2e 31 2e 31 2e 32 20 61 6e 64 tion 4.1.1.2 and
3dc0: 20 34 2e 31 2e 31 2e 33 20 2a 2f 0a 20 20 20 20 4.1.1.3 */.
3dd0: 2f 2a 20 73 69 67 6e 61 74 75 72 65 41 6c 67 6f /* signatureAlgo
3de0: 72 69 74 68 6d 20 69 73 20 74 68 65 20 69 64 20 rithm is the id
3df0: 6f 66 20 74 68 65 20 63 72 79 70 74 6f 67 72 61 of the cryptogra
3e00: 70 68 69 63 20 61 6c 67 6f 72 69 74 68 6d 20 75 phic algorithm u
3e10: 73 65 64 20 62 79 20 74 68 65 0a 09 43 41 20 74 sed by the..CA t
3e20: 6f 20 73 69 67 6e 20 74 68 69 73 20 63 65 72 74 o sign this cert
3e30: 2e 20 73 69 67 6e 61 74 75 72 65 56 61 6c 75 65 . signatureValue
3e40: 20 69 73 20 74 68 65 20 64 69 67 69 74 61 6c 20 is the digital
3e50: 73 69 67 6e 61 74 75 72 65 20 63 6f 6d 70 75 74 signature comput
3e60: 65 64 0a 09 75 70 6f 6e 20 74 68 65 20 41 53 4e ed..upon the ASN
3e70: 2e 31 20 44 45 52 20 65 6e 63 6f 64 65 64 20 74 .1 DER encoded t
3e80: 62 73 43 65 72 74 69 66 69 63 61 74 65 2e 20 2a bsCertificate. *
3e90: 2f 0a 20 20 20 20 7b 0a 09 63 6f 6e 73 74 20 58 /. {..const X
3ea0: 35 30 39 5f 41 4c 47 4f 52 20 2a 73 69 67 5f 61 509_ALGOR *sig_a
3eb0: 6c 67 3b 0a 09 63 6f 6e 73 74 20 41 53 4e 31 5f lg;..const ASN1_
3ec0: 42 49 54 5f 53 54 52 49 4e 47 20 2a 73 69 67 3b BIT_STRING *sig;
3ed0: 0a 09 69 6e 74 20 73 69 67 5f 6e 69 64 3b 0a 0a ..int sig_nid;..
3ee0: 09 58 35 30 39 5f 67 65 74 30 5f 73 69 67 6e 61 .X509_get0_signa
3ef0: 74 75 72 65 28 26 73 69 67 2c 20 26 73 69 67 5f ture(&sig, &sig_
3f00: 61 6c 67 2c 20 63 65 72 74 29 3b 0a 09 2f 2a 20 alg, cert);../*
3f10: 73 69 67 5f 6e 69 64 20 3d 20 58 35 30 39 5f 67 sig_nid = X509_g
3f20: 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 et_signature_nid
3f30: 28 63 65 72 74 29 20 2a 2f 0a 09 73 69 67 5f 6e (cert) */..sig_n
3f40: 69 64 20 3d 20 4f 42 4a 5f 6f 62 6a 32 6e 69 64 id = OBJ_obj2nid
3f50: 28 73 69 67 5f 61 6c 67 2d 3e 61 6c 67 6f 72 69 (sig_alg->algori
3f60: 74 68 6d 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 thm);..LAPPEND_S
3f70: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c TR(interp, resul
3f80: 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75 72 65 tObj, "signature
3f90: 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f Algorithm", OBJ_
3fa0: 6e 69 64 32 6c 6e 28 73 69 67 5f 6e 69 64 29 2c nid2ln(sig_nid),
3fb0: 20 2d 31 29 3b 0a 09 69 66 20 28 73 69 67 5f 6e -1);..if (sig_n
3fc0: 69 64 20 21 3d 20 4e 49 44 5f 75 6e 64 65 66 29 id != NID_undef)
3fd0: 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f {.. LAPPEND_
3fe0: 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 OBJ(interp, resu
3ff0: 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75 72 ltObj, "signatur
4000: 65 56 61 6c 75 65 22 2c 20 53 74 72 69 6e 67 5f eValue", String_
4010: 74 6f 5f 48 65 78 28 73 69 67 2d 3e 64 61 74 61 to_Hex(sig->data
4020: 2c 20 73 69 67 2d 3e 6c 65 6e 67 74 68 29 29 3b , sig->length));
4030: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
4040: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
4050: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
4060: 73 69 67 6e 61 74 75 72 65 56 61 6c 75 65 22 2c signatureValue",
4070: 20 22 22 2c 20 30 29 3b 0a 09 7d 0a 20 20 20 20 "", 0);..}.
4080: 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f }.. /* Versio
4090: 6e 20 6f 66 20 74 68 65 20 65 6e 63 6f 64 65 64 n of the encoded
40a0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2d 20 52 certificate - R
40b0: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 FC 5280 section
40c0: 34 2e 31 2e 32 2e 31 20 2a 2f 0a 20 20 20 20 4c 4.1.2.1 */. L
40d0: 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 APPEND_LONG(inte
40e0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
40f0: 76 65 72 73 69 6f 6e 22 2c 20 58 35 30 39 5f 67 version", X509_g
4100: 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 29 et_version(cert)
4110: 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 69 +1);.. /* Uni
4120: 71 75 65 20 6e 75 6d 62 65 72 20 61 73 73 69 67 que number assig
4130: 6e 65 64 20 62 79 20 43 41 20 74 6f 20 63 65 72 ned by CA to cer
4140: 74 69 66 69 63 61 74 65 20 2d 20 52 46 43 20 35 tificate - RFC 5
4150: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 280 section 4.1.
4160: 32 2e 32 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 2.2 */. len =
4170: 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 69 BIO_to_Buffer(i
4180: 32 61 5f 41 53 4e 31 5f 49 4e 54 45 47 45 52 28 2a_ASN1_INTEGER(
4190: 62 69 6f 2c 20 58 35 30 39 5f 67 65 74 30 5f 73 bio, X509_get0_s
41a0: 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 erialNumber(cert
41b0: 29 29 2c 20 62 69 6f 2c 20 62 75 66 66 65 72 2c )), bio, buffer,
41c0: 20 42 55 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 BUFSIZ);. LA
41d0: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
41e0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 65 , resultObj, "se
41f0: 72 69 61 6c 4e 75 6d 62 65 72 22 2c 20 62 75 66 rialNumber", buf
4200: 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 fer, len);..
4210: 2f 2a 20 53 69 67 6e 61 74 75 72 65 20 61 6c 67 /* Signature alg
4220: 6f 72 69 74 68 6d 20 75 73 65 64 20 62 79 20 74 orithm used by t
4230: 68 65 20 43 41 20 74 6f 20 73 69 67 6e 20 74 68 he CA to sign th
4240: 65 20 63 65 72 74 69 66 69 63 61 74 65 2e 20 4d e certificate. M
4250: 75 73 74 20 6d 61 74 63 68 0a 09 73 69 67 6e 61 ust match..signa
4260: 74 75 72 65 41 6c 67 6f 72 69 74 68 6d 2e 20 52 tureAlgorithm. R
4270: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 FC 5280 section
4280: 34 2e 31 2e 32 2e 33 20 2a 2f 0a 20 20 20 20 4c 4.1.2.3 */. L
4290: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
42a0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 p, resultObj, "s
42b0: 69 67 6e 61 74 75 72 65 22 2c 20 4f 42 4a 5f 6e ignature", OBJ_n
42c0: 69 64 32 6c 6e 28 58 35 30 39 5f 67 65 74 5f 73 id2ln(X509_get_s
42d0: 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 63 65 72 ignature_nid(cer
42e0: 74 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f t)), -1);.. /
42f0: 2a 20 49 73 73 75 65 72 20 69 64 65 6e 74 69 66 * Issuer identif
4300: 69 65 73 20 74 68 65 20 65 6e 74 69 74 79 20 74 ies the entity t
4310: 68 61 74 20 73 69 67 6e 65 64 20 61 6e 64 20 69 hat signed and i
4320: 73 73 75 65 64 20 74 68 65 20 63 65 72 74 2e 20 ssued the cert.
4330: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e RFC 5280 section
4340: 20 34 2e 31 2e 32 2e 34 20 2a 2f 0a 20 20 20 20 4.1.2.4 */.
4350: 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 len = BIO_to_Buf
4360: 66 65 72 28 58 35 30 39 5f 4e 41 4d 45 5f 70 72 fer(X509_NAME_pr
4370: 69 6e 74 5f 65 78 28 62 69 6f 2c 20 58 35 30 39 int_ex(bio, X509
4380: 5f 67 65 74 5f 69 73 73 75 65 72 5f 6e 61 6d 65 _get_issuer_name
4390: 28 63 65 72 74 29 2c 20 30 2c 20 66 6c 61 67 73 (cert), 0, flags
43a0: 29 2c 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 ), bio, buffer,
43b0: 42 55 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 BUFSIZ);. LAP
43c0: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
43d0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 69 73 73 resultObj, "iss
43e0: 75 65 72 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 uer", buffer, le
43f0: 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 n);.. /* Cert
4400: 69 66 69 63 61 74 65 20 76 61 6c 69 64 69 74 79 ificate validity
4410: 20 70 65 72 69 6f 64 20 69 73 20 74 68 65 20 69 period is the i
4420: 6e 74 65 72 76 61 6c 20 74 68 65 20 43 41 20 77 nterval the CA w
4430: 61 72 72 61 6e 74 73 20 74 68 61 74 20 69 74 20 arrants that it
4440: 77 69 6c 6c 0a 09 6d 61 69 6e 74 61 69 6e 20 69 will..maintain i
4450: 6e 66 6f 20 6f 6e 20 74 68 65 20 73 74 61 74 75 nfo on the statu
4460: 73 20 6f 66 20 74 68 65 20 63 65 72 74 69 66 69 s of the certifi
4470: 63 61 74 65 2e 20 52 46 43 20 35 32 38 30 20 73 cate. RFC 5280 s
4480: 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 35 20 2a ection 4.1.2.5 *
4490: 2f 0a 20 20 20 20 2f 2a 20 47 65 74 20 56 61 6c /. /* Get Val
44a0: 69 64 69 74 79 20 2d 20 4e 6f 74 20 42 65 66 6f idity - Not Befo
44b0: 72 65 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 re */. len =
44c0: 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 41 53 BIO_to_Buffer(AS
44d0: 4e 31 5f 54 49 4d 45 5f 70 72 69 6e 74 28 62 69 N1_TIME_print(bi
44e0: 6f 2c 20 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74 o, X509_get0_not
44f0: 42 65 66 6f 72 65 28 63 65 72 74 29 29 2c 20 62 Before(cert)), b
4500: 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 io, buffer, BUFS
4510: 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 IZ);. LAPPEND
4520: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 _STR(interp, res
4530: 75 6c 74 4f 62 6a 2c 20 22 6e 6f 74 42 65 66 6f ultObj, "notBefo
4540: 72 65 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e re", buffer, len
4550: 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 56 );.. /* Get V
4560: 61 6c 69 64 69 74 79 20 2d 20 4e 6f 74 20 41 66 alidity - Not Af
4570: 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d ter */. len =
4580: 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 41 BIO_to_Buffer(A
4590: 53 4e 31 5f 54 49 4d 45 5f 70 72 69 6e 74 28 62 SN1_TIME_print(b
45a0: 69 6f 2c 20 58 35 30 39 5f 67 65 74 30 5f 6e 6f io, X509_get0_no
45b0: 74 41 66 74 65 72 28 63 65 72 74 29 29 2c 20 62 tAfter(cert)), b
45c0: 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 io, buffer, BUFS
45d0: 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 IZ);. LAPPEND
45e0: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 _STR(interp, res
45f0: 75 6c 74 4f 62 6a 2c 20 22 6e 6f 74 41 66 74 65 ultObj, "notAfte
4600: 72 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 r", buffer, len)
4610: 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 ;.. /* Subjec
4620: 74 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 t identifies the
4630: 20 65 6e 74 69 74 79 20 61 73 73 6f 63 69 61 74 entity associat
4640: 65 64 20 77 69 74 68 20 74 68 65 20 70 75 62 6c ed with the publ
4650: 69 63 20 6b 65 79 20 73 74 6f 72 65 64 20 69 6e ic key stored in
4660: 0a 09 74 68 65 20 73 75 62 6a 65 63 74 20 70 75 ..the subject pu
4670: 62 6c 69 63 20 6b 65 79 20 66 69 65 6c 64 2e 20 blic key field.
4680: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e RFC 5280 section
4690: 20 34 2e 31 2e 32 2e 36 20 2a 2f 0a 20 20 20 20 4.1.2.6 */.
46a0: 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 len = BIO_to_Buf
46b0: 66 65 72 28 58 35 30 39 5f 4e 41 4d 45 5f 70 72 fer(X509_NAME_pr
46c0: 69 6e 74 5f 65 78 28 62 69 6f 2c 20 58 35 30 39 int_ex(bio, X509
46d0: 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d _get_subject_nam
46e0: 65 28 63 65 72 74 29 2c 20 30 2c 20 66 6c 61 67 e(cert), 0, flag
46f0: 73 29 2c 20 62 69 6f 2c 20 62 75 66 66 65 72 2c s), bio, buffer,
4700: 20 42 55 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 BUFSIZ);. LA
4710: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
4720: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 75 , resultObj, "su
4730: 62 6a 65 63 74 22 2c 20 62 75 66 66 65 72 2c 20 bject", buffer,
4740: 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 48 len);.. /* SH
4750: 41 31 20 44 69 67 65 73 74 20 28 46 69 6e 67 65 A1 Digest (Finge
4760: 72 70 72 69 6e 74 29 20 6f 66 20 63 65 72 74 20 rprint) of cert
4770: 2d 20 44 45 52 20 72 65 70 72 65 73 65 6e 74 61 - DER representa
4780: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 tion */. if (
4790: 58 35 30 39 5f 64 69 67 65 73 74 28 63 65 72 74 X509_digest(cert
47a0: 2c 20 45 56 50 5f 73 68 61 31 28 29 2c 20 28 75 , EVP_sha1(), (u
47b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 nsigned char *)b
47c0: 75 66 66 65 72 2c 20 26 75 6c 65 6e 29 29 20 7b uffer, &ulen)) {
47d0: 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e ..LAPPEND_OBJ(in
47e0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
47f0: 20 22 73 68 61 31 5f 68 61 73 68 22 2c 20 53 74 "sha1_hash", St
4800: 72 69 6e 67 5f 74 6f 5f 48 65 78 28 28 75 6e 73 ring_to_Hex((uns
4810: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 igned char *)buf
4820: 66 65 72 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 fer, (int) ulen)
4830: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
4840: 20 53 48 41 32 35 36 20 44 69 67 65 73 74 20 28 SHA256 Digest (
4850: 46 69 6e 67 65 72 70 72 69 6e 74 29 20 6f 66 20 Fingerprint) of
4860: 63 65 72 74 20 2d 20 44 45 52 20 72 65 70 72 65 cert - DER repre
4870: 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 sentation */.
4880: 20 69 66 20 28 58 35 30 39 5f 64 69 67 65 73 74 if (X509_digest
4890: 28 63 65 72 74 2c 20 45 56 50 5f 73 68 61 32 35 (cert, EVP_sha25
48a0: 36 28 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 6(), (unsigned c
48b0: 68 61 72 20 2a 29 62 75 66 66 65 72 2c 20 26 75 har *)buffer, &u
48c0: 6c 65 6e 29 29 20 7b 0a 09 4c 41 50 50 45 4e 44 len)) {..LAPPEND
48d0: 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 _OBJ(interp, res
48e0: 75 6c 74 4f 62 6a 2c 20 22 73 68 61 32 35 36 5f ultObj, "sha256_
48f0: 68 61 73 68 22 2c 20 53 74 72 69 6e 67 5f 74 6f hash", String_to
4900: 5f 48 65 78 28 28 75 6e 73 69 67 6e 65 64 20 63 _Hex((unsigned c
4910: 68 61 72 20 2a 29 62 75 66 66 65 72 2c 20 28 69 har *)buffer, (i
4920: 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 20 20 20 20 nt) ulen));.
4930: 7d 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 }.. /* Subjec
4940: 74 20 50 75 62 6c 69 63 20 4b 65 79 20 49 6e 66 t Public Key Inf
4950: 6f 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 o specifies the
4960: 70 75 62 6c 69 63 20 6b 65 79 20 61 6e 64 20 69 public key and i
4970: 64 65 6e 74 69 66 69 65 73 20 74 68 65 0a 09 61 dentifies the..a
4980: 6c 67 6f 72 69 74 68 6d 20 77 69 74 68 20 77 68 lgorithm with wh
4990: 69 63 68 20 74 68 65 20 6b 65 79 20 69 73 20 75 ich the key is u
49a0: 73 65 64 2e 20 52 46 43 20 35 32 38 30 20 73 65 sed. RFC 5280 se
49b0: 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 37 20 2a 2f ction 4.1.2.7 */
49c0: 0a 20 20 20 20 69 66 20 28 58 35 30 39 5f 67 65 . if (X509_ge
49d0: 74 5f 73 69 67 6e 61 74 75 72 65 5f 69 6e 66 6f t_signature_info
49e0: 28 63 65 72 74 2c 20 26 6d 64 6e 69 64 2c 20 26 (cert, &mdnid, &
49f0: 70 6b 6e 69 64 2c 20 26 62 69 74 73 2c 20 26 78 pknid, &bits, &x
4a00: 66 6c 61 67 73 29 29 20 7b 0a 09 41 53 4e 31 5f flags)) {..ASN1_
4a10: 42 49 54 5f 53 54 52 49 4e 47 20 2a 6b 65 79 3b BIT_STRING *key;
4a20: 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e ..unsigned int n
4a30: 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 ;...LAPPEND_STR(
4a40: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
4a50: 6a 2c 20 22 73 69 67 6e 69 6e 67 44 69 67 65 73 j, "signingDiges
4a60: 74 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6d t", OBJ_nid2ln(m
4a70: 64 6e 69 64 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 dnid), -1);..LAP
4a80: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
4a90: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 75 62 resultObj, "pub
4aa0: 6c 69 63 4b 65 79 41 6c 67 6f 72 69 74 68 6d 22 licKeyAlgorithm"
4ab0: 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 70 6b 6e , OBJ_nid2ln(pkn
4ac0: 69 64 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 id), -1);..LAPPE
4ad0: 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 ND_INT(interp, r
4ae0: 65 73 75 6c 74 4f 62 6a 2c 20 22 62 69 74 73 22 esultObj, "bits"
4af0: 2c 20 62 69 74 73 29 3b 20 2f 2a 20 45 66 66 65 , bits); /* Effe
4b00: 63 74 69 76 65 20 73 65 63 75 72 69 74 79 20 62 ctive security b
4b10: 69 74 73 20 2a 2f 0a 0a 09 6b 65 79 20 3d 20 58 its */...key = X
4b20: 35 30 39 5f 67 65 74 30 5f 70 75 62 6b 65 79 5f 509_get0_pubkey_
4b30: 62 69 74 73 74 72 28 63 65 72 74 29 3b 0a 09 4c bitstr(cert);..L
4b40: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 APPEND_OBJ(inter
4b50: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 p, resultObj, "p
4b60: 75 62 6c 69 63 4b 65 79 22 2c 20 53 74 72 69 6e ublicKey", Strin
4b70: 67 5f 74 6f 5f 48 65 78 28 6b 65 79 2d 3e 64 61 g_to_Hex(key->da
4b80: 74 61 2c 20 6b 65 79 2d 3e 6c 65 6e 67 74 68 29 ta, key->length)
4b90: 29 3b 0a 0a 09 69 66 20 28 58 35 30 39 5f 70 75 );...if (X509_pu
4ba0: 62 6b 65 79 5f 64 69 67 65 73 74 28 63 65 72 74 bkey_digest(cert
4bb0: 2c 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74 , EVP_get_digest
4bc0: 62 79 6e 69 64 28 70 6b 6e 69 64 29 2c 20 28 75 bynid(pknid), (u
4bd0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 nsigned char *)b
4be0: 75 66 66 65 72 2c 20 26 6e 29 29 20 7b 0a 09 20 uffer, &n)) {..
4bf0: 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 LAPPEND_OBJ(i
4c00: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
4c10: 2c 20 22 70 75 62 6c 69 63 4b 65 79 48 61 73 68 , "publicKeyHash
4c20: 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 ", String_to_Hex
4c30: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ((unsigned char
4c40: 2a 29 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20 *)buffer, (int)
4c50: 6e 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 n));..} else {..
4c60: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
4c70: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
4c80: 6a 2c 20 22 70 75 62 6c 69 63 4b 65 79 48 61 73 j, "publicKeyHas
4c90: 68 22 2c 20 22 22 2c 20 30 29 3b 0a 09 7d 0a 0a h", "", 0);..}..
4ca0: 09 2f 2a 20 64 69 67 65 73 74 20 6f 66 20 74 68 ./* digest of th
4cb0: 65 20 44 45 52 20 72 65 70 72 65 73 65 6e 74 61 e DER representa
4cc0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 65 72 74 tion of the cert
4cd0: 69 66 69 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 ificate */..if (
4ce0: 58 35 30 39 5f 64 69 67 65 73 74 28 63 65 72 74 X509_digest(cert
4cf0: 2c 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74 , EVP_get_digest
4d00: 62 79 6e 69 64 28 6d 64 6e 69 64 29 2c 20 28 75 bynid(mdnid), (u
4d10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 nsigned char *)b
4d20: 75 66 66 65 72 2c 20 26 6e 29 29 20 7b 0a 09 20 uffer, &n)) {..
4d30: 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 LAPPEND_OBJ(i
4d40: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
4d50: 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 , "signatureHash
4d60: 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 ", String_to_Hex
4d70: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ((unsigned char
4d80: 2a 29 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20 *)buffer, (int)
4d90: 6e 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 n));..} else {..
4da0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
4db0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
4dc0: 6a 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 j, "signatureHas
4dd0: 68 22 2c 20 22 22 2c 20 30 29 3b 0a 09 7d 0a 20 h", "", 0);..}.
4de0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 65 72 }.. /* Cer
4df0: 74 69 66 69 63 61 74 65 20 50 75 72 70 6f 73 65 tificate Purpose
4e00: 2e 20 43 61 6c 6c 20 62 65 66 6f 72 65 20 63 68 . Call before ch
4e10: 65 63 6b 69 6e 67 20 66 6f 72 20 65 78 74 65 6e ecking for exten
4e20: 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 4c 41 sions. */. LA
4e30: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
4e40: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 75 , resultObj, "pu
4e50: 72 70 6f 73 65 22 2c 20 54 6c 73 5f 78 35 30 39 rpose", Tls_x509
4e60: 50 75 72 70 6f 73 65 28 63 65 72 74 29 2c 20 2d Purpose(cert), -
4e70: 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 1);. LAPPEND_
4e80: 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 OBJ(interp, resu
4e90: 6c 74 4f 62 6a 2c 20 22 63 65 72 74 69 66 69 63 ltObj, "certific
4ea0: 61 74 65 50 75 72 70 6f 73 65 22 2c 20 54 6c 73 atePurpose", Tls
4eb0: 5f 78 35 30 39 50 75 72 70 6f 73 65 73 28 69 6e _x509Purposes(in
4ec0: 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 terp, cert));..
4ed0: 20 20 20 2f 2a 20 47 65 74 20 65 78 74 65 6e 73 /* Get extens
4ee0: 69 6f 6e 73 20 66 6c 61 67 73 20 2a 2f 0a 20 20 ions flags */.
4ef0: 20 20 78 66 6c 61 67 73 20 3d 20 58 35 30 39 5f xflags = X509_
4f00: 67 65 74 5f 65 78 74 65 6e 73 69 6f 6e 5f 66 6c get_extension_fl
4f10: 61 67 73 28 63 65 72 74 29 3b 0a 20 20 20 20 4c ags(cert);. L
4f20: 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
4f30: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 p, resultObj, "e
4f40: 78 74 46 6c 61 67 73 22 2c 20 78 66 6c 61 67 73 xtFlags", xflags
4f50: 29 3b 0a 0a 09 2f 2a 20 43 68 65 63 6b 20 69 66 );.../* Check if
4f60: 20 63 65 72 74 20 77 61 73 20 69 73 73 75 65 64 cert was issued
4f70: 20 62 79 20 43 41 20 63 65 72 74 20 69 73 73 75 by CA cert issu
4f80: 65 72 20 6f 72 20 73 65 6c 66 20 73 69 67 6e 65 er or self signe
4f90: 64 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 d */. LAPPEND
4fa0: 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65 _BOOL(interp, re
4fb0: 73 75 6c 74 4f 62 6a 2c 20 22 73 65 6c 66 49 73 sultObj, "selfIs
4fc0: 73 75 65 64 22 2c 20 78 66 6c 61 67 73 20 26 20 sued", xflags &
4fd0: 45 58 46 4c 41 47 5f 53 49 29 3b 0a 20 20 20 20 EXFLAG_SI);.
4fe0: 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
4ff0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
5000: 22 73 65 6c 66 53 69 67 6e 65 64 22 2c 20 78 66 "selfSigned", xf
5010: 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 53 53 lags & EXFLAG_SS
5020: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 );. LAPPEND_B
5030: 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 75 OOL(interp, resu
5040: 6c 74 4f 62 6a 2c 20 22 69 73 50 72 6f 78 79 43 ltObj, "isProxyC
5050: 65 72 74 22 2c 20 78 66 6c 61 67 73 20 26 20 45 ert", xflags & E
5060: 58 46 4c 41 47 5f 50 52 4f 58 59 29 3b 0a 20 20 XFLAG_PROXY);.
5070: 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 LAPPEND_BOOL(i
5080: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
5090: 2c 20 22 65 78 74 49 6e 76 61 6c 69 64 22 2c 20 , "extInvalid",
50a0: 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f xflags & EXFLAG_
50b0: 49 4e 56 41 4c 49 44 29 3b 0a 20 20 20 20 4c 41 INVALID);. LA
50c0: 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
50d0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 69 p, resultObj, "i
50e0: 73 43 41 43 65 72 74 22 2c 20 58 35 30 39 5f 63 sCACert", X509_c
50f0: 68 65 63 6b 5f 63 61 28 63 65 72 74 29 29 3b 0a heck_ca(cert));.
5100: 0a 20 20 20 20 2f 2a 20 54 68 65 20 55 6e 69 71 . /* The Uniq
5110: 75 65 20 49 64 73 20 61 72 65 20 75 73 65 64 20 ue Ids are used
5120: 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 70 6f to handle the po
5130: 73 73 69 62 69 6c 69 74 79 20 6f 66 20 72 65 75 ssibility of reu
5140: 73 65 20 6f 66 20 73 75 62 6a 65 63 74 0a 09 61 se of subject..a
5150: 6e 64 2f 6f 72 20 69 73 73 75 65 72 20 6e 61 6d nd/or issuer nam
5160: 65 73 20 6f 76 65 72 20 74 69 6d 65 2e 20 52 46 es over time. RF
5170: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 C 5280 section 4
5180: 2e 31 2e 32 2e 38 20 2a 2f 0a 20 20 20 20 7b 0a .1.2.8 */. {.
5190: 09 63 6f 6e 73 74 20 41 53 4e 31 5f 42 49 54 5f .const ASN1_BIT_
51a0: 53 54 52 49 4e 47 20 2a 69 75 69 64 2c 20 2a 73 STRING *iuid, *s
51b0: 75 69 64 3b 0a 09 58 35 30 39 5f 67 65 74 30 5f uid;..X509_get0_
51c0: 75 69 64 73 28 63 65 72 74 2c 20 26 69 75 69 64 uids(cert, &iuid
51d0: 2c 20 26 73 75 69 64 29 3b 0a 0a 09 54 63 6c 5f , &suid);...Tcl_
51e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
51f0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 ment(interp, res
5200: 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 ultObj, Tcl_NewS
5210: 74 72 69 6e 67 4f 62 6a 28 22 69 73 73 75 65 72 tringObj("issuer
5220: 55 6e 69 71 75 65 49 64 22 2c 20 2d 31 29 29 3b UniqueId", -1));
5230: 0a 09 69 66 20 28 69 75 69 64 20 21 3d 20 4e 55 ..if (iuid != NU
5240: 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c LL) {.. Tcl_L
5250: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5260: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 ent(interp, resu
5270: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 42 79 ltObj, Tcl_NewBy
5280: 74 65 41 72 72 61 79 4f 62 6a 28 28 63 6f 6e 73 teArrayObj((cons
5290: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
52a0: 2a 29 69 75 69 64 2d 3e 64 61 74 61 2c 20 28 54 *)iuid->data, (T
52b0: 63 6c 5f 53 69 7a 65 29 20 69 75 69 64 2d 3e 6c cl_Size) iuid->l
52c0: 65 6e 67 74 68 29 29 3b 0a 09 7d 20 65 6c 73 65 ength));..} else
52d0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
52e0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
52f0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
5300: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e bj, Tcl_NewStrin
5310: 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 09 gObj("", -1));..
5320: 7d 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 }...Tcl_ListObjA
5330: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
5340: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
5350: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
5360: 28 22 73 75 62 6a 65 63 74 55 6e 69 71 75 65 49 ("subjectUniqueI
5370: 64 22 2c 20 2d 31 29 29 3b 0a 09 69 66 20 28 73 d", -1));..if (s
5380: 75 69 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 uid != NULL) {..
5390: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
53a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
53b0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
53c0: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 Tcl_NewByteArray
53d0: 4f 62 6a 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 Obj((const unsig
53e0: 6e 65 64 20 63 68 61 72 20 2a 29 73 75 69 64 2d ned char *)suid-
53f0: 3e 64 61 74 61 2c 20 28 54 63 6c 5f 53 69 7a 65 >data, (Tcl_Size
5400: 29 20 73 75 69 64 2d 3e 6c 65 6e 67 74 68 29 29 ) suid->length))
5410: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ;..} else {..
5420: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5430: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5440: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c , resultObj, Tcl
5450: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 _NewStringObj(""
5460: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d , -1));..}. }
5470: 0a 0a 20 20 20 20 2f 2a 20 58 35 30 39 20 76 33 .. /* X509 v3
5480: 20 45 78 74 65 6e 73 69 6f 6e 73 20 2d 20 52 46 Extensions - RF
5490: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 C 5280 section 4
54a0: 2e 31 2e 32 2e 39 20 2a 2f 0a 20 20 20 20 4c 41 .1.2.9 */. LA
54b0: 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
54c0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 , resultObj, "ex
54d0: 74 43 6f 75 6e 74 22 2c 20 58 35 30 39 5f 67 65 tCount", X509_ge
54e0: 74 5f 65 78 74 5f 63 6f 75 6e 74 28 63 65 72 74 t_ext_count(cert
54f0: 29 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f ));. LAPPEND_
5500: 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 OBJ(interp, resu
5510: 6c 74 4f 62 6a 2c 20 22 65 78 74 65 6e 73 69 6f ltObj, "extensio
5520: 6e 73 22 2c 20 54 6c 73 5f 78 35 30 39 45 78 74 ns", Tls_x509Ext
5530: 65 6e 73 69 6f 6e 73 28 69 6e 74 65 72 70 2c 20 ensions(interp,
5540: 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 cert));.. /*
5550: 41 75 74 68 6f 72 69 74 79 20 4b 65 79 20 49 64 Authority Key Id
5560: 65 6e 74 69 66 69 65 72 20 28 41 4b 49 29 20 69 entifier (AKI) i
5570: 73 20 74 68 65 20 53 75 62 6a 65 63 74 20 4b 65 s the Subject Ke
5580: 79 20 49 64 65 6e 74 69 66 69 65 72 20 28 53 4b y Identifier (SK
5590: 49 29 20 6f 66 0a 09 69 74 73 20 73 69 67 6e 65 I) of..its signe
55a0: 72 20 28 74 68 65 20 43 41 29 2e 20 52 46 43 20 r (the CA). RFC
55b0: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 5280 section 4.2
55c0: 2e 31 2e 31 2c 20 4e 49 44 5f 61 75 74 68 6f 72 .1.1, NID_author
55d0: 69 74 79 5f 6b 65 79 5f 69 64 65 6e 74 69 66 69 ity_key_identifi
55e0: 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e er */. LAPPEN
55f0: 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 D_OBJ(interp, re
5600: 73 75 6c 74 4f 62 6a 2c 20 22 61 75 74 68 6f 72 sultObj, "author
5610: 69 74 79 4b 65 79 49 64 65 6e 74 69 66 69 65 72 ityKeyIdentifier
5620: 22 2c 0a 09 54 6c 73 5f 78 35 30 39 49 64 65 6e ",..Tls_x509Iden
5630: 74 69 66 69 65 72 28 58 35 30 39 5f 67 65 74 30 tifier(X509_get0
5640: 5f 61 75 74 68 6f 72 69 74 79 5f 6b 65 79 5f 69 _authority_key_i
5650: 64 28 63 65 72 74 29 29 29 3b 0a 0a 20 20 20 20 d(cert)));..
5660: 2f 2a 20 53 75 62 6a 65 63 74 20 4b 65 79 20 49 /* Subject Key I
5670: 64 65 6e 74 69 66 69 65 72 20 28 53 4b 49 29 20 dentifier (SKI)
5680: 69 73 20 75 73 65 64 20 74 6f 20 69 64 65 6e 74 is used to ident
5690: 69 66 79 20 63 65 72 74 69 66 69 63 61 74 65 73 ify certificates
56a0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 0a 09 61 that contain..a
56b0: 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 62 6c particular publ
56c0: 69 63 20 6b 65 79 2e 20 52 46 43 20 35 32 38 30 ic key. RFC 5280
56d0: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 32 section 4.2.1.2
56e0: 2c 20 4e 49 44 5f 73 75 62 6a 65 63 74 5f 6b 65 , NID_subject_ke
56f0: 79 5f 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a y_identifier */.
5700: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 LAPPEND_OBJ(
5710: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
5720: 6a 2c 20 22 73 75 62 6a 65 63 74 4b 65 79 49 64 j, "subjectKeyId
5730: 65 6e 74 69 66 69 65 72 22 2c 0a 09 54 6c 73 5f entifier",..Tls_
5740: 78 35 30 39 49 64 65 6e 74 69 66 69 65 72 28 58 x509Identifier(X
5750: 35 30 39 5f 67 65 74 30 5f 73 75 62 6a 65 63 74 509_get0_subject
5760: 5f 6b 65 79 5f 69 64 28 63 65 72 74 29 29 29 3b _key_id(cert)));
5770: 0a 0a 20 20 20 20 2f 2a 20 4b 65 79 20 75 73 61 .. /* Key usa
5780: 67 65 20 65 78 74 65 6e 73 69 6f 6e 20 64 65 66 ge extension def
5790: 69 6e 65 73 20 74 68 65 20 70 75 72 70 6f 73 65 ines the purpose
57a0: 20 28 65 2e 67 2e 2c 20 65 6e 63 69 70 68 65 72 (e.g., encipher
57b0: 6d 65 6e 74 2c 20 73 69 67 6e 61 74 75 72 65 2c ment, signature,
57c0: 20 63 65 72 74 69 66 69 63 61 74 65 0a 09 73 69 certificate..si
57d0: 67 6e 69 6e 67 29 20 6f 66 20 74 68 65 20 6b 65 gning) of the ke
57e0: 79 20 69 6e 20 74 68 65 20 63 65 72 74 69 66 69 y in the certifi
57f0: 63 61 74 65 2e 20 52 46 43 20 35 32 38 30 20 73 cate. RFC 5280 s
5800: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 33 2c 20 ection 4.2.1.3,
5810: 4e 49 44 5f 6b 65 79 5f 75 73 61 67 65 20 2a 2f NID_key_usage */
5820: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a . LAPPEND_OBJ
5830: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
5840: 62 6a 2c 20 22 6b 65 79 55 73 61 67 65 22 2c 20 bj, "keyUsage",
5850: 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65 Tls_x509KeyUsage
5860: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 78 (interp, cert, x
5870: 66 6c 61 67 73 29 29 3b 0a 0a 20 20 20 20 2f 2a flags));.. /*
5880: 20 43 65 72 74 69 66 69 63 61 74 65 20 50 6f 6c Certificate Pol
5890: 69 63 69 65 73 20 2d 20 69 6e 64 69 63 61 74 65 icies - indicate
58a0: 73 20 74 68 65 20 69 73 73 75 69 6e 67 20 43 41 s the issuing CA
58b0: 20 63 6f 6e 73 69 64 65 72 73 20 69 74 73 20 69 considers its i
58c0: 73 73 75 65 72 44 6f 6d 61 69 6e 50 6f 6c 69 63 ssuerDomainPolic
58d0: 79 0a 09 65 71 75 69 76 61 6c 65 6e 74 20 74 6f y..equivalent to
58e0: 20 74 68 65 20 73 75 62 6a 65 63 74 20 43 41 27 the subject CA'
58f0: 73 20 73 75 62 6a 65 63 74 44 6f 6d 61 69 6e 50 s subjectDomainP
5900: 6f 6c 69 63 79 2e 20 52 46 43 20 35 32 38 30 20 olicy. RFC 5280
5910: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 34 2c section 4.2.1.4,
5920: 20 4e 49 44 5f 63 65 72 74 69 66 69 63 61 74 65 NID_certificate
5930: 5f 70 6f 6c 69 63 69 65 73 20 2a 2f 0a 20 20 20 _policies */.
5940: 20 69 66 20 28 78 66 6c 61 67 73 20 26 20 45 58 if (xflags & EX
5950: 46 4c 41 47 5f 49 4e 56 41 4c 49 44 5f 50 4f 4c FLAG_INVALID_POL
5960: 49 43 59 29 20 7b 0a 09 2f 2a 20 52 65 6a 65 63 ICY) {../* Rejec
5970: 74 20 63 65 72 74 20 2a 2f 0a 20 20 20 20 7d 0a t cert */. }.
5980: 0a 20 20 20 20 2f 2a 20 50 6f 6c 69 63 79 20 4d . /* Policy M
5990: 61 70 70 69 6e 67 73 20 2d 20 52 46 43 20 35 32 appings - RFC 52
59a0: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 80 section 4.2.1
59b0: 2e 35 2c 20 4e 49 44 5f 70 6f 6c 69 63 79 5f 6d .5, NID_policy_m
59c0: 61 70 70 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 appings */..
59d0: 2f 2a 20 53 75 62 6a 65 63 74 20 41 6c 74 65 72 /* Subject Alter
59e0: 6e 61 74 69 76 65 20 4e 61 6d 65 20 28 53 41 4e native Name (SAN
59f0: 29 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 ) contains addit
5a00: 69 6f 6e 61 6c 20 55 52 4c 73 2c 20 44 4e 53 20 ional URLs, DNS
5a10: 6e 61 6d 65 73 2c 20 6f 72 20 49 50 0a 09 61 64 names, or IP..ad
5a20: 64 72 65 73 73 65 73 20 62 6f 75 6e 64 20 74 6f dresses bound to
5a30: 20 63 65 72 74 69 66 69 63 61 74 65 2e 20 52 46 certificate. RF
5a40: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 C 5280 section 4
5a50: 2e 32 2e 31 2e 36 2c 20 4e 49 44 5f 73 75 62 6a .2.1.6, NID_subj
5a60: 65 63 74 5f 61 6c 74 5f 6e 61 6d 65 20 2a 2f 0a ect_alt_name */.
5a70: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 LAPPEND_OBJ(
5a80: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
5a90: 6a 2c 20 22 73 75 62 6a 65 63 74 41 6c 74 4e 61 j, "subjectAltNa
5aa0: 6d 65 22 2c 20 54 6c 73 5f 78 35 30 39 4e 61 6d me", Tls_x509Nam
5ab0: 65 73 28 69 6e 74 65 72 70 2c 20 63 65 72 74 2c es(interp, cert,
5ac0: 20 4e 49 44 5f 73 75 62 6a 65 63 74 5f 61 6c 74 NID_subject_alt
5ad0: 5f 6e 61 6d 65 2c 20 62 69 6f 29 29 3b 0a 0a 20 _name, bio));..
5ae0: 20 20 20 2f 2a 20 49 73 73 75 65 72 20 41 6c 74 /* Issuer Alt
5af0: 65 72 6e 61 74 69 76 65 20 4e 61 6d 65 20 69 73 ernative Name is
5b00: 20 75 73 65 64 20 74 6f 20 61 73 73 6f 63 69 61 used to associa
5b10: 74 65 20 49 6e 74 65 72 6e 65 74 20 73 74 79 6c te Internet styl
5b20: 65 20 69 64 65 6e 74 69 74 69 65 73 0a 09 77 69 e identities..wi
5b30: 74 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 th the certifica
5b40: 74 65 20 69 73 73 75 65 72 2e 20 52 46 43 20 35 te issuer. RFC 5
5b50: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 280 section 4.2.
5b60: 31 2e 37 2c 20 4e 49 44 5f 69 73 73 75 65 72 5f 1.7, NID_issuer_
5b70: 61 6c 74 5f 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 alt_name */.
5b80: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 LAPPEND_OBJ(inte
5b90: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
5ba0: 69 73 73 75 65 72 41 6c 74 4e 61 6d 65 22 2c 20 issuerAltName",
5bb0: 54 6c 73 5f 78 35 30 39 4e 61 6d 65 73 28 69 6e Tls_x509Names(in
5bc0: 74 65 72 70 2c 20 63 65 72 74 2c 20 4e 49 44 5f terp, cert, NID_
5bd0: 69 73 73 75 65 72 5f 61 6c 74 5f 6e 61 6d 65 2c issuer_alt_name,
5be0: 20 62 69 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 bio));.. /*
5bf0: 53 75 62 6a 65 63 74 20 44 69 72 65 63 74 6f 72 Subject Director
5c00: 79 20 41 74 74 72 69 62 75 74 65 73 20 70 72 6f y Attributes pro
5c10: 76 69 64 65 73 20 69 64 65 6e 74 69 66 69 63 61 vides identifica
5c20: 74 69 6f 6e 20 61 74 74 72 69 62 75 74 65 73 20 tion attributes
5c30: 28 65 2e 67 2e 2c 20 6e 61 74 69 6f 6e 61 6c 69 (e.g., nationali
5c40: 74 79 29 0a 09 6f 66 20 74 68 65 20 73 75 62 6a ty)..of the subj
5c50: 65 63 74 2e 20 52 46 43 20 35 32 38 30 20 73 65 ect. RFC 5280 se
5c60: 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 38 20 28 73 ction 4.2.1.8 (s
5c70: 75 62 6a 65 63 74 44 69 72 65 63 74 6f 72 79 41 ubjectDirectoryA
5c80: 74 74 72 69 62 75 74 65 73 29 20 2a 2f 0a 0a 20 ttributes) */..
5c90: 20 20 20 2f 2a 20 42 61 73 69 63 20 43 6f 6e 73 /* Basic Cons
5ca0: 74 72 61 69 6e 74 73 20 69 64 65 6e 74 69 66 69 traints identifi
5cb0: 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20 73 es whether the s
5cc0: 75 62 6a 65 63 74 20 6f 66 20 74 68 65 20 63 65 ubject of the ce
5cd0: 72 74 20 69 73 20 61 20 43 41 20 61 6e 64 0a 09 rt is a CA and..
5ce0: 74 68 65 20 6d 61 78 20 64 65 70 74 68 20 6f 66 the max depth of
5cf0: 20 76 61 6c 69 64 20 63 65 72 74 20 70 61 74 68 valid cert path
5d00: 73 20 66 6f 72 20 74 68 69 73 20 63 65 72 74 2e s for this cert.
5d10: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f RFC 5280 sectio
5d20: 6e 20 34 2e 32 2e 31 2e 39 2c 20 4e 49 44 5f 62 n 4.2.1.9, NID_b
5d30: 61 73 69 63 5f 63 6f 6e 73 74 72 61 69 6e 74 73 asic_constraints
5d40: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 28 78 66 */. if (!(xf
5d50: 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 50 52 lags & EXFLAG_PR
5d60: 4f 58 59 29 29 20 7b 0a 09 4c 41 50 50 45 4e 44 OXY)) {..LAPPEND
5d70: 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 72 65 _LONG(interp, re
5d80: 73 75 6c 74 4f 62 6a 2c 20 22 70 61 74 68 4c 65 sultObj, "pathLe
5d90: 6e 22 2c 20 58 35 30 39 5f 67 65 74 5f 70 61 74 n", X509_get_pat
5da0: 68 6c 65 6e 28 63 65 72 74 29 29 3b 0a 20 20 20 hlen(cert));.
5db0: 20 7d 20 65 6c 73 65 20 7b 0a 09 4c 41 50 50 45 } else {..LAPPE
5dc0: 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
5dd0: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 61 74 68 resultObj, "path
5de0: 4c 65 6e 22 2c 20 58 35 30 39 5f 67 65 74 5f 70 Len", X509_get_p
5df0: 72 6f 78 79 5f 70 61 74 68 6c 65 6e 28 63 65 72 roxy_pathlen(cer
5e00: 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4c t));. }. L
5e10: 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
5e20: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
5e30: 62 61 73 69 63 43 6f 6e 73 74 72 61 69 6e 74 73 basicConstraints
5e40: 43 41 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58 CA", xflags & EX
5e50: 46 4c 41 47 5f 43 41 29 3b 0a 0a 20 20 20 20 2f FLAG_CA);.. /
5e60: 2a 20 4e 61 6d 65 20 43 6f 6e 73 74 72 61 69 6e * Name Constrain
5e70: 74 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 ts is only used
5e80: 69 6e 20 43 41 20 63 65 72 74 73 20 74 6f 20 69 in CA certs to i
5e90: 6e 64 69 63 61 74 65 20 74 68 65 20 6e 61 6d 65 ndicate the name
5ea0: 20 73 70 61 63 65 20 66 6f 72 0a 09 61 6c 6c 20 space for..all
5eb0: 73 75 62 6a 65 63 74 20 6e 61 6d 65 73 20 69 6e subject names in
5ec0: 20 73 75 62 73 65 71 75 65 6e 74 20 63 65 72 74 subsequent cert
5ed0: 69 66 69 63 61 74 65 73 20 69 6e 20 61 20 63 65 ificates in a ce
5ee0: 72 74 69 66 69 63 61 74 69 6f 6e 20 70 61 74 68 rtification path
5ef0: 0a 09 4d 55 53 54 20 62 65 20 6c 6f 63 61 74 65 ..MUST be locate
5f00: 64 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 d. RFC 5280 sect
5f10: 69 6f 6e 20 34 2e 32 2e 31 2e 31 30 2c 20 4e 49 ion 4.2.1.10, NI
5f20: 44 5f 6e 61 6d 65 5f 63 6f 6e 73 74 72 61 69 6e D_name_constrain
5f30: 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 50 6f ts */.. /* Po
5f40: 6c 69 63 79 20 43 6f 6e 73 74 72 61 69 6e 74 73 licy Constraints
5f50: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e is only used in
5f60: 20 43 41 20 63 65 72 74 73 20 74 6f 20 6c 69 6d CA certs to lim
5f70: 69 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 it the length of
5f80: 20 61 0a 09 63 65 72 74 20 63 68 61 69 6e 20 66 a..cert chain f
5f90: 6f 72 20 74 68 61 74 20 43 41 2e 20 52 46 43 20 or that CA. RFC
5fa0: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 5280 section 4.2
5fb0: 2e 31 2e 31 31 2c 20 4e 49 44 5f 70 6f 6c 69 63 .1.11, NID_polic
5fc0: 79 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f y_constraints */
5fd0: 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e 64 65 .. /* Extende
5fe0: 64 20 4b 65 79 20 55 73 61 67 65 20 69 6e 64 69 d Key Usage indi
5ff0: 63 61 74 65 73 20 74 68 65 20 70 75 72 70 6f 73 cates the purpos
6000: 65 73 20 74 68 65 20 63 65 72 74 69 66 69 65 64 es the certified
6010: 20 70 75 62 6c 69 63 20 6b 65 79 20 6d 61 79 20 public key may
6020: 62 65 0a 09 75 73 65 64 2c 20 62 65 79 6f 6e 64 be..used, beyond
6030: 20 74 68 65 20 62 61 73 69 63 20 70 75 72 70 6f the basic purpo
6040: 73 65 73 2e 20 52 46 43 20 35 32 38 30 20 73 65 ses. RFC 5280 se
6050: 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 32 2c 20 ction 4.2.1.12,
6060: 4e 49 44 5f 65 78 74 5f 6b 65 79 5f 75 73 61 67 NID_ext_key_usag
6070: 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 e */. LAPPEND
6080: 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 _OBJ(interp, res
6090: 75 6c 74 4f 62 6a 2c 20 22 65 78 74 65 6e 64 65 ultObj, "extende
60a0: 64 4b 65 79 55 73 61 67 65 22 2c 20 54 6c 73 5f dKeyUsage", Tls_
60b0: 78 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 28 x509ExtKeyUsage(
60c0: 69 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 78 66 interp, cert, xf
60d0: 6c 61 67 73 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 lags));.. /*
60e0: 43 52 4c 20 44 69 73 74 72 69 62 75 74 69 6f 6e CRL Distribution
60f0: 20 50 6f 69 6e 74 73 20 69 64 65 6e 74 69 66 69 Points identifi
6100: 65 73 20 77 68 65 72 65 20 43 52 4c 20 69 6e 66 es where CRL inf
6110: 6f 72 6d 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 ormation can be
6120: 6f 62 74 61 69 6e 65 64 2e 0a 09 52 46 43 20 35 obtained...RFC 5
6130: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 280 section 4.2.
6140: 31 2e 31 33 2a 2f 0a 20 20 20 20 4c 41 50 50 45 1.13*/. LAPPE
6150: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 ND_OBJ(interp, r
6160: 65 73 75 6c 74 4f 62 6a 2c 20 22 63 72 6c 44 69 esultObj, "crlDi
6170: 73 74 72 69 62 75 74 69 6f 6e 50 6f 69 6e 74 73 stributionPoints
6180: 22 2c 20 54 6c 73 5f 78 35 30 39 43 72 6c 44 70 ", Tls_x509CrlDp
6190: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b (interp, cert));
61a0: 0a 0a 20 20 20 20 2f 2a 20 46 72 65 73 68 65 73 .. /* Freshes
61b0: 74 20 43 52 4c 20 65 78 74 65 6e 73 69 6f 6e 20 t CRL extension
61c0: 2a 2f 0a 20 20 20 20 69 66 20 28 78 66 6c 61 67 */. if (xflag
61d0: 73 20 26 20 45 58 46 4c 41 47 5f 46 52 45 53 48 s & EXFLAG_FRESH
61e0: 45 53 54 29 20 7b 0a 20 20 20 20 7d 0a 0a 20 20 EST) {. }..
61f0: 20 20 2f 2a 20 41 75 74 68 6f 72 69 74 79 20 49 /* Authority I
6200: 6e 66 6f 72 6d 61 74 69 6f 6e 20 41 63 63 65 73 nformation Acces
6210: 73 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 s indicates how
6220: 74 6f 20 61 63 63 65 73 73 20 69 6e 66 6f 20 61 to access info a
6230: 6e 64 20 73 65 72 76 69 63 65 73 0a 09 66 6f 72 nd services..for
6240: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
6250: 20 69 73 73 75 65 72 2e 20 52 46 43 20 35 32 38 issuer. RFC 528
6260: 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 32 2e 0 section 4.2.2.
6270: 31 2c 20 4e 49 44 5f 69 6e 66 6f 5f 61 63 63 65 1, NID_info_acce
6280: 73 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4f 6e ss */.. /* On
6290: 2d 6c 69 6e 65 20 43 65 72 74 69 66 69 63 61 74 -line Certificat
62a0: 65 20 53 74 61 74 75 73 20 50 72 6f 74 6f 63 6f e Status Protoco
62b0: 6c 20 28 4f 53 43 50 29 20 52 65 73 70 6f 6e 64 l (OSCP) Respond
62c0: 65 72 73 20 55 52 4c 20 2a 2f 0a 20 20 20 20 4c ers URL */. L
62d0: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 APPEND_OBJ(inter
62e0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6f p, resultObj, "o
62f0: 63 73 70 52 65 73 70 6f 6e 64 65 72 73 22 2c 20 cspResponders",
6300: 54 6c 73 5f 78 35 30 39 4f 73 63 70 28 69 6e 74 Tls_x509Oscp(int
6310: 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 erp, cert));..
6320: 20 20 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65 /* Certificate
6330: 20 41 75 74 68 6f 72 69 74 79 20 28 43 41 29 20 Authority (CA)
6340: 49 73 73 75 65 72 73 20 55 52 4c 20 2a 2f 0a 20 Issuers URL */.
6350: 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 LAPPEND_OBJ(i
6360: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
6370: 2c 20 22 63 61 49 73 73 75 65 72 73 22 2c 20 54 , "caIssuers", T
6380: 6c 73 5f 78 35 30 39 43 61 49 73 73 75 65 72 73 ls_x509CaIssuers
6390: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b (interp, cert));
63a0: 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 .. /* Subject
63b0: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 41 63 63 Information Acc
63c0: 65 73 73 20 2d 20 52 46 43 20 35 32 38 30 20 73 ess - RFC 5280 s
63d0: 65 63 74 69 6f 6e 20 34 2e 32 2e 32 2e 32 2c 20 ection 4.2.2.2,
63e0: 4e 49 44 5f 73 69 6e 66 6f 5f 61 63 63 65 73 73 NID_sinfo_access
63f0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 */.. /* Cert
6400: 69 66 69 63 61 74 65 20 41 6c 69 61 73 2e 20 49 ificate Alias. I
6410: 66 20 75 73 65 73 20 61 20 50 4b 43 53 23 31 32 f uses a PKCS#12
6420: 20 73 74 72 75 63 74 75 72 65 2c 20 61 6c 69 61 structure, alia
6430: 73 20 77 69 6c 6c 20 72 65 66 6c 65 63 74 20 74 s will reflect t
6440: 68 65 0a 09 66 72 69 65 6e 64 6c 79 4e 61 6d 65 he..friendlyName
6450: 20 61 74 74 72 69 62 75 74 65 20 28 52 46 43 20 attribute (RFC
6460: 32 39 38 35 29 2e 20 2a 2f 0a 20 20 20 20 7b 0a 2985). */. {.
6470: 09 69 6e 74 20 69 6c 65 6e 20 3d 20 30 3b 0a 09 .int ilen = 0;..
6480: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 unsigned char *s
6490: 74 72 69 6e 67 20 3d 20 58 35 30 39 5f 61 6c 69 tring = X509_ali
64a0: 61 73 5f 67 65 74 30 28 63 65 72 74 2c 20 26 69 as_get0(cert, &i
64b0: 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 len);..LAPPEND_S
64c0: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c TR(interp, resul
64d0: 74 4f 62 6a 2c 20 22 61 6c 69 61 73 22 2c 20 28 tObj, "alias", (
64e0: 63 68 61 72 20 2a 29 20 73 74 72 69 6e 67 2c 20 char *) string,
64f0: 28 54 63 6c 5f 53 69 7a 65 29 20 69 6c 65 6e 29 (Tcl_Size) ilen)
6500: 3b 0a 09 73 74 72 69 6e 67 20 3d 20 58 35 30 39 ;..string = X509
6510: 5f 6b 65 79 69 64 5f 67 65 74 30 28 63 65 72 74 _keyid_get0(cert
6520: 2c 20 26 69 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 , &ilen);..LAPPE
6530: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 ND_STR(interp, r
6540: 65 73 75 6c 74 4f 62 6a 2c 20 22 6b 65 79 49 64 esultObj, "keyId
6550: 22 2c 20 28 63 68 61 72 20 2a 29 20 73 74 72 69 ", (char *) stri
6560: 6e 67 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 69 ng, (Tcl_Size) i
6570: 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 len);. }..
6580: 20 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65 20 /* Certificate
6590: 61 6e 64 20 64 75 6d 70 20 61 6c 6c 20 64 61 74 and dump all dat
65a0: 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 6c a */. if (all
65b0: 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 61 6c ) {..Tcl_Obj *al
65c0: 6c 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79 lObj = Tcl_NewBy
65d0: 74 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c 2c teArrayObj(NULL,
65e0: 20 30 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 0);..Tcl_Obj *c
65f0: 65 72 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 ertObj = Tcl_New
6600: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c ByteArrayObj(NUL
6610: 4c 2c 20 30 29 3b 0a 09 75 6e 73 69 67 6e 65 64 L, 0);..unsigned
6620: 20 63 68 61 72 20 2a 61 6c 6c 53 74 72 2c 20 2a char *allStr, *
6630: 63 65 72 74 53 74 72 3b 0a 0a 09 69 66 20 28 61 certStr;...if (a
6640: 6c 6c 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 20 7c 7c llObj == NULL ||
6650: 20 63 65 72 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c certObj == NULL
6660: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 ) {.. Tcl_Dec
6670: 72 52 65 66 43 6f 75 6e 74 28 61 6c 6c 4f 62 6a rRefCount(allObj
6680: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 );.. BIO_free
6690: 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f (bio);.. Tcl_
66a0: 46 72 65 65 28 62 75 66 66 65 72 29 3b 0a 09 20 Free(buffer);..
66b0: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 return result
66c0: 4f 62 6a 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 Obj;..}.../* Get
66d0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a certificate */.
66e0: 09 63 65 72 74 53 74 72 20 3d 20 54 63 6c 5f 53 .certStr = Tcl_S
66f0: 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 etByteArrayLengt
6700: 68 28 63 65 72 74 4f 62 6a 2c 20 43 45 52 54 5f h(certObj, CERT_
6710: 53 54 52 5f 53 49 5a 45 29 3b 0a 09 6c 65 6e 20 STR_SIZE);..len
6720: 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 = BIO_to_Buffer(
6730: 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 PEM_write_bio_X5
6740: 30 39 28 62 69 6f 2c 20 63 65 72 74 29 2c 20 62 09(bio, cert), b
6750: 69 6f 2c 20 63 65 72 74 53 74 72 2c 20 43 45 52 io, certStr, CER
6760: 54 5f 53 54 52 5f 53 49 5a 45 29 3b 0a 09 54 63 T_STR_SIZE);..Tc
6770: 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65 l_SetByteArrayLe
6780: 6e 67 74 68 28 63 65 72 74 4f 62 6a 2c 20 6c 65 ngth(certObj, le
6790: 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a n);..LAPPEND_OBJ
67a0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
67b0: 62 6a 2c 20 22 63 65 72 74 69 66 69 63 61 74 65 bj, "certificate
67c0: 22 2c 20 63 65 72 74 4f 62 6a 29 0a 0a 09 2f 2a ", certObj).../*
67d0: 20 47 65 74 20 61 6c 6c 20 69 6e 66 6f 20 6f 6e Get all info on
67e0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a certificate */.
67f0: 09 61 6c 6c 53 74 72 20 3d 20 54 63 6c 5f 53 65 .allStr = Tcl_Se
6800: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 tByteArrayLength
6810: 28 61 6c 6c 4f 62 6a 2c 20 43 45 52 54 5f 53 54 (allObj, CERT_ST
6820: 52 5f 53 49 5a 45 20 2a 20 32 29 3b 0a 09 6c 65 R_SIZE * 2);..le
6830: 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 n = BIO_to_Buffe
6840: 72 28 58 35 30 39 5f 70 72 69 6e 74 5f 65 78 28 r(X509_print_ex(
6850: 62 69 6f 2c 20 63 65 72 74 2c 20 66 6c 61 67 73 bio, cert, flags
6860: 2c 20 30 29 2c 20 62 69 6f 2c 20 61 6c 6c 53 74 , 0), bio, allSt
6870: 72 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 r, CERT_STR_SIZE
6880: 20 2a 20 32 29 3b 0a 09 54 63 6c 5f 53 65 74 42 * 2);..Tcl_SetB
6890: 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 61 yteArrayLength(a
68a0: 6c 6c 4f 62 6a 2c 20 6c 65 6e 29 3b 0a 09 4c 41 llObj, len);..LA
68b0: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 PPEND_OBJ(interp
68c0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 61 6c , resultObj, "al
68d0: 6c 22 2c 20 61 6c 6c 4f 62 6a 29 0a 20 20 20 20 l", allObj).
68e0: 7d 0a 0a 20 20 20 20 42 49 4f 5f 66 72 65 65 28 }.. BIO_free(
68f0: 62 69 6f 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 bio);. Tcl_Fr
6900: 65 65 28 62 75 66 66 65 72 29 3b 0a 20 20 20 20 ee(buffer);.
6910: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a return resultObj
6920: 3b 0a 7d 0a ;.}.