0000: 2f 2a 0a 20 2a 20 50 61 72 73 65 20 58 2e 35 30 /*. * Parse X.50
0010: 39 20 63 65 72 74 69 66 69 63 61 74 65 73 20 61 9 certificates a
0020: 6e 64 20 72 65 74 75 72 6e 20 63 6f 6e 74 65 6e nd return conten
0030: 74 73 20 61 73 20 61 20 54 43 4c 20 6b 65 79 2d ts as a TCL key-
0040: 76 61 6c 75 65 20 6c 69 73 74 2e 0a 20 2a 0a 20 value list.. *.
0050: 2a 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 * Copyright (C)
0060: 31 39 39 37 2d 32 30 30 30 20 53 65 6e 73 75 73 1997-2000 Sensus
0070: 20 43 6f 6e 73 75 6c 74 69 6e 67 20 4c 74 64 2e Consulting Ltd.
0080: 0a 20 2a 20 4d 61 74 74 20 4e 65 77 6d 61 6e 20 . * Matt Newman
0090: 3c 6d 61 74 74 40 73 65 6e 73 75 73 2e 6f 72 67 <matt@sensus.org
00a0: 3e 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 >. * Copyright (
00b0: 43 29 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 C) 2023 Brian O'
00c0: 48 61 67 61 6e 0a 20 2a 2f 0a 23 69 6e 63 6c 75 Hagan. */.#inclu
00d0: 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e 63 6c de <tcl.h>.#incl
00e0: 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 ude <stdio.h>.#i
00f0: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0100: 62 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 bio.h>.#include
0110: 3c 6f 70 65 6e 73 73 6c 2f 73 68 61 2e 68 3e 0a <openssl/sha.h>.
0120: 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 #include <openss
0130: 6c 2f 78 35 30 39 2e 68 3e 0a 23 69 6e 63 6c 75 l/x509.h>.#inclu
0140: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 78 35 30 39 de <openssl/x509
0150: 76 33 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c v3.h>.#include <
0160: 6f 70 65 6e 73 73 6c 2f 78 35 30 39 5f 76 66 79 openssl/x509_vfy
0170: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 .h>.#include <op
0180: 65 6e 73 73 6c 2f 61 73 6e 31 2e 68 3e 0a 23 69 enssl/asn1.h>.#i
0190: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 nclude "tlsInt.h
01a0: 22 0a 0a 2f 2a 20 44 65 66 69 6e 65 20 6d 61 78 "../* Define max
01b0: 69 6d 75 6d 20 63 65 72 74 69 66 69 63 61 74 65 imum certificate
01c0: 20 73 69 7a 65 2e 20 4d 61 78 20 50 45 4d 20 73 size. Max PEM s
01d0: 69 7a 65 20 31 30 30 6b 42 20 61 6e 64 20 44 45 ize 100kB and DE
01e0: 52 20 73 69 7a 65 20 69 73 20 32 34 6b 42 2e 20 R size is 24kB.
01f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 45 52 54 5f */.#define CERT_
0200: 53 54 52 5f 53 49 5a 45 20 32 34 35 37 36 0a 0a STR_SIZE 24576..
0210: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
0220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0260: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 72 69 6e ----. *. * Strin
0270: 67 5f 74 6f 5f 48 65 78 20 2d 2d 0a 20 2a 0a 20 g_to_Hex --. *.
0280: 2a 09 46 6f 72 6d 61 74 20 63 6f 6e 74 65 6e 74 *.Format content
0290: 73 20 6f 66 20 61 20 62 69 6e 61 72 79 20 73 74 s of a binary st
02a0: 72 69 6e 67 20 61 73 20 61 20 68 65 78 20 73 74 ring as a hex st
02b0: 72 69 6e 67 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ring. *. * Resul
02c0: 74 73 3a 0a 20 2a 09 54 43 4c 20 62 79 74 65 20 ts:. *.TCL byte
02d0: 61 72 72 61 79 20 6f 62 6a 65 63 74 20 77 69 74 array object wit
02e0: 68 20 78 35 30 39 20 69 64 65 6e 74 69 66 69 65 h x509 identifie
02f0: 72 20 61 73 20 61 20 68 65 78 20 73 74 72 69 6e r as a hex strin
0300: 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 45 66 66 g. *. * Side Eff
0310: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ects:. *.None. *
0320: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
0330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0370: 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 53 74 . */.Tcl_Obj *St
0380: 72 69 6e 67 5f 74 6f 5f 48 65 78 28 75 6e 73 69 ring_to_Hex(unsi
0390: 67 6e 65 64 20 63 68 61 72 2a 20 69 6e 70 75 74 gned char* input
03a0: 2c 20 69 6e 74 20 69 6c 65 6e 29 20 7b 0a 20 20 , int ilen) {.
03b0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
03c0: 2a 69 70 74 72 20 3d 20 69 6e 70 75 74 3b 0a 20 *iptr = input;.
03d0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 Tcl_Obj *resu
03e0: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 ltObj = Tcl_NewB
03f0: 79 74 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c yteArrayObj(NULL
0400: 2c 20 30 29 3b 0a 20 20 20 20 75 6e 73 69 67 6e , 0);. unsign
0410: 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 ed char *data =
0420: 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 Tcl_SetByteArray
0430: 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a Length(resultObj
0440: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 69 6c 65 6e , (Tcl_Size)ilen
0450: 2a 32 29 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 *2);. unsigne
0460: 64 20 63 68 61 72 20 2a 64 70 74 72 20 3d 20 26 d char *dptr = &
0470: 64 61 74 61 5b 30 5d 3b 0a 20 20 20 20 63 6f 6e data[0];. con
0480: 73 74 20 63 68 61 72 20 2a 68 65 78 20 3d 20 22 st char *hex = "
0490: 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 0123456789abcdef
04a0: 22 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 ";.. if (resu
04b0: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b ltObj == NULL) {
04c0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
04d0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 69 }.. for (i
04e0: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 69 6c nt i = 0; i < il
04f0: 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 2a 64 70 74 en; i++) {..*dpt
0500: 72 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 r++ = (unsigned
0510: 63 68 61 72 29 68 65 78 5b 28 2a 69 70 74 72 3e char)hex[(*iptr>
0520: 3e 34 29 26 30 78 46 5d 3b 0a 09 2a 64 70 74 72 >4)&0xF];..*dptr
0530: 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 ++ = (unsigned c
0540: 68 61 72 29 68 65 78 5b 28 2a 69 70 74 72 2b 2b har)hex[(*iptr++
0550: 29 26 30 78 46 5d 3b 0a 20 20 20 20 7d 0a 20 20 )&0xF];. }.
0560: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f return resultO
0570: 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d bj;.}../*. *----
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
05d0: 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 20 2d 2d BIO_to_Buffer --
05e0: 0a 20 2a 0a 20 2a 09 4f 75 74 70 75 74 20 63 6f . *. *.Output co
05f0: 6e 74 65 6e 74 73 20 6f 66 20 61 20 42 49 4f 20 ntents of a BIO
0600: 74 6f 20 61 20 62 75 66 66 65 72 0a 20 2a 0a 20 to a buffer. *.
0610: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 * Results:. *.Re
0620: 74 75 72 6e 73 20 6c 65 6e 67 74 68 20 6f 66 20 turns length of
0630: 73 74 72 69 6e 67 20 69 6e 20 62 75 66 66 65 72 string in buffer
0640: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
0650: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a cts:. *.None. *.
0660: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
06b0: 20 2a 2f 0a 54 63 6c 5f 53 69 7a 65 20 42 49 4f */.Tcl_Size BIO
06c0: 5f 74 6f 5f 42 75 66 66 65 72 28 69 6e 74 20 72 _to_Buffer(int r
06d0: 65 73 75 6c 74 2c 20 42 49 4f 20 2a 62 69 6f 2c esult, BIO *bio,
06e0: 20 76 6f 69 64 20 2a 6f 75 74 70 75 74 2c 20 69 void *output, i
06f0: 6e 74 20 6f 6c 65 6e 29 20 7b 0a 20 20 20 20 54 nt olen) {. T
0700: 63 6c 5f 53 69 7a 65 20 6c 65 6e 20 3d 20 30 3b cl_Size len = 0;
0710: 0a 20 20 20 20 69 6e 74 20 70 65 6e 64 69 6e 67 . int pending
0720: 20 3d 20 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 = BIO_pending(b
0730: 69 6f 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 io);.. if (re
0740: 73 75 6c 74 29 20 7b 0a 09 6c 65 6e 20 3d 20 28 sult) {..len = (
0750: 54 63 6c 5f 53 69 7a 65 29 20 42 49 4f 5f 72 65 Tcl_Size) BIO_re
0760: 61 64 28 62 69 6f 2c 20 6f 75 74 70 75 74 2c 20 ad(bio, output,
0770: 28 70 65 6e 64 69 6e 67 20 3c 20 6f 6c 65 6e 29 (pending < olen)
0780: 20 3f 20 70 65 6e 64 69 6e 67 20 3a 20 6f 6c 65 ? pending : ole
0790: 6e 29 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f 66 n);..(void)BIO_f
07a0: 6c 75 73 68 28 62 69 6f 29 3b 0a 09 69 66 20 28 lush(bio);..if (
07b0: 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 20 20 20 20 len < 0) {..
07c0: 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 20 20 20 20 len = 0;..}.
07d0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e }. return len
07e0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0830: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
0840: 6c 73 5f 78 35 30 39 45 78 74 65 6e 73 69 6f 6e ls_x509Extension
0850: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 6c s --. *. *.Get l
0860: 69 73 74 20 6f 66 20 58 2e 35 30 39 20 43 65 72 ist of X.509 Cer
0870: 74 69 66 69 63 61 74 65 20 45 78 74 65 6e 73 69 tificate Extensi
0880: 6f 6e 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ons. *. * Result
0890: 73 3a 0a 20 2a 09 54 43 4c 20 6c 69 73 74 20 6f s:. *.TCL list o
08a0: 66 20 65 78 74 65 6e 73 69 6f 6e 73 20 61 6e 64 f extensions and
08b0: 20 62 6f 6f 6c 65 61 6e 20 63 72 69 74 69 63 61 boolean critica
08c0: 6c 20 73 74 61 74 75 73 0a 20 2a 0a 20 2a 20 53 l status. *. * S
08d0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
08e0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d None. *. *------
08f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f -------. */.Tcl_
0940: 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 45 78 74 Obj *Tls_x509Ext
0950: 65 6e 73 69 6f 6e 73 28 54 63 6c 5f 49 6e 74 65 ensions(Tcl_Inte
0960: 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 rp *interp, X509
0970: 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 63 6f *cert) {. co
0980: 6e 73 74 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 nst STACK_OF(X50
0990: 39 5f 45 58 54 45 4e 53 49 4f 4e 29 20 2a 65 78 9_EXTENSION) *ex
09a0: 74 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 ts;. Tcl_Obj
09b0: 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c *resultObj = Tcl
09c0: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
09d0: 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 ULL);.. if (r
09e0: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c esultObj == NULL
09f0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c ) {..return NULL
0a00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
0a10: 28 28 65 78 74 73 20 3d 20 58 35 30 39 5f 67 65 ((exts = X509_ge
0a20: 74 30 5f 65 78 74 65 6e 73 69 6f 6e 73 28 63 65 t0_extensions(ce
0a30: 72 74 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a rt)) != NULL) {.
0a40: 09 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b 20 69 .for (int i=0; i
0a50: 20 3c 20 58 35 30 39 5f 67 65 74 5f 65 78 74 5f < X509_get_ext_
0a60: 63 6f 75 6e 74 28 63 65 72 74 29 3b 20 69 2b 2b count(cert); i++
0a70: 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 45 58 ) {.. X509_EX
0a80: 54 45 4e 53 49 4f 4e 20 2a 65 78 20 3d 20 73 6b TENSION *ex = sk
0a90: 5f 58 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f _X509_EXTENSION_
0aa0: 76 61 6c 75 65 28 65 78 74 73 2c 20 69 29 3b 0a value(exts, i);.
0ab0: 09 20 20 20 20 41 53 4e 31 5f 4f 42 4a 45 43 54 . ASN1_OBJECT
0ac0: 20 2a 6f 62 6a 20 3d 20 58 35 30 39 5f 45 58 54 *obj = X509_EXT
0ad0: 45 4e 53 49 4f 4e 5f 67 65 74 5f 6f 62 6a 65 63 ENSION_get_objec
0ae0: 74 28 65 78 29 3b 0a 09 20 20 20 20 2f 2a 20 41 t(ex);.. /* A
0af0: 53 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49 4e 47 SN1_OCTET_STRING
0b00: 20 2a 64 61 74 61 20 3d 20 58 35 30 39 5f 45 58 *data = X509_EX
0b10: 54 45 4e 53 49 4f 4e 5f 67 65 74 5f 64 61 74 61 TENSION_get_data
0b20: 28 65 78 29 3b 20 2a 2f 0a 09 20 20 20 20 69 6e (ex); */.. in
0b30: 74 20 63 72 69 74 69 63 61 6c 20 3d 20 58 35 30 t critical = X50
0b40: 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74 5f 9_EXTENSION_get_
0b50: 63 72 69 74 69 63 61 6c 28 65 78 29 3b 0a 09 20 critical(ex);..
0b60: 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 LAPPEND_BOOL(
0b70: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
0b80: 6a 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 4f 42 j, OBJ_nid2ln(OB
0b90: 4a 5f 6f 62 6a 32 6e 69 64 28 6f 62 6a 29 29 2c J_obj2nid(obj)),
0ba0: 20 63 72 69 74 69 63 61 6c 29 3b 0a 09 7d 0a 20 critical);..}.
0bb0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
0bc0: 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a resultObj;.}../*
0bd0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c20: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39 49 . *. * Tls_x509I
0c30: 64 65 6e 74 69 66 69 65 72 20 2d 2d 0a 20 2a 0a dentifier --. *.
0c40: 20 2a 09 47 65 74 20 58 2e 35 30 39 20 63 65 72 *.Get X.509 cer
0c50: 74 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 tificate Authori
0c60: 74 79 20 6f 72 20 53 75 62 6a 65 63 74 20 4b 65 ty or Subject Ke
0c70: 79 20 49 64 65 6e 74 69 66 69 65 72 73 0a 20 2a y Identifiers. *
0c80: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
0c90: 54 43 4c 20 62 79 74 65 20 61 72 72 61 79 20 6f TCL byte array o
0ca0: 62 6a 65 63 74 20 77 69 74 68 20 78 35 30 39 20 bject with x509
0cb0: 69 64 65 6e 74 69 66 69 65 72 20 61 73 20 61 20 identifier as a
0cc0: 68 65 78 20 73 74 72 69 6e 67 0a 20 2a 0a 20 2a hex string. *. *
0cd0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
0ce0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d *.None. *. *----
0cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 ---------. */.Tc
0d40: 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 49 l_Obj *Tls_x509I
0d50: 64 65 6e 74 69 66 69 65 72 28 63 6f 6e 73 74 20 dentifier(const
0d60: 41 53 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49 4e ASN1_OCTET_STRIN
0d70: 47 20 2a 61 73 74 72 69 6e 67 29 20 7b 0a 20 20 G *astring) {.
0d80: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c Tcl_Obj *resul
0d90: 74 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 tObj = NULL;..
0da0: 20 20 69 66 20 28 61 73 74 72 69 6e 67 20 21 3d if (astring !=
0db0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 75 6c 74 NULL) {..result
0dc0: 4f 62 6a 20 3d 20 53 74 72 69 6e 67 5f 74 6f 5f Obj = String_to_
0dd0: 48 65 78 28 28 75 6e 73 69 67 6e 65 64 20 63 68 Hex((unsigned ch
0de0: 61 72 20 2a 29 41 53 4e 31 5f 53 54 52 49 4e 47 ar *)ASN1_STRING
0df0: 5f 67 65 74 30 5f 64 61 74 61 28 61 73 74 72 69 _get0_data(astri
0e00: 6e 67 29 2c 0a 09 20 20 20 20 41 53 4e 31 5f 53 ng),.. ASN1_S
0e10: 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 61 73 74 TRING_length(ast
0e20: 72 69 6e 67 29 29 3b 0a 20 20 20 20 7d 0a 20 20 ring));. }.
0e30: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f return resultO
0e40: 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d bj;.}../*. *----
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
0ea0: 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65 Tls_x509KeyUsage
0eb0: 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 58 2e --. *. *.Get X.
0ec0: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 509 certificate
0ed0: 6b 65 79 20 75 73 61 67 65 20 74 79 70 65 73 0a key usage types.
0ee0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
0ef0: 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 74 79 *.Tcl list of ty
0f00: 70 65 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 pes. *. * Side e
0f10: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a ffects:. *.None.
0f20: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f70: 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a --. */.Tcl_Obj *
0f80: 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65 Tls_x509KeyUsage
0f90: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
0fa0: 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c erp, X509 *cert,
0fb0: 20 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 73 uint32_t xflags
0fc0: 29 20 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 ) {. uint32_t
0fd0: 20 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 usage = X509_ge
0fe0: 74 5f 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74 t_key_usage(cert
0ff0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a );. Tcl_Obj *
1000: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f resultObj = Tcl_
1010: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
1020: 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 LL);.. if (re
1030: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 sultObj == NULL)
1040: 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b {..return NULL;
1050: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
1060: 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 (xflags & EXFLAG
1070: 5f 4b 55 53 41 47 45 29 20 26 26 20 75 73 61 67 _KUSAGE) && usag
1080: 65 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58 29 20 e < UINT32_MAX)
1090: 7b 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b {..if (usage & K
10a0: 55 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 54 U_DIGITAL_SIGNAT
10b0: 55 52 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f URE) {.. Tcl_
10c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 ment(interp, res
10e0: 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 ultObj, Tcl_NewS
10f0: 74 72 69 6e 67 4f 62 6a 28 22 44 69 67 69 74 61 tringObj("Digita
1100: 6c 20 53 69 67 6e 61 74 75 72 65 22 2c 20 2d 31 l Signature", -1
1110: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 ));..}..if (usag
1120: 65 20 26 20 4b 55 5f 4e 4f 4e 5f 52 45 50 55 44 e & KU_NON_REPUD
1130: 49 41 54 49 4f 4e 29 20 7b 0a 09 20 20 20 20 54 IATION) {.. T
1140: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1150: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
1160: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e resultObj, Tcl_N
1170: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 6f 6e ewStringObj("Non
1180: 2d 52 65 70 75 64 69 61 74 69 6f 6e 22 2c 20 2d -Repudiation", -
1190: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 1));..}..if (usa
11a0: 67 65 20 26 20 4b 55 5f 4b 45 59 5f 45 4e 43 49 ge & KU_KEY_ENCI
11b0: 50 48 45 52 4d 45 4e 54 29 20 7b 0a 09 20 20 20 PHERMENT) {..
11c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
11d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11e0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c , resultObj, Tcl
11f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4b _NewStringObj("K
1200: 65 79 20 45 6e 63 69 70 68 65 72 6d 65 6e 74 22 ey Encipherment"
1210: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
1220: 75 73 61 67 65 20 26 20 4b 55 5f 44 41 54 41 5f usage & KU_DATA_
1230: 45 4e 43 49 50 48 45 52 4d 45 4e 54 29 20 7b 0a ENCIPHERMENT) {.
1240: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1250: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1260: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
1270: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1280: 6a 28 22 44 61 74 61 20 45 6e 63 69 70 68 65 72 j("Data Encipher
1290: 6d 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a ment", -1));..}.
12a0: 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f .if (usage & KU_
12b0: 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 29 20 7b KEY_AGREEMENT) {
12c0: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
12d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
12e0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
12f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
1300: 62 6a 28 22 4b 65 79 20 41 67 72 65 65 6d 65 6e bj("Key Agreemen
1310: 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 t", -1));..}..if
1320: 20 28 75 73 61 67 65 20 26 20 4b 55 5f 4b 45 59 (usage & KU_KEY
1330: 5f 43 45 52 54 5f 53 49 47 4e 29 20 7b 0a 09 20 _CERT_SIGN) {..
1340: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
1350: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
1360: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 rp, resultObj, T
1370: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1380: 22 43 65 72 74 69 66 69 63 61 74 65 20 53 69 67 "Certificate Sig
1390: 6e 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a ning", -1));..}.
13a0: 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f .if (usage & KU_
13b0: 43 52 4c 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 CRL_SIGN) {..
13c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
13d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
13e0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c , resultObj, Tcl
13f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 43 _NewStringObj("C
1400: 52 4c 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 RL Signing", -1)
1410: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 );..}..if (usage
1420: 20 26 20 4b 55 5f 45 4e 43 49 50 48 45 52 5f 4f & KU_ENCIPHER_O
1430: 4e 4c 59 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f NLY) {.. Tcl_
1440: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1450: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 ment(interp, res
1460: 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 ultObj, Tcl_NewS
1470: 74 72 69 6e 67 4f 62 6a 28 22 45 6e 63 69 70 68 tringObj("Enciph
1480: 65 72 20 4f 6e 6c 79 22 2c 20 2d 31 29 29 3b 0a er Only", -1));.
1490: 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 .}..if (usage &
14a0: 4b 55 5f 44 45 43 49 50 48 45 52 5f 4f 4e 4c 59 KU_DECIPHER_ONLY
14b0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
14c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
14d0: 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 t(interp, result
14e0: 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Obj, Tcl_NewStri
14f0: 6e 67 4f 62 6a 28 22 44 65 63 69 70 68 65 72 20 ngObj("Decipher
1500: 4f 6e 6c 79 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a Only", -1));..}.
1510: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 } else {..
1520: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
1530: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1540: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 p, resultObj, Tc
1550: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
1560: 75 6e 72 65 73 74 72 69 63 74 65 64 22 2c 20 2d unrestricted", -
1570: 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 1));. }. r
1580: 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b eturn resultObj;
1590: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
15a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
15f0: 5f 78 35 30 39 50 75 72 70 6f 73 65 20 2d 2d 0a _x509Purpose --.
1600: 20 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30 39 20 *. *.Get X.509
1610: 63 65 72 74 69 66 69 63 61 74 65 20 70 75 72 70 certificate purp
1620: 6f 73 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ose. *. * Result
1630: 73 3a 0a 20 2a 09 50 75 72 70 6f 73 65 20 73 74 s:. *.Purpose st
1640: 72 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ring. *. * Side
1650: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
1660: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
1670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b0: 2d 2d 2d 0a 20 2a 2f 0a 63 6f 6e 73 74 20 63 68 ---. */.const ch
16c0: 61 72 20 2a 54 6c 73 5f 78 35 30 39 50 75 72 70 ar *Tls_x509Purp
16d0: 6f 73 65 28 58 35 30 39 20 2a 63 65 72 74 29 20 ose(X509 *cert)
16e0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 {. const char
16f0: 20 2a 70 75 72 70 6f 73 65 20 3d 20 4e 55 4c 4c *purpose = NULL
1700: 3b 0a 0a 20 20 20 20 69 66 20 28 58 35 30 39 5f ;.. if (X509_
1710: 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 check_purpose(ce
1720: 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 rt, X509_PURPOSE
1730: 5f 53 53 4c 5f 43 4c 49 45 4e 54 2c 20 30 29 20 _SSL_CLIENT, 0)
1740: 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 > 0) {..purpose
1750: 3d 20 22 53 53 4c 20 43 6c 69 65 6e 74 22 3b 0a = "SSL Client";.
1760: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 58 } else if (X
1770: 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 509_check_purpos
1780: 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 e(cert, X509_PUR
1790: 50 4f 53 45 5f 53 53 4c 5f 53 45 52 56 45 52 2c POSE_SSL_SERVER,
17a0: 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 0) > 0) {..purp
17b0: 6f 73 65 20 3d 20 22 53 53 4c 20 53 65 72 76 65 ose = "SSL Serve
17c0: 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 r";. } else i
17d0: 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 f (X509_check_pu
17e0: 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 rpose(cert, X509
17f0: 5f 50 55 52 50 4f 53 45 5f 4e 53 5f 53 53 4c 5f _PURPOSE_NS_SSL_
1800: 53 45 52 56 45 52 2c 20 30 29 20 3e 20 30 29 20 SERVER, 0) > 0)
1810: 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 4d 53 {..purpose = "MS
1820: 53 20 53 53 4c 20 53 65 72 76 65 72 22 3b 0a 20 S SSL Server";.
1830: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35 } else if (X5
1840: 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 09_check_purpose
1850: 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 (cert, X509_PURP
1860: 4f 53 45 5f 53 4d 49 4d 45 5f 53 49 47 4e 2c 20 OSE_SMIME_SIGN,
1870: 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 0) > 0) {..purpo
1880: 73 65 20 3d 20 22 53 4d 49 4d 45 20 53 69 67 6e se = "SMIME Sign
1890: 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ing";. } else
18a0: 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f if (X509_check_
18b0: 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 purpose(cert, X5
18c0: 30 39 5f 50 55 52 50 4f 53 45 5f 53 4d 49 4d 45 09_PURPOSE_SMIME
18d0: 5f 45 4e 43 52 59 50 54 2c 20 30 29 20 3e 20 30 _ENCRYPT, 0) > 0
18e0: 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 ) {..purpose = "
18f0: 53 4d 49 4d 45 20 45 6e 63 72 79 70 74 69 6f 6e SMIME Encryption
1900: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ";. } else if
1910: 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 (X509_check_pur
1920: 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f pose(cert, X509_
1930: 50 55 52 50 4f 53 45 5f 43 52 4c 5f 53 49 47 4e PURPOSE_CRL_SIGN
1940: 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 , 0) > 0) {..pur
1950: 70 6f 73 65 20 3d 20 22 43 52 4c 20 53 69 67 6e pose = "CRL Sign
1960: 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ing";. } else
1970: 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f if (X509_check_
1980: 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 purpose(cert, X5
1990: 30 39 5f 50 55 52 50 4f 53 45 5f 41 4e 59 2c 20 09_PURPOSE_ANY,
19a0: 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 0) > 0) {..purpo
19b0: 73 65 20 3d 20 22 41 6e 79 22 3b 0a 20 20 20 20 se = "Any";.
19c0: 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f } else if (X509_
19d0: 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 check_purpose(ce
19e0: 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 rt, X509_PURPOSE
19f0: 5f 4f 43 53 50 5f 48 45 4c 50 45 52 2c 20 30 29 _OCSP_HELPER, 0)
1a00: 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 > 0) {..purpose
1a10: 20 3d 20 22 4f 43 53 50 20 48 65 6c 70 65 72 22 = "OCSP Helper"
1a20: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
1a30: 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 (X509_check_purp
1a40: 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 ose(cert, X509_P
1a50: 55 52 50 4f 53 45 5f 54 49 4d 45 53 54 41 4d 50 URPOSE_TIMESTAMP
1a60: 5f 53 49 47 4e 2c 20 30 29 20 3e 20 30 29 20 7b _SIGN, 0) > 0) {
1a70: 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 54 69 6d ..purpose = "Tim
1a80: 65 73 74 61 6d 70 20 53 69 67 6e 69 6e 67 22 3b estamp Signing";
1a90: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 . } else {..p
1aa0: 75 72 70 6f 73 65 20 3d 20 22 22 3b 0a 20 20 20 urpose = "";.
1ab0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 75 }. return pu
1ac0: 72 70 6f 73 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d rpose;.}../*. *-
1ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
1b20: 20 2a 20 54 6c 73 5f 78 35 30 39 50 75 72 70 6f * Tls_x509Purpo
1b30: 73 65 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 ses --. *. *.Get
1b40: 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 X.509 certifica
1b50: 74 65 20 70 75 72 70 6f 73 65 20 74 79 70 65 73 te purpose types
1b60: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
1b70: 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 65 *.Tcl list of e
1b80: 61 63 68 20 70 75 72 70 6f 73 65 20 61 6e 64 20 ach purpose and
1b90: 77 68 65 74 68 65 72 20 69 74 20 69 73 20 43 41 whether it is CA
1ba0: 20 6f 72 20 6e 6f 6e 2d 43 41 0a 20 2a 0a 20 2a or non-CA. *. *
1bb0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
1bc0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d *.None. *. *----
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 ---------. */.Tc
1c20: 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 50 l_Obj *Tls_x509P
1c30: 75 72 70 6f 73 65 73 28 54 63 6c 5f 49 6e 74 65 urposes(Tcl_Inte
1c40: 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 rp *interp, X509
1c50: 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 54 63 *cert) {. Tc
1c60: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a l_Obj *resultObj
1c70: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
1c80: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 j(0, NULL);.
1c90: 58 35 30 39 5f 50 55 52 50 4f 53 45 20 2a 70 74 X509_PURPOSE *pt
1ca0: 6d 70 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 mp;.. if (res
1cb0: 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 ultObj == NULL)
1cc0: 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a {..return NULL;.
1cd0: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 }.. for (
1ce0: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 58 int i = 0; i < X
1cf0: 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 5f 509_PURPOSE_get_
1d00: 63 6f 75 6e 74 28 29 3b 20 69 2b 2b 29 20 7b 0a count(); i++) {.
1d10: 09 70 74 6d 70 20 3d 20 58 35 30 39 5f 50 55 52 .ptmp = X509_PUR
1d20: 50 4f 53 45 5f 67 65 74 30 28 69 29 3b 0a 09 54 POSE_get0(i);..T
1d30: 63 6c 5f 4f 62 6a 20 2a 74 6d 70 50 74 72 20 3d cl_Obj *tmpPtr =
1d40: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
1d50: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 66 6f 72 20 0, NULL);...for
1d60: 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 3c 20 (int j = 0; j <
1d70: 32 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 69 2; j++) {.. i
1d80: 6e 74 20 69 64 72 65 74 20 3d 20 58 35 30 39 5f nt idret = X509_
1d90: 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 check_purpose(ce
1da0: 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 rt, X509_PURPOSE
1db0: 5f 67 65 74 5f 69 64 28 70 74 6d 70 29 2c 20 6a _get_id(ptmp), j
1dc0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 );.. Tcl_List
1dd0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1de0: 28 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 2c (interp, tmpPtr,
1df0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1e00: 6a 28 6a 20 3f 20 22 43 41 22 20 3a 20 22 6e 6f j(j ? "CA" : "no
1e10: 6e 43 41 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 nCA", -1));..
1e20: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
1e30: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
1e40: 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65 , tmpPtr, Tcl_Ne
1e50: 77 53 74 72 69 6e 67 4f 62 6a 28 69 64 72 65 74 wStringObj(idret
1e60: 20 3d 3d 20 31 20 3f 20 22 59 65 73 22 20 3a 20 == 1 ? "Yes" :
1e70: 22 4e 6f 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 "No", -1));..}..
1e80: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 LAPPEND_OBJ(inte
1e90: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 58 rp, resultObj, X
1ea0: 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 30 509_PURPOSE_get0
1eb0: 5f 6e 61 6d 65 28 70 74 6d 70 29 2c 20 74 6d 70 _name(ptmp), tmp
1ec0: 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 Ptr);. }.
1ed0: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a return resultObj
1ee0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
1ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
1f40: 73 5f 78 35 30 39 4e 61 6d 65 73 20 2d 2d 0a 20 s_x509Names --.
1f50: 2a 0a 20 2a 09 47 65 74 20 61 20 6c 69 73 74 20 *. *.Get a list
1f60: 6f 66 20 53 75 62 6a 65 63 74 20 41 6c 74 65 72 of Subject Alter
1f70: 6e 61 74 65 20 4e 61 6d 65 73 20 28 53 41 4e 29 nate Names (SAN)
1f80: 20 6f 72 20 49 73 73 75 65 72 20 41 6c 74 65 72 or Issuer Alter
1f90: 6e 61 74 65 20 4e 61 6d 65 73 0a 20 2a 0a 20 2a nate Names. *. *
1fa0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 6c Results:. *.Tcl
1fb0: 20 6c 69 73 74 20 6f 66 20 61 6c 74 65 72 6e 61 list of alterna
1fc0: 74 65 20 6e 61 6d 65 73 0a 20 2a 0a 20 2a 20 53 te names. *. * S
1fd0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
1fe0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d None. *. *------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2030: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f -------. */.Tcl_
2040: 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 4e 61 6d Obj *Tls_x509Nam
2050: 65 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 es(Tcl_Interp *i
2060: 6e 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 nterp, X509 *cer
2070: 74 2c 20 69 6e 74 20 6e 69 64 2c 20 42 49 4f 20 t, int nid, BIO
2080: 2a 62 69 6f 29 20 7b 0a 20 20 20 20 53 54 41 43 *bio) {. STAC
2090: 4b 5f 4f 46 28 47 45 4e 45 52 41 4c 5f 4e 41 4d K_OF(GENERAL_NAM
20a0: 45 29 20 2a 6e 61 6d 65 73 3b 0a 20 20 20 20 54 E) *names;. T
20b0: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 cl_Obj *resultOb
20c0: 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f j = Tcl_NewListO
20d0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 bj(0, NULL);.
20e0: 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 Tcl_Size len;.
20f0: 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 char buffer[1
2100: 30 32 34 5d 3b 0a 0a 20 20 20 20 69 66 20 28 72 024];.. if (r
2110: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c esultObj == NULL
2120: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c ) {..return NULL
2130: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
2140: 28 28 6e 61 6d 65 73 20 3d 20 28 53 54 41 43 4b ((names = (STACK
2150: 5f 4f 46 28 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 _OF(GENERAL_NAME
2160: 29 20 2a 29 58 35 30 39 5f 67 65 74 5f 65 78 74 ) *)X509_get_ext
2170: 5f 64 32 69 28 63 65 72 74 2c 20 6e 69 64 2c 20 _d2i(cert, nid,
2180: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 NULL, NULL)) !=
2190: 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e NULL) {..for (in
21a0: 74 20 69 3d 30 3b 20 69 20 3c 20 73 6b 5f 47 45 t i=0; i < sk_GE
21b0: 4e 45 52 41 4c 5f 4e 41 4d 45 5f 6e 75 6d 28 6e NERAL_NAME_num(n
21c0: 61 6d 65 73 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 ames); i++) {..
21d0: 20 20 20 63 6f 6e 73 74 20 47 45 4e 45 52 41 4c const GENERAL
21e0: 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b _NAME *name = sk
21f0: 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 76 61 _GENERAL_NAME_va
2200: 6c 75 65 28 6e 61 6d 65 73 2c 20 69 29 3b 0a 0a lue(names, i);..
2210: 09 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 . len = BIO_t
2220: 6f 5f 42 75 66 66 65 72 28 6e 61 6d 65 20 26 26 o_Buffer(name &&
2230: 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70 72 GENERAL_NAME_pr
2240: 69 6e 74 28 62 69 6f 2c 20 28 47 45 4e 45 52 41 int(bio, (GENERA
2250: 4c 5f 4e 41 4d 45 20 2a 29 20 6e 61 6d 65 29 2c L_NAME *) name),
2260: 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 31 30 bio, buffer, 10
2270: 32 34 29 3b 0a 09 20 20 20 20 4c 41 50 50 45 4e 24);.. LAPPEN
2280: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 D_STR(interp, re
2290: 73 75 6c 74 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 62 sultObj, NULL, b
22a0: 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 09 7d 0a uffer, len);..}.
22b0: 09 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 .sk_GENERAL_NAME
22c0: 5f 70 6f 70 5f 66 72 65 65 28 6e 61 6d 65 73 2c _pop_free(names,
22d0: 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 66 72 GENERAL_NAME_fr
22e0: 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ee);. }. r
22f0: 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b eturn resultObj;
2300: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
2310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2350: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
2360: 5f 78 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 _x509ExtKeyUsage
2370: 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 61 20 --. *. *.Get a
2380: 6c 69 73 74 20 6f 66 20 45 78 74 65 6e 64 65 64 list of Extended
2390: 20 4b 65 79 20 55 73 61 67 65 73 0a 20 2a 0a 20 Key Usages. *.
23a0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 63 * Returns:. *.Tc
23b0: 6c 20 6c 69 73 74 20 6f 66 20 75 73 61 67 65 73 l list of usages
23c0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
23d0: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a cts:. *.None. *.
23e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
23f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2430: 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 */.Tcl_Obj *Tls
2440: 5f 78 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 _x509ExtKeyUsage
2450: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
2460: 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c erp, X509 *cert,
2470: 20 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 73 uint32_t xflags
2480: 29 20 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 ) {. uint32_t
2490: 20 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 usage = X509_ge
24a0: 74 5f 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74 t_key_usage(cert
24b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a );. Tcl_Obj *
24c0: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f resultObj = Tcl_
24d0: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
24e0: 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 LL);.. if (re
24f0: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 sultObj == NULL)
2500: 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b {..return NULL;
2510: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
2520: 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 (xflags & EXFLAG
2530: 5f 58 4b 55 53 41 47 45 29 20 26 26 20 75 73 61 _XKUSAGE) && usa
2540: 67 65 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58 29 ge < UINT32_MAX)
2550: 20 7b 0a 09 75 73 61 67 65 20 3d 20 58 35 30 39 {..usage = X509
2560: 5f 67 65 74 5f 65 78 74 65 6e 64 65 64 5f 6b 65 _get_extended_ke
2570: 79 5f 75 73 61 67 65 28 63 65 72 74 29 3b 0a 0a y_usage(cert);..
2580: 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 .if (usage & XKU
2590: 5f 53 53 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09 _SSL_SERVER) {..
25a0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
25b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
25c0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
25d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
25e0: 28 22 54 4c 53 20 57 65 62 20 53 65 72 76 65 72 ("TLS Web Server
25f0: 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 22 Authentication"
2600: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
2610: 75 73 61 67 65 20 26 20 58 4b 55 5f 53 53 4c 5f usage & XKU_SSL_
2620: 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 54 CLIENT) {.. T
2630: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2640: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2650: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e resultObj, Tcl_N
2660: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 4c 53 ewStringObj("TLS
2670: 20 57 65 62 20 43 6c 69 65 6e 74 20 41 75 74 68 Web Client Auth
2680: 65 6e 74 69 63 61 74 69 6f 6e 22 2c 20 2d 31 29 entication", -1)
2690: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 );..}..if (usage
26a0: 20 26 20 58 4b 55 5f 53 4d 49 4d 45 29 20 7b 0a & XKU_SMIME) {.
26b0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
26c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
26d0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
26e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
26f0: 6a 28 22 45 2d 6d 61 69 6c 20 50 72 6f 74 65 63 j("E-mail Protec
2700: 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a tion", -1));..}.
2710: 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 .if (usage & XKU
2720: 5f 43 4f 44 45 5f 53 49 47 4e 29 20 7b 0a 09 20 _CODE_SIGN) {..
2730: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2740: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2750: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 rp, resultObj, T
2760: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
2770: 22 43 6f 64 65 20 53 69 67 6e 69 6e 67 22 2c 20 "Code Signing",
2780: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 -1));..}..if (us
2790: 61 67 65 20 26 20 58 4b 55 5f 53 47 43 29 20 7b age & XKU_SGC) {
27a0: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
27b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
27c0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
27d0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
27e0: 62 6a 28 22 53 47 43 22 2c 20 2d 31 29 29 3b 0a bj("SGC", -1));.
27f0: 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 .}..if (usage &
2800: 58 4b 55 5f 4f 43 53 50 5f 53 49 47 4e 29 20 7b XKU_OCSP_SIGN) {
2810: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
2820: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2830: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
2840: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
2850: 62 6a 28 22 4f 43 53 50 20 53 69 67 6e 69 6e 67 bj("OCSP Signing
2860: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 ", -1));..}..if
2870: 28 75 73 61 67 65 20 26 20 58 4b 55 5f 54 49 4d (usage & XKU_TIM
2880: 45 53 54 41 4d 50 29 20 7b 0a 09 20 20 20 20 54 ESTAMP) {.. T
2890: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
28a0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
28b0: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e resultObj, Tcl_N
28c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 69 6d ewStringObj("Tim
28d0: 65 20 53 74 61 6d 70 69 6e 67 22 2c 20 2d 31 29 e Stamping", -1)
28e0: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 );..}..if (usage
28f0: 20 26 20 58 4b 55 5f 44 56 43 53 20 29 20 7b 0a & XKU_DVCS ) {.
2900: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2910: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2920: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
2930: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
2940: 6a 28 22 44 56 43 53 22 2c 20 2d 31 29 29 3b 0a j("DVCS", -1));.
2950: 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 .}..if (usage &
2960: 58 4b 55 5f 41 4e 59 45 4b 55 29 20 7b 0a 09 20 XKU_ANYEKU) {..
2970: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2980: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2990: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 rp, resultObj, T
29a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
29b0: 22 41 6e 79 20 45 78 74 65 6e 64 65 64 20 4b 65 "Any Extended Ke
29c0: 79 20 55 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a y Usage", -1));.
29d0: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a .}. } else {.
29e0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
29f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2a00: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
2a10: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
2a20: 6a 28 22 75 6e 72 65 73 74 72 69 63 74 65 64 22 j("unrestricted"
2a30: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 , -1));. }.
2a40: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f return resultO
2a50: 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d bj;.}../*. *----
2a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
2ab0: 54 6c 73 5f 78 35 30 39 43 72 6c 44 70 20 2d 2d Tls_x509CrlDp --
2ac0: 0a 20 2a 0a 20 2a 09 47 65 74 20 6c 69 73 74 20 . *. *.Get list
2ad0: 6f 66 20 43 52 4c 20 44 69 73 74 72 69 62 75 74 of CRL Distribut
2ae0: 69 6f 6e 20 50 6f 69 6e 74 73 0a 20 2a 0a 20 2a ion Points. *. *
2af0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 63 6c Returns:. *.Tcl
2b00: 20 6c 69 73 74 20 6f 66 20 55 52 49 73 20 61 6e list of URIs an
2b10: 64 20 72 65 6c 61 74 69 76 65 2d 6e 61 6d 65 73 d relative-names
2b20: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
2b30: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a cts:. *.None. *.
2b40: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
2b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2b90: 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 */.Tcl_Obj *Tls
2ba0: 5f 78 35 30 39 43 72 6c 44 70 28 54 63 6c 5f 49 _x509CrlDp(Tcl_I
2bb0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 nterp *interp, X
2bc0: 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 509 *cert) {.
2bd0: 20 53 54 41 43 4b 5f 4f 46 28 44 49 53 54 5f 50 STACK_OF(DIST_P
2be0: 4f 49 4e 54 29 20 2a 63 72 6c 3b 0a 20 20 20 20 OINT) *crl;.
2bf0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f Tcl_Obj *resultO
2c00: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 bj = Tcl_NewList
2c10: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 Obj(0, NULL);..
2c20: 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a if (resultObj
2c30: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
2c40: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
2c50: 0a 20 20 20 20 69 66 20 28 28 63 72 6c 20 3d 20 . if ((crl =
2c60: 28 53 54 41 43 4b 5f 4f 46 28 44 49 53 54 5f 50 (STACK_OF(DIST_P
2c70: 4f 49 4e 54 29 20 2a 29 58 35 30 39 5f 67 65 74 OINT) *)X509_get
2c80: 5f 65 78 74 5f 64 32 69 28 63 65 72 74 2c 20 4e _ext_d2i(cert, N
2c90: 49 44 5f 63 72 6c 5f 64 69 73 74 72 69 62 75 74 ID_crl_distribut
2ca0: 69 6f 6e 5f 70 6f 69 6e 74 73 2c 20 4e 55 4c 4c ion_points, NULL
2cb0: 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c , NULL)) != NULL
2cc0: 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69 3d ) {..for (int i=
2cd0: 30 3b 20 69 20 3c 20 73 6b 5f 44 49 53 54 5f 50 0; i < sk_DIST_P
2ce0: 4f 49 4e 54 5f 6e 75 6d 28 63 72 6c 29 3b 20 69 OINT_num(crl); i
2cf0: 2b 2b 29 20 7b 0a 09 20 20 20 20 44 49 53 54 5f ++) {.. DIST_
2d00: 50 4f 49 4e 54 20 2a 64 70 20 3d 20 73 6b 5f 44 POINT *dp = sk_D
2d10: 49 53 54 5f 50 4f 49 4e 54 5f 76 61 6c 75 65 28 IST_POINT_value(
2d20: 63 72 6c 2c 20 69 29 3b 0a 09 20 20 20 20 44 49 crl, i);.. DI
2d30: 53 54 5f 50 4f 49 4e 54 5f 4e 41 4d 45 20 2a 64 ST_POINT_NAME *d
2d40: 69 73 74 70 6f 69 6e 74 20 3d 20 64 70 2d 3e 64 istpoint = dp->d
2d50: 69 73 74 70 6f 69 6e 74 3b 0a 0a 09 20 20 20 20 istpoint;...
2d60: 69 66 20 28 64 69 73 74 70 6f 69 6e 74 2d 3e 74 if (distpoint->t
2d70: 79 70 65 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a ype == 0) {.../*
2d80: 20 66 75 6c 6c 2d 6e 61 6d 65 20 47 45 4e 45 52 full-name GENER
2d90: 41 4c 49 5a 45 44 4e 41 4d 45 20 2a 2f 0a 09 09 ALIZEDNAME */...
2da0: 66 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20 for (int j = 0;
2db0: 6a 20 3c 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e j < sk_GENERAL_N
2dc0: 41 4d 45 5f 6e 75 6d 28 64 69 73 74 70 6f 69 6e AME_num(distpoin
2dd0: 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c 6e 61 6d 65 t->name.fullname
2de0: 29 3b 20 6a 2b 2b 29 20 7b 0a 09 09 20 20 20 20 ); j++) {...
2df0: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 20 2a 67 65 GENERAL_NAME *ge
2e00: 6e 20 3d 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e n = sk_GENERAL_N
2e10: 41 4d 45 5f 76 61 6c 75 65 28 64 69 73 74 70 6f AME_value(distpo
2e20: 69 6e 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c 6e 61 int->name.fullna
2e30: 6d 65 2c 20 6a 29 3b 0a 09 09 20 20 20 20 69 6e me, j);... in
2e40: 74 20 74 79 70 65 3b 0a 09 09 20 20 20 20 41 53 t type;... AS
2e50: 4e 31 5f 53 54 52 49 4e 47 20 2a 75 72 69 20 3d N1_STRING *uri =
2e60: 20 28 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 29 (ASN1_STRING *)
2e70: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 67 65 74 GENERAL_NAME_get
2e80: 30 5f 76 61 6c 75 65 28 67 65 6e 2c 20 26 74 79 0_value(gen, &ty
2e90: 70 65 29 3b 0a 09 09 20 20 20 20 69 66 20 28 74 pe);... if (t
2ea0: 79 70 65 20 3d 3d 20 47 45 4e 5f 55 52 49 29 20 ype == GEN_URI)
2eb0: 7b 0a 09 09 09 4c 41 50 50 45 4e 44 5f 53 54 52 {....LAPPEND_STR
2ec0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
2ed0: 62 6a 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c bj, (char *) NUL
2ee0: 4c 2c 20 28 63 68 61 72 20 2a 29 20 41 53 4e 31 L, (char *) ASN1
2ef0: 5f 53 54 52 49 4e 47 5f 67 65 74 30 5f 64 61 74 _STRING_get0_dat
2f00: 61 28 75 72 69 29 2c 20 28 54 63 6c 5f 53 69 7a a(uri), (Tcl_Siz
2f10: 65 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c e) ASN1_STRING_l
2f20: 65 6e 67 74 68 28 75 72 69 29 29 3b 0a 09 09 20 ength(uri));...
2f30: 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 20 }...}.. }
2f40: 65 6c 73 65 20 69 66 20 28 64 69 73 74 70 6f 69 else if (distpoi
2f50: 6e 74 2d 3e 74 79 70 65 20 3d 3d 20 31 29 20 7b nt->type == 1) {
2f60: 0a 09 09 2f 2a 20 72 65 6c 61 74 69 76 65 2d 6e .../* relative-n
2f70: 61 6d 65 20 58 35 30 39 4e 41 4d 45 20 2a 2f 0a ame X509NAME */.
2f80: 09 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f ..STACK_OF(X509_
2f90: 4e 41 4d 45 5f 45 4e 54 52 59 29 20 2a 73 6b 5f NAME_ENTRY) *sk_
2fa0: 72 65 6c 6e 61 6d 65 20 3d 20 64 69 73 74 70 6f relname = distpo
2fb0: 69 6e 74 2d 3e 6e 61 6d 65 2e 72 65 6c 61 74 69 int->name.relati
2fc0: 76 65 6e 61 6d 65 3b 0a 09 09 66 6f 72 20 28 69 vename;...for (i
2fd0: 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 3c 20 73 6b nt j = 0; j < sk
2fe0: 5f 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 _X509_NAME_ENTRY
2ff0: 5f 6e 75 6d 28 73 6b 5f 72 65 6c 6e 61 6d 65 29 _num(sk_relname)
3000: 3b 20 6a 2b 2b 29 20 7b 0a 09 09 20 20 20 20 58 ; j++) {... X
3010: 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 20 2a 509_NAME_ENTRY *
3020: 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 e = sk_X509_NAME
3030: 5f 45 4e 54 52 59 5f 76 61 6c 75 65 28 73 6b 5f _ENTRY_value(sk_
3040: 72 65 6c 6e 61 6d 65 2c 20 6a 29 3b 0a 09 09 20 relname, j);...
3050: 20 20 20 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a ASN1_STRING *
3060: 64 20 3d 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e d = X509_NAME_EN
3070: 54 52 59 5f 67 65 74 5f 64 61 74 61 28 65 29 3b TRY_get_data(e);
3080: 0a 09 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 ... LAPPEND_S
3090: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c TR(interp, resul
30a0: 74 4f 62 6a 2c 20 28 63 68 61 72 20 2a 29 20 4e tObj, (char *) N
30b0: 55 4c 4c 2c 20 28 63 68 61 72 20 2a 29 20 41 53 ULL, (char *) AS
30c0: 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74 30 5f 64 N1_STRING_get0_d
30d0: 61 74 61 28 64 29 2c 20 28 54 63 6c 5f 53 69 7a ata(d), (Tcl_Siz
30e0: 65 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c e) ASN1_STRING_l
30f0: 65 6e 67 74 68 28 64 29 29 3b 0a 09 09 7d 0a 09 ength(d));...}..
3100: 20 20 20 20 7d 0a 09 7d 0a 09 43 52 4c 5f 44 49 }..}..CRL_DI
3110: 53 54 5f 50 4f 49 4e 54 53 5f 66 72 65 65 28 63 ST_POINTS_free(c
3120: 72 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 rl);. }. r
3130: 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b eturn resultObj;
3140: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3190: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
31a0: 5f 78 35 30 39 4f 73 63 70 0a 20 2a 0a 20 2a 09 _x509Oscp. *. *.
31b0: 47 65 74 20 6c 69 73 74 20 6f 66 20 4f 6e 2d 6c Get list of On-l
31c0: 69 6e 65 20 43 65 72 74 69 66 69 63 61 74 65 20 ine Certificate
31d0: 53 74 61 74 75 73 20 50 72 6f 74 6f 63 6f 6c 20 Status Protocol
31e0: 28 4f 53 43 50 29 20 55 52 49 73 0a 20 2a 0a 20 (OSCP) URIs. *.
31f0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 * Results:. *.Tc
3200: 6c 20 6c 69 73 74 20 6f 66 20 55 52 49 73 0a 20 l list of URIs.
3210: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
3220: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
3230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
3280: 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 /.Tcl_Obj *Tls_x
3290: 35 30 39 4f 73 63 70 28 54 63 6c 5f 49 6e 74 65 509Oscp(Tcl_Inte
32a0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 rp *interp, X509
32b0: 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 53 54 *cert) {. ST
32c0: 41 43 4b 5f 4f 46 28 4f 50 45 4e 53 53 4c 5f 53 ACK_OF(OPENSSL_S
32d0: 54 52 49 4e 47 29 20 2a 6f 63 73 70 3b 0a 20 20 TRING) *ocsp;.
32e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c Tcl_Obj *resul
32f0: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 tObj = Tcl_NewLi
3300: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
3310: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f . if (resultO
3320: 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 bj == NULL) {..r
3330: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
3340: 7d 0a 0a 20 20 20 20 69 66 20 28 28 6f 63 73 70 }.. if ((ocsp
3350: 20 3d 20 58 35 30 39 5f 67 65 74 31 5f 6f 63 73 = X509_get1_ocs
3360: 70 28 63 65 72 74 29 29 20 21 3d 20 4e 55 4c 4c p(cert)) != NULL
3370: 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 ) {..for (int i
3380: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 4f 50 45 4e = 0; i < sk_OPEN
3390: 53 53 4c 5f 53 54 52 49 4e 47 5f 6e 75 6d 28 6f SSL_STRING_num(o
33a0: 63 73 70 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 csp); i++) {..
33b0: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
33c0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
33d0: 20 4e 55 4c 4c 2c 20 73 6b 5f 4f 50 45 4e 53 53 NULL, sk_OPENSS
33e0: 4c 5f 53 54 52 49 4e 47 5f 76 61 6c 75 65 28 6f L_STRING_value(o
33f0: 63 73 70 2c 20 69 29 2c 20 2d 31 29 3b 0a 09 7d csp, i), -1);..}
3400: 0a 09 58 35 30 39 5f 65 6d 61 69 6c 5f 66 72 65 ..X509_email_fre
3410: 65 28 6f 63 73 70 29 3b 0a 20 20 20 20 7d 0a 20 e(ocsp);. }.
3420: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 return result
3430: 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d Obj;.}../*. *---
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
3490: 20 54 6c 73 5f 78 35 30 39 43 61 49 73 73 75 65 Tls_x509CaIssue
34a0: 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 rs --. *. *.Get
34b0: 6c 69 73 74 20 6f 66 20 43 65 72 74 69 66 69 63 list of Certific
34c0: 61 74 65 20 41 75 74 68 6f 72 69 74 79 20 28 43 ate Authority (C
34d0: 41 29 20 49 73 73 75 65 72 20 55 52 49 73 0a 20 A) Issuer URIs.
34e0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
34f0: 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 43 41 20 .Tcl list of CA
3500: 69 73 73 75 65 72 20 55 52 49 73 0a 20 2a 0a 20 issuer URIs. *.
3510: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
3520: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *.None. *. *---
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 ----------. */.T
3580: 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 cl_Obj *Tls_x509
3590: 43 61 49 73 73 75 65 72 73 28 54 63 6c 5f 49 6e CaIssuers(Tcl_In
35a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 terp *interp, X5
35b0: 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 09 *cert) {.
35c0: 53 54 41 43 4b 5f 4f 46 28 41 43 43 45 53 53 5f STACK_OF(ACCESS_
35d0: 44 45 53 43 52 49 50 54 49 4f 4e 29 20 2a 61 64 DESCRIPTION) *ad
35e0: 73 3b 0a 20 20 20 20 41 43 43 45 53 53 5f 44 45 s;. ACCESS_DE
35f0: 53 43 52 49 50 54 49 4f 4e 20 2a 61 64 3b 0a 20 SCRIPTION *ad;.
3600: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 Tcl_Obj *resu
3610: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c ltObj = Tcl_NewL
3620: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
3630: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
3640: 61 72 20 2a 62 75 66 3b 0a 0a 20 20 20 20 69 66 ar *buf;.. if
3650: 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e (resultObj == N
3660: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e ULL) {..return N
3670: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
3680: 69 66 20 28 28 61 64 73 20 3d 20 28 53 54 41 43 if ((ads = (STAC
3690: 4b 5f 4f 46 28 41 43 43 45 53 53 5f 44 45 53 43 K_OF(ACCESS_DESC
36a0: 52 49 50 54 49 4f 4e 29 20 2a 29 58 35 30 39 5f RIPTION) *)X509_
36b0: 67 65 74 5f 65 78 74 5f 64 32 69 28 63 65 72 74 get_ext_d2i(cert
36c0: 2c 20 4e 49 44 5f 69 6e 66 6f 5f 61 63 63 65 73 , NID_info_acces
36d0: 73 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 s, NULL, NULL))
36e0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 != NULL) {..for
36f0: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 (int i = 0; i <
3700: 73 6b 5f 41 43 43 45 53 53 5f 44 45 53 43 52 49 sk_ACCESS_DESCRI
3710: 50 54 49 4f 4e 5f 6e 75 6d 28 61 64 73 29 3b 20 PTION_num(ads);
3720: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 61 64 20 3d i++) {.. ad =
3730: 20 28 41 43 43 45 53 53 5f 44 45 53 43 52 49 50 (ACCESS_DESCRIP
3740: 54 49 4f 4e 20 2a 29 73 6b 5f 41 43 43 45 53 53 TION *)sk_ACCESS
3750: 5f 44 45 53 43 52 49 50 54 49 4f 4e 5f 76 61 6c _DESCRIPTION_val
3760: 75 65 28 61 64 73 2c 20 69 29 3b 0a 09 20 20 20 ue(ads, i);..
3770: 20 69 66 20 28 4f 42 4a 5f 6f 62 6a 32 6e 69 64 if (OBJ_obj2nid
3780: 28 61 64 2d 3e 6d 65 74 68 6f 64 29 20 3d 3d 20 (ad->method) ==
3790: 4e 49 44 5f 61 64 5f 63 61 5f 69 73 73 75 65 72 NID_ad_ca_issuer
37a0: 73 20 26 26 20 61 64 2d 3e 6c 6f 63 61 74 69 6f s && ad->locatio
37b0: 6e 29 20 7b 0a 09 09 69 66 20 28 61 64 2d 3e 6c n) {...if (ad->l
37c0: 6f 63 61 74 69 6f 6e 2d 3e 74 79 70 65 20 3d 3d ocation->type ==
37d0: 20 47 45 4e 5f 55 52 49 29 20 7b 0a 09 09 20 20 GEN_URI) {...
37e0: 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 20 3d Tcl_Size len =
37f0: 20 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31 (Tcl_Size) ASN1
3800: 5f 53 54 52 49 4e 47 5f 74 6f 5f 55 54 46 38 28 _STRING_to_UTF8(
3810: 26 62 75 66 2c 20 61 64 2d 3e 6c 6f 63 61 74 69 &buf, ad->locati
3820: 6f 6e 2d 3e 64 2e 75 6e 69 66 6f 72 6d 52 65 73 on->d.uniformRes
3830: 6f 75 72 63 65 49 64 65 6e 74 69 66 69 65 72 29 ourceIdentifier)
3840: 3b 0a 09 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 ;... Tcl_List
3850: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3860: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
3870: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e bj, Tcl_NewStrin
3880: 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 20 62 75 gObj((char *) bu
3890: 66 2c 20 6c 65 6e 29 29 3b 0a 09 09 20 20 20 20 f, len));...
38a0: 4f 50 45 4e 53 53 4c 5f 66 72 65 65 28 62 75 66 OPENSSL_free(buf
38b0: 29 3b 0a 09 09 20 20 20 20 62 72 65 61 6b 3b 0a );... break;.
38c0: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f ..}.. }..}../
38d0: 2a 20 73 6b 5f 41 43 43 45 53 53 5f 44 45 53 43 * sk_ACCESS_DESC
38e0: 52 49 50 54 49 4f 4e 5f 70 6f 70 5f 66 72 65 65 RIPTION_pop_free
38f0: 28 61 64 73 2c 20 41 43 43 45 53 53 5f 44 45 53 (ads, ACCESS_DES
3900: 43 52 49 50 54 49 4f 4e 5f 66 72 65 65 29 3b 20 CRIPTION_free);
3910: 2a 2f 0a 09 41 55 54 48 4f 52 49 54 59 5f 49 4e */..AUTHORITY_IN
3920: 46 4f 5f 41 43 43 45 53 53 5f 66 72 65 65 28 61 FO_ACCESS_free(a
3930: 64 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ds);. }. r
3940: 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b eturn resultObj;
3950: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
39b0: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 20 2d 2d 0a s_NewX509Obj --.
39c0: 20 2a 0a 20 2a 09 50 61 72 73 65 73 20 61 20 58 *. *.Parses a X
39d0: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 509 certificate
39e0: 61 6e 64 20 72 65 74 75 72 6e 73 20 63 6f 6e 74 and returns cont
39f0: 65 6e 74 73 20 61 73 20 61 20 6b 65 79 2d 76 61 ents as a key-va
3a00: 6c 75 65 20 54 63 6c 20 6c 69 73 74 2e 0a 20 2a lue Tcl list.. *
3a10: 0a 20 2a 20 52 65 73 75 6c 74 3a 0a 20 2a 09 41 . * Result:. *.A
3a20: 20 54 63 6c 20 4c 69 73 74 20 77 69 74 68 20 74 Tcl List with t
3a30: 68 65 20 58 35 30 39 20 63 65 72 74 69 66 69 63 he X509 certific
3a40: 61 74 65 20 69 6e 66 6f 20 61 73 20 61 20 6b 65 ate info as a ke
3a50: 79 2d 76 61 6c 75 65 20 6c 69 73 74 0a 20 2a 0a y-value list. *.
3a60: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
3a70: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d . *.None. *. *--
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
3ad0: 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 4e 65 77 Tcl_Obj *Tls_New
3ae0: 58 35 30 39 4f 62 6a 28 54 63 6c 5f 49 6e 74 65 X509Obj(Tcl_Inte
3af0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 rp *interp, X509
3b00: 20 2a 63 65 72 74 2c 20 69 6e 74 20 61 6c 6c 29 *cert, int all)
3b10: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
3b20: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f resultObj = Tcl_
3b30: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
3b40: 4c 4c 29 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 LL);. BIO *bi
3b50: 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f o = BIO_new(BIO_
3b60: 73 5f 6d 65 6d 28 29 29 3b 0a 20 20 20 20 69 6e s_mem());. in
3b70: 74 20 6d 64 6e 69 64 2c 20 70 6b 6e 69 64 2c 20 t mdnid, pknid,
3b80: 62 69 74 73 3b 0a 20 20 20 20 54 63 6c 5f 53 69 bits;. Tcl_Si
3b90: 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 ze len;. unsi
3ba0: 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 20 gned int ulen;.
3bb0: 20 20 20 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 uint32_t xfla
3bc0: 67 73 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 gs;. unsigned
3bd0: 20 6c 6f 6e 67 20 66 6c 61 67 73 20 3d 20 58 4e long flags = XN
3be0: 5f 46 4c 41 47 5f 52 46 43 32 32 35 33 20 7c 20 _FLAG_RFC2253 |
3bf0: 41 53 4e 31 5f 53 54 52 46 4c 47 53 5f 55 54 46 ASN1_STRFLGS_UTF
3c00: 38 5f 43 4f 4e 56 45 52 54 3b 0a 20 20 20 20 66 8_CONVERT;. f
3c10: 6c 61 67 73 20 26 3d 20 7e 28 75 6e 73 69 67 6e lags &= ~(unsign
3c20: 65 64 20 6c 6f 6e 67 29 41 53 4e 31 5f 53 54 52 ed long)ASN1_STR
3c30: 46 4c 47 53 5f 45 53 43 5f 4d 53 42 3b 0a 0a 20 FLGS_ESC_MSB;..
3c40: 20 20 20 63 68 61 72 20 2a 62 75 66 66 65 72 20 char *buffer
3c50: 3d 20 28 63 68 61 72 20 2a 29 63 6b 61 6c 6c 6f = (char *)ckallo
3c60: 63 28 42 55 46 53 49 5a 20 3e 20 45 56 50 5f 4d c(BUFSIZ > EVP_M
3c70: 41 58 5f 4d 44 5f 53 49 5a 45 20 3f 20 42 55 46 AX_MD_SIZE ? BUF
3c80: 53 49 5a 20 3a 20 45 56 50 5f 4d 41 58 5f 4d 44 SIZ : EVP_MAX_MD
3c90: 5f 53 49 5a 45 29 3b 0a 0a 20 20 20 20 64 70 72 _SIZE);.. dpr
3ca0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
3cb0: 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 20 . if (interp
3cc0: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 65 72 74 20 == NULL || cert
3cd0: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62 69 6f 20 3d == NULL || bio =
3ce0: 3d 20 4e 55 4c 4c 20 7c 7c 20 72 65 73 75 6c 74 = NULL || result
3cf0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62 Obj == NULL || b
3d00: 75 66 66 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b uffer == NULL) {
3d10: 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 ..Tcl_DecrRefCou
3d20: 6e 74 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 09 nt(resultObj);..
3d30: 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 BIO_free(bio);..
3d40: 69 66 20 28 62 75 66 66 65 72 20 21 3d 20 4e 55 if (buffer != NU
3d50: 4c 4c 29 20 63 6b 66 72 65 65 28 62 75 66 66 65 LL) ckfree(buffe
3d60: 72 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c r);..return NULL
3d70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
3d80: 53 69 67 6e 61 74 75 72 65 20 61 6c 67 6f 72 69 Signature algori
3d90: 74 68 6d 20 61 6e 64 20 76 61 6c 75 65 20 2d 20 thm and value -
3da0: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e RFC 5280 section
3db0: 20 34 2e 31 2e 31 2e 32 20 61 6e 64 20 34 2e 31 4.1.1.2 and 4.1
3dc0: 2e 31 2e 33 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 .1.3 */. /* s
3dd0: 69 67 6e 61 74 75 72 65 41 6c 67 6f 72 69 74 68 ignatureAlgorith
3de0: 6d 20 69 73 20 74 68 65 20 69 64 20 6f 66 20 74 m is the id of t
3df0: 68 65 20 63 72 79 70 74 6f 67 72 61 70 68 69 63 he cryptographic
3e00: 20 61 6c 67 6f 72 69 74 68 6d 20 75 73 65 64 20 algorithm used
3e10: 62 79 20 74 68 65 0a 09 43 41 20 74 6f 20 73 69 by the..CA to si
3e20: 67 6e 20 74 68 69 73 20 63 65 72 74 2e 20 73 69 gn this cert. si
3e30: 67 6e 61 74 75 72 65 56 61 6c 75 65 20 69 73 20 gnatureValue is
3e40: 74 68 65 20 64 69 67 69 74 61 6c 20 73 69 67 6e the digital sign
3e50: 61 74 75 72 65 20 63 6f 6d 70 75 74 65 64 0a 09 ature computed..
3e60: 75 70 6f 6e 20 74 68 65 20 41 53 4e 2e 31 20 44 upon the ASN.1 D
3e70: 45 52 20 65 6e 63 6f 64 65 64 20 74 62 73 43 65 ER encoded tbsCe
3e80: 72 74 69 66 69 63 61 74 65 2e 20 2a 2f 0a 20 20 rtificate. */.
3e90: 20 20 7b 0a 09 63 6f 6e 73 74 20 58 35 30 39 5f {..const X509_
3ea0: 41 4c 47 4f 52 20 2a 73 69 67 5f 61 6c 67 3b 0a ALGOR *sig_alg;.
3eb0: 09 63 6f 6e 73 74 20 41 53 4e 31 5f 42 49 54 5f .const ASN1_BIT_
3ec0: 53 54 52 49 4e 47 20 2a 73 69 67 3b 0a 09 69 6e STRING *sig;..in
3ed0: 74 20 73 69 67 5f 6e 69 64 3b 0a 0a 09 58 35 30 t sig_nid;...X50
3ee0: 39 5f 67 65 74 30 5f 73 69 67 6e 61 74 75 72 65 9_get0_signature
3ef0: 28 26 73 69 67 2c 20 26 73 69 67 5f 61 6c 67 2c (&sig, &sig_alg,
3f00: 20 63 65 72 74 29 3b 0a 09 2f 2a 20 73 69 67 5f cert);../* sig_
3f10: 6e 69 64 20 3d 20 58 35 30 39 5f 67 65 74 5f 73 nid = X509_get_s
3f20: 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 63 65 72 ignature_nid(cer
3f30: 74 29 20 2a 2f 0a 09 73 69 67 5f 6e 69 64 20 3d t) */..sig_nid =
3f40: 20 4f 42 4a 5f 6f 62 6a 32 6e 69 64 28 73 69 67 OBJ_obj2nid(sig
3f50: 5f 61 6c 67 2d 3e 61 6c 67 6f 72 69 74 68 6d 29 _alg->algorithm)
3f60: 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
3f70: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
3f80: 2c 20 22 73 69 67 6e 61 74 75 72 65 41 6c 67 6f , "signatureAlgo
3f90: 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 rithm", OBJ_nid2
3fa0: 6c 6e 28 73 69 67 5f 6e 69 64 29 2c 20 2d 31 29 ln(sig_nid), -1)
3fb0: 3b 0a 09 69 66 20 28 73 69 67 5f 6e 69 64 20 21 ;..if (sig_nid !
3fc0: 3d 20 4e 49 44 5f 75 6e 64 65 66 29 20 7b 0a 09 = NID_undef) {..
3fd0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 LAPPEND_OBJ(
3fe0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
3ff0: 6a 2c 20 22 73 69 67 6e 61 74 75 72 65 56 61 6c j, "signatureVal
4000: 75 65 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f 48 ue", String_to_H
4010: 65 78 28 73 69 67 2d 3e 64 61 74 61 2c 20 73 69 ex(sig->data, si
4020: 67 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a 09 7d 20 g->length));..}
4030: 65 6c 73 65 20 7b 0a 09 20 20 20 20 4c 41 50 50 else {.. LAPP
4040: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
4050: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e resultObj, "sign
4060: 61 74 75 72 65 56 61 6c 75 65 22 2c 20 22 22 2c atureValue", "",
4070: 20 30 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 0);..}. }..
4080: 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 20 6f 66 /* Version of
4090: 20 74 68 65 20 65 6e 63 6f 64 65 64 20 63 65 72 the encoded cer
40a0: 74 69 66 69 63 61 74 65 20 2d 20 52 46 43 20 35 tificate - RFC 5
40b0: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 280 section 4.1.
40c0: 32 2e 31 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 2.1 */. LAPPE
40d0: 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
40e0: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 76 65 72 73 resultObj, "vers
40f0: 69 6f 6e 22 2c 20 58 35 30 39 5f 67 65 74 5f 76 ion", X509_get_v
4100: 65 72 73 69 6f 6e 28 63 65 72 74 29 2b 31 29 3b ersion(cert)+1);
4110: 0a 0a 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 .. /* Unique
4120: 6e 75 6d 62 65 72 20 61 73 73 69 67 6e 65 64 20 number assigned
4130: 62 79 20 43 41 20 74 6f 20 63 65 72 74 69 66 69 by CA to certifi
4140: 63 61 74 65 20 2d 20 52 46 43 20 35 32 38 30 20 cate - RFC 5280
4150: 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 32 20 section 4.1.2.2
4160: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f */. len = BIO
4170: 5f 74 6f 5f 42 75 66 66 65 72 28 69 32 61 5f 41 _to_Buffer(i2a_A
4180: 53 4e 31 5f 49 4e 54 45 47 45 52 28 62 69 6f 2c SN1_INTEGER(bio,
4190: 20 58 35 30 39 5f 67 65 74 30 5f 73 65 72 69 61 X509_get0_seria
41a0: 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 29 2c 20 lNumber(cert)),
41b0: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46 bio, buffer, BUF
41c0: 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e SIZ);. LAPPEN
41d0: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 D_STR(interp, re
41e0: 73 75 6c 74 4f 62 6a 2c 20 22 73 65 72 69 61 6c sultObj, "serial
41f0: 4e 75 6d 62 65 72 22 2c 20 62 75 66 66 65 72 2c Number", buffer,
4200: 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 len);.. /* S
4210: 69 67 6e 61 74 75 72 65 20 61 6c 67 6f 72 69 74 ignature algorit
4220: 68 6d 20 75 73 65 64 20 62 79 20 74 68 65 20 43 hm used by the C
4230: 41 20 74 6f 20 73 69 67 6e 20 74 68 65 20 63 65 A to sign the ce
4240: 72 74 69 66 69 63 61 74 65 2e 20 4d 75 73 74 20 rtificate. Must
4250: 6d 61 74 63 68 0a 09 73 69 67 6e 61 74 75 72 65 match..signature
4260: 41 6c 67 6f 72 69 74 68 6d 2e 20 52 46 43 20 35 Algorithm. RFC 5
4270: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 280 section 4.1.
4280: 32 2e 33 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 2.3 */. LAPPE
4290: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 ND_STR(interp, r
42a0: 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 esultObj, "signa
42b0: 74 75 72 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c ture", OBJ_nid2l
42c0: 6e 28 58 35 30 39 5f 67 65 74 5f 73 69 67 6e 61 n(X509_get_signa
42d0: 74 75 72 65 5f 6e 69 64 28 63 65 72 74 29 29 2c ture_nid(cert)),
42e0: 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 73 -1);.. /* Is
42f0: 73 75 65 72 20 69 64 65 6e 74 69 66 69 65 73 20 suer identifies
4300: 74 68 65 20 65 6e 74 69 74 79 20 74 68 61 74 20 the entity that
4310: 73 69 67 6e 65 64 20 61 6e 64 20 69 73 73 75 65 signed and issue
4320: 64 20 74 68 65 20 63 65 72 74 2e 20 52 46 43 20 d the cert. RFC
4330: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 5280 section 4.1
4340: 2e 32 2e 34 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 .2.4 */. len
4350: 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 = BIO_to_Buffer(
4360: 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e 74 5f X509_NAME_print_
4370: 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 74 ex(bio, X509_get
4380: 5f 69 73 73 75 65 72 5f 6e 61 6d 65 28 63 65 72 _issuer_name(cer
4390: 74 29 2c 20 30 2c 20 66 6c 61 67 73 29 2c 20 62 t), 0, flags), b
43a0: 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 io, buffer, BUFS
43b0: 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 IZ);. LAPPEND
43c0: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 _STR(interp, res
43d0: 75 6c 74 4f 62 6a 2c 20 22 69 73 73 75 65 72 22 ultObj, "issuer"
43e0: 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a , buffer, len);.
43f0: 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63 . /* Certific
4400: 61 74 65 20 76 61 6c 69 64 69 74 79 20 70 65 72 ate validity per
4410: 69 6f 64 20 69 73 20 74 68 65 20 69 6e 74 65 72 iod is the inter
4420: 76 61 6c 20 74 68 65 20 43 41 20 77 61 72 72 61 val the CA warra
4430: 6e 74 73 20 74 68 61 74 20 69 74 20 77 69 6c 6c nts that it will
4440: 0a 09 6d 61 69 6e 74 61 69 6e 20 69 6e 66 6f 20 ..maintain info
4450: 6f 6e 20 74 68 65 20 73 74 61 74 75 73 20 6f 66 on the status of
4460: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
4470: 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 . RFC 5280 secti
4480: 6f 6e 20 34 2e 31 2e 32 2e 35 20 2a 2f 0a 20 20 on 4.1.2.5 */.
4490: 20 20 2f 2a 20 47 65 74 20 56 61 6c 69 64 69 74 /* Get Validit
44a0: 79 20 2d 20 4e 6f 74 20 42 65 66 6f 72 65 20 2a y - Not Before *
44b0: 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f /. len = BIO_
44c0: 74 6f 5f 42 75 66 66 65 72 28 41 53 4e 31 5f 54 to_Buffer(ASN1_T
44d0: 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c 20 58 IME_print(bio, X
44e0: 35 30 39 5f 67 65 74 30 5f 6e 6f 74 42 65 66 6f 509_get0_notBefo
44f0: 72 65 28 63 65 72 74 29 29 2c 20 62 69 6f 2c 20 re(cert)), bio,
4500: 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b buffer, BUFSIZ);
4510: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
4520: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
4530: 62 6a 2c 20 22 6e 6f 74 42 65 66 6f 72 65 22 2c bj, "notBefore",
4540: 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a buffer, len);..
4550: 20 20 20 20 2f 2a 20 47 65 74 20 56 61 6c 69 64 /* Get Valid
4560: 69 74 79 20 2d 20 4e 6f 74 20 41 66 74 65 72 20 ity - Not After
4570: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f */. len = BIO
4580: 5f 74 6f 5f 42 75 66 66 65 72 28 41 53 4e 31 5f _to_Buffer(ASN1_
4590: 54 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c 20 TIME_print(bio,
45a0: 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74 41 66 74 X509_get0_notAft
45b0: 65 72 28 63 65 72 74 29 29 2c 20 62 69 6f 2c 20 er(cert)), bio,
45c0: 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b buffer, BUFSIZ);
45d0: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
45e0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
45f0: 62 6a 2c 20 22 6e 6f 74 41 66 74 65 72 22 2c 20 bj, "notAfter",
4600: 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a 20 buffer, len);..
4610: 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 69 64 /* Subject id
4620: 65 6e 74 69 66 69 65 73 20 74 68 65 20 65 6e 74 entifies the ent
4630: 69 74 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 ity associated w
4640: 69 74 68 20 74 68 65 20 70 75 62 6c 69 63 20 6b ith the public k
4650: 65 79 20 73 74 6f 72 65 64 20 69 6e 0a 09 74 68 ey stored in..th
4660: 65 20 73 75 62 6a 65 63 74 20 70 75 62 6c 69 63 e subject public
4670: 20 6b 65 79 20 66 69 65 6c 64 2e 20 52 46 43 20 key field. RFC
4680: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 5280 section 4.1
4690: 2e 32 2e 36 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 .2.6 */. len
46a0: 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 = BIO_to_Buffer(
46b0: 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e 74 5f X509_NAME_print_
46c0: 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 74 ex(bio, X509_get
46d0: 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 _subject_name(ce
46e0: 72 74 29 2c 20 30 2c 20 66 6c 61 67 73 29 2c 20 rt), 0, flags),
46f0: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46 bio, buffer, BUF
4700: 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e SIZ);. LAPPEN
4710: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 D_STR(interp, re
4720: 73 75 6c 74 4f 62 6a 2c 20 22 73 75 62 6a 65 63 sultObj, "subjec
4730: 74 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 t", buffer, len)
4740: 3b 0a 0a 20 20 20 20 2f 2a 20 53 48 41 31 20 44 ;.. /* SHA1 D
4750: 69 67 65 73 74 20 28 46 69 6e 67 65 72 70 72 69 igest (Fingerpri
4760: 6e 74 29 20 6f 66 20 63 65 72 74 20 2d 20 44 45 nt) of cert - DE
4770: 52 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e R representation
4780: 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35 30 39 */. if (X509
4790: 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 45 56 _digest(cert, EV
47a0: 50 5f 73 68 61 31 28 29 2c 20 28 75 6e 73 69 67 P_sha1(), (unsig
47b0: 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 ned char *)buffe
47c0: 72 2c 20 26 75 6c 65 6e 29 29 20 7b 0a 09 4c 41 r, &ulen)) {..LA
47d0: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 PPEND_OBJ(interp
47e0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 68 , resultObj, "sh
47f0: 61 31 5f 68 61 73 68 22 2c 20 53 74 72 69 6e 67 a1_hash", String
4800: 5f 74 6f 5f 48 65 78 28 28 75 6e 73 69 67 6e 65 _to_Hex((unsigne
4810: 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 72 2c d char *)buffer,
4820: 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 20 (int) ulen));.
4830: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 48 41 }.. /* SHA
4840: 32 35 36 20 44 69 67 65 73 74 20 28 46 69 6e 67 256 Digest (Fing
4850: 65 72 70 72 69 6e 74 29 20 6f 66 20 63 65 72 74 erprint) of cert
4860: 20 2d 20 44 45 52 20 72 65 70 72 65 73 65 6e 74 - DER represent
4870: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 ation */. if
4880: 28 58 35 30 39 5f 64 69 67 65 73 74 28 63 65 72 (X509_digest(cer
4890: 74 2c 20 45 56 50 5f 73 68 61 32 35 36 28 29 2c t, EVP_sha256(),
48a0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 (unsigned char
48b0: 2a 29 62 75 66 66 65 72 2c 20 26 75 6c 65 6e 29 *)buffer, &ulen)
48c0: 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a ) {..LAPPEND_OBJ
48d0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
48e0: 62 6a 2c 20 22 73 68 61 32 35 36 5f 68 61 73 68 bj, "sha256_hash
48f0: 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 ", String_to_Hex
4900: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ((unsigned char
4910: 2a 29 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20 *)buffer, (int)
4920: 75 6c 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 ulen));. }..
4930: 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 50 75 /* Subject Pu
4940: 62 6c 69 63 20 4b 65 79 20 49 6e 66 6f 20 73 70 blic Key Info sp
4950: 65 63 69 66 69 65 73 20 74 68 65 20 70 75 62 6c ecifies the publ
4960: 69 63 20 6b 65 79 20 61 6e 64 20 69 64 65 6e 74 ic key and ident
4970: 69 66 69 65 73 20 74 68 65 0a 09 61 6c 67 6f 72 ifies the..algor
4980: 69 74 68 6d 20 77 69 74 68 20 77 68 69 63 68 20 ithm with which
4990: 74 68 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e the key is used.
49a0: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f RFC 5280 sectio
49b0: 6e 20 34 2e 31 2e 32 2e 37 20 2a 2f 0a 20 20 20 n 4.1.2.7 */.
49c0: 20 69 66 20 28 58 35 30 39 5f 67 65 74 5f 73 69 if (X509_get_si
49d0: 67 6e 61 74 75 72 65 5f 69 6e 66 6f 28 63 65 72 gnature_info(cer
49e0: 74 2c 20 26 6d 64 6e 69 64 2c 20 26 70 6b 6e 69 t, &mdnid, &pkni
49f0: 64 2c 20 26 62 69 74 73 2c 20 26 78 66 6c 61 67 d, &bits, &xflag
4a00: 73 29 29 20 7b 0a 09 41 53 4e 31 5f 42 49 54 5f s)) {..ASN1_BIT_
4a10: 53 54 52 49 4e 47 20 2a 6b 65 79 3b 0a 09 75 6e STRING *key;..un
4a20: 73 69 67 6e 65 64 20 69 6e 74 20 6e 3b 0a 0a 09 signed int n;...
4a30: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
4a40: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
4a50: 73 69 67 6e 69 6e 67 44 69 67 65 73 74 22 2c 20 signingDigest",
4a60: 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6d 64 6e 69 64 OBJ_nid2ln(mdnid
4a70: 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 ), -1);..LAPPEND
4a80: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 _STR(interp, res
4a90: 75 6c 74 4f 62 6a 2c 20 22 70 75 62 6c 69 63 4b ultObj, "publicK
4aa0: 65 79 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 eyAlgorithm", OB
4ab0: 4a 5f 6e 69 64 32 6c 6e 28 70 6b 6e 69 64 29 2c J_nid2ln(pknid),
4ac0: 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 -1);..LAPPEND_I
4ad0: 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c NT(interp, resul
4ae0: 74 4f 62 6a 2c 20 22 62 69 74 73 22 2c 20 62 69 tObj, "bits", bi
4af0: 74 73 29 3b 20 2f 2a 20 45 66 66 65 63 74 69 76 ts); /* Effectiv
4b00: 65 20 73 65 63 75 72 69 74 79 20 62 69 74 73 20 e security bits
4b10: 2a 2f 0a 0a 09 6b 65 79 20 3d 20 58 35 30 39 5f */...key = X509_
4b20: 67 65 74 30 5f 70 75 62 6b 65 79 5f 62 69 74 73 get0_pubkey_bits
4b30: 74 72 28 63 65 72 74 29 3b 0a 09 4c 41 50 50 45 tr(cert);..LAPPE
4b40: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 ND_OBJ(interp, r
4b50: 65 73 75 6c 74 4f 62 6a 2c 20 22 70 75 62 6c 69 esultObj, "publi
4b60: 63 4b 65 79 22 2c 20 53 74 72 69 6e 67 5f 74 6f cKey", String_to
4b70: 5f 48 65 78 28 6b 65 79 2d 3e 64 61 74 61 2c 20 _Hex(key->data,
4b80: 6b 65 79 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a 0a key->length));..
4b90: 09 69 66 20 28 58 35 30 39 5f 70 75 62 6b 65 79 .if (X509_pubkey
4ba0: 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 45 56 _digest(cert, EV
4bb0: 50 5f 67 65 74 5f 64 69 67 65 73 74 62 79 6e 69 P_get_digestbyni
4bc0: 64 28 70 6b 6e 69 64 29 2c 20 28 75 6e 73 69 67 d(pknid), (unsig
4bd0: 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 ned char *)buffe
4be0: 72 2c 20 26 6e 29 29 20 7b 0a 09 20 20 20 20 4c r, &n)) {.. L
4bf0: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 APPEND_OBJ(inter
4c00: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 p, resultObj, "p
4c10: 75 62 6c 69 63 4b 65 79 48 61 73 68 22 2c 20 53 ublicKeyHash", S
4c20: 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 28 75 6e tring_to_Hex((un
4c30: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75 signed char *)bu
4c40: 66 66 65 72 2c 20 28 69 6e 74 29 20 6e 29 29 3b ffer, (int) n));
4c50: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
4c60: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
4c70: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
4c80: 70 75 62 6c 69 63 4b 65 79 48 61 73 68 22 2c 20 publicKeyHash",
4c90: 22 22 2c 20 30 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 "", 0);..}.../*
4ca0: 64 69 67 65 73 74 20 6f 66 20 74 68 65 20 44 45 digest of the DE
4cb0: 52 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e R representation
4cc0: 20 6f 66 20 74 68 65 20 63 65 72 74 69 66 69 63 of the certific
4cd0: 61 74 65 20 2a 2f 0a 09 69 66 20 28 58 35 30 39 ate */..if (X509
4ce0: 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 45 56 _digest(cert, EV
4cf0: 50 5f 67 65 74 5f 64 69 67 65 73 74 62 79 6e 69 P_get_digestbyni
4d00: 64 28 6d 64 6e 69 64 29 2c 20 28 75 6e 73 69 67 d(mdnid), (unsig
4d10: 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 ned char *)buffe
4d20: 72 2c 20 26 6e 29 29 20 7b 0a 09 20 20 20 20 4c r, &n)) {.. L
4d30: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 APPEND_OBJ(inter
4d40: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 p, resultObj, "s
4d50: 69 67 6e 61 74 75 72 65 48 61 73 68 22 2c 20 53 ignatureHash", S
4d60: 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 28 75 6e tring_to_Hex((un
4d70: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75 signed char *)bu
4d80: 66 66 65 72 2c 20 28 69 6e 74 29 20 6e 29 29 3b ffer, (int) n));
4d90: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
4da0: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
4db0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
4dc0: 73 69 67 6e 61 74 75 72 65 48 61 73 68 22 2c 20 signatureHash",
4dd0: 22 22 2c 20 30 29 3b 0a 09 7d 0a 20 20 20 20 7d "", 0);..}. }
4de0: 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 .. /* Certifi
4df0: 63 61 74 65 20 50 75 72 70 6f 73 65 2e 20 43 61 cate Purpose. Ca
4e00: 6c 6c 20 62 65 66 6f 72 65 20 63 68 65 63 6b 69 ll before checki
4e10: 6e 67 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e ng for extension
4e20: 73 2e 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e s. */. LAPPEN
4e30: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 D_STR(interp, re
4e40: 73 75 6c 74 4f 62 6a 2c 20 22 70 75 72 70 6f 73 sultObj, "purpos
4e50: 65 22 2c 20 54 6c 73 5f 78 35 30 39 50 75 72 70 e", Tls_x509Purp
4e60: 6f 73 65 28 63 65 72 74 29 2c 20 2d 31 29 3b 0a ose(cert), -1);.
4e70: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 LAPPEND_OBJ(
4e80: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
4e90: 6a 2c 20 22 63 65 72 74 69 66 69 63 61 74 65 50 j, "certificateP
4ea0: 75 72 70 6f 73 65 22 2c 20 54 6c 73 5f 78 35 30 urpose", Tls_x50
4eb0: 39 50 75 72 70 6f 73 65 73 28 69 6e 74 65 72 70 9Purposes(interp
4ec0: 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f , cert));.. /
4ed0: 2a 20 47 65 74 20 65 78 74 65 6e 73 69 6f 6e 73 * Get extensions
4ee0: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20 78 66 flags */. xf
4ef0: 6c 61 67 73 20 3d 20 58 35 30 39 5f 67 65 74 5f lags = X509_get_
4f00: 65 78 74 65 6e 73 69 6f 6e 5f 66 6c 61 67 73 28 extension_flags(
4f10: 63 65 72 74 29 3b 0a 20 20 20 20 4c 41 50 50 45 cert);. LAPPE
4f20: 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 ND_INT(interp, r
4f30: 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74 46 6c esultObj, "extFl
4f40: 61 67 73 22 2c 20 78 66 6c 61 67 73 29 3b 0a 0a ags", xflags);..
4f50: 09 2f 2a 20 43 68 65 63 6b 20 69 66 20 63 65 72 ./* Check if cer
4f60: 74 20 77 61 73 20 69 73 73 75 65 64 20 62 79 20 t was issued by
4f70: 43 41 20 63 65 72 74 20 69 73 73 75 65 72 20 6f CA cert issuer o
4f80: 72 20 73 65 6c 66 20 73 69 67 6e 65 64 20 2a 2f r self signed */
4f90: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f . LAPPEND_BOO
4fa0: 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 L(interp, result
4fb0: 4f 62 6a 2c 20 22 73 65 6c 66 49 73 73 75 65 64 Obj, "selfIssued
4fc0: 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c ", xflags & EXFL
4fd0: 41 47 5f 53 49 29 3b 0a 20 20 20 20 4c 41 50 50 AG_SI);. LAPP
4fe0: 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
4ff0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 65 6c resultObj, "sel
5000: 66 53 69 67 6e 65 64 22 2c 20 78 66 6c 61 67 73 fSigned", xflags
5010: 20 26 20 45 58 46 4c 41 47 5f 53 53 29 3b 0a 20 & EXFLAG_SS);.
5020: 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 LAPPEND_BOOL(
5030: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
5040: 6a 2c 20 22 69 73 50 72 6f 78 79 43 65 72 74 22 j, "isProxyCert"
5050: 2c 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 , xflags & EXFLA
5060: 47 5f 50 52 4f 58 59 29 3b 0a 20 20 20 20 4c 41 G_PROXY);. LA
5070: 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
5080: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 p, resultObj, "e
5090: 78 74 49 6e 76 61 6c 69 64 22 2c 20 78 66 6c 61 xtInvalid", xfla
50a0: 67 73 20 26 20 45 58 46 4c 41 47 5f 49 4e 56 41 gs & EXFLAG_INVA
50b0: 4c 49 44 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e LID);. LAPPEN
50c0: 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 D_BOOL(interp, r
50d0: 65 73 75 6c 74 4f 62 6a 2c 20 22 69 73 43 41 43 esultObj, "isCAC
50e0: 65 72 74 22 2c 20 58 35 30 39 5f 63 68 65 63 6b ert", X509_check
50f0: 5f 63 61 28 63 65 72 74 29 29 3b 0a 0a 20 20 20 _ca(cert));..
5100: 20 2f 2a 20 54 68 65 20 55 6e 69 71 75 65 20 49 /* The Unique I
5110: 64 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 68 ds are used to h
5120: 61 6e 64 6c 65 20 74 68 65 20 70 6f 73 73 69 62 andle the possib
5130: 69 6c 69 74 79 20 6f 66 20 72 65 75 73 65 20 6f ility of reuse o
5140: 66 20 73 75 62 6a 65 63 74 0a 09 61 6e 64 2f 6f f subject..and/o
5150: 72 20 69 73 73 75 65 72 20 6e 61 6d 65 73 20 6f r issuer names o
5160: 76 65 72 20 74 69 6d 65 2e 20 52 46 43 20 35 32 ver time. RFC 52
5170: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 80 section 4.1.2
5180: 2e 38 20 2a 2f 0a 20 20 20 20 7b 0a 09 63 6f 6e .8 */. {..con
5190: 73 74 20 41 53 4e 31 5f 42 49 54 5f 53 54 52 49 st ASN1_BIT_STRI
51a0: 4e 47 20 2a 69 75 69 64 2c 20 2a 73 75 69 64 3b NG *iuid, *suid;
51b0: 0a 09 58 35 30 39 5f 67 65 74 30 5f 75 69 64 73 ..X509_get0_uids
51c0: 28 63 65 72 74 2c 20 26 69 75 69 64 2c 20 26 73 (cert, &iuid, &s
51d0: 75 69 64 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 uid);...Tcl_List
51e0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
51f0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
5200: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e bj, Tcl_NewStrin
5210: 67 4f 62 6a 28 22 69 73 73 75 65 72 55 6e 69 71 gObj("issuerUniq
5220: 75 65 49 64 22 2c 20 2d 31 29 29 3b 0a 09 69 66 ueId", -1));..if
5230: 20 28 69 75 69 64 20 21 3d 20 4e 55 4c 4c 29 20 (iuid != NULL)
5240: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
5250: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
5260: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
5270: 6a 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 j, Tcl_NewByteAr
5280: 72 61 79 4f 62 6a 28 28 63 6f 6e 73 74 20 75 6e rayObj((const un
5290: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 69 75 signed char *)iu
52a0: 69 64 2d 3e 64 61 74 61 2c 20 28 54 63 6c 5f 53 id->data, (Tcl_S
52b0: 69 7a 65 29 20 69 75 69 64 2d 3e 6c 65 6e 67 74 ize) iuid->lengt
52c0: 68 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 h));..} else {..
52d0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
52e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
52f0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
5300: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
5310: 28 22 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 0a 09 ("", -1));..}...
5320: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
5330: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
5340: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f resultObj, Tcl_
5350: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 75 NewStringObj("su
5360: 62 6a 65 63 74 55 6e 69 71 75 65 49 64 22 2c 20 bjectUniqueId",
5370: 2d 31 29 29 3b 0a 09 69 66 20 28 73 75 69 64 20 -1));..if (suid
5380: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
5390: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
53a0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
53b0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f resultObj, Tcl_
53c0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 NewByteArrayObj(
53d0: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
53e0: 63 68 61 72 20 2a 29 73 75 69 64 2d 3e 64 61 74 char *)suid->dat
53f0: 61 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 75 a, (Tcl_Size) su
5400: 69 64 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a 09 7d id->length));..}
5410: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c else {.. Tcl
5420: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
5430: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 ement(interp, re
5440: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 sultObj, Tcl_New
5450: 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 StringObj("", -1
5460: 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 ));..}. }..
5470: 20 20 2f 2a 20 58 35 30 39 20 76 33 20 45 78 74 /* X509 v3 Ext
5480: 65 6e 73 69 6f 6e 73 20 2d 20 52 46 43 20 35 32 ensions - RFC 52
5490: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 80 section 4.1.2
54a0: 2e 39 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e .9 */. LAPPEN
54b0: 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 D_INT(interp, re
54c0: 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74 43 6f 75 sultObj, "extCou
54d0: 6e 74 22 2c 20 58 35 30 39 5f 67 65 74 5f 65 78 nt", X509_get_ex
54e0: 74 5f 63 6f 75 6e 74 28 63 65 72 74 29 29 3b 0a t_count(cert));.
54f0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 LAPPEND_OBJ(
5500: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
5510: 6a 2c 20 22 65 78 74 65 6e 73 69 6f 6e 73 22 2c j, "extensions",
5520: 20 54 6c 73 5f 78 35 30 39 45 78 74 65 6e 73 69 Tls_x509Extensi
5530: 6f 6e 73 28 69 6e 74 65 72 70 2c 20 63 65 72 74 ons(interp, cert
5540: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 75 74 68 ));.. /* Auth
5550: 6f 72 69 74 79 20 4b 65 79 20 49 64 65 6e 74 69 ority Key Identi
5560: 66 69 65 72 20 28 41 4b 49 29 20 69 73 20 74 68 fier (AKI) is th
5570: 65 20 53 75 62 6a 65 63 74 20 4b 65 79 20 49 64 e Subject Key Id
5580: 65 6e 74 69 66 69 65 72 20 28 53 4b 49 29 20 6f entifier (SKI) o
5590: 66 0a 09 69 74 73 20 73 69 67 6e 65 72 20 28 74 f..its signer (t
55a0: 68 65 20 43 41 29 2e 20 52 46 43 20 35 32 38 30 he CA). RFC 5280
55b0: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 section 4.2.1.1
55c0: 2c 20 4e 49 44 5f 61 75 74 68 6f 72 69 74 79 5f , NID_authority_
55d0: 6b 65 79 5f 69 64 65 6e 74 69 66 69 65 72 20 2a key_identifier *
55e0: 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 /. LAPPEND_OB
55f0: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 J(interp, result
5600: 4f 62 6a 2c 20 22 61 75 74 68 6f 72 69 74 79 4b Obj, "authorityK
5610: 65 79 49 64 65 6e 74 69 66 69 65 72 22 2c 0a 09 eyIdentifier",..
5620: 54 6c 73 5f 78 35 30 39 49 64 65 6e 74 69 66 69 Tls_x509Identifi
5630: 65 72 28 58 35 30 39 5f 67 65 74 30 5f 61 75 74 er(X509_get0_aut
5640: 68 6f 72 69 74 79 5f 6b 65 79 5f 69 64 28 63 65 hority_key_id(ce
5650: 72 74 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 rt)));.. /* S
5660: 75 62 6a 65 63 74 20 4b 65 79 20 49 64 65 6e 74 ubject Key Ident
5670: 69 66 69 65 72 20 28 53 4b 49 29 20 69 73 20 75 ifier (SKI) is u
5680: 73 65 64 20 74 6f 20 69 64 65 6e 74 69 66 79 20 sed to identify
5690: 63 65 72 74 69 66 69 63 61 74 65 73 20 74 68 61 certificates tha
56a0: 74 20 63 6f 6e 74 61 69 6e 0a 09 61 20 70 61 72 t contain..a par
56b0: 74 69 63 75 6c 61 72 20 70 75 62 6c 69 63 20 6b ticular public k
56c0: 65 79 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 ey. RFC 5280 sec
56d0: 74 69 6f 6e 20 34 2e 32 2e 31 2e 32 2c 20 4e 49 tion 4.2.1.2, NI
56e0: 44 5f 73 75 62 6a 65 63 74 5f 6b 65 79 5f 69 64 D_subject_key_id
56f0: 65 6e 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 entifier */.
5700: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 LAPPEND_OBJ(inte
5710: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
5720: 73 75 62 6a 65 63 74 4b 65 79 49 64 65 6e 74 69 subjectKeyIdenti
5730: 66 69 65 72 22 2c 0a 09 54 6c 73 5f 78 35 30 39 fier",..Tls_x509
5740: 49 64 65 6e 74 69 66 69 65 72 28 58 35 30 39 5f Identifier(X509_
5750: 67 65 74 30 5f 73 75 62 6a 65 63 74 5f 6b 65 79 get0_subject_key
5760: 5f 69 64 28 63 65 72 74 29 29 29 3b 0a 0a 20 20 _id(cert)));..
5770: 20 20 2f 2a 20 4b 65 79 20 75 73 61 67 65 20 65 /* Key usage e
5780: 78 74 65 6e 73 69 6f 6e 20 64 65 66 69 6e 65 73 xtension defines
5790: 20 74 68 65 20 70 75 72 70 6f 73 65 20 28 65 2e the purpose (e.
57a0: 67 2e 2c 20 65 6e 63 69 70 68 65 72 6d 65 6e 74 g., encipherment
57b0: 2c 20 73 69 67 6e 61 74 75 72 65 2c 20 63 65 72 , signature, cer
57c0: 74 69 66 69 63 61 74 65 0a 09 73 69 67 6e 69 6e tificate..signin
57d0: 67 29 20 6f 66 20 74 68 65 20 6b 65 79 20 69 6e g) of the key in
57e0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
57f0: 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 . RFC 5280 secti
5800: 6f 6e 20 34 2e 32 2e 31 2e 33 2c 20 4e 49 44 5f on 4.2.1.3, NID_
5810: 6b 65 79 5f 75 73 61 67 65 20 2a 2f 0a 20 20 20 key_usage */.
5820: 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 LAPPEND_OBJ(int
5830: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
5840: 22 6b 65 79 55 73 61 67 65 22 2c 20 54 6c 73 5f "keyUsage", Tls_
5850: 78 35 30 39 4b 65 79 55 73 61 67 65 28 69 6e 74 x509KeyUsage(int
5860: 65 72 70 2c 20 63 65 72 74 2c 20 78 66 6c 61 67 erp, cert, xflag
5870: 73 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 65 72 s));.. /* Cer
5880: 74 69 66 69 63 61 74 65 20 50 6f 6c 69 63 69 65 tificate Policie
5890: 73 20 2d 20 69 6e 64 69 63 61 74 65 73 20 74 68 s - indicates th
58a0: 65 20 69 73 73 75 69 6e 67 20 43 41 20 63 6f 6e e issuing CA con
58b0: 73 69 64 65 72 73 20 69 74 73 20 69 73 73 75 65 siders its issue
58c0: 72 44 6f 6d 61 69 6e 50 6f 6c 69 63 79 0a 09 65 rDomainPolicy..e
58d0: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 quivalent to the
58e0: 20 73 75 62 6a 65 63 74 20 43 41 27 73 20 73 75 subject CA's su
58f0: 62 6a 65 63 74 44 6f 6d 61 69 6e 50 6f 6c 69 63 bjectDomainPolic
5900: 79 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 y. RFC 5280 sect
5910: 69 6f 6e 20 34 2e 32 2e 31 2e 34 2c 20 4e 49 44 ion 4.2.1.4, NID
5920: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 70 6f 6c _certificate_pol
5930: 69 63 69 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 icies */. if
5940: 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 (xflags & EXFLAG
5950: 5f 49 4e 56 41 4c 49 44 5f 50 4f 4c 49 43 59 29 _INVALID_POLICY)
5960: 20 7b 0a 09 2f 2a 20 52 65 6a 65 63 74 20 63 65 {../* Reject ce
5970: 72 74 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 rt */. }..
5980: 20 2f 2a 20 50 6f 6c 69 63 79 20 4d 61 70 70 69 /* Policy Mappi
5990: 6e 67 73 20 2d 20 52 46 43 20 35 32 38 30 20 73 ngs - RFC 5280 s
59a0: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 35 2c 20 ection 4.2.1.5,
59b0: 4e 49 44 5f 70 6f 6c 69 63 79 5f 6d 61 70 70 69 NID_policy_mappi
59c0: 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 ngs */.. /* S
59d0: 75 62 6a 65 63 74 20 41 6c 74 65 72 6e 61 74 69 ubject Alternati
59e0: 76 65 20 4e 61 6d 65 20 28 53 41 4e 29 20 63 6f ve Name (SAN) co
59f0: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 ntains additiona
5a00: 6c 20 55 52 4c 73 2c 20 44 4e 53 20 6e 61 6d 65 l URLs, DNS name
5a10: 73 2c 20 6f 72 20 49 50 0a 09 61 64 64 72 65 73 s, or IP..addres
5a20: 73 65 73 20 62 6f 75 6e 64 20 74 6f 20 63 65 72 ses bound to cer
5a30: 74 69 66 69 63 61 74 65 2e 20 52 46 43 20 35 32 tificate. RFC 52
5a40: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 80 section 4.2.1
5a50: 2e 36 2c 20 4e 49 44 5f 73 75 62 6a 65 63 74 5f .6, NID_subject_
5a60: 61 6c 74 5f 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 alt_name */.
5a70: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 LAPPEND_OBJ(inte
5a80: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
5a90: 73 75 62 6a 65 63 74 41 6c 74 4e 61 6d 65 22 2c subjectAltName",
5aa0: 20 54 6c 73 5f 78 35 30 39 4e 61 6d 65 73 28 69 Tls_x509Names(i
5ab0: 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 4e 49 44 nterp, cert, NID
5ac0: 5f 73 75 62 6a 65 63 74 5f 61 6c 74 5f 6e 61 6d _subject_alt_nam
5ad0: 65 2c 20 62 69 6f 29 29 3b 0a 0a 20 20 20 20 2f e, bio));.. /
5ae0: 2a 20 49 73 73 75 65 72 20 41 6c 74 65 72 6e 61 * Issuer Alterna
5af0: 74 69 76 65 20 4e 61 6d 65 20 69 73 20 75 73 65 tive Name is use
5b00: 64 20 74 6f 20 61 73 73 6f 63 69 61 74 65 20 49 d to associate I
5b10: 6e 74 65 72 6e 65 74 20 73 74 79 6c 65 20 69 64 nternet style id
5b20: 65 6e 74 69 74 69 65 73 0a 09 77 69 74 68 20 74 entities..with t
5b30: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69 he certificate i
5b40: 73 73 75 65 72 2e 20 52 46 43 20 35 32 38 30 20 ssuer. RFC 5280
5b50: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 37 2c section 4.2.1.7,
5b60: 20 4e 49 44 5f 69 73 73 75 65 72 5f 61 6c 74 5f NID_issuer_alt_
5b70: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 name */. LAPP
5b80: 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 END_OBJ(interp,
5b90: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 69 73 73 75 resultObj, "issu
5ba0: 65 72 41 6c 74 4e 61 6d 65 22 2c 20 54 6c 73 5f erAltName", Tls_
5bb0: 78 35 30 39 4e 61 6d 65 73 28 69 6e 74 65 72 70 x509Names(interp
5bc0: 2c 20 63 65 72 74 2c 20 4e 49 44 5f 69 73 73 75 , cert, NID_issu
5bd0: 65 72 5f 61 6c 74 5f 6e 61 6d 65 2c 20 62 69 6f er_alt_name, bio
5be0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a ));.. /* Subj
5bf0: 65 63 74 20 44 69 72 65 63 74 6f 72 79 20 41 74 ect Directory At
5c00: 74 72 69 62 75 74 65 73 20 70 72 6f 76 69 64 65 tributes provide
5c10: 73 20 69 64 65 6e 74 69 66 69 63 61 74 69 6f 6e s identification
5c20: 20 61 74 74 72 69 62 75 74 65 73 20 28 65 2e 67 attributes (e.g
5c30: 2e 2c 20 6e 61 74 69 6f 6e 61 6c 69 74 79 29 0a ., nationality).
5c40: 09 6f 66 20 74 68 65 20 73 75 62 6a 65 63 74 2e .of the subject.
5c50: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f RFC 5280 sectio
5c60: 6e 20 34 2e 32 2e 31 2e 38 20 28 73 75 62 6a 65 n 4.2.1.8 (subje
5c70: 63 74 44 69 72 65 63 74 6f 72 79 41 74 74 72 69 ctDirectoryAttri
5c80: 62 75 74 65 73 29 20 2a 2f 0a 0a 20 20 20 20 2f butes) */.. /
5c90: 2a 20 42 61 73 69 63 20 43 6f 6e 73 74 72 61 69 * Basic Constrai
5ca0: 6e 74 73 20 69 64 65 6e 74 69 66 69 65 73 20 77 nts identifies w
5cb0: 68 65 74 68 65 72 20 74 68 65 20 73 75 62 6a 65 hether the subje
5cc0: 63 74 20 6f 66 20 74 68 65 20 63 65 72 74 20 69 ct of the cert i
5cd0: 73 20 61 20 43 41 20 61 6e 64 0a 09 74 68 65 20 s a CA and..the
5ce0: 6d 61 78 20 64 65 70 74 68 20 6f 66 20 76 61 6c max depth of val
5cf0: 69 64 20 63 65 72 74 20 70 61 74 68 73 20 66 6f id cert paths fo
5d00: 72 20 74 68 69 73 20 63 65 72 74 2e 20 52 46 43 r this cert. RFC
5d10: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 5280 section 4.
5d20: 32 2e 31 2e 39 2c 20 4e 49 44 5f 62 61 73 69 63 2.1.9, NID_basic
5d30: 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a _constraints */.
5d40: 20 20 20 20 69 66 20 28 21 28 78 66 6c 61 67 73 if (!(xflags
5d50: 20 26 20 45 58 46 4c 41 47 5f 50 52 4f 58 59 29 & EXFLAG_PROXY)
5d60: 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e ) {..LAPPEND_LON
5d70: 47 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 G(interp, result
5d80: 4f 62 6a 2c 20 22 70 61 74 68 4c 65 6e 22 2c 20 Obj, "pathLen",
5d90: 58 35 30 39 5f 67 65 74 5f 70 61 74 68 6c 65 6e X509_get_pathlen
5da0: 28 63 65 72 74 29 29 3b 0a 20 20 20 20 7d 20 65 (cert));. } e
5db0: 6c 73 65 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 4c lse {..LAPPEND_L
5dc0: 4f 4e 47 28 69 6e 74 65 72 70 2c 20 72 65 73 75 ONG(interp, resu
5dd0: 6c 74 4f 62 6a 2c 20 22 70 61 74 68 4c 65 6e 22 ltObj, "pathLen"
5de0: 2c 20 58 35 30 39 5f 67 65 74 5f 70 72 6f 78 79 , X509_get_proxy
5df0: 5f 70 61 74 68 6c 65 6e 28 63 65 72 74 29 29 3b _pathlen(cert));
5e00: 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 . }. LAPPE
5e10: 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
5e20: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 62 61 73 69 resultObj, "basi
5e30: 63 43 6f 6e 73 74 72 61 69 6e 74 73 43 41 22 2c cConstraintsCA",
5e40: 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 xflags & EXFLAG
5e50: 5f 43 41 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 61 _CA);.. /* Na
5e60: 6d 65 20 43 6f 6e 73 74 72 61 69 6e 74 73 20 69 me Constraints i
5e70: 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 43 s only used in C
5e80: 41 20 63 65 72 74 73 20 74 6f 20 69 6e 64 69 63 A certs to indic
5e90: 61 74 65 20 74 68 65 20 6e 61 6d 65 20 73 70 61 ate the name spa
5ea0: 63 65 20 66 6f 72 0a 09 61 6c 6c 20 73 75 62 6a ce for..all subj
5eb0: 65 63 74 20 6e 61 6d 65 73 20 69 6e 20 73 75 62 ect names in sub
5ec0: 73 65 71 75 65 6e 74 20 63 65 72 74 69 66 69 63 sequent certific
5ed0: 61 74 65 73 20 69 6e 20 61 20 63 65 72 74 69 66 ates in a certif
5ee0: 69 63 61 74 69 6f 6e 20 70 61 74 68 0a 09 4d 55 ication path..MU
5ef0: 53 54 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 52 ST be located. R
5f00: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 FC 5280 section
5f10: 34 2e 32 2e 31 2e 31 30 2c 20 4e 49 44 5f 6e 61 4.2.1.10, NID_na
5f20: 6d 65 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a me_constraints *
5f30: 2f 0a 0a 20 20 20 20 2f 2a 20 50 6f 6c 69 63 79 /.. /* Policy
5f40: 20 43 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20 Constraints is
5f50: 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 43 41 20 only used in CA
5f60: 63 65 72 74 73 20 74 6f 20 6c 69 6d 69 74 20 74 certs to limit t
5f70: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 0a 09 he length of a..
5f80: 63 65 72 74 20 63 68 61 69 6e 20 66 6f 72 20 74 cert chain for t
5f90: 68 61 74 20 43 41 2e 20 52 46 43 20 35 32 38 30 hat CA. RFC 5280
5fa0: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 section 4.2.1.1
5fb0: 31 2c 20 4e 49 44 5f 70 6f 6c 69 63 79 5f 63 6f 1, NID_policy_co
5fc0: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 nstraints */..
5fd0: 20 20 2f 2a 20 45 78 74 65 6e 64 65 64 20 4b 65 /* Extended Ke
5fe0: 79 20 55 73 61 67 65 20 69 6e 64 69 63 61 74 65 y Usage indicate
5ff0: 73 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 74 s the purposes t
6000: 68 65 20 63 65 72 74 69 66 69 65 64 20 70 75 62 he certified pub
6010: 6c 69 63 20 6b 65 79 20 6d 61 79 20 62 65 0a 09 lic key may be..
6020: 75 73 65 64 2c 20 62 65 79 6f 6e 64 20 74 68 65 used, beyond the
6030: 20 62 61 73 69 63 20 70 75 72 70 6f 73 65 73 2e basic purposes.
6040: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f RFC 5280 sectio
6050: 6e 20 34 2e 32 2e 31 2e 31 32 2c 20 4e 49 44 5f n 4.2.1.12, NID_
6060: 65 78 74 5f 6b 65 79 5f 75 73 61 67 65 20 2a 2f ext_key_usage */
6070: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a . LAPPEND_OBJ
6080: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
6090: 62 6a 2c 20 22 65 78 74 65 6e 64 65 64 4b 65 79 bj, "extendedKey
60a0: 55 73 61 67 65 22 2c 20 54 6c 73 5f 78 35 30 39 Usage", Tls_x509
60b0: 45 78 74 4b 65 79 55 73 61 67 65 28 69 6e 74 65 ExtKeyUsage(inte
60c0: 72 70 2c 20 63 65 72 74 2c 20 78 66 6c 61 67 73 rp, cert, xflags
60d0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 52 4c 20 ));.. /* CRL
60e0: 44 69 73 74 72 69 62 75 74 69 6f 6e 20 50 6f 69 Distribution Poi
60f0: 6e 74 73 20 69 64 65 6e 74 69 66 69 65 73 20 77 nts identifies w
6100: 68 65 72 65 20 43 52 4c 20 69 6e 66 6f 72 6d 61 here CRL informa
6110: 74 69 6f 6e 20 63 61 6e 20 62 65 20 6f 62 74 61 tion can be obta
6120: 69 6e 65 64 2e 0a 09 52 46 43 20 35 32 38 30 20 ined...RFC 5280
6130: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 33 section 4.2.1.13
6140: 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f */. LAPPEND_O
6150: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c BJ(interp, resul
6160: 74 4f 62 6a 2c 20 22 63 72 6c 44 69 73 74 72 69 tObj, "crlDistri
6170: 62 75 74 69 6f 6e 50 6f 69 6e 74 73 22 2c 20 54 butionPoints", T
6180: 6c 73 5f 78 35 30 39 43 72 6c 44 70 28 69 6e 74 ls_x509CrlDp(int
6190: 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 erp, cert));..
61a0: 20 20 2f 2a 20 46 72 65 73 68 65 73 74 20 43 52 /* Freshest CR
61b0: 4c 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 20 L extension */.
61c0: 20 20 20 69 66 20 28 78 66 6c 61 67 73 20 26 20 if (xflags &
61d0: 45 58 46 4c 41 47 5f 46 52 45 53 48 45 53 54 29 EXFLAG_FRESHEST)
61e0: 20 7b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a {. }.. /*
61f0: 20 41 75 74 68 6f 72 69 74 79 20 49 6e 66 6f 72 Authority Infor
6200: 6d 61 74 69 6f 6e 20 41 63 63 65 73 73 20 69 6e mation Access in
6210: 64 69 63 61 74 65 73 20 68 6f 77 20 74 6f 20 61 dicates how to a
6220: 63 63 65 73 73 20 69 6e 66 6f 20 61 6e 64 20 73 ccess info and s
6230: 65 72 76 69 63 65 73 0a 09 66 6f 72 20 74 68 65 ervices..for the
6240: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73 certificate iss
6250: 75 65 72 2e 20 52 46 43 20 35 32 38 30 20 73 65 uer. RFC 5280 se
6260: 63 74 69 6f 6e 20 34 2e 32 2e 32 2e 31 2c 20 4e ction 4.2.2.1, N
6270: 49 44 5f 69 6e 66 6f 5f 61 63 63 65 73 73 20 2a ID_info_access *
6280: 2f 0a 0a 20 20 20 20 2f 2a 20 4f 6e 2d 6c 69 6e /.. /* On-lin
6290: 65 20 43 65 72 74 69 66 69 63 61 74 65 20 53 74 e Certificate St
62a0: 61 74 75 73 20 50 72 6f 74 6f 63 6f 6c 20 28 4f atus Protocol (O
62b0: 53 43 50 29 20 52 65 73 70 6f 6e 64 65 72 73 20 SCP) Responders
62c0: 55 52 4c 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 URL */. LAPPE
62d0: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 ND_OBJ(interp, r
62e0: 65 73 75 6c 74 4f 62 6a 2c 20 22 6f 63 73 70 52 esultObj, "ocspR
62f0: 65 73 70 6f 6e 64 65 72 73 22 2c 20 54 6c 73 5f esponders", Tls_
6300: 78 35 30 39 4f 73 63 70 28 69 6e 74 65 72 70 2c x509Oscp(interp,
6310: 20 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a cert));.. /*
6320: 20 43 65 72 74 69 66 69 63 61 74 65 20 41 75 74 Certificate Aut
6330: 68 6f 72 69 74 79 20 28 43 41 29 20 49 73 73 75 hority (CA) Issu
6340: 65 72 73 20 55 52 4c 20 2a 2f 0a 20 20 20 20 4c ers URL */. L
6350: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 APPEND_OBJ(inter
6360: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 63 p, resultObj, "c
6370: 61 49 73 73 75 65 72 73 22 2c 20 54 6c 73 5f 78 aIssuers", Tls_x
6380: 35 30 39 43 61 49 73 73 75 65 72 73 28 69 6e 74 509CaIssuers(int
6390: 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 erp, cert));..
63a0: 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 49 6e 66 /* Subject Inf
63b0: 6f 72 6d 61 74 69 6f 6e 20 41 63 63 65 73 73 20 ormation Access
63c0: 2d 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 - RFC 5280 secti
63d0: 6f 6e 20 34 2e 32 2e 32 2e 32 2c 20 4e 49 44 5f on 4.2.2.2, NID_
63e0: 73 69 6e 66 6f 5f 61 63 63 65 73 73 20 2a 2f 0a sinfo_access */.
63f0: 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63 . /* Certific
6400: 61 74 65 20 41 6c 69 61 73 2e 20 49 66 20 75 73 ate Alias. If us
6410: 65 73 20 61 20 50 4b 43 53 23 31 32 20 73 74 72 es a PKCS#12 str
6420: 75 63 74 75 72 65 2c 20 61 6c 69 61 73 20 77 69 ucture, alias wi
6430: 6c 6c 20 72 65 66 6c 65 63 74 20 74 68 65 0a 09 ll reflect the..
6440: 66 72 69 65 6e 64 6c 79 4e 61 6d 65 20 61 74 74 friendlyName att
6450: 72 69 62 75 74 65 20 28 52 46 43 20 32 39 38 35 ribute (RFC 2985
6460: 29 2e 20 2a 2f 0a 20 20 20 20 7b 0a 09 69 6e 74 ). */. {..int
6470: 20 69 6c 65 6e 20 3d 20 30 3b 0a 09 75 6e 73 69 ilen = 0;..unsi
6480: 67 6e 65 64 20 63 68 61 72 20 2a 73 74 72 69 6e gned char *strin
6490: 67 20 3d 20 58 35 30 39 5f 61 6c 69 61 73 5f 67 g = X509_alias_g
64a0: 65 74 30 28 63 65 72 74 2c 20 26 69 6c 65 6e 29 et0(cert, &ilen)
64b0: 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
64c0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
64d0: 2c 20 22 61 6c 69 61 73 22 2c 20 28 63 68 61 72 , "alias", (char
64e0: 20 2a 29 20 73 74 72 69 6e 67 2c 20 28 54 63 6c *) string, (Tcl
64f0: 5f 53 69 7a 65 29 20 69 6c 65 6e 29 3b 0a 09 73 _Size) ilen);..s
6500: 74 72 69 6e 67 20 3d 20 58 35 30 39 5f 6b 65 79 tring = X509_key
6510: 69 64 5f 67 65 74 30 28 63 65 72 74 2c 20 26 69 id_get0(cert, &i
6520: 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 len);..LAPPEND_S
6530: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c TR(interp, resul
6540: 74 4f 62 6a 2c 20 22 6b 65 79 49 64 22 2c 20 28 tObj, "keyId", (
6550: 63 68 61 72 20 2a 29 20 73 74 72 69 6e 67 2c 20 char *) string,
6560: 28 54 63 6c 5f 53 69 7a 65 29 20 69 6c 65 6e 29 (Tcl_Size) ilen)
6570: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
6580: 43 65 72 74 69 66 69 63 61 74 65 20 61 6e 64 20 Certificate and
6590: 64 75 6d 70 20 61 6c 6c 20 64 61 74 61 20 2a 2f dump all data */
65a0: 0a 20 20 20 20 69 66 20 28 61 6c 6c 29 20 7b 0a . if (all) {.
65b0: 09 54 63 6c 5f 4f 62 6a 20 2a 61 6c 6c 4f 62 6a .Tcl_Obj *allObj
65c0: 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 = Tcl_NewByteAr
65d0: 72 61 79 4f 62 6a 28 4e 55 4c 4c 2c 20 30 29 3b rayObj(NULL, 0);
65e0: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 65 72 74 4f ..Tcl_Obj *certO
65f0: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 bj = Tcl_NewByte
6600: 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c 2c 20 30 ArrayObj(NULL, 0
6610: 29 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 );..unsigned cha
6620: 72 20 2a 61 6c 6c 53 74 72 2c 20 2a 63 65 72 74 r *allStr, *cert
6630: 53 74 72 3b 0a 0a 09 69 66 20 28 61 6c 6c 4f 62 Str;...if (allOb
6640: 6a 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 65 72 j == NULL || cer
6650: 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a tObj == NULL) {.
6660: 09 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
6670: 43 6f 75 6e 74 28 61 6c 6c 4f 62 6a 29 3b 0a 09 Count(allObj);..
6680: 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f BIO_free(bio
6690: 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 62 );.. ckfree(b
66a0: 75 66 66 65 72 29 3b 0a 09 20 20 20 20 72 65 74 uffer);.. ret
66b0: 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 09 urn resultObj;..
66c0: 7d 0a 0a 09 2f 2a 20 47 65 74 20 63 65 72 74 69 }.../* Get certi
66d0: 66 69 63 61 74 65 20 2a 2f 0a 09 63 65 72 74 53 ficate */..certS
66e0: 74 72 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 tr = Tcl_SetByte
66f0: 41 72 72 61 79 4c 65 6e 67 74 68 28 63 65 72 74 ArrayLength(cert
6700: 4f 62 6a 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 Obj, CERT_STR_SI
6710: 5a 45 29 3b 0a 09 6c 65 6e 20 3d 20 42 49 4f 5f ZE);..len = BIO_
6720: 74 6f 5f 42 75 66 66 65 72 28 50 45 4d 5f 77 72 to_Buffer(PEM_wr
6730: 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 62 69 6f ite_bio_X509(bio
6740: 2c 20 63 65 72 74 29 2c 20 62 69 6f 2c 20 63 65 , cert), bio, ce
6750: 72 74 53 74 72 2c 20 43 45 52 54 5f 53 54 52 5f rtStr, CERT_STR_
6760: 53 49 5a 45 29 3b 0a 09 54 63 6c 5f 53 65 74 42 SIZE);..Tcl_SetB
6770: 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 63 yteArrayLength(c
6780: 65 72 74 4f 62 6a 2c 20 6c 65 6e 29 3b 0a 09 4c ertObj, len);..L
6790: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 APPEND_OBJ(inter
67a0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 63 p, resultObj, "c
67b0: 65 72 74 69 66 69 63 61 74 65 22 2c 20 63 65 72 ertificate", cer
67c0: 74 4f 62 6a 29 0a 0a 09 2f 2a 20 47 65 74 20 61 tObj).../* Get a
67d0: 6c 6c 20 69 6e 66 6f 20 6f 6e 20 63 65 72 74 69 ll info on certi
67e0: 66 69 63 61 74 65 20 2a 2f 0a 09 61 6c 6c 53 74 ficate */..allSt
67f0: 72 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41 r = Tcl_SetByteA
6800: 72 72 61 79 4c 65 6e 67 74 68 28 61 6c 6c 4f 62 rrayLength(allOb
6810: 6a 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 j, CERT_STR_SIZE
6820: 20 2a 20 32 29 3b 0a 09 6c 65 6e 20 3d 20 42 49 * 2);..len = BI
6830: 4f 5f 74 6f 5f 42 75 66 66 65 72 28 58 35 30 39 O_to_Buffer(X509
6840: 5f 70 72 69 6e 74 5f 65 78 28 62 69 6f 2c 20 63 _print_ex(bio, c
6850: 65 72 74 2c 20 66 6c 61 67 73 2c 20 30 29 2c 20 ert, flags, 0),
6860: 62 69 6f 2c 20 61 6c 6c 53 74 72 2c 20 43 45 52 bio, allStr, CER
6870: 54 5f 53 54 52 5f 53 49 5a 45 20 2a 20 32 29 3b T_STR_SIZE * 2);
6880: 0a 09 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 ..Tcl_SetByteArr
6890: 61 79 4c 65 6e 67 74 68 28 61 6c 6c 4f 62 6a 2c ayLength(allObj,
68a0: 20 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f len);..LAPPEND_
68b0: 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 OBJ(interp, resu
68c0: 6c 74 4f 62 6a 2c 20 22 61 6c 6c 22 2c 20 61 6c ltObj, "all", al
68d0: 6c 4f 62 6a 29 0a 20 20 20 20 7d 0a 0a 20 20 20 lObj). }..
68e0: 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a BIO_free(bio);.
68f0: 20 20 20 20 63 6b 66 72 65 65 28 62 75 66 66 65 ckfree(buffe
6900: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 r);. return r
6910: 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a esultObj;.}.