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 20 61 6e 9 certificate an
0020: 64 20 72 65 74 75 72 6e 20 63 6f 6e 74 65 6e 74 d return content
0030: 73 20 61 73 20 61 20 54 43 4c 20 6b 65 79 2d 76 s as a TCL key-v
0040: 61 6c 75 65 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a alue list.. *. *
0050: 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 Copyright (C) 1
0060: 39 39 37 2d 32 30 30 30 20 53 65 6e 73 75 73 20 997-2000 Sensus
0070: 43 6f 6e 73 75 6c 74 69 6e 67 20 4c 74 64 2e 0a Consulting Ltd..
0080: 20 2a 20 4d 61 74 74 20 4e 65 77 6d 61 6e 20 3c * Matt Newman <
0090: 6d 61 74 74 40 73 65 6e 73 75 73 2e 6f 72 67 3e matt@sensus.org>
00a0: 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 43 . * Copyright (C
00b0: 29 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 ) 2023 Brian O'H
00c0: 61 67 61 6e 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 agan. */.#includ
00d0: 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e 63 6c 75 e <tcl.h>.#inclu
00e0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e de <stdio.h>.#in
00f0: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 62 clude <openssl/b
0100: 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c io.h>.#include <
0110: 6f 70 65 6e 73 73 6c 2f 73 68 61 2e 68 3e 0a 23 openssl/sha.h>.#
0120: 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c include <openssl
0130: 2f 78 35 30 39 2e 68 3e 0a 23 69 6e 63 6c 75 64 /x509.h>.#includ
0140: 65 20 3c 6f 70 65 6e 73 73 6c 2f 78 35 30 39 76 e <openssl/x509v
0150: 33 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 3.h>.#include <o
0160: 70 65 6e 73 73 6c 2f 78 35 30 39 5f 76 66 79 2e penssl/x509_vfy.
0170: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 h>.#include <ope
0180: 6e 73 73 6c 2f 61 73 6e 31 2e 68 3e 0a 23 69 6e nssl/asn1.h>.#in
0190: 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 22 clude "tlsInt.h"
01a0: 0a 0a 2f 2a 20 44 65 66 69 6e 65 20 6d 61 78 69 ../* Define maxi
01b0: 6d 75 6d 20 63 65 72 74 69 66 69 63 61 74 65 20 mum certificate
01c0: 73 69 7a 65 2e 20 4d 61 78 20 50 45 4d 20 73 69 size. Max PEM si
01d0: 7a 65 20 31 30 30 6b 42 20 61 6e 64 20 44 45 52 ze 100kB and DER
01e0: 20 73 69 7a 65 20 69 73 20 32 34 6b 42 2e 20 2a size is 24kB. *
01f0: 2f 0a 23 64 65 66 69 6e 65 20 43 45 52 54 5f 53 /.#define CERT_S
0200: 54 52 5f 53 49 5a 45 20 33 32 37 36 38 0a 0a 0c TR_SIZE 32768...
0210: 0a 2f 2a 0a 20 2a 20 53 74 72 69 6e 67 5f 74 6f ./*. * String_to
0220: 5f 48 65 78 20 2d 2d 0a 20 2a 09 46 6f 72 6d 61 _Hex --. *.Forma
0230: 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 t contents of a
0240: 62 69 6e 61 72 79 20 73 74 72 69 6e 67 20 61 73 binary string as
0250: 20 61 20 68 65 78 20 73 74 72 69 6e 67 0a 20 2a a hex string. *
0260: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
0270: 52 65 74 75 72 6e 73 20 73 69 7a 65 20 6f 66 20 Returns size of
0280: 6f 75 74 70 75 74 20 68 65 78 20 73 74 72 69 6e output hex strin
0290: 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 45 66 66 g. *. * Side Eff
02a0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ects:. *.None. *
02b0: 0a 20 2a 2f 0a 54 63 6c 5f 53 69 7a 65 20 53 74 . */.Tcl_Size St
02c0: 72 69 6e 67 5f 74 6f 5f 48 65 78 28 75 6e 73 69 ring_to_Hex(unsi
02d0: 67 6e 65 64 20 63 68 61 72 2a 20 69 6e 70 75 74 gned char* input
02e0: 2c 20 69 6e 74 20 69 6c 65 6e 2c 20 75 6e 73 69 , int ilen, unsi
02f0: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 gned char *buffe
0300: 72 2c 20 54 63 6c 5f 53 69 7a 65 20 62 6c 65 6e r, Tcl_Size blen
0310: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 ) {. Tcl_Size
0320: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 75 6e len = 0;. un
0330: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 70 74 signed char *ipt
0340: 72 20 3d 20 69 6e 70 75 74 3b 0a 20 20 20 20 75 r = input;. u
0350: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 70 nsigned char *op
0360: 74 72 20 3d 20 26 62 75 66 66 65 72 5b 30 5d 3b tr = &buffer[0];
0370: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
0380: 2a 68 65 78 20 3d 20 22 30 31 32 33 34 35 36 37 *hex = "01234567
0390: 38 39 61 62 63 64 65 66 22 3b 0a 0a 20 20 20 20 89abcdef";..
03a0: 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 for (int i = 0;
03b0: 69 20 3c 20 69 6c 65 6e 20 26 26 20 6c 65 6e 20 i < ilen && len
03c0: 3c 20 62 6c 65 6e 20 2d 20 31 3b 20 69 2b 2b 2c < blen - 1; i++,
03d0: 20 6c 65 6e 20 2b 3d 20 32 29 20 7b 0a 20 20 20 len += 2) {.
03e0: 20 20 20 20 20 2a 6f 70 74 72 2b 2b 20 3d 20 68 *optr++ = h
03f0: 65 78 5b 28 2a 69 70 74 72 3e 3e 34 29 26 30 78 ex[(*iptr>>4)&0x
0400: 46 5d 3b 0a 20 20 20 20 20 20 20 20 2a 6f 70 74 F];. *opt
0410: 72 2b 2b 20 3d 20 68 65 78 5b 28 2a 69 70 74 72 r++ = hex[(*iptr
0420: 2b 2b 29 26 30 78 46 5d 3b 0a 20 20 20 20 7d 0a ++)&0xF];. }.
0430: 20 20 20 20 2a 6f 70 74 72 20 3d 20 30 3b 0a 20 *optr = 0;.
0440: 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 7d return len;.}
0450: 0a 0a 2f 2a 0a 20 2a 20 42 49 4f 5f 74 6f 5f 42 ../*. * BIO_to_B
0460: 75 66 66 65 72 20 2d 2d 0a 20 2a 09 4f 75 74 70 uffer --. *.Outp
0470: 75 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 ut contents of a
0480: 20 42 49 4f 20 74 6f 20 61 20 62 75 66 66 65 72 BIO to a buffer
0490: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
04a0: 20 2a 09 52 65 74 75 72 6e 73 20 6c 65 6e 67 74 *.Returns lengt
04b0: 68 20 6f 66 20 73 74 72 69 6e 67 20 69 6e 20 62 h of string in b
04c0: 75 66 66 65 72 0a 20 2a 0a 20 2a 20 53 69 64 65 uffer. *. * Side
04d0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
04e0: 65 0a 20 2a 0a 20 2a 2f 0a 54 63 6c 5f 53 69 7a e. *. */.Tcl_Siz
04f0: 65 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 e BIO_to_Buffer(
0500: 69 6e 74 20 72 65 73 75 6c 74 2c 20 42 49 4f 20 int result, BIO
0510: 2a 62 69 6f 2c 20 76 6f 69 64 20 2a 62 75 66 66 *bio, void *buff
0520: 65 72 2c 20 69 6e 74 20 62 6c 65 6e 29 20 7b 0a er, int blen) {.
0530: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e Tcl_Size len
0540: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 70 65 = 0;. int pe
0550: 6e 64 69 6e 67 20 3d 20 42 49 4f 5f 70 65 6e 64 nding = BIO_pend
0560: 69 6e 67 28 62 69 6f 29 3b 0a 0a 20 20 20 20 69 ing(bio);.. i
0570: 66 20 28 72 65 73 75 6c 74 29 20 7b 0a 09 6c 65 f (result) {..le
0580: 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 42 n = (Tcl_Size) B
0590: 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 62 75 66 IO_read(bio, buf
05a0: 66 65 72 2c 20 28 70 65 6e 64 69 6e 67 20 3c 20 fer, (pending <
05b0: 62 6c 65 6e 29 20 3f 20 70 65 6e 64 69 6e 67 20 blen) ? pending
05c0: 3a 20 62 6c 65 6e 29 3b 0a 09 28 76 6f 69 64 29 : blen);..(void)
05d0: 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a BIO_flush(bio);.
05e0: 09 69 66 20 28 6c 65 6e 20 3c 20 30 29 20 7b 0a .if (len < 0) {.
05f0: 09 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 09 7d . len = 0;..}
0600: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
0610: 6e 20 6c 65 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a n len;.}.../*. *
0620: 20 54 6c 73 5f 78 35 30 39 45 78 74 65 6e 73 69 Tls_x509Extensi
0630: 6f 6e 73 20 2d 2d 0a 20 2a 09 47 65 74 20 6c 69 ons --. *.Get li
0640: 73 74 20 6f 66 20 58 2e 35 30 39 20 43 65 72 74 st of X.509 Cert
0650: 69 66 69 63 61 74 65 20 45 78 74 65 6e 73 69 6f ificate Extensio
0660: 6e 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 ns. *. * Results
0670: 3a 0a 20 2a 09 54 43 4c 20 6c 69 73 74 20 6f 66 :. *.TCL list of
0680: 20 65 78 74 65 6e 73 69 6f 6e 73 20 61 6e 64 20 extensions and
0690: 62 6f 6f 6c 65 61 6e 20 63 72 69 74 69 63 61 6c boolean critical
06a0: 20 73 74 61 74 75 73 0a 20 2a 0a 20 2a 20 53 69 status. *. * Si
06b0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
06c0: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 54 63 6c 5f 4f one. *. */.Tcl_O
06d0: 62 6a 20 2a 54 6c 73 5f 78 35 30 39 45 78 74 65 bj *Tls_x509Exte
06e0: 6e 73 69 6f 6e 73 28 54 63 6c 5f 49 6e 74 65 72 nsions(Tcl_Inter
06f0: 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20 p *interp, X509
0700: 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 63 6f 6e *cert) {. con
0710: 73 74 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 st STACK_OF(X509
0720: 5f 45 58 54 45 4e 53 49 4f 4e 29 20 2a 65 78 74 _EXTENSION) *ext
0730: 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a s;. Tcl_Obj *
0740: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f resultObj = Tcl_
0750: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
0760: 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 LL);.. if (re
0770: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 sultObj == NULL)
0780: 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b {..return NULL;
0790: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
07a0: 28 65 78 74 73 20 3d 20 58 35 30 39 5f 67 65 74 (exts = X509_get
07b0: 30 5f 65 78 74 65 6e 73 69 6f 6e 73 28 63 65 72 0_extensions(cer
07c0: 74 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 t)) != NULL) {..
07d0: 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b 20 69 20 for (int i=0; i
07e0: 3c 20 58 35 30 39 5f 67 65 74 5f 65 78 74 5f 63 < X509_get_ext_c
07f0: 6f 75 6e 74 28 63 65 72 74 29 3b 20 69 2b 2b 29 ount(cert); i++)
0800: 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 45 58 54 {.. X509_EXT
0810: 45 4e 53 49 4f 4e 20 2a 65 78 20 3d 20 73 6b 5f ENSION *ex = sk_
0820: 58 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 76 X509_EXTENSION_v
0830: 61 6c 75 65 28 65 78 74 73 2c 20 69 29 3b 0a 09 alue(exts, i);..
0840: 20 20 20 20 41 53 4e 31 5f 4f 42 4a 45 43 54 20 ASN1_OBJECT
0850: 2a 6f 62 6a 20 3d 20 58 35 30 39 5f 45 58 54 45 *obj = X509_EXTE
0860: 4e 53 49 4f 4e 5f 67 65 74 5f 6f 62 6a 65 63 74 NSION_get_object
0870: 28 65 78 29 3b 0a 09 20 20 20 20 2f 2a 20 41 53 (ex);.. /* AS
0880: 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49 4e 47 20 N1_OCTET_STRING
0890: 2a 64 61 74 61 20 3d 20 58 35 30 39 5f 45 58 54 *data = X509_EXT
08a0: 45 4e 53 49 4f 4e 5f 67 65 74 5f 64 61 74 61 28 ENSION_get_data(
08b0: 65 78 29 3b 20 2a 2f 0a 09 20 20 20 20 69 6e 74 ex); */.. int
08c0: 20 63 72 69 74 69 63 61 6c 20 3d 20 58 35 30 39 critical = X509
08d0: 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74 5f 63 _EXTENSION_get_c
08e0: 72 69 74 69 63 61 6c 28 65 78 29 3b 0a 09 20 20 ritical(ex);..
08f0: 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 LAPPEND_BOOL(i
0900: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
0910: 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 4f 42 4a , OBJ_nid2ln(OBJ
0920: 5f 6f 62 6a 32 6e 69 64 28 6f 62 6a 29 29 2c 20 _obj2nid(obj)),
0930: 63 72 69 74 69 63 61 6c 29 3b 0a 09 7d 0a 20 20 critical);..}.
0940: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 }. return r
0950: 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a esultObj;.}../*.
0960: 20 2a 20 54 6c 73 5f 78 35 30 39 49 64 65 6e 74 * Tls_x509Ident
0970: 69 66 69 65 72 20 2d 2d 0a 20 2a 09 47 65 74 20 ifier --. *.Get
0980: 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 X.509 certificat
0990: 65 20 41 75 74 68 6f 72 69 74 79 20 6f 72 20 53 e Authority or S
09a0: 75 62 6a 65 63 74 20 4b 65 79 20 49 64 65 6e 74 ubject Key Ident
09b0: 69 66 69 65 72 73 0a 20 2a 0a 20 2a 20 52 65 73 ifiers. *. * Res
09c0: 75 6c 74 73 3a 0a 20 2a 09 54 43 4c 20 73 74 72 ults:. *.TCL str
09d0: 69 6e 67 20 6f 62 6a 65 63 74 20 77 69 74 68 20 ing object with
09e0: 78 35 30 39 20 69 64 65 6e 74 69 66 69 65 72 20 x509 identifier
09f0: 61 73 20 61 20 68 65 78 20 73 74 72 69 6e 67 0a as a hex string.
0a00: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
0a10: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
0a20: 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f */.Tcl_Obj *Tls_
0a30: 78 35 30 39 49 64 65 6e 74 69 66 69 65 72 28 63 x509Identifier(c
0a40: 6f 6e 73 74 20 41 53 4e 31 5f 4f 43 54 45 54 5f onst ASN1_OCTET_
0a50: 53 54 52 49 4e 47 20 2a 61 73 74 72 69 6e 67 29 STRING *astring)
0a60: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
0a70: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 4e 55 4c 4c resultObj = NULL
0a80: 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c ;. Tcl_Size l
0a90: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 en = 0;. unsi
0aa0: 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 65 72 gned char buffer
0ab0: 5b 31 30 32 34 5d 3b 0a 0a 20 20 20 20 69 66 20 [1024];.. if
0ac0: 28 61 73 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c (astring != NULL
0ad0: 29 20 7b 0a 09 6c 65 6e 20 3d 20 53 74 72 69 6e ) {..len = Strin
0ae0: 67 5f 74 6f 5f 48 65 78 28 28 75 6e 73 69 67 6e g_to_Hex((unsign
0af0: 65 64 20 63 68 61 72 20 2a 29 41 53 4e 31 5f 53 ed char *)ASN1_S
0b00: 54 52 49 4e 47 5f 67 65 74 30 5f 64 61 74 61 28 TRING_get0_data(
0b10: 61 73 74 72 69 6e 67 29 2c 0a 09 20 20 20 20 41 astring),.. A
0b20: 53 4e 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 SN1_STRING_lengt
0b30: 68 28 61 73 74 72 69 6e 67 29 2c 20 62 75 66 66 h(astring), buff
0b40: 65 72 2c 20 31 30 32 34 29 3b 0a 20 20 20 20 7d er, 1024);. }
0b50: 0a 20 20 20 20 72 65 73 75 6c 74 4f 62 6a 20 3d . resultObj =
0b60: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
0b70: 6a 28 28 63 68 61 72 20 2a 29 20 26 62 75 66 66 j((char *) &buff
0b80: 65 72 5b 30 5d 2c 20 6c 65 6e 29 3b 0a 20 20 20 er[0], len);.
0b90: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 return resultOb
0ba0: 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 54 6c 73 5f j;.}../*. * Tls_
0bb0: 78 35 30 39 4b 65 79 55 73 61 67 65 20 2d 2d 0a x509KeyUsage --.
0bc0: 20 2a 09 47 65 74 20 58 2e 35 30 39 20 63 65 72 *.Get X.509 cer
0bd0: 74 69 66 69 63 61 74 65 20 6b 65 79 20 75 73 61 tificate key usa
0be0: 67 65 20 74 79 70 65 73 0a 20 2a 0a 20 2a 20 52 ge types. *. * R
0bf0: 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 6c 20 6c esults:. *.Tcl l
0c00: 69 73 74 20 6f 66 20 74 79 70 65 73 0a 20 2a 0a ist of types. *.
0c10: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
0c20: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a . *.None. *. */.
0c30: 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 Tcl_Obj *Tls_x50
0c40: 39 4b 65 79 55 73 61 67 65 28 54 63 6c 5f 49 6e 9KeyUsage(Tcl_In
0c50: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 terp *interp, X5
0c60: 30 39 20 2a 63 65 72 74 2c 20 75 69 6e 74 33 32 09 *cert, uint32
0c70: 5f 74 20 78 66 6c 61 67 73 29 20 7b 0a 20 20 20 _t xflags) {.
0c80: 20 75 69 6e 74 33 32 5f 74 20 75 73 61 67 65 20 uint32_t usage
0c90: 3d 20 58 35 30 39 5f 67 65 74 5f 6b 65 79 5f 75 = X509_get_key_u
0ca0: 73 61 67 65 28 63 65 72 74 29 3b 0a 20 20 20 20 sage(cert);.
0cb0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f Tcl_Obj *resultO
0cc0: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 bj = Tcl_NewList
0cd0: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 Obj(0, NULL);..
0ce0: 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a if (resultObj
0cf0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
0d00: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
0d10: 0a 20 20 20 20 69 66 20 28 28 78 66 6c 61 67 73 . if ((xflags
0d20: 20 26 20 45 58 46 4c 41 47 5f 4b 55 53 41 47 45 & EXFLAG_KUSAGE
0d30: 29 20 26 26 20 75 73 61 67 65 20 3c 20 55 49 4e ) && usage < UIN
0d40: 54 33 32 5f 4d 41 58 29 20 7b 0a 09 69 66 20 28 T32_MAX) {..if (
0d50: 75 73 61 67 65 20 26 20 4b 55 5f 44 49 47 49 54 usage & KU_DIGIT
0d60: 41 4c 5f 53 49 47 4e 41 54 55 52 45 29 20 7b 0a AL_SIGNATURE) {.
0d70: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
0d80: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
0d90: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
0da0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
0db0: 6a 28 22 44 69 67 69 74 61 6c 20 53 69 67 6e 61 j("Digital Signa
0dc0: 74 75 72 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a ture", -1));..}.
0dd0: 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f .if (usage & KU_
0de0: 4e 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e 29 NON_REPUDIATION)
0df0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
0e00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
0e10: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
0e20: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e bj, Tcl_NewStrin
0e30: 67 4f 62 6a 28 22 4e 6f 6e 2d 52 65 70 75 64 69 gObj("Non-Repudi
0e40: 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d ation", -1));..}
0e50: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 ..if (usage & KU
0e60: 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52 4d 45 4e _KEY_ENCIPHERMEN
0e70: 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 T) {.. Tcl_Li
0e80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
0e90: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c nt(interp, resul
0ea0: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tObj, Tcl_NewStr
0eb0: 69 6e 67 4f 62 6a 28 22 4b 65 79 20 45 6e 63 69 ingObj("Key Enci
0ec0: 70 68 65 72 6d 65 6e 74 22 2c 20 2d 31 29 29 3b pherment", -1));
0ed0: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 ..}..if (usage &
0ee0: 20 4b 55 5f 44 41 54 41 5f 45 4e 43 49 50 48 45 KU_DATA_ENCIPHE
0ef0: 52 4d 45 4e 54 29 20 7b 0a 09 20 20 20 20 54 63 RMENT) {.. Tc
0f00: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
0f10: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 lement(interp, r
0f20: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 esultObj, Tcl_Ne
0f30: 77 53 74 72 69 6e 67 4f 62 6a 28 22 44 61 74 61 wStringObj("Data
0f40: 20 45 6e 63 69 70 68 65 72 6d 65 6e 74 22 2c 20 Encipherment",
0f50: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 -1));..}..if (us
0f60: 61 67 65 20 26 20 4b 55 5f 4b 45 59 5f 41 47 52 age & KU_KEY_AGR
0f70: 45 45 4d 45 4e 54 29 20 7b 0a 09 20 20 20 20 54 EEMENT) {.. T
0f80: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
0f90: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
0fa0: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e resultObj, Tcl_N
0fb0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4b 65 79 ewStringObj("Key
0fc0: 20 41 67 72 65 65 6d 65 6e 74 22 2c 20 2d 31 29 Agreement", -1)
0fd0: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 );..}..if (usage
0fe0: 20 26 20 4b 55 5f 4b 45 59 5f 43 45 52 54 5f 53 & KU_KEY_CERT_S
0ff0: 49 47 4e 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f IGN) {.. Tcl_
1000: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1010: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 ment(interp, res
1020: 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 ultObj, Tcl_NewS
1030: 74 72 69 6e 67 4f 62 6a 28 22 43 65 72 74 69 66 tringObj("Certif
1040: 69 63 61 74 65 20 53 69 67 6e 69 6e 67 22 2c 20 icate Signing",
1050: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 -1));..}..if (us
1060: 61 67 65 20 26 20 4b 55 5f 43 52 4c 5f 53 49 47 age & KU_CRL_SIG
1070: 4e 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 N) {.. Tcl_Li
1080: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1090: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c nt(interp, resul
10a0: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tObj, Tcl_NewStr
10b0: 69 6e 67 4f 62 6a 28 22 43 52 4c 20 53 69 67 6e ingObj("CRL Sign
10c0: 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 ing", -1));..}..
10d0: 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f 45 if (usage & KU_E
10e0: 4e 43 49 50 48 45 52 5f 4f 4e 4c 59 29 20 7b 0a NCIPHER_ONLY) {.
10f0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1100: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1110: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
1120: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1130: 6a 28 22 45 6e 63 69 70 68 65 72 20 4f 6e 6c 79 j("Encipher Only
1140: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 ", -1));..}..if
1150: 28 75 73 61 67 65 20 26 20 4b 55 5f 44 45 43 49 (usage & KU_DECI
1160: 50 48 45 52 5f 4f 4e 4c 59 29 20 7b 0a 09 20 20 PHER_ONLY) {..
1170: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
1180: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1190: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 p, resultObj, Tc
11a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
11b0: 44 65 63 69 70 68 65 72 20 4f 6e 6c 79 22 2c 20 Decipher Only",
11c0: 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 -1));..}. } e
11d0: 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c lse {.. Tcl_L
11e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
11f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 ent(interp, resu
1200: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 ltObj, Tcl_NewSt
1210: 72 69 6e 67 4f 62 6a 28 22 75 6e 72 65 73 74 72 ringObj("unrestr
1220: 69 63 74 65 64 22 2c 20 2d 31 29 29 3b 0a 20 20 icted", -1));.
1230: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 }. return r
1240: 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a esultObj;.}../*.
1250: 20 2a 20 54 6c 73 5f 78 35 30 39 50 75 72 70 6f * Tls_x509Purpo
1260: 73 65 20 2d 2d 0a 20 2a 09 47 65 74 20 58 2e 35 se --. *.Get X.5
1270: 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 09 certificate p
1280: 75 72 70 6f 73 65 0a 20 2a 0a 20 2a 20 52 65 73 urpose. *. * Res
1290: 75 6c 74 73 3a 0a 20 2a 09 50 75 72 70 6f 73 65 ults:. *.Purpose
12a0: 20 73 74 72 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 string. *. * Si
12b0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
12c0: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 63 68 61 72 20 one. *. */.char
12d0: 2a 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 65 *Tls_x509Purpose
12e0: 28 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 (X509 *cert) {.
12f0: 20 20 20 63 68 61 72 20 2a 70 75 72 70 6f 73 65 char *purpose
1300: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 = NULL;.. if
1310: 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 (X509_check_pur
1320: 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f pose(cert, X509_
1330: 50 55 52 50 4f 53 45 5f 53 53 4c 5f 43 4c 49 45 PURPOSE_SSL_CLIE
1340: 4e 54 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 NT, 0) > 0) {..p
1350: 75 72 70 6f 73 65 20 3d 20 22 53 53 4c 20 43 6c urpose = "SSL Cl
1360: 69 65 6e 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 ient";. } els
1370: 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b e if (X509_check
1380: 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 _purpose(cert, X
1390: 35 30 39 5f 50 55 52 50 4f 53 45 5f 53 53 4c 5f 509_PURPOSE_SSL_
13a0: 53 45 52 56 45 52 2c 20 30 29 20 3e 20 30 29 20 SERVER, 0) > 0)
13b0: 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 53 53 {..purpose = "SS
13c0: 4c 20 53 65 72 76 65 72 22 3b 0a 20 20 20 20 7d L Server";. }
13d0: 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 else if (X509_c
13e0: 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 heck_purpose(cer
13f0: 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f t, X509_PURPOSE_
1400: 4e 53 5f 53 53 4c 5f 53 45 52 56 45 52 2c 20 30 NS_SSL_SERVER, 0
1410: 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 ) > 0) {..purpos
1420: 65 20 3d 20 22 4d 53 53 20 53 53 4c 20 53 65 72 e = "MSS SSL Ser
1430: 76 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ver";. } else
1440: 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f if (X509_check_
1450: 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 purpose(cert, X5
1460: 30 39 5f 50 55 52 50 4f 53 45 5f 53 4d 49 4d 45 09_PURPOSE_SMIME
1470: 5f 53 49 47 4e 2c 20 30 29 20 3e 20 30 29 20 7b _SIGN, 0) > 0) {
1480: 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 53 4d 49 ..purpose = "SMI
1490: 4d 45 20 53 69 67 6e 69 6e 67 22 3b 0a 20 20 20 ME Signing";.
14a0: 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 } else if (X509
14b0: 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 _check_purpose(c
14c0: 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 ert, X509_PURPOS
14d0: 45 5f 53 4d 49 4d 45 5f 45 4e 43 52 59 50 54 2c E_SMIME_ENCRYPT,
14e0: 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 0) > 0) {..purp
14f0: 6f 73 65 20 3d 20 22 53 4d 49 4d 45 20 45 6e 63 ose = "SMIME Enc
1500: 72 79 70 74 69 6f 6e 22 3b 0a 20 20 20 20 7d 20 ryption";. }
1510: 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 else if (X509_ch
1520: 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 eck_purpose(cert
1530: 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 43 , X509_PURPOSE_C
1540: 52 4c 5f 53 49 47 4e 2c 20 30 29 20 3e 20 30 29 RL_SIGN, 0) > 0)
1550: 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 43 {..purpose = "C
1560: 52 4c 20 53 69 67 6e 69 6e 67 22 3b 0a 20 20 20 RL Signing";.
1570: 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 } else if (X509
1580: 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 _check_purpose(c
1590: 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 ert, X509_PURPOS
15a0: 45 5f 41 4e 59 2c 20 30 29 20 3e 20 30 29 20 7b E_ANY, 0) > 0) {
15b0: 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 41 6e 79 ..purpose = "Any
15c0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ";. } else if
15d0: 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 (X509_check_pur
15e0: 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f pose(cert, X509_
15f0: 50 55 52 50 4f 53 45 5f 4f 43 53 50 5f 48 45 4c PURPOSE_OCSP_HEL
1600: 50 45 52 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 PER, 0) > 0) {..
1610: 70 75 72 70 6f 73 65 20 3d 20 22 4f 43 53 50 20 purpose = "OCSP
1620: 48 65 6c 70 65 72 22 3b 0a 20 20 20 20 7d 20 65 Helper";. } e
1630: 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 lse if (X509_che
1640: 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c ck_purpose(cert,
1650: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 54 49 X509_PURPOSE_TI
1660: 4d 45 53 54 41 4d 50 5f 53 49 47 4e 2c 20 30 29 MESTAMP_SIGN, 0)
1670: 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 > 0) {..purpose
1680: 20 3d 20 22 54 69 6d 65 73 74 61 6d 70 20 53 69 = "Timestamp Si
1690: 67 6e 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 6c gning";. } el
16a0: 73 65 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 se {..purpose =
16b0: 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 "";. }. re
16c0: 74 75 72 6e 20 70 75 72 70 6f 73 65 3b 0a 7d 0a turn purpose;.}.
16d0: 0a 2f 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39 50 ./*. * Tls_x509P
16e0: 75 72 70 6f 73 65 73 20 2d 2d 0a 20 2a 09 47 65 urposes --. *.Ge
16f0: 74 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 t X.509 certific
1700: 61 74 65 20 70 75 72 70 6f 73 65 20 74 79 70 65 ate purpose type
1710: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
1720: 0a 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 . *.Tcl list of
1730: 65 61 63 68 20 70 75 72 70 6f 73 65 20 61 6e 64 each purpose and
1740: 20 77 68 65 74 68 65 72 20 69 74 20 69 73 20 43 whether it is C
1750: 41 20 6f 72 20 6e 6f 6e 2d 43 41 0a 20 2a 0a 20 A or non-CA. *.
1760: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
1770: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 54 *.None. *. */.T
1780: 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 cl_Obj *Tls_x509
1790: 50 75 72 70 6f 73 65 73 28 54 63 6c 5f 49 6e 74 Purposes(Tcl_Int
17a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 erp *interp, X50
17b0: 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 54 9 *cert) {. T
17c0: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 cl_Obj *resultOb
17d0: 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f j = Tcl_NewListO
17e0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 bj(0, NULL);.
17f0: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 20 2a 70 X509_PURPOSE *p
1800: 74 6d 70 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 tmp;.. if (re
1810: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 sultObj == NULL)
1820: 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b {..return NULL;
1830: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 . }.. for
1840: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 (int i = 0; i <
1850: 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 X509_PURPOSE_get
1860: 5f 63 6f 75 6e 74 28 29 3b 20 69 2b 2b 29 20 7b _count(); i++) {
1870: 0a 09 70 74 6d 70 20 3d 20 58 35 30 39 5f 50 55 ..ptmp = X509_PU
1880: 52 50 4f 53 45 5f 67 65 74 30 28 69 29 3b 0a 09 RPOSE_get0(i);..
1890: 54 63 6c 5f 4f 62 6a 20 2a 74 6d 70 50 74 72 20 Tcl_Obj *tmpPtr
18a0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
18b0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 66 6f 72 (0, NULL);...for
18c0: 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 3c (int j = 0; j <
18d0: 20 32 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 2; j++) {..
18e0: 69 6e 74 20 69 64 72 65 74 20 3d 20 58 35 30 39 int idret = X509
18f0: 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 _check_purpose(c
1900: 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 ert, X509_PURPOS
1910: 45 5f 67 65 74 5f 69 64 28 70 74 6d 70 29 2c 20 E_get_id(ptmp),
1920: 6a 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 j);.. Tcl_Lis
1930: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1940: 74 28 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 t(interp, tmpPtr
1950: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
1960: 62 6a 28 6a 20 3f 20 22 43 41 22 20 3a 20 22 6e bj(j ? "CA" : "n
1970: 6f 6e 43 41 22 2c 20 2d 31 29 29 3b 0a 09 20 20 onCA", -1));..
1980: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
1990: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
19a0: 70 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c 5f 4e p, tmpPtr, Tcl_N
19b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 69 64 72 65 ewStringObj(idre
19c0: 74 20 3d 3d 20 31 20 3f 20 22 59 65 73 22 20 3a t == 1 ? "Yes" :
19d0: 20 22 4e 6f 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a "No", -1));..}.
19e0: 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 .LAPPEND_OBJ(int
19f0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
1a00: 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 X509_PURPOSE_get
1a10: 30 5f 6e 61 6d 65 28 70 74 6d 70 29 2c 20 74 6d 0_name(ptmp), tm
1a20: 70 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 pPtr);. }.
1a30: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 return resultOb
1a40: 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 54 6c 73 5f j;.}../*. * Tls_
1a50: 78 35 30 39 4e 61 6d 65 73 20 2d 2d 0a 20 2a 09 x509Names --. *.
1a60: 47 65 74 20 61 20 6c 69 73 74 20 6f 66 20 53 75 Get a list of Su
1a70: 62 6a 65 63 74 20 41 6c 74 65 72 6e 61 74 65 20 bject Alternate
1a80: 4e 61 6d 65 73 20 28 53 41 4e 29 20 6f 72 20 49 Names (SAN) or I
1a90: 73 73 75 65 72 20 41 6c 74 65 72 6e 61 74 65 20 ssuer Alternate
1aa0: 4e 61 6d 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 Names. *. * Resu
1ab0: 6c 74 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 74 lts:. *.Tcl list
1ac0: 20 6f 66 20 61 6c 74 65 72 6e 61 74 65 20 6e 61 of alternate na
1ad0: 6d 65 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 mes. *. * Side e
1ae0: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a ffects:. *.None.
1af0: 20 2a 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a *. */.Tcl_Obj *
1b00: 54 6c 73 5f 78 35 30 39 4e 61 6d 65 73 28 54 63 Tls_x509Names(Tc
1b10: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
1b20: 2c 20 58 35 30 39 20 2a 63 65 72 74 2c 20 69 6e , X509 *cert, in
1b30: 74 20 6e 69 64 2c 20 42 49 4f 20 2a 62 69 6f 29 t nid, BIO *bio)
1b40: 20 7b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 {. STACK_OF(
1b50: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 29 20 2a 6e GENERAL_NAME) *n
1b60: 61 6d 65 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 ames;. Tcl_Ob
1b70: 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 j *resultObj = T
1b80: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
1b90: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
1ba0: 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 63 68 Size len;. ch
1bb0: 61 72 20 62 75 66 66 65 72 5b 31 30 32 34 5d 3b ar buffer[1024];
1bc0: 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 .. if (result
1bd0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Obj == NULL) {..
1be0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
1bf0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 6e 61 6d }.. if ((nam
1c00: 65 73 20 3d 20 58 35 30 39 5f 67 65 74 5f 65 78 es = X509_get_ex
1c10: 74 5f 64 32 69 28 63 65 72 74 2c 20 6e 69 64 2c t_d2i(cert, nid,
1c20: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d NULL, NULL)) !=
1c30: 20 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 NULL) {..for (i
1c40: 6e 74 20 69 3d 30 3b 20 69 20 3c 20 73 6b 5f 47 nt i=0; i < sk_G
1c50: 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 6e 75 6d 28 ENERAL_NAME_num(
1c60: 6e 61 6d 65 73 29 3b 20 69 2b 2b 29 20 7b 0a 09 names); i++) {..
1c70: 20 20 20 20 63 6f 6e 73 74 20 47 45 4e 45 52 41 const GENERA
1c80: 4c 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 L_NAME *name = s
1c90: 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 76 k_GENERAL_NAME_v
1ca0: 61 6c 75 65 28 6e 61 6d 65 73 2c 20 69 29 3b 0a alue(names, i);.
1cb0: 0a 09 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f .. len = BIO_
1cc0: 74 6f 5f 42 75 66 66 65 72 28 6e 61 6d 65 20 26 to_Buffer(name &
1cd0: 26 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70 & GENERAL_NAME_p
1ce0: 72 69 6e 74 28 62 69 6f 2c 20 28 47 45 4e 45 52 rint(bio, (GENER
1cf0: 41 4c 5f 4e 41 4d 45 20 2a 29 20 6e 61 6d 65 29 AL_NAME *) name)
1d00: 2c 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 31 , bio, buffer, 1
1d10: 30 32 34 29 3b 0a 09 20 20 20 20 4c 41 50 50 45 024);.. LAPPE
1d20: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 ND_STR(interp, r
1d30: 65 73 75 6c 74 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 esultObj, NULL,
1d40: 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 09 7d buffer, len);..}
1d50: 0a 09 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d ..sk_GENERAL_NAM
1d60: 45 5f 70 6f 70 5f 66 72 65 65 28 6e 61 6d 65 73 E_pop_free(names
1d70: 2c 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 66 , GENERAL_NAME_f
1d80: 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ree);. }.
1d90: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a return resultObj
1da0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 54 6c 73 5f 78 ;.}../*. * Tls_x
1db0: 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 20 2d 509ExtKeyUsage -
1dc0: 2d 0a 20 2a 09 47 65 74 20 61 20 6c 69 73 74 20 -. *.Get a list
1dd0: 6f 66 20 45 78 74 65 6e 64 65 64 20 4b 65 79 20 of Extended Key
1de0: 55 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52 65 74 Usages. *. * Ret
1df0: 75 72 6e 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 urns:. *.Tcl lis
1e00: 74 20 6f 66 20 75 73 61 67 65 73 0a 20 2a 0a 20 t of usages. *.
1e10: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
1e20: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 54 *.None. *. */.T
1e30: 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 cl_Obj *Tls_x509
1e40: 45 78 74 4b 65 79 55 73 61 67 65 28 54 63 6c 5f ExtKeyUsage(Tcl_
1e50: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
1e60: 58 35 30 39 20 2a 63 65 72 74 2c 20 75 69 6e 74 X509 *cert, uint
1e70: 33 32 5f 74 20 78 66 6c 61 67 73 29 20 7b 0a 20 32_t xflags) {.
1e80: 20 20 20 75 69 6e 74 33 32 5f 74 20 75 73 61 67 uint32_t usag
1e90: 65 20 3d 20 58 35 30 39 5f 67 65 74 5f 6b 65 79 e = X509_get_key
1ea0: 5f 75 73 61 67 65 28 63 65 72 74 29 3b 0a 20 20 _usage(cert);.
1eb0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c Tcl_Obj *resul
1ec0: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 tObj = Tcl_NewLi
1ed0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
1ee0: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f . if (resultO
1ef0: 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 bj == NULL) {..r
1f00: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
1f10: 7d 0a 0a 20 20 20 20 69 66 20 28 28 78 66 6c 61 }.. if ((xfla
1f20: 67 73 20 26 20 45 58 46 4c 41 47 5f 58 4b 55 53 gs & EXFLAG_XKUS
1f30: 41 47 45 29 20 26 26 20 75 73 61 67 65 20 3c 20 AGE) && usage <
1f40: 55 49 4e 54 33 32 5f 4d 41 58 29 20 7b 0a 09 75 UINT32_MAX) {..u
1f50: 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 74 5f sage = X509_get_
1f60: 65 78 74 65 6e 64 65 64 5f 6b 65 79 5f 75 73 61 extended_key_usa
1f70: 67 65 28 63 65 72 74 29 3b 0a 0a 09 69 66 20 28 ge(cert);...if (
1f80: 75 73 61 67 65 20 26 20 58 4b 55 5f 53 53 4c 5f usage & XKU_SSL_
1f90: 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 54 SERVER) {.. T
1fa0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1fb0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
1fc0: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e resultObj, Tcl_N
1fd0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 4c 53 ewStringObj("TLS
1fe0: 20 57 65 62 20 53 65 72 76 65 72 20 41 75 74 68 Web Server Auth
1ff0: 65 6e 74 69 63 61 74 69 6f 6e 22 2c 20 2d 31 29 entication", -1)
2000: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 );..}..if (usage
2010: 20 26 20 58 4b 55 5f 53 53 4c 5f 43 4c 49 45 4e & XKU_SSL_CLIEN
2020: 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 T) {.. Tcl_Li
2030: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2040: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c nt(interp, resul
2050: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tObj, Tcl_NewStr
2060: 69 6e 67 4f 62 6a 28 22 54 4c 53 20 57 65 62 20 ingObj("TLS Web
2070: 43 6c 69 65 6e 74 20 41 75 74 68 65 6e 74 69 63 Client Authentic
2080: 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d ation", -1));..}
2090: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b ..if (usage & XK
20a0: 55 5f 53 4d 49 4d 45 29 20 7b 0a 09 20 20 20 20 U_SMIME) {..
20b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
20c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
20d0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f resultObj, Tcl_
20e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 45 2d NewStringObj("E-
20f0: 6d 61 69 6c 20 50 72 6f 74 65 63 74 69 6f 6e 22 mail Protection"
2100: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
2110: 75 73 61 67 65 20 26 20 58 4b 55 5f 43 4f 44 45 usage & XKU_CODE
2120: 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 20 54 63 _SIGN) {.. Tc
2130: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2140: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 lement(interp, r
2150: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 esultObj, Tcl_Ne
2160: 77 53 74 72 69 6e 67 4f 62 6a 28 22 43 6f 64 65 wStringObj("Code
2170: 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 3b Signing", -1));
2180: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 ..}..if (usage &
2190: 20 58 4b 55 5f 53 47 43 29 20 7b 0a 09 20 20 20 XKU_SGC) {..
21a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
21b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
21c0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c , resultObj, Tcl
21d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 53 _NewStringObj("S
21e0: 47 43 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 GC", -1));..}..i
21f0: 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f 4f f (usage & XKU_O
2200: 43 53 50 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 CSP_SIGN) {..
2210: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2220: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2230: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c , resultObj, Tcl
2240: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4f _NewStringObj("O
2250: 43 53 50 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 CSP Signing", -1
2260: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 ));..}..if (usag
2270: 65 20 26 20 58 4b 55 5f 54 49 4d 45 53 54 41 4d e & XKU_TIMESTAM
2280: 50 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 P) {.. Tcl_Li
2290: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
22a0: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c nt(interp, resul
22b0: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tObj, Tcl_NewStr
22c0: 69 6e 67 4f 62 6a 28 22 54 69 6d 65 20 53 74 61 ingObj("Time Sta
22d0: 6d 70 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d mping", -1));..}
22e0: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b ..if (usage & XK
22f0: 55 5f 44 56 43 53 20 29 20 7b 0a 09 20 20 20 20 U_DVCS ) {..
2300: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2310: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2320: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f resultObj, Tcl_
2330: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 44 56 NewStringObj("DV
2340: 43 53 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 CS", -1));..}..i
2350: 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f 41 f (usage & XKU_A
2360: 4e 59 45 4b 55 29 20 7b 0a 09 20 20 20 20 54 63 NYEKU) {.. Tc
2370: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2380: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 lement(interp, r
2390: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 esultObj, Tcl_Ne
23a0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 41 6e 79 20 wStringObj("Any
23b0: 45 78 74 65 6e 64 65 64 20 4b 65 79 20 55 73 61 Extended Key Usa
23c0: 67 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 ge", -1));..}.
23d0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 } else {..
23e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
23f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2400: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f resultObj, Tcl_
2410: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e NewStringObj("un
2420: 72 65 73 74 72 69 63 74 65 64 22 2c 20 2d 31 29 restricted", -1)
2430: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 );. }. ret
2440: 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d urn resultObj;.}
2450: 0a 0a 2f 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39 ../*. * Tls_x509
2460: 43 72 6c 44 70 20 2d 2d 0a 20 2a 09 47 65 74 20 CrlDp --. *.Get
2470: 6c 69 73 74 20 6f 66 20 43 52 4c 20 44 69 73 74 list of CRL Dist
2480: 72 69 62 75 74 69 6f 6e 20 50 6f 69 6e 74 73 0a ribution Points.
2490: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 *. * Returns:.
24a0: 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 55 52 *.Tcl list of UR
24b0: 49 73 20 61 6e 64 20 72 65 6c 61 74 69 76 65 2d Is and relative-
24c0: 6e 61 6d 65 73 0a 20 2a 0a 20 2a 20 53 69 64 65 names. *. * Side
24d0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
24e0: 65 0a 20 2a 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a e. *. */.Tcl_Obj
24f0: 20 2a 54 6c 73 5f 78 35 30 39 43 72 6c 44 70 28 *Tls_x509CrlDp(
2500: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
2510: 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 29 20 rp, X509 *cert)
2520: 7b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 44 {. STACK_OF(D
2530: 49 53 54 5f 50 4f 49 4e 54 29 20 2a 63 72 6c 3b IST_POINT) *crl;
2540: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 . Tcl_Obj *re
2550: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 sultObj = Tcl_Ne
2560: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
2570: 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 );.. if (resu
2580: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b ltObj == NULL) {
2590: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
25a0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 63 }.. if ((c
25b0: 72 6c 20 3d 20 58 35 30 39 5f 67 65 74 5f 65 78 rl = X509_get_ex
25c0: 74 5f 64 32 69 28 63 65 72 74 2c 20 4e 49 44 5f t_d2i(cert, NID_
25d0: 63 72 6c 5f 64 69 73 74 72 69 62 75 74 69 6f 6e crl_distribution
25e0: 5f 70 6f 69 6e 74 73 2c 20 4e 55 4c 4c 2c 20 4e _points, NULL, N
25f0: 55 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b ULL)) != NULL) {
2600: 0a 09 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b 20 ..for (int i=0;
2610: 69 20 3c 20 73 6b 5f 44 49 53 54 5f 50 4f 49 4e i < sk_DIST_POIN
2620: 54 5f 6e 75 6d 28 63 72 6c 29 3b 20 69 2b 2b 29 T_num(crl); i++)
2630: 20 7b 0a 09 20 20 20 20 44 49 53 54 5f 50 4f 49 {.. DIST_POI
2640: 4e 54 20 2a 64 70 20 3d 20 73 6b 5f 44 49 53 54 NT *dp = sk_DIST
2650: 5f 50 4f 49 4e 54 5f 76 61 6c 75 65 28 63 72 6c _POINT_value(crl
2660: 2c 20 69 29 3b 0a 09 20 20 20 20 44 49 53 54 5f , i);.. DIST_
2670: 50 4f 49 4e 54 5f 4e 41 4d 45 20 2a 64 69 73 74 POINT_NAME *dist
2680: 70 6f 69 6e 74 20 3d 20 64 70 2d 3e 64 69 73 74 point = dp->dist
2690: 70 6f 69 6e 74 3b 0a 0a 09 20 20 20 20 69 66 20 point;... if
26a0: 28 64 69 73 74 70 6f 69 6e 74 2d 3e 74 79 70 65 (distpoint->type
26b0: 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 66 75 == 0) {.../* fu
26c0: 6c 6c 2d 6e 61 6d 65 20 47 45 4e 45 52 41 4c 49 ll-name GENERALI
26d0: 5a 45 44 4e 41 4d 45 20 2a 2f 0a 09 09 66 6f 72 ZEDNAME */...for
26e0: 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 3c (int j = 0; j <
26f0: 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 sk_GENERAL_NAME
2700: 5f 6e 75 6d 28 64 69 73 74 70 6f 69 6e 74 2d 3e _num(distpoint->
2710: 6e 61 6d 65 2e 66 75 6c 6c 6e 61 6d 65 29 3b 20 name.fullname);
2720: 6a 2b 2b 29 20 7b 0a 09 09 20 20 20 20 47 45 4e j++) {... GEN
2730: 45 52 41 4c 5f 4e 41 4d 45 20 2a 67 65 6e 20 3d ERAL_NAME *gen =
2740: 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 sk_GENERAL_NAME
2750: 5f 76 61 6c 75 65 28 64 69 73 74 70 6f 69 6e 74 _value(distpoint
2760: 2d 3e 6e 61 6d 65 2e 66 75 6c 6c 6e 61 6d 65 2c ->name.fullname,
2770: 20 6a 29 3b 0a 09 09 20 20 20 20 69 6e 74 20 74 j);... int t
2780: 79 70 65 3b 0a 09 09 20 20 20 20 41 53 4e 31 5f ype;... ASN1_
2790: 53 54 52 49 4e 47 20 2a 75 72 69 20 3d 20 47 45 STRING *uri = GE
27a0: 4e 45 52 41 4c 5f 4e 41 4d 45 5f 67 65 74 30 5f NERAL_NAME_get0_
27b0: 76 61 6c 75 65 28 67 65 6e 2c 20 26 74 79 70 65 value(gen, &type
27c0: 29 3b 0a 09 09 20 20 20 20 69 66 20 28 74 79 70 );... if (typ
27d0: 65 20 3d 3d 20 47 45 4e 5f 55 52 49 29 20 7b 0a e == GEN_URI) {.
27e0: 09 09 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ...LAPPEND_STR(i
27f0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
2800: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c , (char *) NULL,
2810: 20 28 63 68 61 72 20 2a 29 20 41 53 4e 31 5f 53 (char *) ASN1_S
2820: 54 52 49 4e 47 5f 67 65 74 30 5f 64 61 74 61 28 TRING_get0_data(
2830: 75 72 69 29 2c 20 28 54 63 6c 5f 53 69 7a 65 29 uri), (Tcl_Size)
2840: 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c 65 6e ASN1_STRING_len
2850: 67 74 68 28 75 72 69 29 29 3b 0a 09 09 20 20 20 gth(uri));...
2860: 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c }...}.. } el
2870: 73 65 20 69 66 20 28 64 69 73 74 70 6f 69 6e 74 se if (distpoint
2880: 2d 3e 74 79 70 65 20 3d 3d 20 31 29 20 7b 0a 09 ->type == 1) {..
2890: 09 2f 2a 20 72 65 6c 61 74 69 76 65 2d 6e 61 6d ./* relative-nam
28a0: 65 20 58 35 30 39 4e 41 4d 45 20 2a 2f 0a 09 09 e X509NAME */...
28b0: 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 STACK_OF(X509_NA
28c0: 4d 45 5f 45 4e 54 52 59 29 20 2a 73 6b 5f 72 65 ME_ENTRY) *sk_re
28d0: 6c 6e 61 6d 65 20 3d 20 64 69 73 74 70 6f 69 6e lname = distpoin
28e0: 74 2d 3e 6e 61 6d 65 2e 72 65 6c 61 74 69 76 65 t->name.relative
28f0: 6e 61 6d 65 3b 0a 09 09 66 6f 72 20 28 69 6e 74 name;...for (int
2900: 20 6a 20 3d 20 30 3b 20 6a 20 3c 20 73 6b 5f 58 j = 0; j < sk_X
2910: 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 5f 6e 509_NAME_ENTRY_n
2920: 75 6d 28 73 6b 5f 72 65 6c 6e 61 6d 65 29 3b 20 um(sk_relname);
2930: 6a 2b 2b 29 20 7b 0a 09 09 20 20 20 20 58 35 30 j++) {... X50
2940: 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 20 2a 65 20 9_NAME_ENTRY *e
2950: 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 45 = sk_X509_NAME_E
2960: 4e 54 52 59 5f 76 61 6c 75 65 28 73 6b 5f 72 65 NTRY_value(sk_re
2970: 6c 6e 61 6d 65 2c 20 6a 29 3b 0a 09 09 20 20 20 lname, j);...
2980: 20 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 64 20 ASN1_STRING *d
2990: 3d 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 = X509_NAME_ENTR
29a0: 59 5f 67 65 74 5f 64 61 74 61 28 65 29 3b 0a 09 Y_get_data(e);..
29b0: 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
29c0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
29d0: 62 6a 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c bj, (char *) NUL
29e0: 4c 2c 20 28 63 68 61 72 20 2a 29 20 41 53 4e 31 L, (char *) ASN1
29f0: 5f 53 54 52 49 4e 47 5f 64 61 74 61 28 64 29 2c _STRING_data(d),
2a00: 20 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31 (Tcl_Size) ASN1
2a10: 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 64 _STRING_length(d
2a20: 29 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 ));...}.. }..
2a30: 7d 0a 09 43 52 4c 5f 44 49 53 54 5f 50 4f 49 4e }..CRL_DIST_POIN
2a40: 54 53 5f 66 72 65 65 28 63 72 6c 29 3b 0a 20 20 TS_free(crl);.
2a50: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 }. return r
2a60: 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a esultObj;.}../*.
2a70: 20 2a 20 54 6c 73 5f 78 35 30 39 4f 73 63 70 0a * Tls_x509Oscp.
2a80: 20 2a 09 47 65 74 20 6c 69 73 74 20 6f 66 20 4f *.Get list of O
2a90: 6e 2d 6c 69 6e 65 20 43 65 72 74 69 66 69 63 61 n-line Certifica
2aa0: 74 65 20 53 74 61 74 75 73 20 50 72 6f 74 6f 63 te Status Protoc
2ab0: 6f 6c 20 28 4f 53 43 50 29 20 55 52 49 73 0a 20 ol (OSCP) URIs.
2ac0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
2ad0: 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 55 52 49 .Tcl list of URI
2ae0: 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 s. *. * Side eff
2af0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ects:. *.None. *
2b00: 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c . */.Tcl_Obj *Tl
2b10: 73 5f 78 35 30 39 4f 73 63 70 28 54 63 6c 5f 49 s_x509Oscp(Tcl_I
2b20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 nterp *interp, X
2b30: 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 509 *cert) {.
2b40: 20 53 54 41 43 4b 5f 4f 46 28 4f 50 45 4e 53 53 STACK_OF(OPENSS
2b50: 4c 5f 53 54 52 49 4e 47 29 20 2a 6f 63 73 70 3b L_STRING) *ocsp;
2b60: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 . Tcl_Obj *re
2b70: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 sultObj = Tcl_Ne
2b80: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
2b90: 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 );.. if (resu
2ba0: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b ltObj == NULL) {
2bb0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
2bc0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 6f }.. if ((o
2bd0: 63 73 70 20 3d 20 58 35 30 39 5f 67 65 74 31 5f csp = X509_get1_
2be0: 6f 63 73 70 28 63 65 72 74 29 29 20 21 3d 20 4e ocsp(cert)) != N
2bf0: 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 ULL) {..for (int
2c00: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 4f i = 0; i < sk_O
2c10: 50 45 4e 53 53 4c 5f 53 54 52 49 4e 47 5f 6e 75 PENSSL_STRING_nu
2c20: 6d 28 6f 63 73 70 29 3b 20 69 2b 2b 29 20 7b 0a m(ocsp); i++) {.
2c30: 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
2c40: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
2c50: 62 6a 2c 20 4e 55 4c 4c 2c 20 73 6b 5f 4f 50 45 bj, NULL, sk_OPE
2c60: 4e 53 53 4c 5f 53 54 52 49 4e 47 5f 76 61 6c 75 NSSL_STRING_valu
2c70: 65 28 6f 63 73 70 2c 20 69 29 2c 20 2d 31 29 3b e(ocsp, i), -1);
2c80: 0a 09 7d 0a 09 58 35 30 39 5f 65 6d 61 69 6c 5f ..}..X509_email_
2c90: 66 72 65 65 28 6f 63 73 70 29 3b 0a 20 20 20 20 free(ocsp);.
2ca0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 }. return res
2cb0: 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a ultObj;.}../*. *
2cc0: 20 54 6c 73 5f 78 35 30 39 43 61 49 73 73 75 65 Tls_x509CaIssue
2cd0: 72 73 20 2d 2d 0a 20 2a 09 47 65 74 20 6c 69 73 rs --. *.Get lis
2ce0: 74 20 6f 66 20 43 65 72 74 69 66 69 63 61 74 65 t of Certificate
2cf0: 20 41 75 74 68 6f 72 69 74 79 20 28 43 41 29 20 Authority (CA)
2d00: 49 73 73 75 65 72 20 55 52 49 73 0a 20 2a 0a 20 Issuer URIs. *.
2d10: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 * Results:. *.Tc
2d20: 6c 20 6c 69 73 74 20 6f 66 20 43 41 20 69 73 73 l list of CA iss
2d30: 75 65 72 20 55 52 49 73 0a 20 2a 0a 20 2a 20 53 uer URIs. *. * S
2d40: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
2d50: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 54 63 6c 5f None. *. */.Tcl_
2d60: 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 43 61 49 Obj *Tls_x509CaI
2d70: 73 73 75 65 72 73 28 54 63 6c 5f 49 6e 74 65 72 ssuers(Tcl_Inter
2d80: 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20 p *interp, X509
2d90: 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 53 54 41 *cert) {. STA
2da0: 43 4b 5f 4f 46 28 41 43 43 45 53 53 5f 44 45 53 CK_OF(ACCESS_DES
2db0: 43 52 49 50 54 49 4f 4e 29 20 2a 61 64 73 3b 0a CRIPTION) *ads;.
2dc0: 20 20 20 20 41 43 43 45 53 53 5f 44 45 53 43 52 ACCESS_DESCR
2dd0: 49 50 54 49 4f 4e 20 2a 61 64 3b 0a 20 20 20 20 IPTION *ad;.
2de0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f Tcl_Obj *resultO
2df0: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 bj = Tcl_NewList
2e00: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 Obj(0, NULL);.
2e10: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
2e20: 2a 62 75 66 3b 0a 0a 20 20 20 20 69 66 20 28 72 *buf;.. if (r
2e30: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c esultObj == NULL
2e40: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c ) {..return NULL
2e50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
2e60: 28 28 61 64 73 20 3d 20 58 35 30 39 5f 67 65 74 ((ads = X509_get
2e70: 5f 65 78 74 5f 64 32 69 28 63 65 72 74 2c 20 4e _ext_d2i(cert, N
2e80: 49 44 5f 69 6e 66 6f 5f 61 63 63 65 73 73 2c 20 ID_info_access,
2e90: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 NULL, NULL)) !=
2ea0: 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e NULL) {..for (in
2eb0: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f t i = 0; i < sk_
2ec0: 41 43 43 45 53 53 5f 44 45 53 43 52 49 50 54 49 ACCESS_DESCRIPTI
2ed0: 4f 4e 5f 6e 75 6d 28 61 64 73 29 3b 20 69 2b 2b ON_num(ads); i++
2ee0: 29 20 7b 0a 09 20 20 20 20 61 64 20 3d 20 73 6b ) {.. ad = sk
2ef0: 5f 41 43 43 45 53 53 5f 44 45 53 43 52 49 50 54 _ACCESS_DESCRIPT
2f00: 49 4f 4e 5f 76 61 6c 75 65 28 61 64 73 2c 20 69 ION_value(ads, i
2f10: 29 3b 0a 09 20 20 20 20 69 66 20 28 4f 42 4a 5f );.. if (OBJ_
2f20: 6f 62 6a 32 6e 69 64 28 61 64 2d 3e 6d 65 74 68 obj2nid(ad->meth
2f30: 6f 64 29 20 3d 3d 20 4e 49 44 5f 61 64 5f 63 61 od) == NID_ad_ca
2f40: 5f 69 73 73 75 65 72 73 20 26 26 20 61 64 2d 3e _issuers && ad->
2f50: 6c 6f 63 61 74 69 6f 6e 29 20 7b 0a 09 09 69 66 location) {...if
2f60: 20 28 61 64 2d 3e 6c 6f 63 61 74 69 6f 6e 2d 3e (ad->location->
2f70: 74 79 70 65 20 3d 3d 20 47 45 4e 5f 55 52 49 29 type == GEN_URI)
2f80: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 69 7a {... Tcl_Siz
2f90: 65 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a e len = (Tcl_Siz
2fa0: 65 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 74 e) ASN1_STRING_t
2fb0: 6f 5f 55 54 46 38 28 26 62 75 66 2c 20 61 64 2d o_UTF8(&buf, ad-
2fc0: 3e 6c 6f 63 61 74 69 6f 6e 2d 3e 64 2e 75 6e 69 >location->d.uni
2fd0: 66 6f 72 6d 52 65 73 6f 75 72 63 65 49 64 65 6e formResourceIden
2fe0: 74 69 66 69 65 72 29 3b 0a 09 09 20 20 20 20 54 tifier);... T
2ff0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3000: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
3010: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e resultObj, Tcl_N
3020: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 ewStringObj((cha
3030: 72 20 2a 29 20 62 75 66 2c 20 6c 65 6e 29 29 3b r *) buf, len));
3040: 0a 09 09 20 20 20 20 4f 50 45 4e 53 53 4c 5f 66 ... OPENSSL_f
3050: 72 65 65 28 62 75 66 29 3b 0a 09 09 20 20 20 20 ree(buf);...
3060: 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 20 20 20 20 break;...}..
3070: 7d 0a 09 7d 0a 09 2f 2a 20 73 6b 5f 41 43 43 45 }..}../* sk_ACCE
3080: 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 5f 70 SS_DESCRIPTION_p
3090: 6f 70 5f 66 72 65 65 28 61 64 73 2c 20 41 43 43 op_free(ads, ACC
30a0: 45 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 5f ESS_DESCRIPTION_
30b0: 66 72 65 65 29 3b 20 2a 2f 0a 09 41 55 54 48 4f free); */..AUTHO
30c0: 52 49 54 59 5f 49 4e 46 4f 5f 41 43 43 45 53 53 RITY_INFO_ACCESS
30d0: 5f 66 72 65 65 28 61 64 73 29 3b 0a 20 20 20 20 _free(ads);.
30e0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 }. return res
30f0: 75 6c 74 4f 62 6a 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ultObj;.}.../*.
3100: 2a 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a * Tls_NewX509Obj
3110: 20 2d 2d 0a 20 2a 09 50 61 72 73 65 73 20 61 20 --. *.Parses a
3120: 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 X509 certificate
3130: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 63 6f 6e and returns con
3140: 74 65 6e 74 73 20 61 73 20 61 20 6b 65 79 2d 76 tents as a key-v
3150: 61 6c 75 65 20 54 63 6c 20 6c 69 73 74 2e 0a 20 alue Tcl list..
3160: 2a 0a 20 2a 20 52 65 73 75 6c 74 3a 0a 20 2a 09 *. * Result:. *.
3170: 41 20 54 63 6c 20 4c 69 73 74 20 77 69 74 68 20 A Tcl List with
3180: 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66 69 the X509 certifi
3190: 63 61 74 65 20 69 6e 66 6f 20 61 73 20 61 20 6b cate info as a k
31a0: 65 79 2d 76 61 6c 75 65 20 6c 69 73 74 0a 20 2a ey-value list. *
31b0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
31c0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f :. *.None. *. */
31d0: 0a 0a 54 63 6c 5f 4f 62 6a 2a 0a 54 6c 73 5f 4e ..Tcl_Obj*.Tls_N
31e0: 65 77 58 35 30 39 4f 62 6a 28 54 63 6c 5f 49 6e ewX509Obj(Tcl_In
31f0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 terp *interp, X5
3200: 30 39 20 2a 63 65 72 74 2c 20 69 6e 74 20 61 6c 09 *cert, int al
3210: 6c 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a l) {. Tcl_Obj
3220: 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 *resultObj = Tc
3230: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
3240: 4e 55 4c 4c 29 3b 0a 20 20 20 20 42 49 4f 20 2a NULL);. BIO *
3250: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 bio = BIO_new(BI
3260: 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 20 20 20 20 O_s_mem());.
3270: 69 6e 74 20 6d 64 6e 69 64 2c 20 70 6b 6e 69 64 int mdnid, pknid
3280: 2c 20 62 69 74 73 3b 0a 20 20 20 20 54 63 6c 5f , bits;. Tcl_
3290: 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 75 6e Size len;. un
32a0: 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b signed int ulen;
32b0: 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 78 66 . uint32_t xf
32c0: 6c 61 67 73 3b 0a 20 20 20 20 63 68 61 72 20 62 lags;. char b
32d0: 75 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 20 uffer[BUFSIZ];.
32e0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
32f0: 20 6d 64 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 md[EVP_MAX_MD_S
3300: 49 5a 45 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e IZE];. unsign
3310: 65 64 20 6c 6f 6e 67 20 66 6c 61 67 73 20 3d 20 ed long flags =
3320: 58 4e 5f 46 4c 41 47 5f 52 46 43 32 32 35 33 20 XN_FLAG_RFC2253
3330: 7c 20 41 53 4e 31 5f 53 54 52 46 4c 47 53 5f 55 | ASN1_STRFLGS_U
3340: 54 46 38 5f 43 4f 4e 56 45 52 54 3b 0a 20 20 20 TF8_CONVERT;.
3350: 20 66 6c 61 67 73 20 26 3d 20 7e 41 53 4e 31 5f flags &= ~ASN1_
3360: 53 54 52 46 4c 47 53 5f 45 53 43 5f 4d 53 42 3b STRFLGS_ESC_MSB;
3370: 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 .. if (interp
3380: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 65 72 74 == NULL || cert
3390: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62 69 6f 20 == NULL || bio
33a0: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 65 73 75 6c == NULL || resul
33b0: 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a tObj == NULL) {.
33c0: 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
33d0: 74 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 09 42 t(resultObj);..B
33e0: 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 72 IO_free(bio);..r
33f0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
3400: 7d 0a 0a 20 20 20 20 2f 2a 20 53 69 67 6e 61 74 }.. /* Signat
3410: 75 72 65 20 61 6c 67 6f 72 69 74 68 6d 20 61 6e ure algorithm an
3420: 64 20 76 61 6c 75 65 20 2d 20 52 46 43 20 35 32 d value - RFC 52
3430: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 31 80 section 4.1.1
3440: 2e 32 20 61 6e 64 20 34 2e 31 2e 31 2e 33 20 2a .2 and 4.1.1.3 *
3450: 2f 0a 20 20 20 20 2f 2a 20 73 69 67 6e 61 74 75 /. /* signatu
3460: 72 65 41 6c 67 6f 72 69 74 68 6d 20 69 73 20 74 reAlgorithm is t
3470: 68 65 20 69 64 20 6f 66 20 74 68 65 20 63 72 79 he id of the cry
3480: 70 74 6f 67 72 61 70 68 69 63 20 61 6c 67 6f 72 ptographic algor
3490: 69 74 68 6d 20 75 73 65 64 20 62 79 20 74 68 65 ithm used by the
34a0: 0a 09 43 41 20 74 6f 20 73 69 67 6e 20 74 68 69 ..CA to sign thi
34b0: 73 20 63 65 72 74 2e 20 73 69 67 6e 61 74 75 72 s cert. signatur
34c0: 65 56 61 6c 75 65 20 69 73 20 74 68 65 20 64 69 eValue is the di
34d0: 67 69 74 61 6c 20 73 69 67 6e 61 74 75 72 65 20 gital signature
34e0: 63 6f 6d 70 75 74 65 64 0a 09 75 70 6f 6e 20 74 computed..upon t
34f0: 68 65 20 41 53 4e 2e 31 20 44 45 52 20 65 6e 63 he ASN.1 DER enc
3500: 6f 64 65 64 20 74 62 73 43 65 72 74 69 66 69 63 oded tbsCertific
3510: 61 74 65 2e 20 2a 2f 0a 20 20 20 20 7b 0a 09 63 ate. */. {..c
3520: 6f 6e 73 74 20 58 35 30 39 5f 41 4c 47 4f 52 20 onst X509_ALGOR
3530: 2a 73 69 67 5f 61 6c 67 3b 0a 09 63 6f 6e 73 74 *sig_alg;..const
3540: 20 41 53 4e 31 5f 42 49 54 5f 53 54 52 49 4e 47 ASN1_BIT_STRING
3550: 20 2a 73 69 67 3b 0a 09 69 6e 74 20 73 69 67 5f *sig;..int sig_
3560: 6e 69 64 3b 0a 0a 09 58 35 30 39 5f 67 65 74 30 nid;...X509_get0
3570: 5f 73 69 67 6e 61 74 75 72 65 28 26 73 69 67 2c _signature(&sig,
3580: 20 26 73 69 67 5f 61 6c 67 2c 20 63 65 72 74 29 &sig_alg, cert)
3590: 3b 0a 09 2f 2a 20 73 69 67 5f 6e 69 64 20 3d 20 ;../* sig_nid =
35a0: 58 35 30 39 5f 67 65 74 5f 73 69 67 6e 61 74 75 X509_get_signatu
35b0: 72 65 5f 6e 69 64 28 63 65 72 74 29 20 2a 2f 0a re_nid(cert) */.
35c0: 09 73 69 67 5f 6e 69 64 20 3d 20 4f 42 4a 5f 6f .sig_nid = OBJ_o
35d0: 62 6a 32 6e 69 64 28 73 69 67 5f 61 6c 67 2d 3e bj2nid(sig_alg->
35e0: 61 6c 67 6f 72 69 74 68 6d 29 3b 0a 09 4c 41 50 algorithm);..LAP
35f0: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
3600: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 resultObj, "sig
3610: 6e 61 74 75 72 65 41 6c 67 6f 72 69 74 68 6d 22 natureAlgorithm"
3620: 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 73 69 67 , OBJ_nid2ln(sig
3630: 5f 6e 69 64 29 2c 20 2d 31 29 3b 0a 09 6c 65 6e _nid), -1);..len
3640: 20 3d 20 28 73 69 67 5f 6e 69 64 20 21 3d 20 4e = (sig_nid != N
3650: 49 44 5f 75 6e 64 65 66 29 20 3f 20 53 74 72 69 ID_undef) ? Stri
3660: 6e 67 5f 74 6f 5f 48 65 78 28 73 69 67 2d 3e 64 ng_to_Hex(sig->d
3670: 61 74 61 2c 20 73 69 67 2d 3e 6c 65 6e 67 74 68 ata, sig->length
3680: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 , (unsigned char
3690: 20 2a 29 20 62 75 66 66 65 72 2c 20 42 55 46 53 *) buffer, BUFS
36a0: 49 5a 29 20 3a 20 30 3b 0a 09 4c 41 50 50 45 4e IZ) : 0;..LAPPEN
36b0: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 D_STR(interp, re
36c0: 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74 sultObj, "signat
36d0: 75 72 65 56 61 6c 75 65 22 2c 20 62 75 66 66 65 ureValue", buffe
36e0: 72 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a r, len);. }..
36f0: 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 20 6f /* Version o
3700: 66 20 74 68 65 20 65 6e 63 6f 64 65 64 20 63 65 f the encoded ce
3710: 72 74 69 66 69 63 61 74 65 20 2d 20 52 46 43 20 rtificate - RFC
3720: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 5280 section 4.1
3730: 2e 32 2e 31 20 2a 2f 0a 20 20 20 20 4c 41 50 50 .2.1 */. LAPP
3740: 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c END_LONG(interp,
3750: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 76 65 72 resultObj, "ver
3760: 73 69 6f 6e 22 2c 20 58 35 30 39 5f 67 65 74 5f sion", X509_get_
3770: 76 65 72 73 69 6f 6e 28 63 65 72 74 29 2b 31 29 version(cert)+1)
3780: 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 ;.. /* Unique
3790: 20 6e 75 6d 62 65 72 20 61 73 73 69 67 6e 65 64 number assigned
37a0: 20 62 79 20 43 41 20 74 6f 20 63 65 72 74 69 66 by CA to certif
37b0: 69 63 61 74 65 20 2d 20 52 46 43 20 35 32 38 30 icate - RFC 5280
37c0: 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 32 section 4.1.2.2
37d0: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 */. len = BI
37e0: 4f 5f 74 6f 5f 42 75 66 66 65 72 28 69 32 61 5f O_to_Buffer(i2a_
37f0: 41 53 4e 31 5f 49 4e 54 45 47 45 52 28 62 69 6f ASN1_INTEGER(bio
3800: 2c 20 58 35 30 39 5f 67 65 74 30 5f 73 65 72 69 , X509_get0_seri
3810: 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 29 2c alNumber(cert)),
3820: 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 bio, buffer, BU
3830: 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 FSIZ);. LAPPE
3840: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 ND_STR(interp, r
3850: 65 73 75 6c 74 4f 62 6a 2c 20 22 73 65 72 69 61 esultObj, "seria
3860: 6c 4e 75 6d 62 65 72 22 2c 20 62 75 66 66 65 72 lNumber", buffer
3870: 2c 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 , len);.. /*
3880: 53 69 67 6e 61 74 75 72 65 20 61 6c 67 6f 72 69 Signature algori
3890: 74 68 6d 20 75 73 65 64 20 62 79 20 74 68 65 20 thm used by the
38a0: 43 41 20 74 6f 20 73 69 67 6e 20 74 68 65 20 63 CA to sign the c
38b0: 65 72 74 69 66 69 63 61 74 65 2e 20 4d 75 73 74 ertificate. Must
38c0: 20 6d 61 74 63 68 0a 09 73 69 67 6e 61 74 75 72 match..signatur
38d0: 65 41 6c 67 6f 72 69 74 68 6d 2e 20 52 46 43 20 eAlgorithm. RFC
38e0: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 5280 section 4.1
38f0: 2e 32 2e 33 20 2a 2f 0a 20 20 20 20 4c 41 50 50 .2.3 */. LAPP
3900: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
3910: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e resultObj, "sign
3920: 61 74 75 72 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 ature", OBJ_nid2
3930: 6c 6e 28 58 35 30 39 5f 67 65 74 5f 73 69 67 6e ln(X509_get_sign
3940: 61 74 75 72 65 5f 6e 69 64 28 63 65 72 74 29 29 ature_nid(cert))
3950: 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 , -1);.. /* I
3960: 73 73 75 65 72 20 69 64 65 6e 74 69 66 69 65 73 ssuer identifies
3970: 20 74 68 65 20 65 6e 74 69 74 79 20 74 68 61 74 the entity that
3980: 20 73 69 67 6e 65 64 20 61 6e 64 20 69 73 73 75 signed and issu
3990: 65 64 20 74 68 65 20 63 65 72 74 2e 20 52 46 43 ed the cert. RFC
39a0: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 5280 section 4.
39b0: 31 2e 32 2e 34 20 2a 2f 0a 20 20 20 20 6c 65 6e 1.2.4 */. len
39c0: 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 = BIO_to_Buffer
39d0: 28 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e 74 (X509_NAME_print
39e0: 5f 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 _ex(bio, X509_ge
39f0: 74 5f 69 73 73 75 65 72 5f 6e 61 6d 65 28 63 65 t_issuer_name(ce
3a00: 72 74 29 2c 20 30 2c 20 66 6c 61 67 73 29 2c 20 rt), 0, flags),
3a10: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46 bio, buffer, BUF
3a20: 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e SIZ);. LAPPEN
3a30: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 D_STR(interp, re
3a40: 73 75 6c 74 4f 62 6a 2c 20 22 69 73 73 75 65 72 sultObj, "issuer
3a50: 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b ", buffer, len);
3a60: 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 .. /* Certifi
3a70: 63 61 74 65 20 76 61 6c 69 64 69 74 79 20 70 65 cate validity pe
3a80: 72 69 6f 64 20 69 73 20 74 68 65 20 69 6e 74 65 riod is the inte
3a90: 72 76 61 6c 20 74 68 65 20 43 41 20 77 61 72 72 rval the CA warr
3aa0: 61 6e 74 73 20 74 68 61 74 20 69 74 20 77 69 6c ants that it wil
3ab0: 6c 0a 09 6d 61 69 6e 74 61 69 6e 20 69 6e 66 6f l..maintain info
3ac0: 20 6f 6e 20 74 68 65 20 73 74 61 74 75 73 20 6f on the status o
3ad0: 66 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 f the certificat
3ae0: 65 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 e. RFC 5280 sect
3af0: 69 6f 6e 20 34 2e 31 2e 32 2e 35 20 2a 2f 0a 20 ion 4.1.2.5 */.
3b00: 20 20 20 2f 2a 20 47 65 74 20 56 61 6c 69 64 69 /* Get Validi
3b10: 74 79 20 2d 20 4e 6f 74 20 42 65 66 6f 72 65 20 ty - Not Before
3b20: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f */. len = BIO
3b30: 5f 74 6f 5f 42 75 66 66 65 72 28 41 53 4e 31 5f _to_Buffer(ASN1_
3b40: 54 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c 20 TIME_print(bio,
3b50: 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74 42 65 66 X509_get0_notBef
3b60: 6f 72 65 28 63 65 72 74 29 29 2c 20 62 69 6f 2c ore(cert)), bio,
3b70: 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 buffer, BUFSIZ)
3b80: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 ;. LAPPEND_ST
3b90: 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 R(interp, result
3ba0: 4f 62 6a 2c 20 22 6e 6f 74 42 65 66 6f 72 65 22 Obj, "notBefore"
3bb0: 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a , buffer, len);.
3bc0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 56 61 6c 69 . /* Get Vali
3bd0: 64 69 74 79 20 2d 20 4e 6f 74 20 41 66 74 65 72 dity - Not After
3be0: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 */. len = BI
3bf0: 4f 5f 74 6f 5f 42 75 66 66 65 72 28 41 53 4e 31 O_to_Buffer(ASN1
3c00: 5f 54 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c _TIME_print(bio,
3c10: 20 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74 41 66 X509_get0_notAf
3c20: 74 65 72 28 63 65 72 74 29 29 2c 20 62 69 6f 2c ter(cert)), bio,
3c30: 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 buffer, BUFSIZ)
3c40: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 ;. LAPPEND_ST
3c50: 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 R(interp, result
3c60: 4f 62 6a 2c 20 22 6e 6f 74 41 66 74 65 72 22 2c Obj, "notAfter",
3c70: 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a buffer, len);..
3c80: 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 69 /* Subject i
3c90: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 65 6e dentifies the en
3ca0: 74 69 74 79 20 61 73 73 6f 63 69 61 74 65 64 20 tity associated
3cb0: 77 69 74 68 20 74 68 65 20 70 75 62 6c 69 63 20 with the public
3cc0: 6b 65 79 20 73 74 6f 72 65 64 20 69 6e 0a 09 74 key stored in..t
3cd0: 68 65 20 73 75 62 6a 65 63 74 20 70 75 62 6c 69 he subject publi
3ce0: 63 20 6b 65 79 20 66 69 65 6c 64 2e 20 52 46 43 c key field. RFC
3cf0: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 5280 section 4.
3d00: 31 2e 32 2e 36 20 2a 2f 0a 20 20 20 20 6c 65 6e 1.2.6 */. len
3d10: 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 = BIO_to_Buffer
3d20: 28 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e 74 (X509_NAME_print
3d30: 5f 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 _ex(bio, X509_ge
3d40: 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 t_subject_name(c
3d50: 65 72 74 29 2c 20 30 2c 20 66 6c 61 67 73 29 2c ert), 0, flags),
3d60: 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 bio, buffer, BU
3d70: 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 FSIZ);. LAPPE
3d80: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 ND_STR(interp, r
3d90: 65 73 75 6c 74 4f 62 6a 2c 20 22 73 75 62 6a 65 esultObj, "subje
3da0: 63 74 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e ct", buffer, len
3db0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 48 41 31 20 );.. /* SHA1
3dc0: 44 69 67 65 73 74 20 28 46 69 6e 67 65 72 70 72 Digest (Fingerpr
3dd0: 69 6e 74 29 20 6f 66 20 63 65 72 74 20 2d 20 44 int) of cert - D
3de0: 45 52 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f ER representatio
3df0: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35 30 n */. if (X50
3e00: 39 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 45 9_digest(cert, E
3e10: 56 50 5f 73 68 61 31 28 29 2c 20 6d 64 2c 20 26 VP_sha1(), md, &
3e20: 75 6c 65 6e 29 29 20 7b 0a 09 6c 65 6e 20 3d 20 ulen)) {..len =
3e30: 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 6d 64 String_to_Hex(md
3e40: 2c 20 28 69 6e 74 29 20 75 6c 65 6e 2c 20 28 75 , (int) ulen, (u
3e50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
3e60: 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b buffer, BUFSIZ);
3e70: 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
3e80: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
3e90: 20 22 73 68 61 31 5f 68 61 73 68 22 2c 20 62 75 "sha1_hash", bu
3ea0: 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 ffer, len);.
3eb0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 48 41 32 35 36 }.. /* SHA256
3ec0: 20 44 69 67 65 73 74 20 28 46 69 6e 67 65 72 70 Digest (Fingerp
3ed0: 72 69 6e 74 29 20 6f 66 20 63 65 72 74 20 2d 20 rint) of cert -
3ee0: 44 45 52 20 72 65 70 72 65 73 65 6e 74 61 74 69 DER representati
3ef0: 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35 on */. if (X5
3f00: 30 39 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 09_digest(cert,
3f10: 45 56 50 5f 73 68 61 32 35 36 28 29 2c 20 6d 64 EVP_sha256(), md
3f20: 2c 20 26 75 6c 65 6e 29 29 20 7b 0a 09 6c 65 6e , &ulen)) {..len
3f30: 20 3d 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 = String_to_Hex
3f40: 28 6d 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e 2c (md, (int) ulen,
3f50: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 (unsigned char
3f60: 2a 29 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 *) buffer, BUFSI
3f70: 5a 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 Z);..LAPPEND_STR
3f80: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
3f90: 62 6a 2c 20 22 73 68 61 32 35 36 5f 68 61 73 68 bj, "sha256_hash
3fa0: 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b ", buffer, len);
3fb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
3fc0: 75 62 6a 65 63 74 20 50 75 62 6c 69 63 20 4b 65 ubject Public Ke
3fd0: 79 20 49 6e 66 6f 20 73 70 65 63 69 66 69 65 73 y Info specifies
3fe0: 20 74 68 65 20 70 75 62 6c 69 63 20 6b 65 79 20 the public key
3ff0: 61 6e 64 20 69 64 65 6e 74 69 66 69 65 73 20 74 and identifies t
4000: 68 65 0a 09 61 6c 67 6f 72 69 74 68 6d 20 77 69 he..algorithm wi
4010: 74 68 20 77 68 69 63 68 20 74 68 65 20 6b 65 79 th which the key
4020: 20 69 73 20 75 73 65 64 2e 20 52 46 43 20 35 32 is used. RFC 52
4030: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 80 section 4.1.2
4040: 2e 37 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35 .7 */. if (X5
4050: 30 39 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 09_get_signature
4060: 5f 69 6e 66 6f 28 63 65 72 74 2c 20 26 6d 64 6e _info(cert, &mdn
4070: 69 64 2c 20 26 70 6b 6e 69 64 2c 20 26 62 69 74 id, &pknid, &bit
4080: 73 2c 20 26 78 66 6c 61 67 73 29 29 20 7b 0a 09 s, &xflags)) {..
4090: 41 53 4e 31 5f 42 49 54 5f 53 54 52 49 4e 47 20 ASN1_BIT_STRING
40a0: 2a 6b 65 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 *key;..unsigned
40b0: 69 6e 74 20 6e 3b 0a 0a 09 4c 41 50 50 45 4e 44 int n;...LAPPEND
40c0: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 _STR(interp, res
40d0: 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 69 6e 67 ultObj, "signing
40e0: 44 69 67 65 73 74 22 2c 20 4f 42 4a 5f 6e 69 64 Digest", OBJ_nid
40f0: 32 6c 6e 28 6d 64 6e 69 64 29 2c 20 2d 31 29 3b 2ln(mdnid), -1);
4100: 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
4110: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
4120: 20 22 70 75 62 6c 69 63 4b 65 79 41 6c 67 6f 72 "publicKeyAlgor
4130: 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c ithm", OBJ_nid2l
4140: 6e 28 70 6b 6e 69 64 29 2c 20 2d 31 29 3b 0a 09 n(pknid), -1);..
4150: 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
4160: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
4170: 62 69 74 73 22 2c 20 62 69 74 73 29 3b 20 2f 2a bits", bits); /*
4180: 20 45 66 66 65 63 74 69 76 65 20 73 65 63 75 72 Effective secur
4190: 69 74 79 20 62 69 74 73 20 2a 2f 0a 0a 09 6b 65 ity bits */...ke
41a0: 79 20 3d 20 58 35 30 39 5f 67 65 74 30 5f 70 75 y = X509_get0_pu
41b0: 62 6b 65 79 5f 62 69 74 73 74 72 28 63 65 72 74 bkey_bitstr(cert
41c0: 29 3b 0a 09 6c 65 6e 20 3d 20 53 74 72 69 6e 67 );..len = String
41d0: 5f 74 6f 5f 48 65 78 28 6b 65 79 2d 3e 64 61 74 _to_Hex(key->dat
41e0: 61 2c 20 6b 65 79 2d 3e 6c 65 6e 67 74 68 2c 20 a, key->length,
41f0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a (unsigned char *
4200: 29 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a ) buffer, BUFSIZ
4210: 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
4220: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
4230: 6a 2c 20 22 70 75 62 6c 69 63 4b 65 79 22 2c 20 j, "publicKey",
4240: 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a 09 buffer, len);...
4250: 6c 65 6e 20 3d 20 30 3b 0a 09 69 66 20 28 58 35 len = 0;..if (X5
4260: 30 39 5f 70 75 62 6b 65 79 5f 64 69 67 65 73 74 09_pubkey_digest
4270: 28 63 65 72 74 2c 20 45 56 50 5f 67 65 74 5f 64 (cert, EVP_get_d
4280: 69 67 65 73 74 62 79 6e 69 64 28 70 6b 6e 69 64 igestbynid(pknid
4290: 29 2c 20 6d 64 2c 20 26 6e 29 29 20 7b 0a 09 20 ), md, &n)) {..
42a0: 20 20 20 6c 65 6e 20 3d 20 53 74 72 69 6e 67 5f len = String_
42b0: 74 6f 5f 48 65 78 28 6d 64 2c 20 28 69 6e 74 29 to_Hex(md, (int)
42c0: 20 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 n, (unsigned ch
42d0: 61 72 20 2a 29 20 62 75 66 66 65 72 2c 20 42 55 ar *) buffer, BU
42e0: 46 53 49 5a 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 FSIZ);..}..LAPPE
42f0: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 ND_STR(interp, r
4300: 65 73 75 6c 74 4f 62 6a 2c 20 22 70 75 62 6c 69 esultObj, "publi
4310: 63 4b 65 79 48 61 73 68 22 2c 20 62 75 66 66 65 cKeyHash", buffe
4320: 72 2c 20 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 64 69 r, len);.../* di
4330: 67 65 73 74 20 6f 66 20 74 68 65 20 44 45 52 20 gest of the DER
4340: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f representation o
4350: 66 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 f the certificat
4360: 65 20 2a 2f 0a 09 6c 65 6e 20 3d 20 30 3b 0a 09 e */..len = 0;..
4370: 69 66 20 28 58 35 30 39 5f 64 69 67 65 73 74 28 if (X509_digest(
4380: 63 65 72 74 2c 20 45 56 50 5f 67 65 74 5f 64 69 cert, EVP_get_di
4390: 67 65 73 74 62 79 6e 69 64 28 6d 64 6e 69 64 29 gestbynid(mdnid)
43a0: 2c 20 6d 64 2c 20 26 6e 29 29 20 7b 0a 09 20 20 , md, &n)) {..
43b0: 20 20 6c 65 6e 20 3d 20 53 74 72 69 6e 67 5f 74 len = String_t
43c0: 6f 5f 48 65 78 28 6d 64 2c 20 28 69 6e 74 29 20 o_Hex(md, (int)
43d0: 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 n, (unsigned cha
43e0: 72 20 2a 29 20 62 75 66 66 65 72 2c 20 42 55 46 r *) buffer, BUF
43f0: 53 49 5a 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e SIZ);..}..LAPPEN
4400: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 D_STR(interp, re
4410: 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74 sultObj, "signat
4420: 75 72 65 48 61 73 68 22 2c 20 62 75 66 66 65 72 ureHash", buffer
4430: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 , len);. }..
4440: 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63 61 74 /* Certificat
4450: 65 20 50 75 72 70 6f 73 65 2e 20 43 61 6c 6c 20 e Purpose. Call
4460: 62 65 66 6f 72 65 20 63 68 65 63 6b 69 6e 67 20 before checking
4470: 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 for extensions.
4480: 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 */. LAPPEND_S
4490: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c TR(interp, resul
44a0: 74 4f 62 6a 2c 20 22 70 75 72 70 6f 73 65 22 2c tObj, "purpose",
44b0: 20 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 65 Tls_x509Purpose
44c0: 28 63 65 72 74 29 2c 20 2d 31 29 3b 0a 20 20 20 (cert), -1);.
44d0: 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 LAPPEND_OBJ(int
44e0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
44f0: 22 63 65 72 74 69 66 69 63 61 74 65 50 75 72 70 "certificatePurp
4500: 6f 73 65 22 2c 20 54 6c 73 5f 78 35 30 39 50 75 ose", Tls_x509Pu
4510: 72 70 6f 73 65 73 28 69 6e 74 65 72 70 2c 20 63 rposes(interp, c
4520: 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 ert));.. /* G
4530: 65 74 20 65 78 74 65 6e 73 69 6f 6e 73 20 66 6c et extensions fl
4540: 61 67 73 20 2a 2f 0a 20 20 20 20 78 66 6c 61 67 ags */. xflag
4550: 73 20 3d 20 58 35 30 39 5f 67 65 74 5f 65 78 74 s = X509_get_ext
4560: 65 6e 73 69 6f 6e 5f 66 6c 61 67 73 28 63 65 72 ension_flags(cer
4570: 74 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f t);. LAPPEND_
4580: 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 73 75 INT(interp, resu
4590: 6c 74 4f 62 6a 2c 20 22 65 78 74 46 6c 61 67 73 ltObj, "extFlags
45a0: 22 2c 20 78 66 6c 61 67 73 29 3b 0a 0a 09 2f 2a ", xflags);.../*
45b0: 20 43 68 65 63 6b 20 69 66 20 63 65 72 74 20 77 Check if cert w
45c0: 61 73 20 69 73 73 75 65 64 20 62 79 20 43 41 20 as issued by CA
45d0: 63 65 72 74 20 69 73 73 75 65 72 20 6f 72 20 73 cert issuer or s
45e0: 65 6c 66 20 73 69 67 6e 65 64 20 2a 2f 0a 20 20 elf signed */.
45f0: 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 LAPPEND_BOOL(i
4600: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
4610: 2c 20 22 73 65 6c 66 49 73 73 75 65 64 22 2c 20 , "selfIssued",
4620: 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f xflags & EXFLAG_
4630: 53 49 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 SI);. LAPPEND
4640: 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65 _BOOL(interp, re
4650: 73 75 6c 74 4f 62 6a 2c 20 22 73 65 6c 66 53 69 sultObj, "selfSi
4660: 67 6e 65 64 22 2c 20 78 66 6c 61 67 73 20 26 20 gned", xflags &
4670: 45 58 46 4c 41 47 5f 53 53 29 3b 0a 20 20 20 20 EXFLAG_SS);.
4680: 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
4690: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
46a0: 22 69 73 50 72 6f 78 79 43 65 72 74 22 2c 20 78 "isProxyCert", x
46b0: 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 50 flags & EXFLAG_P
46c0: 52 4f 58 59 29 3b 0a 20 20 20 20 4c 41 50 50 45 ROXY);. LAPPE
46d0: 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
46e0: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74 49 resultObj, "extI
46f0: 6e 76 61 6c 69 64 22 2c 20 78 66 6c 61 67 73 20 nvalid", xflags
4700: 26 20 45 58 46 4c 41 47 5f 49 4e 56 41 4c 49 44 & EXFLAG_INVALID
4710: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 );. LAPPEND_B
4720: 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 75 OOL(interp, resu
4730: 6c 74 4f 62 6a 2c 20 22 69 73 43 41 43 65 72 74 ltObj, "isCACert
4740: 22 2c 20 58 35 30 39 5f 63 68 65 63 6b 5f 63 61 ", X509_check_ca
4750: 28 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a (cert));.. /*
4760: 20 54 68 65 20 55 6e 69 71 75 65 20 49 64 73 20 The Unique Ids
4770: 61 72 65 20 75 73 65 64 20 74 6f 20 68 61 6e 64 are used to hand
4780: 6c 65 20 74 68 65 20 70 6f 73 73 69 62 69 6c 69 le the possibili
4790: 74 79 20 6f 66 20 72 65 75 73 65 20 6f 66 20 73 ty of reuse of s
47a0: 75 62 6a 65 63 74 0a 09 61 6e 64 2f 6f 72 20 69 ubject..and/or i
47b0: 73 73 75 65 72 20 6e 61 6d 65 73 20 6f 76 65 72 ssuer names over
47c0: 20 74 69 6d 65 2e 20 52 46 43 20 35 32 38 30 20 time. RFC 5280
47d0: 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 38 20 section 4.1.2.8
47e0: 2a 2f 0a 20 20 20 20 7b 0a 09 63 6f 6e 73 74 20 */. {..const
47f0: 41 53 4e 31 5f 42 49 54 5f 53 54 52 49 4e 47 20 ASN1_BIT_STRING
4800: 2a 69 75 69 64 2c 20 2a 73 75 69 64 3b 0a 20 20 *iuid, *suid;.
4810: 20 20 20 20 20 20 58 35 30 39 5f 67 65 74 30 5f X509_get0_
4820: 75 69 64 73 28 63 65 72 74 2c 20 26 69 75 69 64 uids(cert, &iuid
4830: 2c 20 26 73 75 69 64 29 3b 0a 0a 09 54 63 6c 5f , &suid);...Tcl_
4840: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
4850: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 ment(interp, res
4860: 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 ultObj, Tcl_NewS
4870: 74 72 69 6e 67 4f 62 6a 28 22 69 73 73 75 65 72 tringObj("issuer
4880: 55 6e 69 71 75 65 49 64 22 2c 20 2d 31 29 29 3b UniqueId", -1));
4890: 0a 09 69 66 20 28 69 75 69 64 20 21 3d 20 4e 55 ..if (iuid != NU
48a0: 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c LL) {.. Tcl_L
48b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
48c0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 ent(interp, resu
48d0: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 42 79 ltObj, Tcl_NewBy
48e0: 74 65 41 72 72 61 79 4f 62 6a 28 28 63 6f 6e 73 teArrayObj((cons
48f0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
4900: 2a 29 69 75 69 64 2d 3e 64 61 74 61 2c 20 28 54 *)iuid->data, (T
4910: 63 6c 5f 53 69 7a 65 29 20 69 75 69 64 2d 3e 6c cl_Size) iuid->l
4920: 65 6e 67 74 68 29 29 3b 0a 09 7d 20 65 6c 73 65 ength));..} else
4930: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
4940: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
4950: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
4960: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e bj, Tcl_NewStrin
4970: 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 09 gObj("", -1));..
4980: 7d 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 }...Tcl_ListObjA
4990: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
49a0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
49b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
49c0: 28 22 73 75 62 6a 65 63 74 55 6e 69 71 75 65 49 ("subjectUniqueI
49d0: 64 22 2c 20 2d 31 29 29 3b 0a 09 69 66 20 28 73 d", -1));..if (s
49e0: 75 69 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 uid != NULL) {..
49f0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4a00: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4a10: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
4a20: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 Tcl_NewByteArray
4a30: 4f 62 6a 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 Obj((const unsig
4a40: 6e 65 64 20 63 68 61 72 20 2a 29 73 75 69 64 2d ned char *)suid-
4a50: 3e 64 61 74 61 2c 20 28 54 63 6c 5f 53 69 7a 65 >data, (Tcl_Size
4a60: 29 20 73 75 69 64 2d 3e 6c 65 6e 67 74 68 29 29 ) suid->length))
4a70: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ;..} else {..
4a80: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4a90: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4aa0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c , resultObj, Tcl
4ab0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 _NewStringObj(""
4ac0: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d , -1));..}. }
4ad0: 0a 0a 20 20 20 20 2f 2a 20 58 35 30 39 20 76 33 .. /* X509 v3
4ae0: 20 45 78 74 65 6e 73 69 6f 6e 73 20 2d 20 52 46 Extensions - RF
4af0: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 C 5280 section 4
4b00: 2e 31 2e 32 2e 39 20 2a 2f 0a 20 20 20 20 4c 41 .1.2.9 */. LA
4b10: 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
4b20: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 , resultObj, "ex
4b30: 74 43 6f 75 6e 74 22 2c 20 58 35 30 39 5f 67 65 tCount", X509_ge
4b40: 74 5f 65 78 74 5f 63 6f 75 6e 74 28 63 65 72 74 t_ext_count(cert
4b50: 29 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f ));. LAPPEND_
4b60: 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 OBJ(interp, resu
4b70: 6c 74 4f 62 6a 2c 20 22 65 78 74 65 6e 73 69 6f ltObj, "extensio
4b80: 6e 73 22 2c 20 54 6c 73 5f 78 35 30 39 45 78 74 ns", Tls_x509Ext
4b90: 65 6e 73 69 6f 6e 73 28 69 6e 74 65 72 70 2c 20 ensions(interp,
4ba0: 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 cert));.. /*
4bb0: 41 75 74 68 6f 72 69 74 79 20 4b 65 79 20 49 64 Authority Key Id
4bc0: 65 6e 74 69 66 69 65 72 20 28 41 4b 49 29 20 69 entifier (AKI) i
4bd0: 73 20 74 68 65 20 53 75 62 6a 65 63 74 20 4b 65 s the Subject Ke
4be0: 79 20 49 64 65 6e 74 69 66 69 65 72 20 28 53 4b y Identifier (SK
4bf0: 49 29 20 6f 66 0a 09 69 74 73 20 73 69 67 6e 65 I) of..its signe
4c00: 72 20 28 74 68 65 20 43 41 29 2e 20 52 46 43 20 r (the CA). RFC
4c10: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 5280 section 4.2
4c20: 2e 31 2e 31 2c 20 4e 49 44 5f 61 75 74 68 6f 72 .1.1, NID_author
4c30: 69 74 79 5f 6b 65 79 5f 69 64 65 6e 74 69 66 69 ity_key_identifi
4c40: 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e er */. LAPPEN
4c50: 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 D_OBJ(interp, re
4c60: 73 75 6c 74 4f 62 6a 2c 20 22 61 75 74 68 6f 72 sultObj, "author
4c70: 69 74 79 4b 65 79 49 64 65 6e 74 69 66 69 65 72 ityKeyIdentifier
4c80: 22 2c 0a 09 54 6c 73 5f 78 35 30 39 49 64 65 6e ",..Tls_x509Iden
4c90: 74 69 66 69 65 72 28 58 35 30 39 5f 67 65 74 30 tifier(X509_get0
4ca0: 5f 61 75 74 68 6f 72 69 74 79 5f 6b 65 79 5f 69 _authority_key_i
4cb0: 64 28 63 65 72 74 29 29 29 3b 0a 0a 20 20 20 20 d(cert)));..
4cc0: 2f 2a 20 53 75 62 6a 65 63 74 20 4b 65 79 20 49 /* Subject Key I
4cd0: 64 65 6e 74 69 66 69 65 72 20 28 53 4b 49 29 20 dentifier (SKI)
4ce0: 69 73 20 75 73 65 64 20 74 6f 20 69 64 65 6e 74 is used to ident
4cf0: 69 66 79 20 63 65 72 74 69 66 69 63 61 74 65 73 ify certificates
4d00: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 0a 09 61 that contain..a
4d10: 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 62 6c particular publ
4d20: 69 63 20 6b 65 79 2e 20 52 46 43 20 35 32 38 30 ic key. RFC 5280
4d30: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 32 section 4.2.1.2
4d40: 2c 20 4e 49 44 5f 73 75 62 6a 65 63 74 5f 6b 65 , NID_subject_ke
4d50: 79 5f 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a y_identifier */.
4d60: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 LAPPEND_OBJ(
4d70: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
4d80: 6a 2c 20 22 73 75 62 6a 65 63 74 4b 65 79 49 64 j, "subjectKeyId
4d90: 65 6e 74 69 66 69 65 72 22 2c 0a 09 54 6c 73 5f entifier",..Tls_
4da0: 78 35 30 39 49 64 65 6e 74 69 66 69 65 72 28 58 x509Identifier(X
4db0: 35 30 39 5f 67 65 74 30 5f 73 75 62 6a 65 63 74 509_get0_subject
4dc0: 5f 6b 65 79 5f 69 64 28 63 65 72 74 29 29 29 3b _key_id(cert)));
4dd0: 0a 0a 20 20 20 20 2f 2a 20 4b 65 79 20 75 73 61 .. /* Key usa
4de0: 67 65 20 65 78 74 65 6e 73 69 6f 6e 20 64 65 66 ge extension def
4df0: 69 6e 65 73 20 74 68 65 20 70 75 72 70 6f 73 65 ines the purpose
4e00: 20 28 65 2e 67 2e 2c 20 65 6e 63 69 70 68 65 72 (e.g., encipher
4e10: 6d 65 6e 74 2c 20 73 69 67 6e 61 74 75 72 65 2c ment, signature,
4e20: 20 63 65 72 74 69 66 69 63 61 74 65 0a 09 73 69 certificate..si
4e30: 67 6e 69 6e 67 29 20 6f 66 20 74 68 65 20 6b 65 gning) of the ke
4e40: 79 20 69 6e 20 74 68 65 20 63 65 72 74 69 66 69 y in the certifi
4e50: 63 61 74 65 2e 20 52 46 43 20 35 32 38 30 20 73 cate. RFC 5280 s
4e60: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 33 2c 20 ection 4.2.1.3,
4e70: 4e 49 44 5f 6b 65 79 5f 75 73 61 67 65 20 2a 2f NID_key_usage */
4e80: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a . LAPPEND_OBJ
4e90: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
4ea0: 62 6a 2c 20 22 6b 65 79 55 73 61 67 65 22 2c 20 bj, "keyUsage",
4eb0: 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65 Tls_x509KeyUsage
4ec0: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 78 (interp, cert, x
4ed0: 66 6c 61 67 73 29 29 3b 0a 0a 20 20 20 20 2f 2a flags));.. /*
4ee0: 20 43 65 72 74 69 66 69 63 61 74 65 20 50 6f 6c Certificate Pol
4ef0: 69 63 69 65 73 20 2d 20 69 6e 64 69 63 61 74 65 icies - indicate
4f00: 73 20 74 68 65 20 69 73 73 75 69 6e 67 20 43 41 s the issuing CA
4f10: 20 63 6f 6e 73 69 64 65 72 73 20 69 74 73 20 69 considers its i
4f20: 73 73 75 65 72 44 6f 6d 61 69 6e 50 6f 6c 69 63 ssuerDomainPolic
4f30: 79 0a 09 65 71 75 69 76 61 6c 65 6e 74 20 74 6f y..equivalent to
4f40: 20 74 68 65 20 73 75 62 6a 65 63 74 20 43 41 27 the subject CA'
4f50: 73 20 73 75 62 6a 65 63 74 44 6f 6d 61 69 6e 50 s subjectDomainP
4f60: 6f 6c 69 63 79 2e 20 52 46 43 20 35 32 38 30 20 olicy. RFC 5280
4f70: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 34 2c section 4.2.1.4,
4f80: 20 4e 49 44 5f 63 65 72 74 69 66 69 63 61 74 65 NID_certificate
4f90: 5f 70 6f 6c 69 63 69 65 73 20 2a 2f 0a 20 20 20 _policies */.
4fa0: 20 69 66 20 28 78 66 6c 61 67 73 20 26 20 45 58 if (xflags & EX
4fb0: 46 4c 41 47 5f 49 4e 56 41 4c 49 44 5f 50 4f 4c FLAG_INVALID_POL
4fc0: 49 43 59 29 20 7b 0a 09 2f 2a 20 52 65 6a 65 63 ICY) {../* Rejec
4fd0: 74 20 63 65 72 74 20 2a 2f 0a 20 20 20 20 7d 0a t cert */. }.
4fe0: 0a 20 20 20 20 2f 2a 20 50 6f 6c 69 63 79 20 4d . /* Policy M
4ff0: 61 70 70 69 6e 67 73 20 2d 20 52 46 43 20 35 32 appings - RFC 52
5000: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 80 section 4.2.1
5010: 2e 35 2c 20 4e 49 44 5f 70 6f 6c 69 63 79 5f 6d .5, NID_policy_m
5020: 61 70 70 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 appings */..
5030: 2f 2a 20 53 75 62 6a 65 63 74 20 41 6c 74 65 72 /* Subject Alter
5040: 6e 61 74 69 76 65 20 4e 61 6d 65 20 28 53 41 4e native Name (SAN
5050: 29 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 ) contains addit
5060: 69 6f 6e 61 6c 20 55 52 4c 73 2c 20 44 4e 53 20 ional URLs, DNS
5070: 6e 61 6d 65 73 2c 20 6f 72 20 49 50 0a 09 61 64 names, or IP..ad
5080: 64 72 65 73 73 65 73 20 62 6f 75 6e 64 20 74 6f dresses bound to
5090: 20 63 65 72 74 69 66 69 63 61 74 65 2e 20 52 46 certificate. RF
50a0: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 C 5280 section 4
50b0: 2e 32 2e 31 2e 36 2c 20 4e 49 44 5f 73 75 62 6a .2.1.6, NID_subj
50c0: 65 63 74 5f 61 6c 74 5f 6e 61 6d 65 20 2a 2f 0a ect_alt_name */.
50d0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 LAPPEND_OBJ(
50e0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
50f0: 6a 2c 20 22 73 75 62 6a 65 63 74 41 6c 74 4e 61 j, "subjectAltNa
5100: 6d 65 22 2c 20 54 6c 73 5f 78 35 30 39 4e 61 6d me", Tls_x509Nam
5110: 65 73 28 69 6e 74 65 72 70 2c 20 63 65 72 74 2c es(interp, cert,
5120: 20 4e 49 44 5f 73 75 62 6a 65 63 74 5f 61 6c 74 NID_subject_alt
5130: 5f 6e 61 6d 65 2c 20 62 69 6f 29 29 3b 0a 0a 20 _name, bio));..
5140: 20 20 20 2f 2a 20 49 73 73 75 65 72 20 41 6c 74 /* Issuer Alt
5150: 65 72 6e 61 74 69 76 65 20 4e 61 6d 65 20 69 73 ernative Name is
5160: 20 75 73 65 64 20 74 6f 20 61 73 73 6f 63 69 61 used to associa
5170: 74 65 20 49 6e 74 65 72 6e 65 74 20 73 74 79 6c te Internet styl
5180: 65 20 69 64 65 6e 74 69 74 69 65 73 0a 09 77 69 e identities..wi
5190: 74 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 th the certifica
51a0: 74 65 20 69 73 73 75 65 72 2e 20 52 46 43 20 35 te issuer. RFC 5
51b0: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 280 section 4.2.
51c0: 31 2e 37 2c 20 4e 49 44 5f 69 73 73 75 65 72 5f 1.7, NID_issuer_
51d0: 61 6c 74 5f 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 alt_name */.
51e0: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 LAPPEND_OBJ(inte
51f0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
5200: 69 73 73 75 65 72 41 6c 74 4e 61 6d 65 22 2c 20 issuerAltName",
5210: 54 6c 73 5f 78 35 30 39 4e 61 6d 65 73 28 69 6e Tls_x509Names(in
5220: 74 65 72 70 2c 20 63 65 72 74 2c 20 4e 49 44 5f terp, cert, NID_
5230: 69 73 73 75 65 72 5f 61 6c 74 5f 6e 61 6d 65 2c issuer_alt_name,
5240: 20 62 69 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 bio));.. /*
5250: 53 75 62 6a 65 63 74 20 44 69 72 65 63 74 6f 72 Subject Director
5260: 79 20 41 74 74 72 69 62 75 74 65 73 20 70 72 6f y Attributes pro
5270: 76 69 64 65 73 20 69 64 65 6e 74 69 66 69 63 61 vides identifica
5280: 74 69 6f 6e 20 61 74 74 72 69 62 75 74 65 73 20 tion attributes
5290: 28 65 2e 67 2e 2c 20 6e 61 74 69 6f 6e 61 6c 69 (e.g., nationali
52a0: 74 79 29 0a 09 6f 66 20 74 68 65 20 73 75 62 6a ty)..of the subj
52b0: 65 63 74 2e 20 52 46 43 20 35 32 38 30 20 73 65 ect. RFC 5280 se
52c0: 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 38 20 28 73 ction 4.2.1.8 (s
52d0: 75 62 6a 65 63 74 44 69 72 65 63 74 6f 72 79 41 ubjectDirectoryA
52e0: 74 74 72 69 62 75 74 65 73 29 20 2a 2f 0a 0a 20 ttributes) */..
52f0: 20 20 20 2f 2a 20 42 61 73 69 63 20 43 6f 6e 73 /* Basic Cons
5300: 74 72 61 69 6e 74 73 20 69 64 65 6e 74 69 66 69 traints identifi
5310: 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20 73 es whether the s
5320: 75 62 6a 65 63 74 20 6f 66 20 74 68 65 20 63 65 ubject of the ce
5330: 72 74 20 69 73 20 61 20 43 41 20 61 6e 64 0a 09 rt is a CA and..
5340: 74 68 65 20 6d 61 78 20 64 65 70 74 68 20 6f 66 the max depth of
5350: 20 76 61 6c 69 64 20 63 65 72 74 20 70 61 74 68 valid cert path
5360: 73 20 66 6f 72 20 74 68 69 73 20 63 65 72 74 2e s for this cert.
5370: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f RFC 5280 sectio
5380: 6e 20 34 2e 32 2e 31 2e 39 2c 20 4e 49 44 5f 62 n 4.2.1.9, NID_b
5390: 61 73 69 63 5f 63 6f 6e 73 74 72 61 69 6e 74 73 asic_constraints
53a0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 28 78 66 */. if (!(xf
53b0: 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 50 52 lags & EXFLAG_PR
53c0: 4f 58 59 29 29 20 7b 0a 09 4c 41 50 50 45 4e 44 OXY)) {..LAPPEND
53d0: 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 72 65 _LONG(interp, re
53e0: 73 75 6c 74 4f 62 6a 2c 20 22 70 61 74 68 4c 65 sultObj, "pathLe
53f0: 6e 22 2c 20 58 35 30 39 5f 67 65 74 5f 70 61 74 n", X509_get_pat
5400: 68 6c 65 6e 28 63 65 72 74 29 29 3b 0a 20 20 20 hlen(cert));.
5410: 20 7d 20 65 6c 73 65 20 7b 0a 09 4c 41 50 50 45 } else {..LAPPE
5420: 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
5430: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 61 74 68 resultObj, "path
5440: 4c 65 6e 22 2c 20 58 35 30 39 5f 67 65 74 5f 70 Len", X509_get_p
5450: 72 6f 78 79 5f 70 61 74 68 6c 65 6e 28 63 65 72 roxy_pathlen(cer
5460: 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4c t));. }. L
5470: 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
5480: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
5490: 62 61 73 69 63 43 6f 6e 73 74 72 61 69 6e 74 73 basicConstraints
54a0: 43 41 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58 CA", xflags & EX
54b0: 46 4c 41 47 5f 43 41 29 3b 0a 0a 20 20 20 20 2f FLAG_CA);.. /
54c0: 2a 20 4e 61 6d 65 20 43 6f 6e 73 74 72 61 69 6e * Name Constrain
54d0: 74 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 ts is only used
54e0: 69 6e 20 43 41 20 63 65 72 74 73 20 74 6f 20 69 in CA certs to i
54f0: 6e 64 69 63 61 74 65 20 74 68 65 20 6e 61 6d 65 ndicate the name
5500: 20 73 70 61 63 65 20 66 6f 72 0a 09 61 6c 6c 20 space for..all
5510: 73 75 62 6a 65 63 74 20 6e 61 6d 65 73 20 69 6e subject names in
5520: 20 73 75 62 73 65 71 75 65 6e 74 20 63 65 72 74 subsequent cert
5530: 69 66 69 63 61 74 65 73 20 69 6e 20 61 20 63 65 ificates in a ce
5540: 72 74 69 66 69 63 61 74 69 6f 6e 20 70 61 74 68 rtification path
5550: 0a 09 4d 55 53 54 20 62 65 20 6c 6f 63 61 74 65 ..MUST be locate
5560: 64 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 d. RFC 5280 sect
5570: 69 6f 6e 20 34 2e 32 2e 31 2e 31 30 2c 20 4e 49 ion 4.2.1.10, NI
5580: 44 5f 6e 61 6d 65 5f 63 6f 6e 73 74 72 61 69 6e D_name_constrain
5590: 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 50 6f ts */.. /* Po
55a0: 6c 69 63 79 20 43 6f 6e 73 74 72 61 69 6e 74 73 licy Constraints
55b0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e is only used in
55c0: 20 43 41 20 63 65 72 74 73 20 74 6f 20 6c 69 6d CA certs to lim
55d0: 69 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 it the length of
55e0: 20 61 0a 09 63 65 72 74 20 63 68 61 69 6e 20 66 a..cert chain f
55f0: 6f 72 20 74 68 61 74 20 43 41 2e 20 52 46 43 20 or that CA. RFC
5600: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 5280 section 4.2
5610: 2e 31 2e 31 31 2c 20 4e 49 44 5f 70 6f 6c 69 63 .1.11, NID_polic
5620: 79 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f y_constraints */
5630: 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e 64 65 .. /* Extende
5640: 64 20 4b 65 79 20 55 73 61 67 65 20 69 6e 64 69 d Key Usage indi
5650: 63 61 74 65 73 20 74 68 65 20 70 75 72 70 6f 73 cates the purpos
5660: 65 73 20 74 68 65 20 63 65 72 74 69 66 69 65 64 es the certified
5670: 20 70 75 62 6c 69 63 20 6b 65 79 20 6d 61 79 20 public key may
5680: 62 65 0a 09 75 73 65 64 2c 20 62 65 79 6f 6e 64 be..used, beyond
5690: 20 74 68 65 20 62 61 73 69 63 20 70 75 72 70 6f the basic purpo
56a0: 73 65 73 2e 20 52 46 43 20 35 32 38 30 20 73 65 ses. RFC 5280 se
56b0: 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 32 2c 20 ction 4.2.1.12,
56c0: 4e 49 44 5f 65 78 74 5f 6b 65 79 5f 75 73 61 67 NID_ext_key_usag
56d0: 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 e */. LAPPEND
56e0: 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 _OBJ(interp, res
56f0: 75 6c 74 4f 62 6a 2c 20 22 65 78 74 65 6e 64 65 ultObj, "extende
5700: 64 4b 65 79 55 73 61 67 65 22 2c 20 54 6c 73 5f dKeyUsage", Tls_
5710: 78 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 28 x509ExtKeyUsage(
5720: 69 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 78 66 interp, cert, xf
5730: 6c 61 67 73 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 lags));.. /*
5740: 43 52 4c 20 44 69 73 74 72 69 62 75 74 69 6f 6e CRL Distribution
5750: 20 50 6f 69 6e 74 73 20 69 64 65 6e 74 69 66 69 Points identifi
5760: 65 73 20 77 68 65 72 65 20 43 52 4c 20 69 6e 66 es where CRL inf
5770: 6f 72 6d 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 ormation can be
5780: 6f 62 74 61 69 6e 65 64 2e 0a 09 52 46 43 20 35 obtained...RFC 5
5790: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 280 section 4.2.
57a0: 31 2e 31 33 2a 2f 0a 20 20 20 20 4c 41 50 50 45 1.13*/. LAPPE
57b0: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 ND_OBJ(interp, r
57c0: 65 73 75 6c 74 4f 62 6a 2c 20 22 63 72 6c 44 69 esultObj, "crlDi
57d0: 73 74 72 69 62 75 74 69 6f 6e 50 6f 69 6e 74 73 stributionPoints
57e0: 22 2c 20 54 6c 73 5f 78 35 30 39 43 72 6c 44 70 ", Tls_x509CrlDp
57f0: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b (interp, cert));
5800: 0a 0a 20 20 20 20 2f 2a 20 46 72 65 73 68 65 73 .. /* Freshes
5810: 74 20 43 52 4c 20 65 78 74 65 6e 73 69 6f 6e 20 t CRL extension
5820: 2a 2f 0a 20 20 20 20 69 66 20 28 78 66 6c 61 67 */. if (xflag
5830: 73 20 26 20 45 58 46 4c 41 47 5f 46 52 45 53 48 s & EXFLAG_FRESH
5840: 45 53 54 29 20 7b 0a 20 20 20 20 7d 0a 0a 20 20 EST) {. }..
5850: 20 20 2f 2a 20 41 75 74 68 6f 72 69 74 79 20 49 /* Authority I
5860: 6e 66 6f 72 6d 61 74 69 6f 6e 20 41 63 63 65 73 nformation Acces
5870: 73 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 s indicates how
5880: 74 6f 20 61 63 63 65 73 73 20 69 6e 66 6f 20 61 to access info a
5890: 6e 64 20 73 65 72 76 69 63 65 73 0a 09 66 6f 72 nd services..for
58a0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
58b0: 20 69 73 73 75 65 72 2e 20 52 46 43 20 35 32 38 issuer. RFC 528
58c0: 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 32 2e 0 section 4.2.2.
58d0: 31 2c 20 4e 49 44 5f 69 6e 66 6f 5f 61 63 63 65 1, NID_info_acce
58e0: 73 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4f 6e ss */.. /* On
58f0: 2d 6c 69 6e 65 20 43 65 72 74 69 66 69 63 61 74 -line Certificat
5900: 65 20 53 74 61 74 75 73 20 50 72 6f 74 6f 63 6f e Status Protoco
5910: 6c 20 28 4f 53 43 50 29 20 52 65 73 70 6f 6e 64 l (OSCP) Respond
5920: 65 72 73 20 55 52 4c 20 2a 2f 0a 20 20 20 20 4c ers URL */. L
5930: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 APPEND_OBJ(inter
5940: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6f p, resultObj, "o
5950: 63 73 70 52 65 73 70 6f 6e 64 65 72 73 22 2c 20 cspResponders",
5960: 54 6c 73 5f 78 35 30 39 4f 73 63 70 28 69 6e 74 Tls_x509Oscp(int
5970: 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 erp, cert));..
5980: 20 20 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65 /* Certificate
5990: 20 41 75 74 68 6f 72 69 74 79 20 28 43 41 29 20 Authority (CA)
59a0: 49 73 73 75 65 72 73 20 55 52 4c 20 2a 2f 0a 20 Issuers URL */.
59b0: 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 LAPPEND_OBJ(i
59c0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
59d0: 2c 20 22 63 61 49 73 73 75 65 72 73 22 2c 20 54 , "caIssuers", T
59e0: 6c 73 5f 78 35 30 39 43 61 49 73 73 75 65 72 73 ls_x509CaIssuers
59f0: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b (interp, cert));
5a00: 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 .. /* Subject
5a10: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 41 63 63 Information Acc
5a20: 65 73 73 20 2d 20 52 46 43 20 35 32 38 30 20 73 ess - RFC 5280 s
5a30: 65 63 74 69 6f 6e 20 34 2e 32 2e 32 2e 32 2c 20 ection 4.2.2.2,
5a40: 4e 49 44 5f 73 69 6e 66 6f 5f 61 63 63 65 73 73 NID_sinfo_access
5a50: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 */.. /* Cert
5a60: 69 66 69 63 61 74 65 20 41 6c 69 61 73 2e 20 49 ificate Alias. I
5a70: 66 20 75 73 65 73 20 61 20 50 4b 43 53 23 31 32 f uses a PKCS#12
5a80: 20 73 74 72 75 63 74 75 72 65 2c 20 61 6c 69 61 structure, alia
5a90: 73 20 77 69 6c 6c 20 72 65 66 6c 65 63 74 20 74 s will reflect t
5aa0: 68 65 0a 09 66 72 69 65 6e 64 6c 79 4e 61 6d 65 he..friendlyName
5ab0: 20 61 74 74 72 69 62 75 74 65 20 28 52 46 43 20 attribute (RFC
5ac0: 32 39 38 35 29 2e 20 2a 2f 0a 20 20 20 20 7b 0a 2985). */. {.
5ad0: 09 69 6e 74 20 69 6c 65 6e 20 3d 20 30 3b 0a 20 .int ilen = 0;.
5ae0: 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 unsigned
5af0: 63 68 61 72 20 2a 73 74 72 69 6e 67 20 3d 20 58 char *string = X
5b00: 35 30 39 5f 61 6c 69 61 73 5f 67 65 74 30 28 63 509_alias_get0(c
5b10: 65 72 74 2c 20 26 69 6c 65 6e 29 3b 0a 09 4c 41 ert, &ilen);..LA
5b20: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
5b30: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 61 6c , resultObj, "al
5b40: 69 61 73 22 2c 20 28 63 68 61 72 20 2a 29 20 73 ias", (char *) s
5b50: 74 72 69 6e 67 2c 20 28 54 63 6c 5f 53 69 7a 65 tring, (Tcl_Size
5b60: 29 20 69 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 ) ilen);.
5b70: 20 73 74 72 69 6e 67 20 3d 20 58 35 30 39 5f 6b string = X509_k
5b80: 65 79 69 64 5f 67 65 74 30 28 63 65 72 74 2c 20 eyid_get0(cert,
5b90: 26 69 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 &ilen);..LAPPEND
5ba0: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 _STR(interp, res
5bb0: 75 6c 74 4f 62 6a 2c 20 22 6b 65 79 49 64 22 2c ultObj, "keyId",
5bc0: 20 28 63 68 61 72 20 2a 29 20 73 74 72 69 6e 67 (char *) string
5bd0: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 69 6c 65 , (Tcl_Size) ile
5be0: 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f n);. }.. /
5bf0: 2a 20 43 65 72 74 69 66 69 63 61 74 65 20 61 6e * Certificate an
5c00: 64 20 64 75 6d 70 20 61 6c 6c 20 64 61 74 61 20 d dump all data
5c10: 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 6c 29 20 */. if (all)
5c20: 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 61 6c 6c 4f {..Tcl_Obj *allO
5c30: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 bj = Tcl_NewByte
5c40: 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c 2c 20 30 ArrayObj(NULL, 0
5c50: 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 65 72 );..Tcl_Obj *cer
5c60: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79 tObj = Tcl_NewBy
5c70: 74 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c 2c teArrayObj(NULL,
5c80: 20 30 29 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 0);..unsigned c
5c90: 68 61 72 20 2a 61 6c 6c 53 74 72 2c 20 2a 63 65 har *allStr, *ce
5ca0: 72 74 53 74 72 3b 0a 0a 09 69 66 20 28 61 6c 6c rtStr;...if (all
5cb0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 Obj == NULL || c
5cc0: 65 72 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 ertObj == NULL)
5cd0: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72 52 {.. Tcl_DecrR
5ce0: 65 66 43 6f 75 6e 74 28 61 6c 6c 4f 62 6a 29 3b efCount(allObj);
5cf0: 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 .. BIO_free(b
5d00: 69 6f 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e io);.. return
5d10: 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 09 7d 0a 0a resultObj;..}..
5d20: 09 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 ./* Get certific
5d30: 61 74 65 20 2a 2f 0a 09 63 65 72 74 53 74 72 20 ate */..certStr
5d40: 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 = Tcl_SetByteArr
5d50: 61 79 4c 65 6e 67 74 68 28 63 65 72 74 4f 62 6a ayLength(certObj
5d60: 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 29 , CERT_STR_SIZE)
5d70: 3b 0a 09 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f ;..len = BIO_to_
5d80: 42 75 66 66 65 72 28 50 45 4d 5f 77 72 69 74 65 Buffer(PEM_write
5d90: 5f 62 69 6f 5f 58 35 30 39 28 62 69 6f 2c 20 63 _bio_X509(bio, c
5da0: 65 72 74 29 2c 20 62 69 6f 2c 20 63 65 72 74 53 ert), bio, certS
5db0: 74 72 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 5a tr, CERT_STR_SIZ
5dc0: 45 29 3b 0a 09 54 63 6c 5f 53 65 74 42 79 74 65 E);..Tcl_SetByte
5dd0: 41 72 72 61 79 4c 65 6e 67 74 68 28 63 65 72 74 ArrayLength(cert
5de0: 4f 62 6a 2c 20 6c 65 6e 29 3b 0a 09 4c 41 50 50 Obj, len);..LAPP
5df0: 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 END_OBJ(interp,
5e00: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 63 65 72 74 resultObj, "cert
5e10: 69 66 69 63 61 74 65 22 2c 20 63 65 72 74 4f 62 ificate", certOb
5e20: 6a 29 0a 0a 09 2f 2a 20 47 65 74 20 61 6c 6c 20 j).../* Get all
5e30: 69 6e 66 6f 20 6f 6e 20 63 65 72 74 69 66 69 63 info on certific
5e40: 61 74 65 20 2a 2f 0a 09 61 6c 6c 53 74 72 20 3d ate */..allStr =
5e50: 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 Tcl_SetByteArra
5e60: 79 4c 65 6e 67 74 68 28 61 6c 6c 4f 62 6a 2c 20 yLength(allObj,
5e70: 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 20 2a 20 CERT_STR_SIZE *
5e80: 32 29 3b 0a 09 6c 65 6e 20 3d 20 42 49 4f 5f 74 2);..len = BIO_t
5e90: 6f 5f 42 75 66 66 65 72 28 58 35 30 39 5f 70 72 o_Buffer(X509_pr
5ea0: 69 6e 74 5f 65 78 28 62 69 6f 2c 20 63 65 72 74 int_ex(bio, cert
5eb0: 2c 20 66 6c 61 67 73 2c 20 30 29 2c 20 62 69 6f , flags, 0), bio
5ec0: 2c 20 61 6c 6c 53 74 72 2c 20 43 45 52 54 5f 53 , allStr, CERT_S
5ed0: 54 52 5f 53 49 5a 45 20 2a 20 32 29 3b 0a 09 54 TR_SIZE * 2);..T
5ee0: 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c cl_SetByteArrayL
5ef0: 65 6e 67 74 68 28 61 6c 6c 4f 62 6a 2c 20 6c 65 ength(allObj, le
5f00: 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a n);..LAPPEND_OBJ
5f10: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
5f20: 62 6a 2c 20 22 61 6c 6c 22 2c 20 61 6c 6c 4f 62 bj, "all", allOb
5f30: 6a 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 42 49 j). }.. BI
5f40: 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20 O_free(bio);.
5f50: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 return resultOb
5f60: 6a 3b 0a 7d 0a j;.}.