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 <[email protected]
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 63 6f 6e 73 ring_to_Hex(cons
0390: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
03a0: 2a 69 6e 70 75 74 2c 20 69 6e 74 20 69 6c 65 6e *input, int ilen
03b0: 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e ) {. const un
03c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 70 74 signed char *ipt
03d0: 72 20 3d 20 69 6e 70 75 74 3b 0a 20 20 20 20 54 r = input;. T
03e0: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 cl_Obj *resultOb
03f0: 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 j = Tcl_NewByteA
0400: 72 72 61 79 4f 62 6a 28 4e 55 4c 4c 2c 20 30 29 rrayObj(NULL, 0)
0410: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 ;. unsigned c
0420: 68 61 72 20 2a 64 61 74 61 20 3d 20 54 63 6c 5f har *data = Tcl_
0430: 53 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 SetByteArrayLeng
0440: 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c 20 28 54 th(resultObj, (T
0450: 63 6c 5f 53 69 7a 65 29 69 6c 65 6e 2a 32 29 3b cl_Size)ilen*2);
0460: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
0470: 61 72 20 2a 64 70 74 72 20 3d 20 26 64 61 74 61 ar *dptr = &data
0480: 5b 30 5d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 [0];. const c
0490: 68 61 72 20 2a 68 65 78 20 3d 20 22 30 31 32 33 har *hex = "0123
04a0: 34 35 36 37 38 39 61 62 63 64 65 66 22 3b 0a 0a 456789abcdef";..
04b0: 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 if (resultOb
04c0: 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 j == NULL) {..re
04d0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
04e0: 0a 0a 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 .. for (int i
04f0: 20 3d 20 30 3b 20 69 20 3c 20 69 6c 65 6e 3b 20 = 0; i < ilen;
0500: 69 2b 2b 29 20 7b 0a 09 2a 64 70 74 72 2b 2b 20 i++) {..*dptr++
0510: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 = (unsigned char
0520: 29 68 65 78 5b 28 2a 69 70 74 72 3e 3e 34 29 26 )hex[(*iptr>>4)&
0530: 30 78 46 5d 3b 0a 09 2a 64 70 74 72 2b 2b 20 3d 0xF];..*dptr++ =
0540: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 (unsigned char)
0550: 68 65 78 5b 28 2a 69 70 74 72 2b 2b 29 26 30 78 hex[(*iptr++)&0x
0560: 46 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 F];. }. re
0570: 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a turn resultObj;.
0580: 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d ----------------
05d0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 49 4f 5f -----. *. * BIO_
05e0: 74 6f 5f 42 75 66 66 65 72 20 2d 2d 0a 20 2a 0a to_Buffer --. *.
05f0: 20 2a 09 4f 75 74 70 75 74 20 63 6f 6e 74 65 6e *.Output conten
0600: 74 73 20 6f 66 20 61 20 42 49 4f 20 74 6f 20 61 ts of a BIO to a
0610: 20 62 75 66 66 65 72 0a 20 2a 0a 20 2a 20 52 65 buffer. *. * Re
0620: 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e sults:. *.Return
0630: 73 20 6c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 s length of stri
0640: 6e 67 20 69 6e 20 62 75 66 66 65 72 0a 20 2a 0a ng in buffer. *.
0650: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
0660: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d . *.None. *. *--
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 2d ----------------
06b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
06c0: 54 63 6c 5f 53 69 7a 65 20 42 49 4f 5f 74 6f 5f Tcl_Size BIO_to_
06d0: 42 75 66 66 65 72 28 69 6e 74 20 72 65 73 75 6c Buffer(int resul
06e0: 74 2c 20 42 49 4f 20 2a 62 69 6f 2c 20 76 6f 69 t, BIO *bio, voi
06f0: 64 20 2a 6f 75 74 70 75 74 2c 20 69 6e 74 20 6f d *output, int o
0700: 6c 65 6e 29 20 7b 0a 20 20 20 20 54 63 6c 5f 53 len) {. Tcl_S
0710: 69 7a 65 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 ize len = 0;.
0720: 20 69 6e 74 20 70 65 6e 64 69 6e 67 20 3d 20 42 int pending = B
0730: 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 3b IO_pending(bio);
0740: 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 .. if (result
0750: 29 20 7b 0a 09 6c 65 6e 20 3d 20 28 54 63 6c 5f ) {..len = (Tcl_
0760: 53 69 7a 65 29 20 42 49 4f 5f 72 65 61 64 28 62 Size) BIO_read(b
0770: 69 6f 2c 20 6f 75 74 70 75 74 2c 20 28 70 65 6e io, output, (pen
0780: 64 69 6e 67 20 3c 20 6f 6c 65 6e 29 20 3f 20 70 ding < olen) ? p
0790: 65 6e 64 69 6e 67 20 3a 20 6f 6c 65 6e 29 3b 0a ending : olen);.
07a0: 09 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 .(void)BIO_flush
07b0: 28 62 69 6f 29 3b 0a 09 69 66 20 28 6c 65 6e 20 (bio);..if (len
07c0: 3c 20 30 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 < 0) {.. len
07d0: 3d 20 30 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 = 0;..}. }.
07e0: 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 7d 0a return len;.}.
07f0: 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0840: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 ----. *. * Tls_x
0850: 35 30 39 45 78 74 65 6e 73 69 6f 6e 73 20 2d 2d 509Extensions --
0860: 0a 20 2a 0a 20 2a 09 47 65 74 20 6c 69 73 74 20 . *. *.Get list
0870: 6f 66 20 58 2e 35 30 39 20 43 65 72 74 69 66 69 of X.509 Certifi
0880: 63 61 74 65 20 45 78 74 65 6e 73 69 6f 6e 73 0a cate Extensions.
0890: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
08a0: 2a 09 54 43 4c 20 6c 69 73 74 20 6f 66 20 65 78 *.TCL list of ex
08b0: 74 65 6e 73 69 6f 6e 73 20 61 6e 64 20 62 6f 6f tensions and boo
08c0: 6c 65 61 6e 20 63 72 69 74 69 63 61 6c 20 73 74 lean critical st
08d0: 61 74 75 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 atus. *. * Side
08e0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
08f0: 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0940: 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 ---. */.Tcl_Obj
0950: 2a 54 6c 73 5f 78 35 30 39 45 78 74 65 6e 73 69 *Tls_x509Extensi
0960: 6f 6e 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a ons(Tcl_Interp *
0970: 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 interp, X509 *ce
0980: 72 74 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 rt) {. const
0990: 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 45 58 STACK_OF(X509_EX
09a0: 54 45 4e 53 49 4f 4e 29 20 2a 65 78 74 73 3b 0a TENSION) *exts;.
09b0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 Tcl_Obj *res
09c0: 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 ultObj = Tcl_New
09d0: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
09e0: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c ;.. if (resul
09f0: 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a tObj == NULL) {.
0a00: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
0a10: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 65 78 }.. if ((ex
0a20: 74 73 20 3d 20 58 35 30 39 5f 67 65 74 30 5f 65 ts = X509_get0_e
0a30: 78 74 65 6e 73 69 6f 6e 73 28 63 65 72 74 29 29 xtensions(cert))
0a40: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 != NULL) {..for
0a50: 20 28 69 6e 74 20 69 3d 30 3b 20 69 20 3c 20 58 (int i=0; i < X
0a60: 35 30 39 5f 67 65 74 5f 65 78 74 5f 63 6f 75 6e 509_get_ext_coun
0a70: 74 28 63 65 72 74 29 3b 20 69 2b 2b 29 20 7b 0a t(cert); i++) {.
0a80: 09 20 20 20 20 58 35 30 39 5f 45 58 54 45 4e 53 . X509_EXTENS
0a90: 49 4f 4e 20 2a 65 78 20 3d 20 73 6b 5f 58 35 30 ION *ex = sk_X50
0aa0: 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 76 61 6c 75 9_EXTENSION_valu
0ab0: 65 28 65 78 74 73 2c 20 69 29 3b 0a 23 69 66 20 e(exts, i);.#if
0ac0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
0ad0: 4e 55 4d 42 45 52 20 3c 20 30 78 34 30 30 30 30 NUMBER < 0x40000
0ae0: 30 30 30 4c 0a 09 20 20 20 20 41 53 4e 31 5f 4f 000L.. ASN1_O
0af0: 42 4a 45 43 54 20 2a 6f 62 6a 20 3d 20 58 35 30 BJECT *obj = X50
0b00: 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74 5f 9_EXTENSION_get_
0b10: 6f 62 6a 65 63 74 28 65 78 29 3b 0a 23 65 6c 73 object(ex);.#els
0b20: 65 0a 09 20 20 20 20 63 6f 6e 73 74 20 41 53 4e e.. const ASN
0b30: 31 5f 4f 42 4a 45 43 54 20 2a 6f 62 6a 20 3d 20 1_OBJECT *obj =
0b40: 58 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 X509_EXTENSION_g
0b50: 65 74 5f 6f 62 6a 65 63 74 28 65 78 29 3b 0a 23 et_object(ex);.#
0b60: 65 6e 64 69 66 0a 09 20 20 20 20 2f 2a 20 41 53 endif.. /* AS
0b70: 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49 4e 47 20 N1_OCTET_STRING
0b80: 2a 64 61 74 61 20 3d 20 58 35 30 39 5f 45 58 54 *data = X509_EXT
0b90: 45 4e 53 49 4f 4e 5f 67 65 74 5f 64 61 74 61 28 ENSION_get_data(
0ba0: 65 78 29 3b 20 2a 2f 0a 09 20 20 20 20 69 6e 74 ex); */.. int
0bb0: 20 63 72 69 74 69 63 61 6c 20 3d 20 58 35 30 39 critical = X509
0bc0: 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74 5f 63 _EXTENSION_get_c
0bd0: 72 69 74 69 63 61 6c 28 65 78 29 3b 0a 09 20 20 ritical(ex);..
0be0: 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 LAPPEND_BOOL(i
0bf0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
0c00: 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 4f 42 4a , OBJ_nid2ln(OBJ
0c10: 5f 6f 62 6a 32 6e 69 64 28 28 63 6f 6e 73 74 20 _obj2nid((const
0c20: 41 53 4e 31 5f 4f 42 4a 45 43 54 20 2a 29 6f 62 ASN1_OBJECT *)ob
0c30: 6a 29 29 2c 20 63 72 69 74 69 63 61 6c 29 3b 0a j)), critical);.
0c40: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 .}. }. ret
0c50: 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d urn resultObj;.}
0c60: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
0c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cb0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 ----. *. * Tls_x
0cc0: 35 30 39 49 64 65 6e 74 69 66 69 65 72 20 2d 2d 509Identifier --
0cd0: 0a 20 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30 39 . *. *.Get X.509
0ce0: 20 63 65 72 74 69 66 69 63 61 74 65 20 41 75 74 certificate Aut
0cf0: 68 6f 72 69 74 79 20 6f 72 20 53 75 62 6a 65 63 hority or Subjec
0d00: 74 20 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 t Key Identifier
0d10: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
0d20: 0a 20 2a 09 54 43 4c 20 62 79 74 65 20 61 72 72 . *.TCL byte arr
0d30: 61 79 20 6f 62 6a 65 63 74 20 77 69 74 68 20 78 ay object with x
0d40: 35 30 39 20 69 64 65 6e 74 69 66 69 65 72 20 61 509 identifier a
0d50: 73 20 61 20 68 65 78 20 73 74 72 69 6e 67 0a 20 s a hex string.
0d60: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
0d70: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
0d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
0dd0: 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 /.Tcl_Obj *Tls_x
0de0: 35 30 39 49 64 65 6e 74 69 66 69 65 72 28 63 6f 509Identifier(co
0df0: 6e 73 74 20 41 53 4e 31 5f 4f 43 54 45 54 5f 53 nst ASN1_OCTET_S
0e00: 54 52 49 4e 47 20 2a 61 73 74 72 69 6e 67 29 20 TRING *astring)
0e10: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 {. Tcl_Obj *r
0e20: 65 73 75 6c 74 4f 62 6a 20 3d 20 4e 55 4c 4c 3b esultObj = NULL;
0e30: 0a 0a 20 20 20 20 69 66 20 28 61 73 74 72 69 6e .. if (astrin
0e40: 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 g != NULL) {.#if
0e50: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
0e60: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 34 30 31 30 _NUMBER < 0x4010
0e70: 30 30 30 30 4c 0a 09 72 65 73 75 6c 74 4f 62 6a 0000L..resultObj
0e80: 20 3d 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 = String_to_Hex
0e90: 28 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74 (ASN1_STRING_get
0ea0: 30 5f 64 61 74 61 28 61 73 74 72 69 6e 67 29 2c 0_data(astring),
0eb0: 0a 09 20 20 20 20 41 53 4e 31 5f 53 54 52 49 4e .. ASN1_STRIN
0ec0: 47 5f 6c 65 6e 67 74 68 28 61 73 74 72 69 6e 67 G_length(astring
0ed0: 29 29 3b 0a 23 65 6c 73 65 0a 09 72 65 73 75 6c ));.#else..resul
0ee0: 74 4f 62 6a 20 3d 20 53 74 72 69 6e 67 5f 74 6f tObj = String_to
0ef0: 5f 48 65 78 28 41 53 4e 31 5f 53 54 52 49 4e 47 _Hex(ASN1_STRING
0f00: 5f 67 65 74 30 5f 64 61 74 61 28 61 73 74 72 69 _get0_data(astri
0f10: 6e 67 29 2c 0a 09 20 20 20 20 28 69 6e 74 29 20 ng),.. (int)
0f20: 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74 5f ASN1_STRING_get_
0f30: 6c 65 6e 67 74 68 28 61 73 74 72 69 6e 67 29 29 length(astring))
0f40: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 ;.#endif. }.
0f50: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 return result
0f60: 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d Obj;.}../*. *---
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
0fc0: 20 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67 Tls_x509KeyUsag
0fd0: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 58 e --. *. *.Get X
0fe0: 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 .509 certificate
0ff0: 20 6b 65 79 20 75 73 61 67 65 20 74 79 70 65 73 key usage types
1000: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
1010: 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 74 *.Tcl list of t
1020: 79 70 65 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ypes. *. * Side
1030: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
1040: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1090: 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 ---. */.Tcl_Obj
10a0: 2a 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67 *Tls_x509KeyUsag
10b0: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e e(Tcl_Interp *in
10c0: 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 terp, X509 *cert
10d0: 2c 20 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 , uint32_t xflag
10e0: 73 29 20 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f s) {. uint32_
10f0: 74 20 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67 t usage = X509_g
1100: 65 74 5f 6b 65 79 5f 75 73 61 67 65 28 63 65 72 et_key_usage(cer
1110: 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 t);. Tcl_Obj
1120: 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c *resultObj = Tcl
1130: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
1140: 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 ULL);.. if (r
1150: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c esultObj == NULL
1160: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c ) {..return NULL
1170: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
1180: 28 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 ((xflags & EXFLA
1190: 47 5f 4b 55 53 41 47 45 29 20 26 26 20 75 73 61 G_KUSAGE) && usa
11a0: 67 65 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58 29 ge < UINT32_MAX)
11b0: 20 7b 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 {..if (usage &
11c0: 4b 55 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 KU_DIGITAL_SIGNA
11d0: 54 55 52 45 29 20 7b 0a 09 20 20 20 20 54 63 6c TURE) {.. Tcl
11e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
11f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 ement(interp, re
1200: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 sultObj, Tcl_New
1210: 53 74 72 69 6e 67 4f 62 6a 28 22 44 69 67 69 74 StringObj("Digit
1220: 61 6c 20 53 69 67 6e 61 74 75 72 65 22 2c 20 2d al Signature", -
1230: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 1));..}..if (usa
1240: 67 65 20 26 20 4b 55 5f 4e 4f 4e 5f 52 45 50 55 ge & KU_NON_REPU
1250: 44 49 41 54 49 4f 4e 29 20 7b 0a 09 20 20 20 20 DIATION) {..
1260: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1270: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1280: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f resultObj, Tcl_
1290: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 6f NewStringObj("No
12a0: 6e 2d 52 65 70 75 64 69 61 74 69 6f 6e 22 2c 20 n-Repudiation",
12b0: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 -1));..}..if (us
12c0: 61 67 65 20 26 20 4b 55 5f 4b 45 59 5f 45 4e 43 age & KU_KEY_ENC
12d0: 49 50 48 45 52 4d 45 4e 54 29 20 7b 0a 09 20 20 IPHERMENT) {..
12e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
12f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1300: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 p, resultObj, Tc
1310: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
1320: 4b 65 79 20 45 6e 63 69 70 68 65 72 6d 65 6e 74 Key Encipherment
1330: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 ", -1));..}..if
1340: 28 75 73 61 67 65 20 26 20 4b 55 5f 44 41 54 41 (usage & KU_DATA
1350: 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 29 20 7b _ENCIPHERMENT) {
1360: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
1370: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1380: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
1390: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
13a0: 62 6a 28 22 44 61 74 61 20 45 6e 63 69 70 68 65 bj("Data Enciphe
13b0: 72 6d 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d rment", -1));..}
13c0: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 ..if (usage & KU
13d0: 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 29 20 _KEY_AGREEMENT)
13e0: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
13f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1400: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
1410: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 j, Tcl_NewString
1420: 4f 62 6a 28 22 4b 65 79 20 41 67 72 65 65 6d 65 Obj("Key Agreeme
1430: 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 nt", -1));..}..i
1440: 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f 4b 45 f (usage & KU_KE
1450: 59 5f 43 45 52 54 5f 53 49 47 4e 29 20 7b 0a 09 Y_CERT_SIGN) {..
1460: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
1470: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
1480: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
1490: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
14a0: 28 22 43 65 72 74 69 66 69 63 61 74 65 20 53 69 ("Certificate Si
14b0: 67 6e 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d gning", -1));..}
14c0: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 ..if (usage & KU
14d0: 5f 43 52 4c 5f 53 49 47 4e 29 20 7b 0a 09 20 20 _CRL_SIGN) {..
14e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
14f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1500: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 p, resultObj, Tc
1510: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
1520: 43 52 4c 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 CRL Signing", -1
1530: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 ));..}..if (usag
1540: 65 20 26 20 4b 55 5f 45 4e 43 49 50 48 45 52 5f e & KU_ENCIPHER_
1550: 4f 4e 4c 59 29 20 7b 0a 09 20 20 20 20 54 63 6c ONLY) {.. Tcl
1560: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1570: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 ement(interp, re
1580: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 sultObj, Tcl_New
1590: 53 74 72 69 6e 67 4f 62 6a 28 22 45 6e 63 69 70 StringObj("Encip
15a0: 68 65 72 20 4f 6e 6c 79 22 2c 20 2d 31 29 29 3b her Only", -1));
15b0: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 ..}..if (usage &
15c0: 20 4b 55 5f 44 45 43 49 50 48 45 52 5f 4f 4e 4c KU_DECIPHER_ONL
15d0: 59 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 Y) {.. Tcl_Li
15e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
15f0: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c nt(interp, resul
1600: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tObj, Tcl_NewStr
1610: 69 6e 67 4f 62 6a 28 22 44 65 63 69 70 68 65 72 ingObj("Decipher
1620: 20 4f 6e 6c 79 22 2c 20 2d 31 29 29 3b 0a 09 7d Only", -1));..}
1630: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 . } else {..
1640: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
1650: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
1660: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 rp, resultObj, T
1670: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1680: 22 75 6e 72 65 73 74 72 69 63 74 65 64 22 2c 20 "unrestricted",
1690: 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 -1));. }.
16a0: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a return resultObj
16b0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
16c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1700: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
1710: 73 5f 78 35 30 39 50 75 72 70 6f 73 65 20 2d 2d s_x509Purpose --
1720: 0a 20 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30 39 . *. *.Get X.509
1730: 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75 72 certificate pur
1740: 70 6f 73 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c pose. *. * Resul
1750: 74 73 3a 0a 20 2a 09 50 75 72 70 6f 73 65 20 73 ts:. *.Purpose s
1760: 74 72 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 tring. *. * Side
1770: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
1780: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
1790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17d0: 2d 2d 2d 2d 0a 20 2a 2f 0a 63 6f 6e 73 74 20 63 ----. */.const c
17e0: 68 61 72 20 2a 54 6c 73 5f 78 35 30 39 50 75 72 har *Tls_x509Pur
17f0: 70 6f 73 65 28 58 35 30 39 20 2a 63 65 72 74 29 pose(X509 *cert)
1800: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 {. const cha
1810: 72 20 2a 70 75 72 70 6f 73 65 20 3d 20 4e 55 4c r *purpose = NUL
1820: 4c 3b 0a 0a 20 20 20 20 69 66 20 28 58 35 30 39 L;.. if (X509
1830: 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 _check_purpose(c
1840: 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 ert, X509_PURPOS
1850: 45 5f 53 53 4c 5f 43 4c 49 45 4e 54 2c 20 30 29 E_SSL_CLIENT, 0)
1860: 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 > 0) {..purpose
1870: 20 3d 20 22 53 53 4c 20 43 6c 69 65 6e 74 22 3b = "SSL Client";
1880: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
1890: 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f X509_check_purpo
18a0: 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 se(cert, X509_PU
18b0: 52 50 4f 53 45 5f 53 53 4c 5f 53 45 52 56 45 52 RPOSE_SSL_SERVER
18c0: 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 , 0) > 0) {..pur
18d0: 70 6f 73 65 20 3d 20 22 53 53 4c 20 53 65 72 76 pose = "SSL Serv
18e0: 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 er";. } else
18f0: 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 if (X509_check_p
1900: 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 urpose(cert, X50
1910: 39 5f 50 55 52 50 4f 53 45 5f 4e 53 5f 53 53 4c 9_PURPOSE_NS_SSL
1920: 5f 53 45 52 56 45 52 2c 20 30 29 20 3e 20 30 29 _SERVER, 0) > 0)
1930: 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 4d {..purpose = "M
1940: 53 53 20 53 53 4c 20 53 65 72 76 65 72 22 3b 0a SS SSL Server";.
1950: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 58 } else if (X
1960: 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 509_check_purpos
1970: 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 e(cert, X509_PUR
1980: 50 4f 53 45 5f 53 4d 49 4d 45 5f 53 49 47 4e 2c POSE_SMIME_SIGN,
1990: 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 0) > 0) {..purp
19a0: 6f 73 65 20 3d 20 22 53 4d 49 4d 45 20 53 69 67 ose = "SMIME Sig
19b0: 6e 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73 ning";. } els
19c0: 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b e if (X509_check
19d0: 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 _purpose(cert, X
19e0: 35 30 39 5f 50 55 52 50 4f 53 45 5f 53 4d 49 4d 509_PURPOSE_SMIM
19f0: 45 5f 45 4e 43 52 59 50 54 2c 20 30 29 20 3e 20 E_ENCRYPT, 0) >
1a00: 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 0) {..purpose =
1a10: 22 53 4d 49 4d 45 20 45 6e 63 72 79 70 74 69 6f "SMIME Encryptio
1a20: 6e 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 n";. } else i
1a30: 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 f (X509_check_pu
1a40: 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 rpose(cert, X509
1a50: 5f 50 55 52 50 4f 53 45 5f 43 52 4c 5f 53 49 47 _PURPOSE_CRL_SIG
1a60: 4e 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 N, 0) > 0) {..pu
1a70: 72 70 6f 73 65 20 3d 20 22 43 52 4c 20 53 69 67 rpose = "CRL Sig
1a80: 6e 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73 ning";. } els
1a90: 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b e if (X509_check
1aa0: 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 _purpose(cert, X
1ab0: 35 30 39 5f 50 55 52 50 4f 53 45 5f 41 4e 59 2c 509_PURPOSE_ANY,
1ac0: 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 0) > 0) {..purp
1ad0: 6f 73 65 20 3d 20 22 41 6e 79 22 3b 0a 20 20 20 ose = "Any";.
1ae0: 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 } else if (X509
1af0: 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 _check_purpose(c
1b00: 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 ert, X509_PURPOS
1b10: 45 5f 4f 43 53 50 5f 48 45 4c 50 45 52 2c 20 30 E_OCSP_HELPER, 0
1b20: 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 ) > 0) {..purpos
1b30: 65 20 3d 20 22 4f 43 53 50 20 48 65 6c 70 65 72 e = "OCSP Helper
1b40: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ";. } else if
1b50: 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 (X509_check_pur
1b60: 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f pose(cert, X509_
1b70: 50 55 52 50 4f 53 45 5f 54 49 4d 45 53 54 41 4d PURPOSE_TIMESTAM
1b80: 50 5f 53 49 47 4e 2c 20 30 29 20 3e 20 30 29 20 P_SIGN, 0) > 0)
1b90: 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 54 69 {..purpose = "Ti
1ba0: 6d 65 73 74 61 6d 70 20 53 69 67 6e 69 6e 67 22 mestamp Signing"
1bb0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
1bc0: 70 75 72 70 6f 73 65 20 3d 20 22 22 3b 0a 20 20 purpose = "";.
1bd0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 }. return p
1be0: 75 72 70 6f 73 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a urpose;.}../*. *
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 2d 2d 2d 2d 2d 2d 2d ----------------
1c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
1c40: 0a 20 2a 20 54 6c 73 5f 78 35 30 39 50 75 72 70 . * Tls_x509Purp
1c50: 6f 73 65 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 oses --. *. *.Ge
1c60: 74 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 t X.509 certific
1c70: 61 74 65 20 70 75 72 70 6f 73 65 20 74 79 70 65 ate purpose type
1c80: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
1c90: 0a 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 . *.Tcl list of
1ca0: 65 61 63 68 20 70 75 72 70 6f 73 65 20 61 6e 64 each purpose and
1cb0: 20 77 68 65 74 68 65 72 20 69 74 20 69 73 20 43 whether it is C
1cc0: 41 20 6f 72 20 6e 6f 6e 2d 43 41 0a 20 2a 0a 20 A or non-CA. *.
1cd0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
1ce0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *.None. *. *---
1cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 ----------. */.T
1d40: 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 cl_Obj *Tls_x509
1d50: 50 75 72 70 6f 73 65 73 28 54 63 6c 5f 49 6e 74 Purposes(Tcl_Int
1d60: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 erp *interp, X50
1d70: 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 54 9 *cert) {. T
1d80: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 cl_Obj *resultOb
1d90: 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f j = Tcl_NewListO
1da0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 bj(0, NULL);.
1db0: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 20 2a 70 X509_PURPOSE *p
1dc0: 74 6d 70 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 tmp;.. if (re
1dd0: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 sultObj == NULL)
1de0: 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b {..return NULL;
1df0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 . }.. for
1e00: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 (int i = 0; i <
1e10: 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 X509_PURPOSE_get
1e20: 5f 63 6f 75 6e 74 28 29 3b 20 69 2b 2b 29 20 7b _count(); i++) {
1e30: 0a 09 70 74 6d 70 20 3d 20 58 35 30 39 5f 50 55 ..ptmp = X509_PU
1e40: 52 50 4f 53 45 5f 67 65 74 30 28 69 29 3b 0a 09 RPOSE_get0(i);..
1e50: 54 63 6c 5f 4f 62 6a 20 2a 74 6d 70 50 74 72 20 Tcl_Obj *tmpPtr
1e60: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
1e70: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 66 6f 72 (0, NULL);...for
1e80: 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 3c (int j = 0; j <
1e90: 20 32 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 2; j++) {..
1ea0: 69 6e 74 20 69 64 72 65 74 20 3d 20 58 35 30 39 int idret = X509
1eb0: 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 _check_purpose(c
1ec0: 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 ert, X509_PURPOS
1ed0: 45 5f 67 65 74 5f 69 64 28 70 74 6d 70 29 2c 20 E_get_id(ptmp),
1ee0: 6a 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 j);.. Tcl_Lis
1ef0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1f00: 74 28 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 t(interp, tmpPtr
1f10: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
1f20: 62 6a 28 6a 20 3f 20 22 43 41 22 20 3a 20 22 6e bj(j ? "CA" : "n
1f30: 6f 6e 43 41 22 2c 20 2d 31 29 29 3b 0a 09 20 20 onCA", -1));..
1f40: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
1f50: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1f60: 70 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c 5f 4e p, tmpPtr, Tcl_N
1f70: 65 77 53 74 72 69 6e 67 4f 62 6a 28 69 64 72 65 ewStringObj(idre
1f80: 74 20 3d 3d 20 31 20 3f 20 22 59 65 73 22 20 3a t == 1 ? "Yes" :
1f90: 20 22 4e 6f 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a "No", -1));..}.
1fa0: 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 .LAPPEND_OBJ(int
1fb0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
1fc0: 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 X509_PURPOSE_get
1fd0: 30 5f 6e 61 6d 65 28 70 74 6d 70 29 2c 20 74 6d 0_name(ptmp), tm
1fe0: 70 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 pPtr);. }.
1ff0: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 return resultOb
2000: 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d j;.}../*. *-----
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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2050: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
2060: 6c 73 5f 78 35 30 39 4e 61 6d 65 73 20 2d 2d 0a ls_x509Names --.
2070: 20 2a 0a 20 2a 09 47 65 74 20 61 20 6c 69 73 74 *. *.Get a list
2080: 20 6f 66 20 53 75 62 6a 65 63 74 20 41 6c 74 65 of Subject Alte
2090: 72 6e 61 74 65 20 4e 61 6d 65 73 20 28 53 41 4e rnate Names (SAN
20a0: 29 20 6f 72 20 49 73 73 75 65 72 20 41 6c 74 65 ) or Issuer Alte
20b0: 72 6e 61 74 65 20 4e 61 6d 65 73 0a 20 2a 0a 20 rnate Names. *.
20c0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 * Results:. *.Tc
20d0: 6c 20 6c 69 73 74 20 6f 66 20 61 6c 74 65 72 6e l list of altern
20e0: 61 74 65 20 6e 61 6d 65 73 0a 20 2a 0a 20 2a 20 ate names. *. *
20f0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
2100: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d .None. *. *-----
2110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2150: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c --------. */.Tcl
2160: 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 4e 61 _Obj *Tls_x509Na
2170: 6d 65 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a mes(Tcl_Interp *
2180: 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 interp, X509 *ce
2190: 72 74 2c 20 69 6e 74 20 6e 69 64 2c 20 42 49 4f rt, int nid, BIO
21a0: 20 2a 62 69 6f 29 20 7b 0a 20 20 20 20 53 54 41 *bio) {. STA
21b0: 43 4b 5f 4f 46 28 47 45 4e 45 52 41 4c 5f 4e 41 CK_OF(GENERAL_NA
21c0: 4d 45 29 20 2a 6e 61 6d 65 73 3b 0a 20 20 20 20 ME) *names;.
21d0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f Tcl_Obj *resultO
21e0: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 bj = Tcl_NewList
21f0: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 Obj(0, NULL);.
2200: 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a Tcl_Size len;.
2210: 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b char buffer[
2220: 31 30 32 34 5d 3b 0a 0a 20 20 20 20 69 66 20 28 1024];.. if (
2230: 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c resultObj == NUL
2240: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c L) {..return NUL
2250: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 L;. }.. if
2260: 20 28 28 6e 61 6d 65 73 20 3d 20 28 53 54 41 43 ((names = (STAC
2270: 4b 5f 4f 46 28 47 45 4e 45 52 41 4c 5f 4e 41 4d K_OF(GENERAL_NAM
2280: 45 29 20 2a 29 58 35 30 39 5f 67 65 74 5f 65 78 E) *)X509_get_ex
2290: 74 5f 64 32 69 28 63 65 72 74 2c 20 6e 69 64 2c t_d2i(cert, nid,
22a0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d NULL, NULL)) !=
22b0: 20 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 NULL) {..for (i
22c0: 6e 74 20 69 3d 30 3b 20 69 20 3c 20 73 6b 5f 47 nt i=0; i < sk_G
22d0: 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 6e 75 6d 28 ENERAL_NAME_num(
22e0: 6e 61 6d 65 73 29 3b 20 69 2b 2b 29 20 7b 0a 09 names); i++) {..
22f0: 20 20 20 20 63 6f 6e 73 74 20 47 45 4e 45 52 41 const GENERA
2300: 4c 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 L_NAME *name = s
2310: 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 76 k_GENERAL_NAME_v
2320: 61 6c 75 65 28 6e 61 6d 65 73 2c 20 69 29 3b 0a alue(names, i);.
2330: 0a 09 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f .. len = BIO_
2340: 74 6f 5f 42 75 66 66 65 72 28 6e 61 6d 65 20 26 to_Buffer(name &
2350: 26 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70 & GENERAL_NAME_p
2360: 72 69 6e 74 28 62 69 6f 2c 20 28 47 45 4e 45 52 rint(bio, (GENER
2370: 41 4c 5f 4e 41 4d 45 20 2a 29 20 6e 61 6d 65 29 AL_NAME *) name)
2380: 2c 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 31 , bio, buffer, 1
2390: 30 32 34 29 3b 0a 09 20 20 20 20 4c 41 50 50 45 024);.. LAPPE
23a0: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 ND_STR(interp, r
23b0: 65 73 75 6c 74 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 esultObj, NULL,
23c0: 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 09 7d buffer, len);..}
23d0: 0a 09 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d ..sk_GENERAL_NAM
23e0: 45 5f 70 6f 70 5f 66 72 65 65 28 6e 61 6d 65 73 E_pop_free(names
23f0: 2c 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 66 , GENERAL_NAME_f
2400: 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ree);. }.
2410: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a return resultObj
2420: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
2430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2470: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
2480: 73 5f 78 35 30 39 45 78 74 4b 65 79 55 73 61 67 s_x509ExtKeyUsag
2490: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 61 e --. *. *.Get a
24a0: 20 6c 69 73 74 20 6f 66 20 45 78 74 65 6e 64 65 list of Extende
24b0: 64 20 4b 65 79 20 55 73 61 67 65 73 0a 20 2a 0a d Key Usages. *.
24c0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 * Returns:. *.T
24d0: 63 6c 20 6c 69 73 74 20 6f 66 20 75 73 61 67 65 cl list of usage
24e0: 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 s. *. * Side eff
24f0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ects:. *.None. *
2500: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
2510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2550: 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c . */.Tcl_Obj *Tl
2560: 73 5f 78 35 30 39 45 78 74 4b 65 79 55 73 61 67 s_x509ExtKeyUsag
2570: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e e(Tcl_Interp *in
2580: 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 terp, X509 *cert
2590: 2c 20 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 , uint32_t xflag
25a0: 73 29 20 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f s) {. uint32_
25b0: 74 20 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67 t usage = X509_g
25c0: 65 74 5f 6b 65 79 5f 75 73 61 67 65 28 63 65 72 et_key_usage(cer
25d0: 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 t);. Tcl_Obj
25e0: 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c *resultObj = Tcl
25f0: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
2600: 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 ULL);.. if (r
2610: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c esultObj == NULL
2620: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c ) {..return NULL
2630: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
2640: 28 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 ((xflags & EXFLA
2650: 47 5f 58 4b 55 53 41 47 45 29 20 26 26 20 75 73 G_XKUSAGE) && us
2660: 61 67 65 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58 age < UINT32_MAX
2670: 29 20 7b 0a 09 75 73 61 67 65 20 3d 20 58 35 30 ) {..usage = X50
2680: 39 5f 67 65 74 5f 65 78 74 65 6e 64 65 64 5f 6b 9_get_extended_k
2690: 65 79 5f 75 73 61 67 65 28 63 65 72 74 29 3b 0a ey_usage(cert);.
26a0: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b ..if (usage & XK
26b0: 55 5f 53 53 4c 5f 53 45 52 56 45 52 29 20 7b 0a U_SSL_SERVER) {.
26c0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
26d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
26e0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
26f0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
2700: 6a 28 22 54 4c 53 20 57 65 62 20 53 65 72 76 65 j("TLS Web Serve
2710: 72 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e r Authentication
2720: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 ", -1));..}..if
2730: 28 75 73 61 67 65 20 26 20 58 4b 55 5f 53 53 4c (usage & XKU_SSL
2740: 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 _CLIENT) {..
2750: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2760: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2770: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f resultObj, Tcl_
2780: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 4c NewStringObj("TL
2790: 53 20 57 65 62 20 43 6c 69 65 6e 74 20 41 75 74 S Web Client Aut
27a0: 68 65 6e 74 69 63 61 74 69 6f 6e 22 2c 20 2d 31 hentication", -1
27b0: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 ));..}..if (usag
27c0: 65 20 26 20 58 4b 55 5f 53 4d 49 4d 45 29 20 7b e & XKU_SMIME) {
27d0: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
27e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
27f0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
2800: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
2810: 62 6a 28 22 45 2d 6d 61 69 6c 20 50 72 6f 74 65 bj("E-mail Prote
2820: 63 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d ction", -1));..}
2830: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b ..if (usage & XK
2840: 55 5f 43 4f 44 45 5f 53 49 47 4e 29 20 7b 0a 09 U_CODE_SIGN) {..
2850: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2860: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2870: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
2880: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2890: 28 22 43 6f 64 65 20 53 69 67 6e 69 6e 67 22 2c ("Code Signing",
28a0: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 -1));..}..if (u
28b0: 73 61 67 65 20 26 20 58 4b 55 5f 53 47 43 29 20 sage & XKU_SGC)
28c0: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
28d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
28e0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
28f0: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 j, Tcl_NewString
2900: 4f 62 6a 28 22 53 47 43 22 2c 20 2d 31 29 29 3b Obj("SGC", -1));
2910: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 ..}..if (usage &
2920: 20 58 4b 55 5f 4f 43 53 50 5f 53 49 47 4e 29 20 XKU_OCSP_SIGN)
2930: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
2940: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2950: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
2960: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 j, Tcl_NewString
2970: 4f 62 6a 28 22 4f 43 53 50 20 53 69 67 6e 69 6e Obj("OCSP Signin
2980: 67 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 g", -1));..}..if
2990: 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f 54 49 (usage & XKU_TI
29a0: 4d 45 53 54 41 4d 50 29 20 7b 0a 09 20 20 20 20 MESTAMP) {..
29b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
29c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
29d0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f resultObj, Tcl_
29e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 69 NewStringObj("Ti
29f0: 6d 65 20 53 74 61 6d 70 69 6e 67 22 2c 20 2d 31 me Stamping", -1
2a00: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 ));..}..if (usag
2a10: 65 20 26 20 58 4b 55 5f 44 56 43 53 20 29 20 7b e & XKU_DVCS ) {
2a20: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
2a30: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2a40: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
2a50: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
2a60: 62 6a 28 22 44 56 43 53 22 2c 20 2d 31 29 29 3b bj("DVCS", -1));
2a70: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 ..}..if (usage &
2a80: 20 58 4b 55 5f 41 4e 59 45 4b 55 29 20 7b 0a 09 XKU_ANYEKU) {..
2a90: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2aa0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2ab0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
2ac0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2ad0: 28 22 41 6e 79 20 45 78 74 65 6e 64 65 64 20 4b ("Any Extended K
2ae0: 65 79 20 55 73 61 67 65 22 2c 20 2d 31 29 29 3b ey Usage", -1));
2af0: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b ..}. } else {
2b00: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
2b10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2b20: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
2b30: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
2b40: 62 6a 28 22 75 6e 72 65 73 74 72 69 63 74 65 64 bj("unrestricted
2b50: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 ", -1));. }.
2b60: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 return result
2b70: 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d Obj;.}../*. *---
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
2bd0: 20 54 6c 73 5f 78 35 30 39 43 72 6c 44 70 20 2d Tls_x509CrlDp -
2be0: 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 6c 69 73 74 -. *. *.Get list
2bf0: 20 6f 66 20 43 52 4c 20 44 69 73 74 72 69 62 75 of CRL Distribu
2c00: 74 69 6f 6e 20 50 6f 69 6e 74 73 0a 20 2a 0a 20 tion Points. *.
2c10: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 63 * Returns:. *.Tc
2c20: 6c 20 6c 69 73 74 20 6f 66 20 55 52 49 73 20 61 l list of URIs a
2c30: 6e 64 20 72 65 6c 61 74 69 76 65 2d 6e 61 6d 65 nd relative-name
2c40: 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 s. *. * Side eff
2c50: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ects:. *.None. *
2c60: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
2c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2cb0: 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c . */.Tcl_Obj *Tl
2cc0: 73 5f 78 35 30 39 43 72 6c 44 70 28 54 63 6c 5f s_x509CrlDp(Tcl_
2cd0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
2ce0: 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 X509 *cert) {.
2cf0: 20 20 53 54 41 43 4b 5f 4f 46 28 44 49 53 54 5f STACK_OF(DIST_
2d00: 50 4f 49 4e 54 29 20 2a 64 70 73 3b 0a 20 20 20 POINT) *dps;.
2d10: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 Tcl_Obj *result
2d20: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Obj = Tcl_NewLis
2d30: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a tObj(0, NULL);..
2d40: 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 if (resultOb
2d50: 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 j == NULL) {..re
2d60: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
2d70: 0a 0a 20 20 20 20 69 66 20 28 28 64 70 73 20 3d .. if ((dps =
2d80: 20 28 53 54 41 43 4b 5f 4f 46 28 44 49 53 54 5f (STACK_OF(DIST_
2d90: 50 4f 49 4e 54 29 20 2a 29 58 35 30 39 5f 67 65 POINT) *)X509_ge
2da0: 74 5f 65 78 74 5f 64 32 69 28 63 65 72 74 2c 20 t_ext_d2i(cert,
2db0: 4e 49 44 5f 63 72 6c 5f 64 69 73 74 72 69 62 75 NID_crl_distribu
2dc0: 74 69 6f 6e 5f 70 6f 69 6e 74 73 2c 20 4e 55 4c tion_points, NUL
2dd0: 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c L, NULL)) != NUL
2de0: 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69 L) {..for (int i
2df0: 3d 30 3b 20 69 20 3c 20 73 6b 5f 44 49 53 54 5f =0; i < sk_DIST_
2e00: 50 4f 49 4e 54 5f 6e 75 6d 28 64 70 73 29 3b 20 POINT_num(dps);
2e10: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 44 49 53 54 i++) {.. DIST
2e20: 5f 50 4f 49 4e 54 20 2a 64 70 20 3d 20 73 6b 5f _POINT *dp = sk_
2e30: 44 49 53 54 5f 50 4f 49 4e 54 5f 76 61 6c 75 65 DIST_POINT_value
2e40: 28 64 70 73 2c 20 69 29 3b 0a 09 20 20 20 20 44 (dps, i);.. D
2e50: 49 53 54 5f 50 4f 49 4e 54 5f 4e 41 4d 45 20 2a IST_POINT_NAME *
2e60: 64 69 73 74 70 6f 69 6e 74 20 3d 20 64 70 2d 3e distpoint = dp->
2e70: 64 69 73 74 70 6f 69 6e 74 3b 0a 0a 09 20 20 20 distpoint;...
2e80: 20 69 66 20 28 64 69 73 74 70 6f 69 6e 74 2d 3e if (distpoint->
2e90: 74 79 70 65 20 3d 3d 20 30 29 20 7b 0a 09 09 2f type == 0) {.../
2ea0: 2a 20 66 75 6c 6c 2d 6e 61 6d 65 20 47 45 4e 45 * full-name GENE
2eb0: 52 41 4c 49 5a 45 44 4e 41 4d 45 20 2a 2f 0a 09 RALIZEDNAME */..
2ec0: 09 66 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b .for (int j = 0;
2ed0: 20 6a 20 3c 20 73 6b 5f 47 45 4e 45 52 41 4c 5f j < sk_GENERAL_
2ee0: 4e 41 4d 45 5f 6e 75 6d 28 64 69 73 74 70 6f 69 NAME_num(distpoi
2ef0: 6e 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c 6e 61 6d nt->name.fullnam
2f00: 65 29 3b 20 6a 2b 2b 29 20 7b 0a 09 09 20 20 20 e); j++) {...
2f10: 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 20 2a 67 GENERAL_NAME *g
2f20: 65 6e 20 3d 20 73 6b 5f 47 45 4e 45 52 41 4c 5f en = sk_GENERAL_
2f30: 4e 41 4d 45 5f 76 61 6c 75 65 28 64 69 73 74 70 NAME_value(distp
2f40: 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c 6e oint->name.fulln
2f50: 61 6d 65 2c 20 6a 29 3b 0a 09 09 20 20 20 20 69 ame, j);... i
2f60: 6e 74 20 74 79 70 65 3b 0a 23 69 66 20 4f 50 45 nt type;.#if OPE
2f70: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
2f80: 42 45 52 20 3c 20 30 78 34 30 30 30 30 30 30 30 BER < 0x40000000
2f90: 4c 0a 09 09 20 20 20 20 41 53 4e 31 5f 53 54 52 L... ASN1_STR
2fa0: 49 4e 47 20 2a 75 72 69 20 3d 20 28 41 53 4e 31 ING *uri = (ASN1
2fb0: 5f 53 54 52 49 4e 47 20 2a 29 47 45 4e 45 52 41 _STRING *)GENERA
2fc0: 4c 5f 4e 41 4d 45 5f 67 65 74 30 5f 76 61 6c 75 L_NAME_get0_valu
2fd0: 65 28 67 65 6e 2c 20 26 74 79 70 65 29 3b 0a 23 e(gen, &type);.#
2fe0: 65 6c 73 65 0a 09 09 20 20 20 20 63 6f 6e 73 74 else... const
2ff0: 20 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 75 72 ASN1_STRING *ur
3000: 69 20 3d 20 28 63 6f 6e 73 74 20 41 53 4e 31 5f i = (const ASN1_
3010: 53 54 52 49 4e 47 20 2a 29 47 45 4e 45 52 41 4c STRING *)GENERAL
3020: 5f 4e 41 4d 45 5f 67 65 74 30 5f 76 61 6c 75 65 _NAME_get0_value
3030: 28 67 65 6e 2c 20 26 74 79 70 65 29 3b 0a 23 65 (gen, &type);.#e
3040: 6e 64 69 66 0a 09 09 20 20 20 20 69 66 20 28 74 ndif... if (t
3050: 79 70 65 20 3d 3d 20 47 45 4e 5f 55 52 49 20 7c ype == GEN_URI |
3060: 7c 20 74 79 70 65 20 3d 3d 20 47 45 4e 5f 44 4e | type == GEN_DN
3070: 53 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c S) {.#if OPENSSL
3080: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
3090: 3c 20 30 78 34 30 31 30 30 30 30 30 4c 0a 09 09 < 0x40100000L...
30a0: 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
30b0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
30c0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 0a 09 (char *) NULL,..
30d0: 09 09 20 20 20 20 28 63 68 61 72 20 2a 29 20 41 .. (char *) A
30e0: 53 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74 30 5f SN1_STRING_get0_
30f0: 64 61 74 61 28 75 72 69 29 2c 0a 09 09 09 20 20 data(uri),....
3100: 20 20 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e (Tcl_Size) ASN
3110: 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 1_STRING_length(
3120: 75 72 69 29 29 3b 0a 23 65 6c 73 65 0a 09 09 09 uri));.#else....
3130: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
3140: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 28 rp, resultObj, (
3150: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 0a 09 09 char *) NULL,...
3160: 09 20 20 20 20 28 63 68 61 72 20 2a 29 20 41 53 . (char *) AS
3170: 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74 30 5f 64 N1_STRING_get0_d
3180: 61 74 61 28 75 72 69 29 2c 0a 09 09 09 20 20 20 ata(uri),....
3190: 20 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31 (Tcl_Size) ASN1
31a0: 5f 53 54 52 49 4e 47 5f 67 65 74 5f 6c 65 6e 67 _STRING_get_leng
31b0: 74 68 28 75 72 69 29 29 3b 0a 23 65 6e 64 69 66 th(uri));.#endif
31c0: 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 ... }...}..
31d0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 69 73 } else if (dis
31e0: 74 70 6f 69 6e 74 2d 3e 74 79 70 65 20 3d 3d 20 tpoint->type ==
31f0: 31 29 20 7b 0a 09 09 2f 2a 20 72 65 6c 61 74 69 1) {.../* relati
3200: 76 65 2d 6e 61 6d 65 20 58 35 30 39 4e 41 4d 45 ve-name X509NAME
3210: 20 2a 2f 0a 09 09 53 54 41 43 4b 5f 4f 46 28 58 */...STACK_OF(X
3220: 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 29 20 509_NAME_ENTRY)
3230: 2a 73 6b 5f 72 65 6c 6e 61 6d 65 20 3d 20 64 69 *sk_relname = di
3240: 73 74 70 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 72 65 stpoint->name.re
3250: 6c 61 74 69 76 65 6e 61 6d 65 3b 0a 09 09 66 6f lativename;...fo
3260: 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 r (int j = 0; j
3270: 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 45 < sk_X509_NAME_E
3280: 4e 54 52 59 5f 6e 75 6d 28 73 6b 5f 72 65 6c 6e NTRY_num(sk_reln
3290: 61 6d 65 29 3b 20 6a 2b 2b 29 20 7b 0a 09 09 20 ame); j++) {...
32a0: 20 20 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 X509_NAME_ENT
32b0: 52 59 20 2a 65 20 3d 20 73 6b 5f 58 35 30 39 5f RY *e = sk_X509_
32c0: 4e 41 4d 45 5f 45 4e 54 52 59 5f 76 61 6c 75 65 NAME_ENTRY_value
32d0: 28 73 6b 5f 72 65 6c 6e 61 6d 65 2c 20 6a 29 3b (sk_relname, j);
32e0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
32f0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
3300: 34 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 40000000L...
3310: 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 64 20 3d ASN1_STRING *d =
3320: 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 X509_NAME_ENTRY
3330: 5f 67 65 74 5f 64 61 74 61 28 65 29 3b 0a 23 65 _get_data(e);.#e
3340: 6c 73 65 0a 09 09 20 20 20 20 63 6f 6e 73 74 20 lse... const
3350: 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a 64 20 3d ASN1_STRING *d =
3360: 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 X509_NAME_ENTRY
3370: 5f 67 65 74 5f 64 61 74 61 28 65 29 3b 0a 23 65 _get_data(e);.#e
3380: 6e 64 69 66 0a 23 69 66 20 4f 50 45 4e 53 53 4c ndif.#if OPENSSL
3390: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
33a0: 3c 20 30 78 34 30 31 30 30 30 30 30 4c 0a 09 09 < 0x40100000L...
33b0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
33c0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
33d0: 6a 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c j, (char *) NULL
33e0: 2c 0a 09 09 20 20 20 20 20 20 20 20 28 63 68 61 ,... (cha
33f0: 72 20 2a 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 r *) ASN1_STRING
3400: 5f 67 65 74 30 5f 64 61 74 61 28 64 29 2c 0a 09 _get0_data(d),..
3410: 09 09 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e ..(Tcl_Size) ASN
3420: 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 1_STRING_length(
3430: 64 29 29 3b 0a 23 65 6c 73 65 0a 09 09 20 20 20 d));.#else...
3440: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
3450: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
3460: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 0a 09 (char *) NULL,..
3470: 09 20 20 20 20 20 20 20 20 28 63 68 61 72 20 2a . (char *
3480: 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67 65 ) ASN1_STRING_ge
3490: 74 30 5f 64 61 74 61 28 64 29 2c 0a 09 09 09 28 t0_data(d),....(
34a0: 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31 5f 53 Tcl_Size) ASN1_S
34b0: 54 52 49 4e 47 5f 67 65 74 5f 6c 65 6e 67 74 68 TRING_get_length
34c0: 28 64 29 29 3b 0a 23 65 6e 64 69 66 0a 09 09 7d (d));.#endif...}
34d0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 43 52 4c 5f .. }..}..CRL_
34e0: 44 49 53 54 5f 50 4f 49 4e 54 53 5f 66 72 65 65 DIST_POINTS_free
34f0: 28 64 70 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 (dps);. }.
3500: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 return resultOb
3510: 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d j;.}../*. *-----
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 54 --------. *. * T
3570: 6c 73 5f 78 35 30 39 4f 73 63 70 0a 20 2a 0a 20 ls_x509Oscp. *.
3580: 2a 09 47 65 74 20 6c 69 73 74 20 6f 66 20 4f 6e *.Get list of On
3590: 2d 6c 69 6e 65 20 43 65 72 74 69 66 69 63 61 74 -line Certificat
35a0: 65 20 53 74 61 74 75 73 20 50 72 6f 74 6f 63 6f e Status Protoco
35b0: 6c 20 28 4f 53 43 50 29 20 55 52 49 73 0a 20 2a l (OSCP) URIs. *
35c0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
35d0: 54 63 6c 20 6c 69 73 74 20 6f 66 20 55 52 49 73 Tcl list of URIs
35e0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
35f0: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a cts:. *.None. *.
3600: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3650: 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 */.Tcl_Obj *Tls
3660: 5f 78 35 30 39 4f 73 63 70 28 54 63 6c 5f 49 6e _x509Oscp(Tcl_In
3670: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 terp *interp, X5
3680: 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 09 *cert) {.
3690: 53 54 41 43 4b 5f 4f 46 28 4f 50 45 4e 53 53 4c STACK_OF(OPENSSL
36a0: 5f 53 54 52 49 4e 47 29 20 2a 6f 63 73 70 3b 0a _STRING) *ocsp;.
36b0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 Tcl_Obj *res
36c0: 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 ultObj = Tcl_New
36d0: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
36e0: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c ;.. if (resul
36f0: 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a tObj == NULL) {.
3700: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
3710: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 6f 63 }.. if ((oc
3720: 73 70 20 3d 20 58 35 30 39 5f 67 65 74 31 5f 6f sp = X509_get1_o
3730: 63 73 70 28 63 65 72 74 29 29 20 21 3d 20 4e 55 csp(cert)) != NU
3740: 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 LL) {..for (int
3750: 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 4f 50 i = 0; i < sk_OP
3760: 45 4e 53 53 4c 5f 53 54 52 49 4e 47 5f 6e 75 6d ENSSL_STRING_num
3770: 28 6f 63 73 70 29 3b 20 69 2b 2b 29 20 7b 0a 09 (ocsp); i++) {..
3780: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
3790: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
37a0: 6a 2c 20 4e 55 4c 4c 2c 20 73 6b 5f 4f 50 45 4e j, NULL, sk_OPEN
37b0: 53 53 4c 5f 53 54 52 49 4e 47 5f 76 61 6c 75 65 SSL_STRING_value
37c0: 28 6f 63 73 70 2c 20 69 29 2c 20 2d 31 29 3b 0a (ocsp, i), -1);.
37d0: 09 7d 0a 09 58 35 30 39 5f 65 6d 61 69 6c 5f 66 .}..X509_email_f
37e0: 72 65 65 28 6f 63 73 70 29 3b 0a 20 20 20 20 7d ree(ocsp);. }
37f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 . return resu
3800: 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d ltObj;.}../*. *-
3810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
3860: 20 2a 20 54 6c 73 5f 78 35 30 39 43 61 49 73 73 * Tls_x509CaIss
3870: 75 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 uers --. *. *.Ge
3880: 74 20 6c 69 73 74 20 6f 66 20 43 65 72 74 69 66 t list of Certif
3890: 69 63 61 74 65 20 41 75 74 68 6f 72 69 74 79 20 icate Authority
38a0: 28 43 41 29 20 49 73 73 75 65 72 20 55 52 49 73 (CA) Issuer URIs
38b0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
38c0: 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 43 *.Tcl list of C
38d0: 41 20 69 73 73 75 65 72 20 55 52 49 73 0a 20 2a A issuer URIs. *
38e0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
38f0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d :. *.None. *. *-
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
3950: 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 .Tcl_Obj *Tls_x5
3960: 30 39 43 61 49 73 73 75 65 72 73 28 54 63 6c 5f 09CaIssuers(Tcl_
3970: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
3980: 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 X509 *cert) {.
3990: 20 20 53 54 41 43 4b 5f 4f 46 28 41 43 43 45 53 STACK_OF(ACCES
39a0: 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 29 20 2a S_DESCRIPTION) *
39b0: 61 64 73 3b 0a 20 20 20 20 41 43 43 45 53 53 5f ads;. ACCESS_
39c0: 44 45 53 43 52 49 50 54 49 4f 4e 20 2a 61 64 3b DESCRIPTION *ad;
39d0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 . Tcl_Obj *re
39e0: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 sultObj = Tcl_Ne
39f0: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
3a00: 29 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 );. unsigned
3a10: 63 68 61 72 20 2a 62 75 66 3b 0a 0a 20 20 20 20 char *buf;..
3a20: 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d if (resultObj ==
3a30: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
3a40: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
3a50: 20 20 69 66 20 28 28 61 64 73 20 3d 20 28 53 54 if ((ads = (ST
3a60: 41 43 4b 5f 4f 46 28 41 43 43 45 53 53 5f 44 45 ACK_OF(ACCESS_DE
3a70: 53 43 52 49 50 54 49 4f 4e 29 20 2a 29 58 35 30 SCRIPTION) *)X50
3a80: 39 5f 67 65 74 5f 65 78 74 5f 64 32 69 28 63 65 9_get_ext_d2i(ce
3a90: 72 74 2c 20 4e 49 44 5f 69 6e 66 6f 5f 61 63 63 rt, NID_info_acc
3aa0: 65 73 73 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 ess, NULL, NULL)
3ab0: 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 66 6f ) != NULL) {..fo
3ac0: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 r (int i = 0; i
3ad0: 3c 20 73 6b 5f 41 43 43 45 53 53 5f 44 45 53 43 < sk_ACCESS_DESC
3ae0: 52 49 50 54 49 4f 4e 5f 6e 75 6d 28 61 64 73 29 RIPTION_num(ads)
3af0: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 61 64 ; i++) {.. ad
3b00: 20 3d 20 28 41 43 43 45 53 53 5f 44 45 53 43 52 = (ACCESS_DESCR
3b10: 49 50 54 49 4f 4e 20 2a 29 73 6b 5f 41 43 43 45 IPTION *)sk_ACCE
3b20: 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 5f 76 SS_DESCRIPTION_v
3b30: 61 6c 75 65 28 61 64 73 2c 20 69 29 3b 0a 09 20 alue(ads, i);..
3b40: 20 20 20 69 66 20 28 4f 42 4a 5f 6f 62 6a 32 6e if (OBJ_obj2n
3b50: 69 64 28 61 64 2d 3e 6d 65 74 68 6f 64 29 20 3d id(ad->method) =
3b60: 3d 20 4e 49 44 5f 61 64 5f 63 61 5f 69 73 73 75 = NID_ad_ca_issu
3b70: 65 72 73 20 26 26 20 61 64 2d 3e 6c 6f 63 61 74 ers && ad->locat
3b80: 69 6f 6e 29 20 7b 0a 09 09 69 66 20 28 61 64 2d ion) {...if (ad-
3b90: 3e 6c 6f 63 61 74 69 6f 6e 2d 3e 74 79 70 65 20 >location->type
3ba0: 3d 3d 20 47 45 4e 5f 55 52 49 29 20 7b 0a 09 09 == GEN_URI) {...
3bb0: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e Tcl_Size len
3bc0: 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 = (Tcl_Size) AS
3bd0: 4e 31 5f 53 54 52 49 4e 47 5f 74 6f 5f 55 54 46 N1_STRING_to_UTF
3be0: 38 28 26 62 75 66 2c 20 61 64 2d 3e 6c 6f 63 61 8(&buf, ad->loca
3bf0: 74 69 6f 6e 2d 3e 64 2e 75 6e 69 66 6f 72 6d 52 tion->d.uniformR
3c00: 65 73 6f 75 72 63 65 49 64 65 6e 74 69 66 69 65 esourceIdentifie
3c10: 72 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f 4c 69 r);... Tcl_Li
3c20: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
3c30: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c nt(interp, resul
3c40: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tObj, Tcl_NewStr
3c50: 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 20 ingObj((char *)
3c60: 62 75 66 2c 20 6c 65 6e 29 29 3b 0a 09 09 20 20 buf, len));...
3c70: 20 20 4f 50 45 4e 53 53 4c 5f 66 72 65 65 28 62 OPENSSL_free(b
3c80: 75 66 29 3b 0a 09 09 20 20 20 20 62 72 65 61 6b uf);... break
3c90: 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a ;...}.. }..}.
3ca0: 09 2f 2a 20 73 6b 5f 41 43 43 45 53 53 5f 44 45 ./* sk_ACCESS_DE
3cb0: 53 43 52 49 50 54 49 4f 4e 5f 70 6f 70 5f 66 72 SCRIPTION_pop_fr
3cc0: 65 65 28 61 64 73 2c 20 41 43 43 45 53 53 5f 44 ee(ads, ACCESS_D
3cd0: 45 53 43 52 49 50 54 49 4f 4e 5f 66 72 65 65 29 ESCRIPTION_free)
3ce0: 3b 20 2a 2f 0a 09 41 55 54 48 4f 52 49 54 59 5f ; */..AUTHORITY_
3cf0: 49 4e 46 4f 5f 41 43 43 45 53 53 5f 66 72 65 65 INFO_ACCESS_free
3d00: 28 61 64 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 (ads);. }.
3d10: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 return resultOb
3d20: 6a 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d j;.}.../*. *----
3d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
3d80: 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 20 2d Tls_NewX509Obj -
3d90: 2d 0a 20 2a 0a 20 2a 09 50 61 72 73 65 73 20 61 -. *. *.Parses a
3da0: 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 X509 certificat
3db0: 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 63 6f e and returns co
3dc0: 6e 74 65 6e 74 73 20 61 73 20 61 20 6b 65 79 2d ntents as a key-
3dd0: 76 61 6c 75 65 20 54 63 6c 20 6c 69 73 74 2e 0a value Tcl list..
3de0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 3a 0a 20 2a *. * Result:. *
3df0: 09 41 20 54 63 6c 20 4c 69 73 74 20 77 69 74 68 .A Tcl List with
3e00: 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66 the X509 certif
3e10: 69 63 61 74 65 20 69 6e 66 6f 20 61 73 20 61 20 icate info as a
3e20: 6b 65 79 2d 76 61 6c 75 65 20 6c 69 73 74 0a 20 key-value list.
3e30: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
3e40: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
3e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
3ea0: 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 4e /.Tcl_Obj *Tls_N
3eb0: 65 77 58 35 30 39 4f 62 6a 28 54 63 6c 5f 49 6e ewX509Obj(Tcl_In
3ec0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 terp *interp, X5
3ed0: 30 39 20 2a 63 65 72 74 2c 20 69 6e 74 20 61 6c 09 *cert, int al
3ee0: 6c 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a l) {. Tcl_Obj
3ef0: 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 *resultObj = Tc
3f00: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
3f10: 4e 55 4c 4c 29 3b 0a 20 20 20 20 42 49 4f 20 2a NULL);. BIO *
3f20: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 bio = BIO_new(BI
3f30: 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 20 20 20 20 O_s_mem());.
3f40: 69 6e 74 20 6d 64 6e 69 64 2c 20 70 6b 6e 69 64 int mdnid, pknid
3f50: 2c 20 62 69 74 73 3b 0a 20 20 20 20 54 63 6c 5f , bits;. Tcl_
3f60: 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 75 6e Size len;. un
3f70: 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b signed int ulen;
3f80: 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 78 66 . uint32_t xf
3f90: 6c 61 67 73 3b 0a 20 20 20 20 75 6e 73 69 67 6e lags;. unsign
3fa0: 65 64 20 6c 6f 6e 67 20 66 6c 61 67 73 20 3d 20 ed long flags =
3fb0: 58 4e 5f 46 4c 41 47 5f 52 46 43 32 32 35 33 20 XN_FLAG_RFC2253
3fc0: 7c 20 41 53 4e 31 5f 53 54 52 46 4c 47 53 5f 55 | ASN1_STRFLGS_U
3fd0: 54 46 38 5f 43 4f 4e 56 45 52 54 3b 0a 20 20 20 TF8_CONVERT;.
3fe0: 20 66 6c 61 67 73 20 26 3d 20 7e 28 75 6e 73 69 flags &= ~(unsi
3ff0: 67 6e 65 64 20 6c 6f 6e 67 29 41 53 4e 31 5f 53 gned long)ASN1_S
4000: 54 52 46 4c 47 53 5f 45 53 43 5f 4d 53 42 3b 0a TRFLGS_ESC_MSB;.
4010: 0a 20 20 20 20 63 68 61 72 20 2a 62 75 66 66 65 . char *buffe
4020: 72 20 3d 20 28 63 68 61 72 20 2a 29 54 63 6c 5f r = (char *)Tcl_
4030: 41 6c 6c 6f 63 28 42 55 46 53 49 5a 20 3e 20 45 Alloc(BUFSIZ > E
4040: 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 20 3f VP_MAX_MD_SIZE ?
4050: 20 42 55 46 53 49 5a 20 3a 20 45 56 50 5f 4d 41 BUFSIZ : EVP_MA
4060: 58 5f 4d 44 5f 53 49 5a 45 29 3b 0a 0a 20 20 20 X_MD_SIZE);..
4070: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
4080: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 ");.. if (int
4090: 65 72 70 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 erp == NULL || c
40a0: 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62 ert == NULL || b
40b0: 69 6f 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 65 io == NULL || re
40c0: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 20 sultObj == NULL
40d0: 7c 7c 20 62 75 66 66 65 72 20 3d 3d 20 4e 55 4c || buffer == NUL
40e0: 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 L) {..Tcl_DecrRe
40f0: 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 4f 62 6a fCount(resultObj
4100: 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28 62 69 6f );..BIO_free(bio
4110: 29 3b 0a 09 69 66 20 28 62 75 66 66 65 72 20 21 );..if (buffer !
4120: 3d 20 4e 55 4c 4c 29 20 54 63 6c 5f 46 72 65 65 = NULL) Tcl_Free
4130: 28 62 75 66 66 65 72 29 3b 0a 09 72 65 74 75 72 (buffer);..retur
4140: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 n NULL;. }..
4150: 20 20 20 2f 2a 20 53 69 67 6e 61 74 75 72 65 20 /* Signature
4160: 61 6c 67 6f 72 69 74 68 6d 20 61 6e 64 20 76 61 algorithm and va
4170: 6c 75 65 20 2d 20 52 46 43 20 35 32 38 30 20 73 lue - RFC 5280 s
4180: 65 63 74 69 6f 6e 20 34 2e 31 2e 31 2e 32 20 61 ection 4.1.1.2 a
4190: 6e 64 20 34 2e 31 2e 31 2e 33 20 2a 2f 0a 20 20 nd 4.1.1.3 */.
41a0: 20 20 2f 2a 20 73 69 67 6e 61 74 75 72 65 41 6c /* signatureAl
41b0: 67 6f 72 69 74 68 6d 20 69 73 20 74 68 65 20 69 gorithm is the i
41c0: 64 20 6f 66 20 74 68 65 20 63 72 79 70 74 6f 67 d of the cryptog
41d0: 72 61 70 68 69 63 20 61 6c 67 6f 72 69 74 68 6d raphic algorithm
41e0: 20 75 73 65 64 20 62 79 20 74 68 65 0a 09 43 41 used by the..CA
41f0: 20 74 6f 20 73 69 67 6e 20 74 68 69 73 20 63 65 to sign this ce
4200: 72 74 2e 20 73 69 67 6e 61 74 75 72 65 56 61 6c rt. signatureVal
4210: 75 65 20 69 73 20 74 68 65 20 64 69 67 69 74 61 ue is the digita
4220: 6c 20 73 69 67 6e 61 74 75 72 65 20 63 6f 6d 70 l signature comp
4230: 75 74 65 64 0a 09 75 70 6f 6e 20 74 68 65 20 41 uted..upon the A
4240: 53 4e 2e 31 20 44 45 52 20 65 6e 63 6f 64 65 64 SN.1 DER encoded
4250: 20 74 62 73 43 65 72 74 69 66 69 63 61 74 65 2e tbsCertificate.
4260: 20 2a 2f 0a 20 20 20 20 7b 0a 09 63 6f 6e 73 74 */. {..const
4270: 20 58 35 30 39 5f 41 4c 47 4f 52 20 2a 73 69 67 X509_ALGOR *sig
4280: 5f 61 6c 67 3b 0a 09 63 6f 6e 73 74 20 41 53 4e _alg;..const ASN
4290: 31 5f 42 49 54 5f 53 54 52 49 4e 47 20 2a 73 69 1_BIT_STRING *si
42a0: 67 3b 0a 09 69 6e 74 20 73 69 67 5f 6e 69 64 3b g;..int sig_nid;
42b0: 0a 0a 09 58 35 30 39 5f 67 65 74 30 5f 73 69 67 ...X509_get0_sig
42c0: 6e 61 74 75 72 65 28 26 73 69 67 2c 20 26 73 69 nature(&sig, &si
42d0: 67 5f 61 6c 67 2c 20 63 65 72 74 29 3b 0a 09 2f g_alg, cert);../
42e0: 2a 20 73 69 67 5f 6e 69 64 20 3d 20 58 35 30 39 * sig_nid = X509
42f0: 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e _get_signature_n
4300: 69 64 28 63 65 72 74 29 20 2a 2f 0a 09 73 69 67 id(cert) */..sig
4310: 5f 6e 69 64 20 3d 20 4f 42 4a 5f 6f 62 6a 32 6e _nid = OBJ_obj2n
4320: 69 64 28 73 69 67 5f 61 6c 67 2d 3e 61 6c 67 6f id(sig_alg->algo
4330: 72 69 74 68 6d 29 3b 0a 09 4c 41 50 50 45 4e 44 rithm);..LAPPEND
4340: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 _STR(interp, res
4350: 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75 ultObj, "signatu
4360: 72 65 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 reAlgorithm", OB
4370: 4a 5f 6e 69 64 32 6c 6e 28 73 69 67 5f 6e 69 64 J_nid2ln(sig_nid
4380: 29 2c 20 2d 31 29 3b 0a 09 69 66 20 28 73 69 67 ), -1);..if (sig
4390: 5f 6e 69 64 20 21 3d 20 4e 49 44 5f 75 6e 64 65 _nid != NID_unde
43a0: 66 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c f) {.#if OPENSSL
43b0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
43c0: 3c 20 30 78 34 30 31 30 30 30 30 30 4c 0a 09 20 < 0x40100000L..
43d0: 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 LAPPEND_OBJ(i
43e0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
43f0: 2c 20 22 73 69 67 6e 61 74 75 72 65 56 61 6c 75 , "signatureValu
4400: 65 22 2c 0a 09 09 53 74 72 69 6e 67 5f 74 6f 5f e",...String_to_
4410: 48 65 78 28 41 53 4e 31 5f 53 54 52 49 4e 47 5f Hex(ASN1_STRING_
4420: 67 65 74 30 5f 64 61 74 61 28 73 69 67 29 2c 20 get0_data(sig),
4430: 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 ASN1_STRING_leng
4440: 74 68 28 73 69 67 29 29 29 3b 0a 23 65 6c 73 65 th(sig)));.#else
4450: 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 .. LAPPEND_OB
4460: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 J(interp, result
4470: 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75 72 65 56 Obj, "signatureV
4480: 61 6c 75 65 22 2c 0a 09 09 53 74 72 69 6e 67 5f alue",...String_
4490: 74 6f 5f 48 65 78 28 41 53 4e 31 5f 53 54 52 49 to_Hex(ASN1_STRI
44a0: 4e 47 5f 67 65 74 30 5f 64 61 74 61 28 73 69 67 NG_get0_data(sig
44b0: 29 2c 20 28 69 6e 74 29 41 53 4e 31 5f 53 54 52 ), (int)ASN1_STR
44c0: 49 4e 47 5f 67 65 74 5f 6c 65 6e 67 74 68 28 73 ING_get_length(s
44d0: 69 67 29 29 29 3b 0a 23 65 6e 64 69 66 0a 09 7d ig)));.#endif..}
44e0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 4c 41 50 else {.. LAP
44f0: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
4500: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 resultObj, "sig
4510: 6e 61 74 75 72 65 56 61 6c 75 65 22 2c 20 22 22 natureValue", ""
4520: 2c 20 30 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a , 0);..}. }..
4530: 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 20 6f /* Version o
4540: 66 20 74 68 65 20 65 6e 63 6f 64 65 64 20 63 65 f the encoded ce
4550: 72 74 69 66 69 63 61 74 65 20 2d 20 52 46 43 20 rtificate - RFC
4560: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 5280 section 4.1
4570: 2e 32 2e 31 20 2a 2f 0a 20 20 20 20 4c 41 50 50 .2.1 */. LAPP
4580: 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c END_LONG(interp,
4590: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 76 65 72 resultObj, "ver
45a0: 73 69 6f 6e 22 2c 20 58 35 30 39 5f 67 65 74 5f sion", X509_get_
45b0: 76 65 72 73 69 6f 6e 28 63 65 72 74 29 2b 31 29 version(cert)+1)
45c0: 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 ;.. /* Unique
45d0: 20 6e 75 6d 62 65 72 20 61 73 73 69 67 6e 65 64 number assigned
45e0: 20 62 79 20 43 41 20 74 6f 20 63 65 72 74 69 66 by CA to certif
45f0: 69 63 61 74 65 20 2d 20 52 46 43 20 35 32 38 30 icate - RFC 5280
4600: 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 32 section 4.1.2.2
4610: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 */. len = BI
4620: 4f 5f 74 6f 5f 42 75 66 66 65 72 28 69 32 61 5f O_to_Buffer(i2a_
4630: 41 53 4e 31 5f 49 4e 54 45 47 45 52 28 62 69 6f ASN1_INTEGER(bio
4640: 2c 20 58 35 30 39 5f 67 65 74 30 5f 73 65 72 69 , X509_get0_seri
4650: 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 29 2c alNumber(cert)),
4660: 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 bio, buffer, BU
4670: 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 FSIZ);. LAPPE
4680: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 ND_STR(interp, r
4690: 65 73 75 6c 74 4f 62 6a 2c 20 22 73 65 72 69 61 esultObj, "seria
46a0: 6c 4e 75 6d 62 65 72 22 2c 20 62 75 66 66 65 72 lNumber", buffer
46b0: 2c 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 , len);.. /*
46c0: 53 69 67 6e 61 74 75 72 65 20 61 6c 67 6f 72 69 Signature algori
46d0: 74 68 6d 20 75 73 65 64 20 62 79 20 74 68 65 20 thm used by the
46e0: 43 41 20 74 6f 20 73 69 67 6e 20 74 68 65 20 63 CA to sign the c
46f0: 65 72 74 69 66 69 63 61 74 65 2e 20 4d 75 73 74 ertificate. Must
4700: 20 6d 61 74 63 68 0a 09 73 69 67 6e 61 74 75 72 match..signatur
4710: 65 41 6c 67 6f 72 69 74 68 6d 2e 20 52 46 43 20 eAlgorithm. RFC
4720: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 5280 section 4.1
4730: 2e 32 2e 33 20 2a 2f 0a 20 20 20 20 4c 41 50 50 .2.3 */. LAPP
4740: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
4750: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e resultObj, "sign
4760: 61 74 75 72 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 ature", OBJ_nid2
4770: 6c 6e 28 58 35 30 39 5f 67 65 74 5f 73 69 67 6e ln(X509_get_sign
4780: 61 74 75 72 65 5f 6e 69 64 28 63 65 72 74 29 29 ature_nid(cert))
4790: 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 , -1);.. /* I
47a0: 73 73 75 65 72 20 69 64 65 6e 74 69 66 69 65 73 ssuer identifies
47b0: 20 74 68 65 20 65 6e 74 69 74 79 20 74 68 61 74 the entity that
47c0: 20 73 69 67 6e 65 64 20 61 6e 64 20 69 73 73 75 signed and issu
47d0: 65 64 20 74 68 65 20 63 65 72 74 2e 20 52 46 43 ed the cert. RFC
47e0: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 5280 section 4.
47f0: 31 2e 32 2e 34 20 2a 2f 0a 20 20 20 20 6c 65 6e 1.2.4 */. len
4800: 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 = BIO_to_Buffer
4810: 28 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e 74 (X509_NAME_print
4820: 5f 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 _ex(bio, X509_ge
4830: 74 5f 69 73 73 75 65 72 5f 6e 61 6d 65 28 63 65 t_issuer_name(ce
4840: 72 74 29 2c 20 30 2c 20 66 6c 61 67 73 29 2c 20 rt), 0, flags),
4850: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46 bio, buffer, BUF
4860: 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e SIZ);. LAPPEN
4870: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 D_STR(interp, re
4880: 73 75 6c 74 4f 62 6a 2c 20 22 69 73 73 75 65 72 sultObj, "issuer
4890: 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b ", buffer, len);
48a0: 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 .. /* Certifi
48b0: 63 61 74 65 20 76 61 6c 69 64 69 74 79 20 70 65 cate validity pe
48c0: 72 69 6f 64 20 69 73 20 74 68 65 20 69 6e 74 65 riod is the inte
48d0: 72 76 61 6c 20 74 68 65 20 43 41 20 77 61 72 72 rval the CA warr
48e0: 61 6e 74 73 20 74 68 61 74 20 69 74 20 77 69 6c ants that it wil
48f0: 6c 0a 09 6d 61 69 6e 74 61 69 6e 20 69 6e 66 6f l..maintain info
4900: 20 6f 6e 20 74 68 65 20 73 74 61 74 75 73 20 6f on the status o
4910: 66 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 f the certificat
4920: 65 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 e. RFC 5280 sect
4930: 69 6f 6e 20 34 2e 31 2e 32 2e 35 20 2a 2f 0a 20 ion 4.1.2.5 */.
4940: 20 20 20 2f 2a 20 47 65 74 20 56 61 6c 69 64 69 /* Get Validi
4950: 74 79 20 2d 20 4e 6f 74 20 42 65 66 6f 72 65 20 ty - Not Before
4960: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f */. len = BIO
4970: 5f 74 6f 5f 42 75 66 66 65 72 28 41 53 4e 31 5f _to_Buffer(ASN1_
4980: 54 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c 20 TIME_print(bio,
4990: 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74 42 65 66 X509_get0_notBef
49a0: 6f 72 65 28 63 65 72 74 29 29 2c 20 62 69 6f 2c ore(cert)), bio,
49b0: 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 buffer, BUFSIZ)
49c0: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 ;. LAPPEND_ST
49d0: 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 R(interp, result
49e0: 4f 62 6a 2c 20 22 6e 6f 74 42 65 66 6f 72 65 22 Obj, "notBefore"
49f0: 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a , buffer, len);.
4a00: 0a 20 20 20 20 2f 2a 20 47 65 74 20 56 61 6c 69 . /* Get Vali
4a10: 64 69 74 79 20 2d 20 4e 6f 74 20 41 66 74 65 72 dity - Not After
4a20: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 */. len = BI
4a30: 4f 5f 74 6f 5f 42 75 66 66 65 72 28 41 53 4e 31 O_to_Buffer(ASN1
4a40: 5f 54 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c _TIME_print(bio,
4a50: 20 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74 41 66 X509_get0_notAf
4a60: 74 65 72 28 63 65 72 74 29 29 2c 20 62 69 6f 2c ter(cert)), bio,
4a70: 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 buffer, BUFSIZ)
4a80: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 ;. LAPPEND_ST
4a90: 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 R(interp, result
4aa0: 4f 62 6a 2c 20 22 6e 6f 74 41 66 74 65 72 22 2c Obj, "notAfter",
4ab0: 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a buffer, len);..
4ac0: 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 69 /* Subject i
4ad0: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 65 6e dentifies the en
4ae0: 74 69 74 79 20 61 73 73 6f 63 69 61 74 65 64 20 tity associated
4af0: 77 69 74 68 20 74 68 65 20 70 75 62 6c 69 63 20 with the public
4b00: 6b 65 79 20 73 74 6f 72 65 64 20 69 6e 0a 09 74 key stored in..t
4b10: 68 65 20 73 75 62 6a 65 63 74 20 70 75 62 6c 69 he subject publi
4b20: 63 20 6b 65 79 20 66 69 65 6c 64 2e 20 52 46 43 c key field. RFC
4b30: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 5280 section 4.
4b40: 31 2e 32 2e 36 20 2a 2f 0a 20 20 20 20 6c 65 6e 1.2.6 */. len
4b50: 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 = BIO_to_Buffer
4b60: 28 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e 74 (X509_NAME_print
4b70: 5f 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 _ex(bio, X509_ge
4b80: 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 t_subject_name(c
4b90: 65 72 74 29 2c 20 30 2c 20 66 6c 61 67 73 29 2c ert), 0, flags),
4ba0: 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 bio, buffer, BU
4bb0: 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 FSIZ);. LAPPE
4bc0: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 ND_STR(interp, r
4bd0: 65 73 75 6c 74 4f 62 6a 2c 20 22 73 75 62 6a 65 esultObj, "subje
4be0: 63 74 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e ct", buffer, len
4bf0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 48 41 31 20 );.. /* SHA1
4c00: 44 69 67 65 73 74 20 28 46 69 6e 67 65 72 70 72 Digest (Fingerpr
4c10: 69 6e 74 29 20 6f 66 20 63 65 72 74 20 2d 20 44 int) of cert - D
4c20: 45 52 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f ER representatio
4c30: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35 30 n */. if (X50
4c40: 39 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 45 9_digest(cert, E
4c50: 56 50 5f 73 68 61 31 28 29 2c 20 28 75 6e 73 69 VP_sha1(), (unsi
4c60: 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 gned char *)buff
4c70: 65 72 2c 20 26 75 6c 65 6e 29 29 20 7b 0a 09 4c er, &ulen)) {..L
4c80: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 APPEND_OBJ(inter
4c90: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 p, resultObj, "s
4ca0: 68 61 31 5f 68 61 73 68 22 2c 20 53 74 72 69 6e ha1_hash", Strin
4cb0: 67 5f 74 6f 5f 48 65 78 28 28 63 6f 6e 73 74 20 g_to_Hex((const
4cc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
4cd0: 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20 75 6c buffer, (int) ul
4ce0: 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 en));. }..
4cf0: 20 2f 2a 20 53 48 41 32 35 36 20 44 69 67 65 73 /* SHA256 Diges
4d00: 74 20 28 46 69 6e 67 65 72 70 72 69 6e 74 29 20 t (Fingerprint)
4d10: 6f 66 20 63 65 72 74 20 2d 20 44 45 52 20 72 65 of cert - DER re
4d20: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a presentation */.
4d30: 20 20 20 20 69 66 20 28 58 35 30 39 5f 64 69 67 if (X509_dig
4d40: 65 73 74 28 63 65 72 74 2c 20 45 56 50 5f 73 68 est(cert, EVP_sh
4d50: 61 32 35 36 28 29 2c 20 28 75 6e 73 69 67 6e 65 a256(), (unsigne
4d60: 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 72 2c d char *)buffer,
4d70: 20 26 75 6c 65 6e 29 29 20 7b 0a 09 4c 41 50 50 &ulen)) {..LAPP
4d80: 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 END_OBJ(interp,
4d90: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 68 61 32 resultObj, "sha2
4da0: 35 36 5f 68 61 73 68 22 2c 20 53 74 72 69 6e 67 56_hash", String
4db0: 5f 74 6f 5f 48 65 78 28 28 63 6f 6e 73 74 20 75 _to_Hex((const u
4dc0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 nsigned char *)b
4dd0: 75 66 66 65 72 2c 20 28 69 6e 74 29 20 75 6c 65 uffer, (int) ule
4de0: 6e 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 n));. }..
4df0: 2f 2a 20 53 75 62 6a 65 63 74 20 50 75 62 6c 69 /* Subject Publi
4e00: 63 20 4b 65 79 20 49 6e 66 6f 20 73 70 65 63 69 c Key Info speci
4e10: 66 69 65 73 20 74 68 65 20 70 75 62 6c 69 63 20 fies the public
4e20: 6b 65 79 20 61 6e 64 20 69 64 65 6e 74 69 66 69 key and identifi
4e30: 65 73 20 74 68 65 0a 09 61 6c 67 6f 72 69 74 68 es the..algorith
4e40: 6d 20 77 69 74 68 20 77 68 69 63 68 20 74 68 65 m with which the
4e50: 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 52 46 key is used. RF
4e60: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 C 5280 section 4
4e70: 2e 31 2e 32 2e 37 20 2a 2f 0a 20 20 20 20 69 66 .1.2.7 */. if
4e80: 20 28 58 35 30 39 5f 67 65 74 5f 73 69 67 6e 61 (X509_get_signa
4e90: 74 75 72 65 5f 69 6e 66 6f 28 63 65 72 74 2c 20 ture_info(cert,
4ea0: 26 6d 64 6e 69 64 2c 20 26 70 6b 6e 69 64 2c 20 &mdnid, &pknid,
4eb0: 26 62 69 74 73 2c 20 26 78 66 6c 61 67 73 29 29 &bits, &xflags))
4ec0: 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 {.#if OPENSSL_V
4ed0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
4ee0: 30 78 34 30 30 30 30 30 30 30 4c 0a 09 41 53 4e 0x40000000L..ASN
4ef0: 31 5f 42 49 54 5f 53 54 52 49 4e 47 20 2a 6b 65 1_BIT_STRING *ke
4f00: 79 3b 0a 23 65 6c 73 65 0a 09 63 6f 6e 73 74 20 y;.#else..const
4f10: 41 53 4e 31 5f 42 49 54 5f 53 54 52 49 4e 47 20 ASN1_BIT_STRING
4f20: 2a 6b 65 79 3b 0a 23 65 6e 64 69 66 0a 09 75 6e *key;.#endif..un
4f30: 73 69 67 6e 65 64 20 69 6e 74 20 6e 3b 0a 0a 09 signed int n;...
4f40: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
4f50: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
4f60: 73 69 67 6e 69 6e 67 44 69 67 65 73 74 22 2c 20 signingDigest",
4f70: 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6d 64 6e 69 64 OBJ_nid2ln(mdnid
4f80: 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 ), -1);..LAPPEND
4f90: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 _STR(interp, res
4fa0: 75 6c 74 4f 62 6a 2c 20 22 70 75 62 6c 69 63 4b ultObj, "publicK
4fb0: 65 79 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 eyAlgorithm", OB
4fc0: 4a 5f 6e 69 64 32 6c 6e 28 70 6b 6e 69 64 29 2c J_nid2ln(pknid),
4fd0: 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 -1);..LAPPEND_I
4fe0: 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c NT(interp, resul
4ff0: 74 4f 62 6a 2c 20 22 62 69 74 73 22 2c 20 62 69 tObj, "bits", bi
5000: 74 73 29 3b 20 2f 2a 20 45 66 66 65 63 74 69 76 ts); /* Effectiv
5010: 65 20 73 65 63 75 72 69 74 79 20 62 69 74 73 20 e security bits
5020: 2a 2f 0a 0a 09 6b 65 79 20 3d 20 58 35 30 39 5f */...key = X509_
5030: 67 65 74 30 5f 70 75 62 6b 65 79 5f 62 69 74 73 get0_pubkey_bits
5040: 74 72 28 63 65 72 74 29 3b 0a 23 69 66 20 4f 50 tr(cert);.#if OP
5050: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
5060: 4d 42 45 52 20 3c 20 30 78 34 30 31 30 30 30 30 MBER < 0x4010000
5070: 30 4c 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 0L..LAPPEND_OBJ(
5080: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
5090: 6a 2c 20 22 70 75 62 6c 69 63 4b 65 79 22 2c 0a j, "publicKey",.
50a0: 09 20 20 20 20 53 74 72 69 6e 67 5f 74 6f 5f 48 . String_to_H
50b0: 65 78 28 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67 ex(ASN1_STRING_g
50c0: 65 74 30 5f 64 61 74 61 28 6b 65 79 29 2c 0a 09 et0_data(key),..
50d0: 20 20 20 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f ASN1_STRING_
50e0: 6c 65 6e 67 74 68 28 6b 65 79 29 29 29 3b 0a 23 length(key)));.#
50f0: 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 else..LAPPEND_OB
5100: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 J(interp, result
5110: 4f 62 6a 2c 20 22 70 75 62 6c 69 63 4b 65 79 22 Obj, "publicKey"
5120: 2c 0a 09 20 20 20 20 53 74 72 69 6e 67 5f 74 6f ,.. String_to
5130: 5f 48 65 78 28 41 53 4e 31 5f 53 54 52 49 4e 47 _Hex(ASN1_STRING
5140: 5f 67 65 74 30 5f 64 61 74 61 28 6b 65 79 29 2c _get0_data(key),
5150: 0a 09 20 20 20 20 28 69 6e 74 29 41 53 4e 31 5f .. (int)ASN1_
5160: 53 54 52 49 4e 47 5f 67 65 74 5f 6c 65 6e 67 74 STRING_get_lengt
5170: 68 28 6b 65 79 29 29 29 3b 0a 23 65 6e 64 69 66 h(key)));.#endif
5180: 0a 0a 09 69 66 20 28 58 35 30 39 5f 70 75 62 6b ...if (X509_pubk
5190: 65 79 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 ey_digest(cert,
51a0: 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74 62 79 EVP_get_digestby
51b0: 6e 69 64 28 70 6b 6e 69 64 29 2c 20 28 75 6e 73 nid(pknid), (uns
51c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 igned char *)buf
51d0: 66 65 72 2c 20 26 6e 29 29 20 7b 0a 09 20 20 20 fer, &n)) {..
51e0: 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 LAPPEND_OBJ(int
51f0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
5200: 22 70 75 62 6c 69 63 4b 65 79 48 61 73 68 22 2c "publicKeyHash",
5210: 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 28 String_to_Hex((
5220: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
5230: 68 61 72 20 2a 29 62 75 66 66 65 72 2c 20 28 69 har *)buffer, (i
5240: 6e 74 29 20 6e 29 29 3b 0a 09 7d 20 65 6c 73 65 nt) n));..} else
5250: 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f {.. LAPPEND_
5260: 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 STR(interp, resu
5270: 6c 74 4f 62 6a 2c 20 22 70 75 62 6c 69 63 4b 65 ltObj, "publicKe
5280: 79 48 61 73 68 22 2c 20 22 22 2c 20 30 29 3b 0a yHash", "", 0);.
5290: 09 7d 0a 0a 09 2f 2a 20 64 69 67 65 73 74 20 6f .}.../* digest o
52a0: 66 20 74 68 65 20 44 45 52 20 72 65 70 72 65 73 f the DER repres
52b0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 entation of the
52c0: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 certificate */..
52d0: 69 66 20 28 58 35 30 39 5f 64 69 67 65 73 74 28 if (X509_digest(
52e0: 63 65 72 74 2c 20 45 56 50 5f 67 65 74 5f 64 69 cert, EVP_get_di
52f0: 67 65 73 74 62 79 6e 69 64 28 6d 64 6e 69 64 29 gestbynid(mdnid)
5300: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 , (unsigned char
5310: 20 2a 29 62 75 66 66 65 72 2c 20 26 6e 29 29 20 *)buffer, &n))
5320: 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f {.. LAPPEND_O
5330: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c BJ(interp, resul
5340: 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75 72 65 tObj, "signature
5350: 48 61 73 68 22 2c 20 53 74 72 69 6e 67 5f 74 6f Hash", String_to
5360: 5f 48 65 78 28 28 63 6f 6e 73 74 20 75 6e 73 69 _Hex((const unsi
5370: 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 gned char *)buff
5380: 65 72 2c 20 28 69 6e 74 29 20 6e 29 29 3b 0a 09 er, (int) n));..
5390: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 4c 41 } else {.. LA
53a0: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
53b0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 , resultObj, "si
53c0: 67 6e 61 74 75 72 65 48 61 73 68 22 2c 20 22 22 gnatureHash", ""
53d0: 2c 20 30 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a , 0);..}. }..
53e0: 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63 61 /* Certifica
53f0: 74 65 20 50 75 72 70 6f 73 65 2e 20 43 61 6c 6c te Purpose. Call
5400: 20 62 65 66 6f 72 65 20 63 68 65 63 6b 69 6e 67 before checking
5410: 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e for extensions.
5420: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f */. LAPPEND_
5430: 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 STR(interp, resu
5440: 6c 74 4f 62 6a 2c 20 22 70 75 72 70 6f 73 65 22 ltObj, "purpose"
5450: 2c 20 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 , Tls_x509Purpos
5460: 65 28 63 65 72 74 29 2c 20 2d 31 29 3b 0a 20 20 e(cert), -1);.
5470: 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e LAPPEND_OBJ(in
5480: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
5490: 20 22 63 65 72 74 69 66 69 63 61 74 65 50 75 72 "certificatePur
54a0: 70 6f 73 65 22 2c 20 54 6c 73 5f 78 35 30 39 50 pose", Tls_x509P
54b0: 75 72 70 6f 73 65 73 28 69 6e 74 65 72 70 2c 20 urposes(interp,
54c0: 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 cert));.. /*
54d0: 47 65 74 20 65 78 74 65 6e 73 69 6f 6e 73 20 66 Get extensions f
54e0: 6c 61 67 73 20 2a 2f 0a 20 20 20 20 78 66 6c 61 lags */. xfla
54f0: 67 73 20 3d 20 58 35 30 39 5f 67 65 74 5f 65 78 gs = X509_get_ex
5500: 74 65 6e 73 69 6f 6e 5f 66 6c 61 67 73 28 63 65 tension_flags(ce
5510: 72 74 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 rt);. LAPPEND
5520: 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 73 _INT(interp, res
5530: 75 6c 74 4f 62 6a 2c 20 22 65 78 74 46 6c 61 67 ultObj, "extFlag
5540: 73 22 2c 20 78 66 6c 61 67 73 29 3b 0a 0a 09 2f s", xflags);.../
5550: 2a 20 43 68 65 63 6b 20 69 66 20 63 65 72 74 20 * Check if cert
5560: 77 61 73 20 69 73 73 75 65 64 20 62 79 20 43 41 was issued by CA
5570: 20 63 65 72 74 20 69 73 73 75 65 72 20 6f 72 20 cert issuer or
5580: 73 65 6c 66 20 73 69 67 6e 65 64 20 2a 2f 0a 20 self signed */.
5590: 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 LAPPEND_BOOL(
55a0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
55b0: 6a 2c 20 22 73 65 6c 66 49 73 73 75 65 64 22 2c j, "selfIssued",
55c0: 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 xflags & EXFLAG
55d0: 5f 53 49 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e _SI);. LAPPEN
55e0: 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 D_BOOL(interp, r
55f0: 65 73 75 6c 74 4f 62 6a 2c 20 22 73 65 6c 66 53 esultObj, "selfS
5600: 69 67 6e 65 64 22 2c 20 78 66 6c 61 67 73 20 26 igned", xflags &
5610: 20 45 58 46 4c 41 47 5f 53 53 29 3b 0a 20 20 20 EXFLAG_SS);.
5620: 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e LAPPEND_BOOL(in
5630: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
5640: 20 22 69 73 50 72 6f 78 79 43 65 72 74 22 2c 20 "isProxyCert",
5650: 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f xflags & EXFLAG_
5660: 50 52 4f 58 59 29 3b 0a 20 20 20 20 4c 41 50 50 PROXY);. LAPP
5670: 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
5680: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74 resultObj, "ext
5690: 49 6e 76 61 6c 69 64 22 2c 20 78 66 6c 61 67 73 Invalid", xflags
56a0: 20 26 20 45 58 46 4c 41 47 5f 49 4e 56 41 4c 49 & EXFLAG_INVALI
56b0: 44 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f D);. LAPPEND_
56c0: 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 BOOL(interp, res
56d0: 75 6c 74 4f 62 6a 2c 20 22 69 73 43 41 43 65 72 ultObj, "isCACer
56e0: 74 22 2c 20 58 35 30 39 5f 63 68 65 63 6b 5f 63 t", X509_check_c
56f0: 61 28 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f a(cert));.. /
5700: 2a 20 54 68 65 20 55 6e 69 71 75 65 20 49 64 73 * The Unique Ids
5710: 20 61 72 65 20 75 73 65 64 20 74 6f 20 68 61 6e are used to han
5720: 64 6c 65 20 74 68 65 20 70 6f 73 73 69 62 69 6c dle the possibil
5730: 69 74 79 20 6f 66 20 72 65 75 73 65 20 6f 66 20 ity of reuse of
5740: 73 75 62 6a 65 63 74 0a 09 61 6e 64 2f 6f 72 20 subject..and/or
5750: 69 73 73 75 65 72 20 6e 61 6d 65 73 20 6f 76 65 issuer names ove
5760: 72 20 74 69 6d 65 2e 20 52 46 43 20 35 32 38 30 r time. RFC 5280
5770: 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 38 section 4.1.2.8
5780: 20 2a 2f 0a 20 20 20 20 7b 0a 09 63 6f 6e 73 74 */. {..const
5790: 20 41 53 4e 31 5f 42 49 54 5f 53 54 52 49 4e 47 ASN1_BIT_STRING
57a0: 20 2a 69 75 69 64 2c 20 2a 73 75 69 64 3b 0a 09 *iuid, *suid;..
57b0: 58 35 30 39 5f 67 65 74 30 5f 75 69 64 73 28 63 X509_get0_uids(c
57c0: 65 72 74 2c 20 26 69 75 69 64 2c 20 26 73 75 69 ert, &iuid, &sui
57d0: 64 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 d);...Tcl_ListOb
57e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
57f0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
5800: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
5810: 62 6a 28 22 69 73 73 75 65 72 55 6e 69 71 75 65 bj("issuerUnique
5820: 49 64 22 2c 20 2d 31 29 29 3b 0a 09 69 66 20 28 Id", -1));..if (
5830: 69 75 69 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a iuid != NULL) {.
5840: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
5850: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 34 ION_NUMBER < 0x4
5860: 30 31 30 30 30 30 30 4c 0a 09 20 20 20 20 54 63 0100000L.. Tc
5870: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
5880: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 lement(interp, r
5890: 65 73 75 6c 74 4f 62 6a 2c 0a 09 09 54 63 6c 5f esultObj,...Tcl_
58a0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 NewByteArrayObj(
58b0: 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74 30 ASN1_STRING_get0
58c0: 5f 64 61 74 61 28 69 75 69 64 29 2c 0a 09 09 28 _data(iuid),...(
58d0: 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31 5f 53 Tcl_Size) ASN1_S
58e0: 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 69 75 69 TRING_length(iui
58f0: 64 29 29 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 d)));.#else..
5900: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5910: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5920: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 0a 09 09 54 , resultObj,...T
5930: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f cl_NewByteArrayO
5940: 62 6a 28 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67 bj(ASN1_STRING_g
5950: 65 74 30 5f 64 61 74 61 28 69 75 69 64 29 2c 0a et0_data(iuid),.
5960: 09 09 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e ..(Tcl_Size) ASN
5970: 31 5f 53 54 52 49 4e 47 5f 67 65 74 5f 6c 65 6e 1_STRING_get_len
5980: 67 74 68 28 69 75 69 64 29 29 29 3b 0a 23 65 6e gth(iuid)));.#en
5990: 64 69 66 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 dif..} else {..
59a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
59b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
59c0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 rp, resultObj, T
59d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
59e0: 22 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 0a 09 54 "", -1));..}...T
59f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
5a00: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
5a10: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e resultObj, Tcl_N
5a20: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 75 62 ewStringObj("sub
5a30: 6a 65 63 74 55 6e 69 71 75 65 49 64 22 2c 20 2d jectUniqueId", -
5a40: 31 29 29 3b 0a 09 69 66 20 28 73 75 69 64 20 21 1));..if (suid !
5a50: 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 20 4f 50 = NULL) {.#if OP
5a60: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
5a70: 4d 42 45 52 20 3c 20 30 78 34 30 31 30 30 30 30 MBER < 0x4010000
5a80: 30 4c 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 0L.. Tcl_List
5a90: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
5aa0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
5ab0: 62 6a 2c 0a 09 09 54 63 6c 5f 4e 65 77 42 79 74 bj,...Tcl_NewByt
5ac0: 65 41 72 72 61 79 4f 62 6a 28 41 53 4e 31 5f 53 eArrayObj(ASN1_S
5ad0: 54 52 49 4e 47 5f 67 65 74 30 5f 64 61 74 61 28 TRING_get0_data(
5ae0: 73 75 69 64 29 2c 0a 09 09 28 54 63 6c 5f 53 69 suid),...(Tcl_Si
5af0: 7a 65 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f ze) ASN1_STRING_
5b00: 6c 65 6e 67 74 68 28 73 75 69 64 29 29 29 3b 0a length(suid)));.
5b10: 23 65 6c 73 65 0a 09 20 20 20 20 54 63 6c 5f 4c #else.. Tcl_L
5b20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5b30: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 ent(interp, resu
5b40: 6c 74 4f 62 6a 2c 0a 09 09 54 63 6c 5f 4e 65 77 ltObj,...Tcl_New
5b50: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 41 53 4e ByteArrayObj(ASN
5b60: 31 5f 53 54 52 49 4e 47 5f 67 65 74 30 5f 64 61 1_STRING_get0_da
5b70: 74 61 28 73 75 69 64 29 2c 0a 09 09 28 54 63 6c ta(suid),...(Tcl
5b80: 5f 53 69 7a 65 29 20 41 53 4e 31 5f 53 54 52 49 _Size) ASN1_STRI
5b90: 4e 47 5f 67 65 74 5f 6c 65 6e 67 74 68 28 73 75 NG_get_length(su
5ba0: 69 64 29 29 29 3b 0a 23 65 6e 64 69 66 0a 09 7d id)));.#endif..}
5bb0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c else {.. Tcl
5bc0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
5bd0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 ement(interp, re
5be0: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 sultObj, Tcl_New
5bf0: 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 StringObj("", -1
5c00: 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 ));..}. }..
5c10: 20 20 2f 2a 20 58 35 30 39 20 76 33 20 45 78 74 /* X509 v3 Ext
5c20: 65 6e 73 69 6f 6e 73 20 2d 20 52 46 43 20 35 32 ensions - RFC 52
5c30: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 80 section 4.1.2
5c40: 2e 39 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e .9 */. LAPPEN
5c50: 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 D_INT(interp, re
5c60: 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74 43 6f 75 sultObj, "extCou
5c70: 6e 74 22 2c 20 58 35 30 39 5f 67 65 74 5f 65 78 nt", X509_get_ex
5c80: 74 5f 63 6f 75 6e 74 28 63 65 72 74 29 29 3b 0a t_count(cert));.
5c90: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 LAPPEND_OBJ(
5ca0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
5cb0: 6a 2c 20 22 65 78 74 65 6e 73 69 6f 6e 73 22 2c j, "extensions",
5cc0: 20 54 6c 73 5f 78 35 30 39 45 78 74 65 6e 73 69 Tls_x509Extensi
5cd0: 6f 6e 73 28 69 6e 74 65 72 70 2c 20 63 65 72 74 ons(interp, cert
5ce0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 75 74 68 ));.. /* Auth
5cf0: 6f 72 69 74 79 20 4b 65 79 20 49 64 65 6e 74 69 ority Key Identi
5d00: 66 69 65 72 20 28 41 4b 49 29 20 69 73 20 74 68 fier (AKI) is th
5d10: 65 20 53 75 62 6a 65 63 74 20 4b 65 79 20 49 64 e Subject Key Id
5d20: 65 6e 74 69 66 69 65 72 20 28 53 4b 49 29 20 6f entifier (SKI) o
5d30: 66 0a 09 69 74 73 20 73 69 67 6e 65 72 20 28 74 f..its signer (t
5d40: 68 65 20 43 41 29 2e 20 52 46 43 20 35 32 38 30 he CA). RFC 5280
5d50: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 section 4.2.1.1
5d60: 2c 20 4e 49 44 5f 61 75 74 68 6f 72 69 74 79 5f , NID_authority_
5d70: 6b 65 79 5f 69 64 65 6e 74 69 66 69 65 72 20 2a key_identifier *
5d80: 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 /. LAPPEND_OB
5d90: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 J(interp, result
5da0: 4f 62 6a 2c 20 22 61 75 74 68 6f 72 69 74 79 4b Obj, "authorityK
5db0: 65 79 49 64 65 6e 74 69 66 69 65 72 22 2c 0a 09 eyIdentifier",..
5dc0: 54 6c 73 5f 78 35 30 39 49 64 65 6e 74 69 66 69 Tls_x509Identifi
5dd0: 65 72 28 58 35 30 39 5f 67 65 74 30 5f 61 75 74 er(X509_get0_aut
5de0: 68 6f 72 69 74 79 5f 6b 65 79 5f 69 64 28 63 65 hority_key_id(ce
5df0: 72 74 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 rt)));.. /* S
5e00: 75 62 6a 65 63 74 20 4b 65 79 20 49 64 65 6e 74 ubject Key Ident
5e10: 69 66 69 65 72 20 28 53 4b 49 29 20 69 73 20 75 ifier (SKI) is u
5e20: 73 65 64 20 74 6f 20 69 64 65 6e 74 69 66 79 20 sed to identify
5e30: 63 65 72 74 69 66 69 63 61 74 65 73 20 74 68 61 certificates tha
5e40: 74 20 63 6f 6e 74 61 69 6e 0a 09 61 20 70 61 72 t contain..a par
5e50: 74 69 63 75 6c 61 72 20 70 75 62 6c 69 63 20 6b ticular public k
5e60: 65 79 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 ey. RFC 5280 sec
5e70: 74 69 6f 6e 20 34 2e 32 2e 31 2e 32 2c 20 4e 49 tion 4.2.1.2, NI
5e80: 44 5f 73 75 62 6a 65 63 74 5f 6b 65 79 5f 69 64 D_subject_key_id
5e90: 65 6e 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 entifier */.
5ea0: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 LAPPEND_OBJ(inte
5eb0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
5ec0: 73 75 62 6a 65 63 74 4b 65 79 49 64 65 6e 74 69 subjectKeyIdenti
5ed0: 66 69 65 72 22 2c 0a 09 54 6c 73 5f 78 35 30 39 fier",..Tls_x509
5ee0: 49 64 65 6e 74 69 66 69 65 72 28 58 35 30 39 5f Identifier(X509_
5ef0: 67 65 74 30 5f 73 75 62 6a 65 63 74 5f 6b 65 79 get0_subject_key
5f00: 5f 69 64 28 63 65 72 74 29 29 29 3b 0a 0a 20 20 _id(cert)));..
5f10: 20 20 2f 2a 20 4b 65 79 20 75 73 61 67 65 20 65 /* Key usage e
5f20: 78 74 65 6e 73 69 6f 6e 20 64 65 66 69 6e 65 73 xtension defines
5f30: 20 74 68 65 20 70 75 72 70 6f 73 65 20 28 65 2e the purpose (e.
5f40: 67 2e 2c 20 65 6e 63 69 70 68 65 72 6d 65 6e 74 g., encipherment
5f50: 2c 20 73 69 67 6e 61 74 75 72 65 2c 20 63 65 72 , signature, cer
5f60: 74 69 66 69 63 61 74 65 0a 09 73 69 67 6e 69 6e tificate..signin
5f70: 67 29 20 6f 66 20 74 68 65 20 6b 65 79 20 69 6e g) of the key in
5f80: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
5f90: 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 . RFC 5280 secti
5fa0: 6f 6e 20 34 2e 32 2e 31 2e 33 2c 20 4e 49 44 5f on 4.2.1.3, NID_
5fb0: 6b 65 79 5f 75 73 61 67 65 20 2a 2f 0a 20 20 20 key_usage */.
5fc0: 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 LAPPEND_OBJ(int
5fd0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
5fe0: 22 6b 65 79 55 73 61 67 65 22 2c 20 54 6c 73 5f "keyUsage", Tls_
5ff0: 78 35 30 39 4b 65 79 55 73 61 67 65 28 69 6e 74 x509KeyUsage(int
6000: 65 72 70 2c 20 63 65 72 74 2c 20 78 66 6c 61 67 erp, cert, xflag
6010: 73 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 65 72 s));.. /* Cer
6020: 74 69 66 69 63 61 74 65 20 50 6f 6c 69 63 69 65 tificate Policie
6030: 73 20 2d 20 69 6e 64 69 63 61 74 65 73 20 74 68 s - indicates th
6040: 65 20 69 73 73 75 69 6e 67 20 43 41 20 63 6f 6e e issuing CA con
6050: 73 69 64 65 72 73 20 69 74 73 20 69 73 73 75 65 siders its issue
6060: 72 44 6f 6d 61 69 6e 50 6f 6c 69 63 79 0a 09 65 rDomainPolicy..e
6070: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 quivalent to the
6080: 20 73 75 62 6a 65 63 74 20 43 41 27 73 20 73 75 subject CA's su
6090: 62 6a 65 63 74 44 6f 6d 61 69 6e 50 6f 6c 69 63 bjectDomainPolic
60a0: 79 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 y. RFC 5280 sect
60b0: 69 6f 6e 20 34 2e 32 2e 31 2e 34 2c 20 4e 49 44 ion 4.2.1.4, NID
60c0: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 70 6f 6c _certificate_pol
60d0: 69 63 69 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 icies */. if
60e0: 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 (xflags & EXFLAG
60f0: 5f 49 4e 56 41 4c 49 44 5f 50 4f 4c 49 43 59 29 _INVALID_POLICY)
6100: 20 7b 0a 09 2f 2a 20 52 65 6a 65 63 74 20 63 65 {../* Reject ce
6110: 72 74 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 rt */. }..
6120: 20 2f 2a 20 50 6f 6c 69 63 79 20 4d 61 70 70 69 /* Policy Mappi
6130: 6e 67 73 20 2d 20 52 46 43 20 35 32 38 30 20 73 ngs - RFC 5280 s
6140: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 35 2c 20 ection 4.2.1.5,
6150: 4e 49 44 5f 70 6f 6c 69 63 79 5f 6d 61 70 70 69 NID_policy_mappi
6160: 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 ngs */.. /* S
6170: 75 62 6a 65 63 74 20 41 6c 74 65 72 6e 61 74 69 ubject Alternati
6180: 76 65 20 4e 61 6d 65 20 28 53 41 4e 29 20 63 6f ve Name (SAN) co
6190: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 ntains additiona
61a0: 6c 20 55 52 4c 73 2c 20 44 4e 53 20 6e 61 6d 65 l URLs, DNS name
61b0: 73 2c 20 6f 72 20 49 50 0a 09 61 64 64 72 65 73 s, or IP..addres
61c0: 73 65 73 20 62 6f 75 6e 64 20 74 6f 20 63 65 72 ses bound to cer
61d0: 74 69 66 69 63 61 74 65 2e 20 52 46 43 20 35 32 tificate. RFC 52
61e0: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 80 section 4.2.1
61f0: 2e 36 2c 20 4e 49 44 5f 73 75 62 6a 65 63 74 5f .6, NID_subject_
6200: 61 6c 74 5f 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 alt_name */.
6210: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 LAPPEND_OBJ(inte
6220: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
6230: 73 75 62 6a 65 63 74 41 6c 74 4e 61 6d 65 22 2c subjectAltName",
6240: 20 54 6c 73 5f 78 35 30 39 4e 61 6d 65 73 28 69 Tls_x509Names(i
6250: 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 4e 49 44 nterp, cert, NID
6260: 5f 73 75 62 6a 65 63 74 5f 61 6c 74 5f 6e 61 6d _subject_alt_nam
6270: 65 2c 20 62 69 6f 29 29 3b 0a 0a 20 20 20 20 2f e, bio));.. /
6280: 2a 20 49 73 73 75 65 72 20 41 6c 74 65 72 6e 61 * Issuer Alterna
6290: 74 69 76 65 20 4e 61 6d 65 20 69 73 20 75 73 65 tive Name is use
62a0: 64 20 74 6f 20 61 73 73 6f 63 69 61 74 65 20 49 d to associate I
62b0: 6e 74 65 72 6e 65 74 20 73 74 79 6c 65 20 69 64 nternet style id
62c0: 65 6e 74 69 74 69 65 73 0a 09 77 69 74 68 20 74 entities..with t
62d0: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69 he certificate i
62e0: 73 73 75 65 72 2e 20 52 46 43 20 35 32 38 30 20 ssuer. RFC 5280
62f0: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 37 2c section 4.2.1.7,
6300: 20 4e 49 44 5f 69 73 73 75 65 72 5f 61 6c 74 5f NID_issuer_alt_
6310: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 name */. LAPP
6320: 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 END_OBJ(interp,
6330: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 69 73 73 75 resultObj, "issu
6340: 65 72 41 6c 74 4e 61 6d 65 22 2c 20 54 6c 73 5f erAltName", Tls_
6350: 78 35 30 39 4e 61 6d 65 73 28 69 6e 74 65 72 70 x509Names(interp
6360: 2c 20 63 65 72 74 2c 20 4e 49 44 5f 69 73 73 75 , cert, NID_issu
6370: 65 72 5f 61 6c 74 5f 6e 61 6d 65 2c 20 62 69 6f er_alt_name, bio
6380: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a ));.. /* Subj
6390: 65 63 74 20 44 69 72 65 63 74 6f 72 79 20 41 74 ect Directory At
63a0: 74 72 69 62 75 74 65 73 20 70 72 6f 76 69 64 65 tributes provide
63b0: 73 20 69 64 65 6e 74 69 66 69 63 61 74 69 6f 6e s identification
63c0: 20 61 74 74 72 69 62 75 74 65 73 20 28 65 2e 67 attributes (e.g
63d0: 2e 2c 20 6e 61 74 69 6f 6e 61 6c 69 74 79 29 0a ., nationality).
63e0: 09 6f 66 20 74 68 65 20 73 75 62 6a 65 63 74 2e .of the subject.
63f0: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f RFC 5280 sectio
6400: 6e 20 34 2e 32 2e 31 2e 38 20 28 73 75 62 6a 65 n 4.2.1.8 (subje
6410: 63 74 44 69 72 65 63 74 6f 72 79 41 74 74 72 69 ctDirectoryAttri
6420: 62 75 74 65 73 29 20 2a 2f 0a 0a 20 20 20 20 2f butes) */.. /
6430: 2a 20 42 61 73 69 63 20 43 6f 6e 73 74 72 61 69 * Basic Constrai
6440: 6e 74 73 20 69 64 65 6e 74 69 66 69 65 73 20 77 nts identifies w
6450: 68 65 74 68 65 72 20 74 68 65 20 73 75 62 6a 65 hether the subje
6460: 63 74 20 6f 66 20 74 68 65 20 63 65 72 74 20 69 ct of the cert i
6470: 73 20 61 20 43 41 20 61 6e 64 0a 09 74 68 65 20 s a CA and..the
6480: 6d 61 78 20 64 65 70 74 68 20 6f 66 20 76 61 6c max depth of val
6490: 69 64 20 63 65 72 74 20 70 61 74 68 73 20 66 6f id cert paths fo
64a0: 72 20 74 68 69 73 20 63 65 72 74 2e 20 52 46 43 r this cert. RFC
64b0: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 5280 section 4.
64c0: 32 2e 31 2e 39 2c 20 4e 49 44 5f 62 61 73 69 63 2.1.9, NID_basic
64d0: 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a _constraints */.
64e0: 20 20 20 20 69 66 20 28 21 28 78 66 6c 61 67 73 if (!(xflags
64f0: 20 26 20 45 58 46 4c 41 47 5f 50 52 4f 58 59 29 & EXFLAG_PROXY)
6500: 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e ) {..LAPPEND_LON
6510: 47 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 G(interp, result
6520: 4f 62 6a 2c 20 22 70 61 74 68 4c 65 6e 22 2c 20 Obj, "pathLen",
6530: 58 35 30 39 5f 67 65 74 5f 70 61 74 68 6c 65 6e X509_get_pathlen
6540: 28 63 65 72 74 29 29 3b 0a 20 20 20 20 7d 20 65 (cert));. } e
6550: 6c 73 65 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 4c lse {..LAPPEND_L
6560: 4f 4e 47 28 69 6e 74 65 72 70 2c 20 72 65 73 75 ONG(interp, resu
6570: 6c 74 4f 62 6a 2c 20 22 70 61 74 68 4c 65 6e 22 ltObj, "pathLen"
6580: 2c 20 58 35 30 39 5f 67 65 74 5f 70 72 6f 78 79 , X509_get_proxy
6590: 5f 70 61 74 68 6c 65 6e 28 63 65 72 74 29 29 3b _pathlen(cert));
65a0: 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 . }. LAPPE
65b0: 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
65c0: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 62 61 73 69 resultObj, "basi
65d0: 63 43 6f 6e 73 74 72 61 69 6e 74 73 43 41 22 2c cConstraintsCA",
65e0: 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 xflags & EXFLAG
65f0: 5f 43 41 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 61 _CA);.. /* Na
6600: 6d 65 20 43 6f 6e 73 74 72 61 69 6e 74 73 20 69 me Constraints i
6610: 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 43 s only used in C
6620: 41 20 63 65 72 74 73 20 74 6f 20 69 6e 64 69 63 A certs to indic
6630: 61 74 65 20 74 68 65 20 6e 61 6d 65 20 73 70 61 ate the name spa
6640: 63 65 20 66 6f 72 0a 09 61 6c 6c 20 73 75 62 6a ce for..all subj
6650: 65 63 74 20 6e 61 6d 65 73 20 69 6e 20 73 75 62 ect names in sub
6660: 73 65 71 75 65 6e 74 20 63 65 72 74 69 66 69 63 sequent certific
6670: 61 74 65 73 20 69 6e 20 61 20 63 65 72 74 69 66 ates in a certif
6680: 69 63 61 74 69 6f 6e 20 70 61 74 68 0a 09 4d 55 ication path..MU
6690: 53 54 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 52 ST be located. R
66a0: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 FC 5280 section
66b0: 34 2e 32 2e 31 2e 31 30 2c 20 4e 49 44 5f 6e 61 4.2.1.10, NID_na
66c0: 6d 65 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a me_constraints *
66d0: 2f 0a 0a 20 20 20 20 2f 2a 20 50 6f 6c 69 63 79 /.. /* Policy
66e0: 20 43 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20 Constraints is
66f0: 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 43 41 20 only used in CA
6700: 63 65 72 74 73 20 74 6f 20 6c 69 6d 69 74 20 74 certs to limit t
6710: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 0a 09 he length of a..
6720: 63 65 72 74 20 63 68 61 69 6e 20 66 6f 72 20 74 cert chain for t
6730: 68 61 74 20 43 41 2e 20 52 46 43 20 35 32 38 30 hat CA. RFC 5280
6740: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 section 4.2.1.1
6750: 31 2c 20 4e 49 44 5f 70 6f 6c 69 63 79 5f 63 6f 1, NID_policy_co
6760: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 nstraints */..
6770: 20 20 2f 2a 20 45 78 74 65 6e 64 65 64 20 4b 65 /* Extended Ke
6780: 79 20 55 73 61 67 65 20 69 6e 64 69 63 61 74 65 y Usage indicate
6790: 73 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 74 s the purposes t
67a0: 68 65 20 63 65 72 74 69 66 69 65 64 20 70 75 62 he certified pub
67b0: 6c 69 63 20 6b 65 79 20 6d 61 79 20 62 65 0a 09 lic key may be..
67c0: 75 73 65 64 2c 20 62 65 79 6f 6e 64 20 74 68 65 used, beyond the
67d0: 20 62 61 73 69 63 20 70 75 72 70 6f 73 65 73 2e basic purposes.
67e0: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f RFC 5280 sectio
67f0: 6e 20 34 2e 32 2e 31 2e 31 32 2c 20 4e 49 44 5f n 4.2.1.12, NID_
6800: 65 78 74 5f 6b 65 79 5f 75 73 61 67 65 20 2a 2f ext_key_usage */
6810: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a . LAPPEND_OBJ
6820: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
6830: 62 6a 2c 20 22 65 78 74 65 6e 64 65 64 4b 65 79 bj, "extendedKey
6840: 55 73 61 67 65 22 2c 20 54 6c 73 5f 78 35 30 39 Usage", Tls_x509
6850: 45 78 74 4b 65 79 55 73 61 67 65 28 69 6e 74 65 ExtKeyUsage(inte
6860: 72 70 2c 20 63 65 72 74 2c 20 78 66 6c 61 67 73 rp, cert, xflags
6870: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 52 4c 20 ));.. /* CRL
6880: 44 69 73 74 72 69 62 75 74 69 6f 6e 20 50 6f 69 Distribution Poi
6890: 6e 74 73 20 69 64 65 6e 74 69 66 69 65 73 20 77 nts identifies w
68a0: 68 65 72 65 20 43 52 4c 20 69 6e 66 6f 72 6d 61 here CRL informa
68b0: 74 69 6f 6e 20 63 61 6e 20 62 65 20 6f 62 74 61 tion can be obta
68c0: 69 6e 65 64 2e 0a 09 52 46 43 20 35 32 38 30 20 ined...RFC 5280
68d0: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 33 section 4.2.1.13
68e0: 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f */. LAPPEND_O
68f0: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c BJ(interp, resul
6900: 74 4f 62 6a 2c 20 22 63 72 6c 44 69 73 74 72 69 tObj, "crlDistri
6910: 62 75 74 69 6f 6e 50 6f 69 6e 74 73 22 2c 20 54 butionPoints", T
6920: 6c 73 5f 78 35 30 39 43 72 6c 44 70 28 69 6e 74 ls_x509CrlDp(int
6930: 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 erp, cert));..
6940: 20 20 2f 2a 20 46 72 65 73 68 65 73 74 20 43 52 /* Freshest CR
6950: 4c 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 20 L extension */.
6960: 20 20 20 69 66 20 28 78 66 6c 61 67 73 20 26 20 if (xflags &
6970: 45 58 46 4c 41 47 5f 46 52 45 53 48 45 53 54 29 EXFLAG_FRESHEST)
6980: 20 7b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a {. }.. /*
6990: 20 41 75 74 68 6f 72 69 74 79 20 49 6e 66 6f 72 Authority Infor
69a0: 6d 61 74 69 6f 6e 20 41 63 63 65 73 73 20 69 6e mation Access in
69b0: 64 69 63 61 74 65 73 20 68 6f 77 20 74 6f 20 61 dicates how to a
69c0: 63 63 65 73 73 20 69 6e 66 6f 20 61 6e 64 20 73 ccess info and s
69d0: 65 72 76 69 63 65 73 0a 09 66 6f 72 20 74 68 65 ervices..for the
69e0: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73 certificate iss
69f0: 75 65 72 2e 20 52 46 43 20 35 32 38 30 20 73 65 uer. RFC 5280 se
6a00: 63 74 69 6f 6e 20 34 2e 32 2e 32 2e 31 2c 20 4e ction 4.2.2.1, N
6a10: 49 44 5f 69 6e 66 6f 5f 61 63 63 65 73 73 20 2a ID_info_access *
6a20: 2f 0a 0a 20 20 20 20 2f 2a 20 4f 6e 2d 6c 69 6e /.. /* On-lin
6a30: 65 20 43 65 72 74 69 66 69 63 61 74 65 20 53 74 e Certificate St
6a40: 61 74 75 73 20 50 72 6f 74 6f 63 6f 6c 20 28 4f atus Protocol (O
6a50: 53 43 50 29 20 52 65 73 70 6f 6e 64 65 72 73 20 SCP) Responders
6a60: 55 52 4c 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 URL */. LAPPE
6a70: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 ND_OBJ(interp, r
6a80: 65 73 75 6c 74 4f 62 6a 2c 20 22 6f 63 73 70 52 esultObj, "ocspR
6a90: 65 73 70 6f 6e 64 65 72 73 22 2c 20 54 6c 73 5f esponders", Tls_
6aa0: 78 35 30 39 4f 73 63 70 28 69 6e 74 65 72 70 2c x509Oscp(interp,
6ab0: 20 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a cert));.. /*
6ac0: 20 43 65 72 74 69 66 69 63 61 74 65 20 41 75 74 Certificate Aut
6ad0: 68 6f 72 69 74 79 20 28 43 41 29 20 49 73 73 75 hority (CA) Issu
6ae0: 65 72 73 20 55 52 4c 20 2a 2f 0a 20 20 20 20 4c ers URL */. L
6af0: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 APPEND_OBJ(inter
6b00: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 63 p, resultObj, "c
6b10: 61 49 73 73 75 65 72 73 22 2c 20 54 6c 73 5f 78 aIssuers", Tls_x
6b20: 35 30 39 43 61 49 73 73 75 65 72 73 28 69 6e 74 509CaIssuers(int
6b30: 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 erp, cert));..
6b40: 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 49 6e 66 /* Subject Inf
6b50: 6f 72 6d 61 74 69 6f 6e 20 41 63 63 65 73 73 20 ormation Access
6b60: 2d 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 - RFC 5280 secti
6b70: 6f 6e 20 34 2e 32 2e 32 2e 32 2c 20 4e 49 44 5f on 4.2.2.2, NID_
6b80: 73 69 6e 66 6f 5f 61 63 63 65 73 73 20 2a 2f 0a sinfo_access */.
6b90: 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63 . /* Certific
6ba0: 61 74 65 20 41 6c 69 61 73 2e 20 49 66 20 75 73 ate Alias. If us
6bb0: 65 73 20 61 20 50 4b 43 53 23 31 32 20 73 74 72 es a PKCS#12 str
6bc0: 75 63 74 75 72 65 2c 20 61 6c 69 61 73 20 77 69 ucture, alias wi
6bd0: 6c 6c 20 72 65 66 6c 65 63 74 20 74 68 65 0a 09 ll reflect the..
6be0: 66 72 69 65 6e 64 6c 79 4e 61 6d 65 20 61 74 74 friendlyName att
6bf0: 72 69 62 75 74 65 20 28 52 46 43 20 32 39 38 35 ribute (RFC 2985
6c00: 29 2e 20 2a 2f 0a 20 20 20 20 7b 0a 09 69 6e 74 ). */. {..int
6c10: 20 69 6c 65 6e 20 3d 20 30 3b 0a 23 69 66 20 4f ilen = 0;.#if O
6c20: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
6c30: 55 4d 42 45 52 20 3c 20 30 78 34 30 30 30 30 30 UMBER < 0x400000
6c40: 30 30 4c 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 00L..unsigned ch
6c50: 61 72 20 2a 73 74 72 69 6e 67 20 3d 20 58 35 30 ar *string = X50
6c60: 39 5f 61 6c 69 61 73 5f 67 65 74 30 28 63 65 72 9_alias_get0(cer
6c70: 74 2c 20 26 69 6c 65 6e 29 3b 0a 23 65 6c 73 65 t, &ilen);.#else
6c80: 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 ..const unsigned
6c90: 20 63 68 61 72 20 2a 73 74 72 69 6e 67 20 3d 20 char *string =
6ca0: 58 35 30 39 5f 61 6c 69 61 73 5f 67 65 74 30 28 X509_alias_get0(
6cb0: 63 65 72 74 2c 20 26 69 6c 65 6e 29 3b 0a 23 65 cert, &ilen);.#e
6cc0: 6e 64 69 66 0a 09 4c 41 50 50 45 4e 44 5f 53 54 ndif..LAPPEND_ST
6cd0: 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 R(interp, result
6ce0: 4f 62 6a 2c 20 22 61 6c 69 61 73 22 2c 20 28 63 Obj, "alias", (c
6cf0: 68 61 72 20 2a 29 20 73 74 72 69 6e 67 2c 20 28 har *) string, (
6d00: 54 63 6c 5f 53 69 7a 65 29 20 69 6c 65 6e 29 3b Tcl_Size) ilen);
6d10: 0a 09 73 74 72 69 6e 67 20 3d 20 58 35 30 39 5f ..string = X509_
6d20: 6b 65 79 69 64 5f 67 65 74 30 28 63 65 72 74 2c keyid_get0(cert,
6d30: 20 26 69 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e &ilen);..LAPPEN
6d40: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 D_STR(interp, re
6d50: 73 75 6c 74 4f 62 6a 2c 20 22 6b 65 79 49 64 22 sultObj, "keyId"
6d60: 2c 20 28 63 68 61 72 20 2a 29 20 73 74 72 69 6e , (char *) strin
6d70: 67 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 69 6c g, (Tcl_Size) il
6d80: 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 en);. }..
6d90: 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65 20 61 /* Certificate a
6da0: 6e 64 20 64 75 6d 70 20 61 6c 6c 20 64 61 74 61 nd dump all data
6db0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 6c 29 */. if (all)
6dc0: 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 61 6c 6c {..Tcl_Obj *all
6dd0: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 Obj = Tcl_NewByt
6de0: 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c 2c 20 eArrayObj(NULL,
6df0: 30 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 65 0);..Tcl_Obj *ce
6e00: 72 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 rtObj = Tcl_NewB
6e10: 79 74 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c yteArrayObj(NULL
6e20: 2c 20 30 29 3b 0a 09 75 6e 73 69 67 6e 65 64 20 , 0);..unsigned
6e30: 63 68 61 72 20 2a 61 6c 6c 53 74 72 2c 20 2a 63 char *allStr, *c
6e40: 65 72 74 53 74 72 3b 0a 0a 09 69 66 20 28 61 6c ertStr;...if (al
6e50: 6c 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 lObj == NULL ||
6e60: 63 65 72 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 certObj == NULL)
6e70: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72 {.. Tcl_Decr
6e80: 52 65 66 43 6f 75 6e 74 28 61 6c 6c 4f 62 6a 29 RefCount(allObj)
6e90: 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 ;.. BIO_free(
6ea0: 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 46 bio);.. Tcl_F
6eb0: 72 65 65 28 62 75 66 66 65 72 29 3b 0a 09 20 20 ree(buffer);..
6ec0: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f return resultO
6ed0: 62 6a 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 bj;..}.../* Get
6ee0: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 certificate */..
6ef0: 63 65 72 74 53 74 72 20 3d 20 54 63 6c 5f 53 65 certStr = Tcl_Se
6f00: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 tByteArrayLength
6f10: 28 63 65 72 74 4f 62 6a 2c 20 43 45 52 54 5f 53 (certObj, CERT_S
6f20: 54 52 5f 53 49 5a 45 29 3b 0a 09 6c 65 6e 20 3d TR_SIZE);..len =
6f30: 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 50 BIO_to_Buffer(P
6f40: 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 EM_write_bio_X50
6f50: 39 28 62 69 6f 2c 20 63 65 72 74 29 2c 20 62 69 9(bio, cert), bi
6f60: 6f 2c 20 63 65 72 74 53 74 72 2c 20 43 45 52 54 o, certStr, CERT
6f70: 5f 53 54 52 5f 53 49 5a 45 29 3b 0a 09 54 63 6c _STR_SIZE);..Tcl
6f80: 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e _SetByteArrayLen
6f90: 67 74 68 28 63 65 72 74 4f 62 6a 2c 20 6c 65 6e gth(certObj, len
6fa0: 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 );..LAPPEND_OBJ(
6fb0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
6fc0: 6a 2c 20 22 63 65 72 74 69 66 69 63 61 74 65 22 j, "certificate"
6fd0: 2c 20 63 65 72 74 4f 62 6a 29 0a 0a 09 2f 2a 20 , certObj).../*
6fe0: 47 65 74 20 61 6c 6c 20 69 6e 66 6f 20 6f 6e 20 Get all info on
6ff0: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 certificate */..
7000: 61 6c 6c 53 74 72 20 3d 20 54 63 6c 5f 53 65 74 allStr = Tcl_Set
7010: 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 ByteArrayLength(
7020: 61 6c 6c 4f 62 6a 2c 20 43 45 52 54 5f 53 54 52 allObj, CERT_STR
7030: 5f 53 49 5a 45 20 2a 20 32 29 3b 0a 09 6c 65 6e _SIZE * 2);..len
7040: 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 = BIO_to_Buffer
7050: 28 58 35 30 39 5f 70 72 69 6e 74 5f 65 78 28 62 (X509_print_ex(b
7060: 69 6f 2c 20 63 65 72 74 2c 20 66 6c 61 67 73 2c io, cert, flags,
7070: 20 30 29 2c 20 62 69 6f 2c 20 61 6c 6c 53 74 72 0), bio, allStr
7080: 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 20 , CERT_STR_SIZE
7090: 2a 20 32 29 3b 0a 09 54 63 6c 5f 53 65 74 42 79 * 2);..Tcl_SetBy
70a0: 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 61 6c teArrayLength(al
70b0: 6c 4f 62 6a 2c 20 6c 65 6e 29 3b 0a 09 4c 41 50 lObj, len);..LAP
70c0: 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c PEND_OBJ(interp,
70d0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 61 6c 6c resultObj, "all
70e0: 22 2c 20 61 6c 6c 4f 62 6a 29 0a 20 20 20 20 7d ", allObj). }
70f0: 0a 0a 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 .. BIO_free(b
7100: 69 6f 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 io);. Tcl_Fre
7110: 65 28 62 75 66 66 65 72 29 3b 0a 20 20 20 20 72 e(buffer);. r
7120: 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b eturn resultObj;
7130: 0a 7d 0a .}.