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 09 72 65 g != NULL) {..re
0e50: 73 75 6c 74 4f 62 6a 20 3d 20 53 74 72 69 6e 67 sultObj = String
0e60: 5f 74 6f 5f 48 65 78 28 41 53 4e 31 5f 53 54 52 _to_Hex(ASN1_STR
0e70: 49 4e 47 5f 67 65 74 30 5f 64 61 74 61 28 61 73 ING_get0_data(as
0e80: 74 72 69 6e 67 29 2c 20 41 53 4e 31 5f 53 54 52 tring), ASN1_STR
0e90: 49 4e 47 5f 6c 65 6e 67 74 68 28 61 73 74 72 69 ING_length(astri
0ea0: 6e 67 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ng));. }.
0eb0: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a return resultObj
0ec0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f10: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
0f20: 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65 20 2d s_x509KeyUsage -
0f30: 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30 -. *. *.Get X.50
0f40: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 6b 65 9 certificate ke
0f50: 79 20 75 73 61 67 65 20 74 79 70 65 73 0a 20 2a y usage types. *
0f60: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
0f70: 54 63 6c 20 6c 69 73 74 20 6f 66 20 74 79 70 65 Tcl list of type
0f80: 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 s. *. * Side eff
0f90: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ects:. *.None. *
0fa0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ff0: 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c . */.Tcl_Obj *Tl
1000: 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65 28 54 s_x509KeyUsage(T
1010: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
1020: 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c 20 75 p, X509 *cert, u
1030: 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 73 29 20 int32_t xflags)
1040: 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 75 {. uint32_t u
1050: 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 74 5f sage = X509_get_
1060: 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74 29 3b key_usage(cert);
1070: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 . Tcl_Obj *re
1080: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 sultObj = Tcl_Ne
1090: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
10a0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 );.. if (resu
10b0: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b ltObj == NULL) {
10c0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
10d0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 78 }.. if ((x
10e0: 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 4b flags & EXFLAG_K
10f0: 55 53 41 47 45 29 20 26 26 20 75 73 61 67 65 20 USAGE) && usage
1100: 3c 20 55 49 4e 54 33 32 5f 4d 41 58 29 20 7b 0a < UINT32_MAX) {.
1110: 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f .if (usage & KU_
1120: 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 54 55 52 DIGITAL_SIGNATUR
1130: 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 E) {.. Tcl_Li
1140: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1150: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c nt(interp, resul
1160: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tObj, Tcl_NewStr
1170: 69 6e 67 4f 62 6a 28 22 44 69 67 69 74 61 6c 20 ingObj("Digital
1180: 53 69 67 6e 61 74 75 72 65 22 2c 20 2d 31 29 29 Signature", -1))
1190: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 ;..}..if (usage
11a0: 26 20 4b 55 5f 4e 4f 4e 5f 52 45 50 55 44 49 41 & KU_NON_REPUDIA
11b0: 54 49 4f 4e 29 20 7b 0a 09 20 20 20 20 54 63 6c TION) {.. Tcl
11c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
11d0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 ement(interp, re
11e0: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 sultObj, Tcl_New
11f0: 53 74 72 69 6e 67 4f 62 6a 28 22 4e 6f 6e 2d 52 StringObj("Non-R
1200: 65 70 75 64 69 61 74 69 6f 6e 22 2c 20 2d 31 29 epudiation", -1)
1210: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 );..}..if (usage
1220: 20 26 20 4b 55 5f 4b 45 59 5f 45 4e 43 49 50 48 & KU_KEY_ENCIPH
1230: 45 52 4d 45 4e 54 29 20 7b 0a 09 20 20 20 20 54 ERMENT) {.. T
1240: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1250: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
1260: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e resultObj, Tcl_N
1270: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4b 65 79 ewStringObj("Key
1280: 20 45 6e 63 69 70 68 65 72 6d 65 6e 74 22 2c 20 Encipherment",
1290: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 -1));..}..if (us
12a0: 61 67 65 20 26 20 4b 55 5f 44 41 54 41 5f 45 4e age & KU_DATA_EN
12b0: 43 49 50 48 45 52 4d 45 4e 54 29 20 7b 0a 09 20 CIPHERMENT) {..
12c0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
12d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
12e0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 rp, resultObj, T
12f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1300: 22 44 61 74 61 20 45 6e 63 69 70 68 65 72 6d 65 "Data Encipherme
1310: 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 nt", -1));..}..i
1320: 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f 4b 45 f (usage & KU_KE
1330: 59 5f 41 47 52 45 45 4d 45 4e 54 29 20 7b 0a 09 Y_AGREEMENT) {..
1340: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
1350: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
1360: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
1370: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1380: 28 22 4b 65 79 20 41 67 72 65 65 6d 65 6e 74 22 ("Key Agreement"
1390: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
13a0: 75 73 61 67 65 20 26 20 4b 55 5f 4b 45 59 5f 43 usage & KU_KEY_C
13b0: 45 52 54 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 ERT_SIGN) {..
13c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
13d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
13e0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c , resultObj, Tcl
13f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 43 _NewStringObj("C
1400: 65 72 74 69 66 69 63 61 74 65 20 53 69 67 6e 69 ertificate Signi
1410: 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 ng", -1));..}..i
1420: 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f 43 52 f (usage & KU_CR
1430: 4c 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 20 54 L_SIGN) {.. T
1440: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1450: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
1460: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e resultObj, Tcl_N
1470: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 43 52 4c ewStringObj("CRL
1480: 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 3b Signing", -1));
1490: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 ..}..if (usage &
14a0: 20 4b 55 5f 45 4e 43 49 50 48 45 52 5f 4f 4e 4c KU_ENCIPHER_ONL
14b0: 59 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 Y) {.. Tcl_Li
14c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
14d0: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c nt(interp, resul
14e0: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tObj, Tcl_NewStr
14f0: 69 6e 67 4f 62 6a 28 22 45 6e 63 69 70 68 65 72 ingObj("Encipher
1500: 20 4f 6e 6c 79 22 2c 20 2d 31 29 29 3b 0a 09 7d Only", -1));..}
1510: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 ..if (usage & KU
1520: 5f 44 45 43 49 50 48 45 52 5f 4f 4e 4c 59 29 20 _DECIPHER_ONLY)
1530: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
1540: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1550: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
1560: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 j, Tcl_NewString
1570: 4f 62 6a 28 22 44 65 63 69 70 68 65 72 20 4f 6e Obj("Decipher On
1580: 6c 79 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 ly", -1));..}.
1590: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 } else {..
15a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
15b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
15c0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f resultObj, Tcl_
15d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e NewStringObj("un
15e0: 72 65 73 74 72 69 63 74 65 64 22 2c 20 2d 31 29 restricted", -1)
15f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 );. }. ret
1600: 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d urn resultObj;.}
1610: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
1620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1660: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 ----. *. * Tls_x
1670: 35 30 39 50 75 72 70 6f 73 65 20 2d 2d 0a 20 2a 509Purpose --. *
1680: 0a 20 2a 09 47 65 74 20 58 2e 35 30 39 20 63 65 . *.Get X.509 ce
1690: 72 74 69 66 69 63 61 74 65 20 70 75 72 70 6f 73 rtificate purpos
16a0: 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a e. *. * Results:
16b0: 0a 20 2a 09 50 75 72 70 6f 73 65 20 73 74 72 69 . *.Purpose stri
16c0: 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ng. *. * Side ef
16d0: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 fects:. *.None.
16e0: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1730: 2d 0a 20 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 -. */.const char
1740: 20 2a 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 *Tls_x509Purpos
1750: 65 28 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a e(X509 *cert) {.
1760: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
1770: 70 75 72 70 6f 73 65 20 3d 20 4e 55 4c 4c 3b 0a purpose = NULL;.
1780: 0a 20 20 20 20 69 66 20 28 58 35 30 39 5f 63 68 . if (X509_ch
1790: 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 eck_purpose(cert
17a0: 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 53 , X509_PURPOSE_S
17b0: 53 4c 5f 43 4c 49 45 4e 54 2c 20 30 29 20 3e 20 SL_CLIENT, 0) >
17c0: 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 0) {..purpose =
17d0: 22 53 53 4c 20 43 6c 69 65 6e 74 22 3b 0a 20 20 "SSL Client";.
17e0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 } else if (X50
17f0: 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 9_check_purpose(
1800: 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f cert, X509_PURPO
1810: 53 45 5f 53 53 4c 5f 53 45 52 56 45 52 2c 20 30 SE_SSL_SERVER, 0
1820: 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 ) > 0) {..purpos
1830: 65 20 3d 20 22 53 53 4c 20 53 65 72 76 65 72 22 e = "SSL Server"
1840: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
1850: 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 (X509_check_purp
1860: 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 ose(cert, X509_P
1870: 55 52 50 4f 53 45 5f 4e 53 5f 53 53 4c 5f 53 45 URPOSE_NS_SSL_SE
1880: 52 56 45 52 2c 20 30 29 20 3e 20 30 29 20 7b 0a RVER, 0) > 0) {.
1890: 09 70 75 72 70 6f 73 65 20 3d 20 22 4d 53 53 20 .purpose = "MSS
18a0: 53 53 4c 20 53 65 72 76 65 72 22 3b 0a 20 20 20 SSL Server";.
18b0: 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 } else if (X509
18c0: 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 _check_purpose(c
18d0: 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 ert, X509_PURPOS
18e0: 45 5f 53 4d 49 4d 45 5f 53 49 47 4e 2c 20 30 29 E_SMIME_SIGN, 0)
18f0: 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 > 0) {..purpose
1900: 20 3d 20 22 53 4d 49 4d 45 20 53 69 67 6e 69 6e = "SMIME Signin
1910: 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 g";. } else i
1920: 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 f (X509_check_pu
1930: 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 rpose(cert, X509
1940: 5f 50 55 52 50 4f 53 45 5f 53 4d 49 4d 45 5f 45 _PURPOSE_SMIME_E
1950: 4e 43 52 59 50 54 2c 20 30 29 20 3e 20 30 29 20 NCRYPT, 0) > 0)
1960: 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 53 4d {..purpose = "SM
1970: 49 4d 45 20 45 6e 63 72 79 70 74 69 6f 6e 22 3b IME Encryption";
1980: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
1990: 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f X509_check_purpo
19a0: 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 se(cert, X509_PU
19b0: 52 50 4f 53 45 5f 43 52 4c 5f 53 49 47 4e 2c 20 RPOSE_CRL_SIGN,
19c0: 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 0) > 0) {..purpo
19d0: 73 65 20 3d 20 22 43 52 4c 20 53 69 67 6e 69 6e se = "CRL Signin
19e0: 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 g";. } else i
19f0: 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 f (X509_check_pu
1a00: 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 rpose(cert, X509
1a10: 5f 50 55 52 50 4f 53 45 5f 41 4e 59 2c 20 30 29 _PURPOSE_ANY, 0)
1a20: 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 > 0) {..purpose
1a30: 20 3d 20 22 41 6e 79 22 3b 0a 20 20 20 20 7d 20 = "Any";. }
1a40: 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 else if (X509_ch
1a50: 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 eck_purpose(cert
1a60: 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 4f , X509_PURPOSE_O
1a70: 43 53 50 5f 48 45 4c 50 45 52 2c 20 30 29 20 3e CSP_HELPER, 0) >
1a80: 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 0) {..purpose =
1a90: 20 22 4f 43 53 50 20 48 65 6c 70 65 72 22 3b 0a "OCSP Helper";.
1aa0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 58 } else if (X
1ab0: 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 509_check_purpos
1ac0: 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 e(cert, X509_PUR
1ad0: 50 4f 53 45 5f 54 49 4d 45 53 54 41 4d 50 5f 53 POSE_TIMESTAMP_S
1ae0: 49 47 4e 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 IGN, 0) > 0) {..
1af0: 70 75 72 70 6f 73 65 20 3d 20 22 54 69 6d 65 73 purpose = "Times
1b00: 74 61 6d 70 20 53 69 67 6e 69 6e 67 22 3b 0a 20 tamp Signing";.
1b10: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 75 72 } else {..pur
1b20: 70 6f 73 65 20 3d 20 22 22 3b 0a 20 20 20 20 7d pose = "";. }
1b30: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 75 72 70 . return purp
1b40: 6f 73 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d ose;.}../*. *---
1b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
1ba0: 20 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 65 Tls_x509Purpose
1bb0: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 58 s --. *. *.Get X
1bc0: 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 .509 certificate
1bd0: 20 70 75 72 70 6f 73 65 20 74 79 70 65 73 0a 20 purpose types.
1be0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
1bf0: 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 65 61 63 .Tcl list of eac
1c00: 68 20 70 75 72 70 6f 73 65 20 61 6e 64 20 77 68 h purpose and wh
1c10: 65 74 68 65 72 20 69 74 20 69 73 20 43 41 20 6f ether it is CA o
1c20: 72 20 6e 6f 6e 2d 43 41 0a 20 2a 0a 20 2a 20 53 r non-CA. *. * S
1c30: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
1c40: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d None. *. *------
1c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c90: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f -------. */.Tcl_
1ca0: 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 50 75 72 Obj *Tls_x509Pur
1cb0: 70 6f 73 65 73 28 54 63 6c 5f 49 6e 74 65 72 70 poses(Tcl_Interp
1cc0: 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a *interp, X509 *
1cd0: 63 65 72 74 29 20 7b 0a 20 20 20 20 54 63 6c 5f cert) {. Tcl_
1ce0: 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d Obj *resultObj =
1cf0: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
1d00: 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 58 35 0, NULL);. X5
1d10: 30 39 5f 50 55 52 50 4f 53 45 20 2a 70 74 6d 70 09_PURPOSE *ptmp
1d20: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c ;.. if (resul
1d30: 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a tObj == NULL) {.
1d40: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
1d50: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 69 6e }.. for (in
1d60: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 58 35 30 t i = 0; i < X50
1d70: 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 5f 63 6f 9_PURPOSE_get_co
1d80: 75 6e 74 28 29 3b 20 69 2b 2b 29 20 7b 0a 09 70 unt(); i++) {..p
1d90: 74 6d 70 20 3d 20 58 35 30 39 5f 50 55 52 50 4f tmp = X509_PURPO
1da0: 53 45 5f 67 65 74 30 28 69 29 3b 0a 09 54 63 6c SE_get0(i);..Tcl
1db0: 5f 4f 62 6a 20 2a 74 6d 70 50 74 72 20 3d 20 54 _Obj *tmpPtr = T
1dc0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
1dd0: 20 4e 55 4c 4c 29 3b 0a 0a 09 66 6f 72 20 28 69 NULL);...for (i
1de0: 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 3c 20 32 3b nt j = 0; j < 2;
1df0: 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 69 6e 74 j++) {.. int
1e00: 20 69 64 72 65 74 20 3d 20 58 35 30 39 5f 63 68 idret = X509_ch
1e10: 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 eck_purpose(cert
1e20: 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 , X509_PURPOSE_g
1e30: 65 74 5f 69 64 28 70 74 6d 70 29 2c 20 6a 29 3b et_id(ptmp), j);
1e40: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
1e50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1e60: 6e 74 65 72 70 2c 20 74 6d 70 50 74 72 2c 20 54 nterp, tmpPtr, T
1e70: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1e80: 6a 20 3f 20 22 43 41 22 20 3a 20 22 6e 6f 6e 43 j ? "CA" : "nonC
1e90: 41 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 54 A", -1));.. T
1ea0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1eb0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
1ec0: 74 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 tmpPtr, Tcl_NewS
1ed0: 74 72 69 6e 67 4f 62 6a 28 69 64 72 65 74 20 3d tringObj(idret =
1ee0: 3d 20 31 20 3f 20 22 59 65 73 22 20 3a 20 22 4e = 1 ? "Yes" : "N
1ef0: 6f 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 o", -1));..}..LA
1f00: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 PPEND_OBJ(interp
1f10: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 58 35 30 , resultObj, X50
1f20: 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 30 5f 6e 9_PURPOSE_get0_n
1f30: 61 6d 65 28 70 74 6d 70 29 2c 20 74 6d 70 50 74 ame(ptmp), tmpPt
1f40: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 r);. }. re
1f50: 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a turn resultObj;.
1f60: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
1f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fb0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
1fc0: 78 35 30 39 4e 61 6d 65 73 20 2d 2d 0a 20 2a 0a x509Names --. *.
1fd0: 20 2a 09 47 65 74 20 61 20 6c 69 73 74 20 6f 66 *.Get a list of
1fe0: 20 53 75 62 6a 65 63 74 20 41 6c 74 65 72 6e 61 Subject Alterna
1ff0: 74 65 20 4e 61 6d 65 73 20 28 53 41 4e 29 20 6f te Names (SAN) o
2000: 72 20 49 73 73 75 65 72 20 41 6c 74 65 72 6e 61 r Issuer Alterna
2010: 74 65 20 4e 61 6d 65 73 0a 20 2a 0a 20 2a 20 52 te Names. *. * R
2020: 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 6c 20 6c esults:. *.Tcl l
2030: 69 73 74 20 6f 66 20 61 6c 74 65 72 6e 61 74 65 ist of alternate
2040: 20 6e 61 6d 65 73 0a 20 2a 0a 20 2a 20 53 69 64 names. *. * Sid
2050: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
2060: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ne. *. *--------
2070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20b0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 -----. */.Tcl_Ob
20c0: 6a 20 2a 54 6c 73 5f 78 35 30 39 4e 61 6d 65 73 j *Tls_x509Names
20d0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
20e0: 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c erp, X509 *cert,
20f0: 20 69 6e 74 20 6e 69 64 2c 20 42 49 4f 20 2a 62 int nid, BIO *b
2100: 69 6f 29 20 7b 0a 20 20 20 20 53 54 41 43 4b 5f io) {. STACK_
2110: 4f 46 28 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 29 OF(GENERAL_NAME)
2120: 20 2a 6e 61 6d 65 73 3b 0a 20 20 20 20 54 63 6c *names;. Tcl
2130: 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 _Obj *resultObj
2140: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
2150: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 (0, NULL);. T
2160: 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 cl_Size len;.
2170: 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 30 32 char buffer[102
2180: 34 5d 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 4];.. if (res
2190: 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 ultObj == NULL)
21a0: 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a {..return NULL;.
21b0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 }.. if ((
21c0: 6e 61 6d 65 73 20 3d 20 28 53 54 41 43 4b 5f 4f names = (STACK_O
21d0: 46 28 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 29 20 F(GENERAL_NAME)
21e0: 2a 29 58 35 30 39 5f 67 65 74 5f 65 78 74 5f 64 *)X509_get_ext_d
21f0: 32 69 28 63 65 72 74 2c 20 6e 69 64 2c 20 4e 55 2i(cert, nid, NU
2200: 4c 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 LL, NULL)) != NU
2210: 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 LL) {..for (int
2220: 69 3d 30 3b 20 69 20 3c 20 73 6b 5f 47 45 4e 45 i=0; i < sk_GENE
2230: 52 41 4c 5f 4e 41 4d 45 5f 6e 75 6d 28 6e 61 6d RAL_NAME_num(nam
2240: 65 73 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 es); i++) {..
2250: 20 63 6f 6e 73 74 20 47 45 4e 45 52 41 4c 5f 4e const GENERAL_N
2260: 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 47 AME *name = sk_G
2270: 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 76 61 6c 75 ENERAL_NAME_valu
2280: 65 28 6e 61 6d 65 73 2c 20 69 29 3b 0a 0a 09 20 e(names, i);...
2290: 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f len = BIO_to_
22a0: 42 75 66 66 65 72 28 6e 61 6d 65 20 26 26 20 47 Buffer(name && G
22b0: 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70 72 69 6e ENERAL_NAME_prin
22c0: 74 28 62 69 6f 2c 20 28 47 45 4e 45 52 41 4c 5f t(bio, (GENERAL_
22d0: 4e 41 4d 45 20 2a 29 20 6e 61 6d 65 29 2c 20 62 NAME *) name), b
22e0: 69 6f 2c 20 62 75 66 66 65 72 2c 20 31 30 32 34 io, buffer, 1024
22f0: 29 3b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f );.. LAPPEND_
2300: 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 STR(interp, resu
2310: 6c 74 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 62 75 66 ltObj, NULL, buf
2320: 66 65 72 2c 20 6c 65 6e 29 3b 0a 09 7d 0a 09 73 fer, len);..}..s
2330: 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70 k_GENERAL_NAME_p
2340: 6f 70 5f 66 72 65 65 28 6e 61 6d 65 73 2c 20 47 op_free(names, G
2350: 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 66 72 65 65 ENERAL_NAME_free
2360: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 );. }. ret
2370: 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d urn resultObj;.}
2380: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23d0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 ----. *. * Tls_x
23e0: 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 20 2d 509ExtKeyUsage -
23f0: 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 61 20 6c 69 -. *. *.Get a li
2400: 73 74 20 6f 66 20 45 78 74 65 6e 64 65 64 20 4b st of Extended K
2410: 65 79 20 55 73 61 67 65 73 0a 20 2a 0a 20 2a 20 ey Usages. *. *
2420: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 63 6c 20 Returns:. *.Tcl
2430: 6c 69 73 74 20 6f 66 20 75 73 61 67 65 73 0a 20 list of usages.
2440: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
2450: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
24b0: 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 /.Tcl_Obj *Tls_x
24c0: 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 28 54 509ExtKeyUsage(T
24d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
24e0: 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c 20 75 p, X509 *cert, u
24f0: 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 73 29 20 int32_t xflags)
2500: 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 75 {. uint32_t u
2510: 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 74 5f sage = X509_get_
2520: 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74 29 3b key_usage(cert);
2530: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 . Tcl_Obj *re
2540: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 sultObj = Tcl_Ne
2550: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
2560: 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 );.. if (resu
2570: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b ltObj == NULL) {
2580: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
2590: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 78 }.. if ((x
25a0: 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 58 flags & EXFLAG_X
25b0: 4b 55 53 41 47 45 29 20 26 26 20 75 73 61 67 65 KUSAGE) && usage
25c0: 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58 29 20 7b < UINT32_MAX) {
25d0: 0a 09 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67 ..usage = X509_g
25e0: 65 74 5f 65 78 74 65 6e 64 65 64 5f 6b 65 79 5f et_extended_key_
25f0: 75 73 61 67 65 28 63 65 72 74 29 3b 0a 0a 09 69 usage(cert);...i
2600: 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f 53 f (usage & XKU_S
2610: 53 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 SL_SERVER) {..
2620: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2630: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2640: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 p, resultObj, Tc
2650: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
2660: 54 4c 53 20 57 65 62 20 53 65 72 76 65 72 20 41 TLS Web Server A
2670: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 22 2c 20 uthentication",
2680: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 -1));..}..if (us
2690: 61 67 65 20 26 20 58 4b 55 5f 53 53 4c 5f 43 4c age & XKU_SSL_CL
26a0: 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 54 63 6c IENT) {.. Tcl
26b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
26c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 ement(interp, re
26d0: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 sultObj, Tcl_New
26e0: 53 74 72 69 6e 67 4f 62 6a 28 22 54 4c 53 20 57 StringObj("TLS W
26f0: 65 62 20 43 6c 69 65 6e 74 20 41 75 74 68 65 6e eb Client Authen
2700: 74 69 63 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b tication", -1));
2710: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 ..}..if (usage &
2720: 20 58 4b 55 5f 53 4d 49 4d 45 29 20 7b 0a 09 20 XKU_SMIME) {..
2730: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2740: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2750: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 rp, resultObj, T
2760: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
2770: 22 45 2d 6d 61 69 6c 20 50 72 6f 74 65 63 74 69 "E-mail Protecti
2780: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 on", -1));..}..i
2790: 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f 43 f (usage & XKU_C
27a0: 4f 44 45 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 ODE_SIGN) {..
27b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
27c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
27d0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c , resultObj, Tcl
27e0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 43 _NewStringObj("C
27f0: 6f 64 65 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 ode Signing", -1
2800: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 ));..}..if (usag
2810: 65 20 26 20 58 4b 55 5f 53 47 43 29 20 7b 0a 09 e & XKU_SGC) {..
2820: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2830: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2840: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
2850: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2860: 28 22 53 47 43 22 2c 20 2d 31 29 29 3b 0a 09 7d ("SGC", -1));..}
2870: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b ..if (usage & XK
2880: 55 5f 4f 43 53 50 5f 53 49 47 4e 29 20 7b 0a 09 U_OCSP_SIGN) {..
2890: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
28a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
28b0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
28c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
28d0: 28 22 4f 43 53 50 20 53 69 67 6e 69 6e 67 22 2c ("OCSP Signing",
28e0: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 -1));..}..if (u
28f0: 73 61 67 65 20 26 20 58 4b 55 5f 54 49 4d 45 53 sage & XKU_TIMES
2900: 54 41 4d 50 29 20 7b 0a 09 20 20 20 20 54 63 6c TAMP) {.. Tcl
2910: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
2920: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 ement(interp, re
2930: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 sultObj, Tcl_New
2940: 53 74 72 69 6e 67 4f 62 6a 28 22 54 69 6d 65 20 StringObj("Time
2950: 53 74 61 6d 70 69 6e 67 22 2c 20 2d 31 29 29 3b Stamping", -1));
2960: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 ..}..if (usage &
2970: 20 58 4b 55 5f 44 56 43 53 20 29 20 7b 0a 09 20 XKU_DVCS ) {..
2980: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2990: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
29a0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 rp, resultObj, T
29b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
29c0: 22 44 56 43 53 22 2c 20 2d 31 29 29 3b 0a 09 7d "DVCS", -1));..}
29d0: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 4b ..if (usage & XK
29e0: 55 5f 41 4e 59 45 4b 55 29 20 7b 0a 09 20 20 20 U_ANYEKU) {..
29f0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2a00: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2a10: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c , resultObj, Tcl
2a20: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 41 _NewStringObj("A
2a30: 6e 79 20 45 78 74 65 6e 64 65 64 20 4b 65 79 20 ny Extended Key
2a40: 55 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 09 7d Usage", -1));..}
2a50: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 . } else {..
2a60: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2a70: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2a80: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 rp, resultObj, T
2a90: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
2aa0: 22 75 6e 72 65 73 74 72 69 63 74 65 64 22 2c 20 "unrestricted",
2ab0: 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 -1));. }.
2ac0: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a return resultObj
2ad0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
2ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b20: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
2b30: 73 5f 78 35 30 39 43 72 6c 44 70 20 2d 2d 0a 20 s_x509CrlDp --.
2b40: 2a 0a 20 2a 09 47 65 74 20 6c 69 73 74 20 6f 66 *. *.Get list of
2b50: 20 43 52 4c 20 44 69 73 74 72 69 62 75 74 69 6f CRL Distributio
2b60: 6e 20 50 6f 69 6e 74 73 0a 20 2a 0a 20 2a 20 52 n Points. *. * R
2b70: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 63 6c 20 6c eturns:. *.Tcl l
2b80: 69 73 74 20 6f 66 20 55 52 49 73 20 61 6e 64 20 ist of URIs and
2b90: 72 65 6c 61 74 69 76 65 2d 6e 61 6d 65 73 0a 20 relative-names.
2ba0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
2bb0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
2bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
2c10: 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 /.Tcl_Obj *Tls_x
2c20: 35 30 39 43 72 6c 44 70 28 54 63 6c 5f 49 6e 74 509CrlDp(Tcl_Int
2c30: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 erp *interp, X50
2c40: 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 53 9 *cert) {. S
2c50: 54 41 43 4b 5f 4f 46 28 44 49 53 54 5f 50 4f 49 TACK_OF(DIST_POI
2c60: 4e 54 29 20 2a 64 70 73 3b 0a 20 20 20 20 54 63 NT) *dps;. Tc
2c70: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a l_Obj *resultObj
2c80: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
2c90: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 j(0, NULL);..
2ca0: 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d if (resultObj =
2cb0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
2cc0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 n NULL;. }..
2cd0: 20 20 20 69 66 20 28 28 64 70 73 20 3d 20 28 53 if ((dps = (S
2ce0: 54 41 43 4b 5f 4f 46 28 44 49 53 54 5f 50 4f 49 TACK_OF(DIST_POI
2cf0: 4e 54 29 20 2a 29 58 35 30 39 5f 67 65 74 5f 65 NT) *)X509_get_e
2d00: 78 74 5f 64 32 69 28 63 65 72 74 2c 20 4e 49 44 xt_d2i(cert, NID
2d10: 5f 63 72 6c 5f 64 69 73 74 72 69 62 75 74 69 6f _crl_distributio
2d20: 6e 5f 70 6f 69 6e 74 73 2c 20 4e 55 4c 4c 2c 20 n_points, NULL,
2d30: 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 NULL)) != NULL)
2d40: 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b {..for (int i=0;
2d50: 20 69 20 3c 20 73 6b 5f 44 49 53 54 5f 50 4f 49 i < sk_DIST_POI
2d60: 4e 54 5f 6e 75 6d 28 64 70 73 29 3b 20 69 2b 2b NT_num(dps); i++
2d70: 29 20 7b 0a 09 20 20 20 20 44 49 53 54 5f 50 4f ) {.. DIST_PO
2d80: 49 4e 54 20 2a 64 70 20 3d 20 73 6b 5f 44 49 53 INT *dp = sk_DIS
2d90: 54 5f 50 4f 49 4e 54 5f 76 61 6c 75 65 28 64 70 T_POINT_value(dp
2da0: 73 2c 20 69 29 3b 0a 09 20 20 20 20 44 49 53 54 s, i);.. DIST
2db0: 5f 50 4f 49 4e 54 5f 4e 41 4d 45 20 2a 64 69 73 _POINT_NAME *dis
2dc0: 74 70 6f 69 6e 74 20 3d 20 64 70 2d 3e 64 69 73 tpoint = dp->dis
2dd0: 74 70 6f 69 6e 74 3b 0a 0a 09 20 20 20 20 69 66 tpoint;... if
2de0: 20 28 64 69 73 74 70 6f 69 6e 74 2d 3e 74 79 70 (distpoint->typ
2df0: 65 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 66 e == 0) {.../* f
2e00: 75 6c 6c 2d 6e 61 6d 65 20 47 45 4e 45 52 41 4c ull-name GENERAL
2e10: 49 5a 45 44 4e 41 4d 45 20 2a 2f 0a 09 09 66 6f IZEDNAME */...fo
2e20: 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 r (int j = 0; j
2e30: 3c 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d < sk_GENERAL_NAM
2e40: 45 5f 6e 75 6d 28 64 69 73 74 70 6f 69 6e 74 2d E_num(distpoint-
2e50: 3e 6e 61 6d 65 2e 66 75 6c 6c 6e 61 6d 65 29 3b >name.fullname);
2e60: 20 6a 2b 2b 29 20 7b 0a 09 09 20 20 20 20 47 45 j++) {... GE
2e70: 4e 45 52 41 4c 5f 4e 41 4d 45 20 2a 67 65 6e 20 NERAL_NAME *gen
2e80: 3d 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d = sk_GENERAL_NAM
2e90: 45 5f 76 61 6c 75 65 28 64 69 73 74 70 6f 69 6e E_value(distpoin
2ea0: 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c 6e 61 6d 65 t->name.fullname
2eb0: 2c 20 6a 29 3b 0a 09 09 20 20 20 20 69 6e 74 20 , j);... int
2ec0: 74 79 70 65 3b 0a 23 69 66 20 4f 50 45 4e 53 53 type;.#if OPENSS
2ed0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
2ee0: 20 3c 20 30 78 34 30 30 30 30 30 30 30 4c 0a 09 < 0x40000000L..
2ef0: 09 20 20 20 20 41 53 4e 31 5f 53 54 52 49 4e 47 . ASN1_STRING
2f00: 20 2a 75 72 69 20 3d 20 28 41 53 4e 31 5f 53 54 *uri = (ASN1_ST
2f10: 52 49 4e 47 20 2a 29 47 45 4e 45 52 41 4c 5f 4e RING *)GENERAL_N
2f20: 41 4d 45 5f 67 65 74 30 5f 76 61 6c 75 65 28 67 AME_get0_value(g
2f30: 65 6e 2c 20 26 74 79 70 65 29 3b 0a 23 65 6c 73 en, &type);.#els
2f40: 65 0a 09 09 20 20 20 20 63 6f 6e 73 74 20 41 53 e... const AS
2f50: 4e 31 5f 53 54 52 49 4e 47 20 2a 75 72 69 20 3d N1_STRING *uri =
2f60: 20 28 63 6f 6e 73 74 20 41 53 4e 31 5f 53 54 52 (const ASN1_STR
2f70: 49 4e 47 20 2a 29 47 45 4e 45 52 41 4c 5f 4e 41 ING *)GENERAL_NA
2f80: 4d 45 5f 67 65 74 30 5f 76 61 6c 75 65 28 67 65 ME_get0_value(ge
2f90: 6e 2c 20 26 74 79 70 65 29 3b 0a 23 65 6e 64 69 n, &type);.#endi
2fa0: 66 0a 09 09 20 20 20 20 69 66 20 28 74 79 70 65 f... if (type
2fb0: 20 3d 3d 20 47 45 4e 5f 55 52 49 20 7c 7c 20 74 == GEN_URI || t
2fc0: 79 70 65 20 3d 3d 20 47 45 4e 5f 44 4e 53 29 20 ype == GEN_DNS)
2fd0: 7b 0a 09 09 09 4c 41 50 50 45 4e 44 5f 53 54 52 {....LAPPEND_STR
2fe0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
2ff0: 62 6a 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c bj, (char *) NUL
3000: 4c 2c 0a 09 09 09 20 20 20 20 28 63 68 61 72 20 L,.... (char
3010: 2a 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67 *) ASN1_STRING_g
3020: 65 74 30 5f 64 61 74 61 28 75 72 69 29 2c 20 28 et0_data(uri), (
3030: 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31 5f 53 Tcl_Size) ASN1_S
3040: 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 75 72 69 TRING_length(uri
3050: 29 29 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a ));... }...}.
3060: 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
3070: 64 69 73 74 70 6f 69 6e 74 2d 3e 74 79 70 65 20 distpoint->type
3080: 3d 3d 20 31 29 20 7b 0a 09 09 2f 2a 20 72 65 6c == 1) {.../* rel
3090: 61 74 69 76 65 2d 6e 61 6d 65 20 58 35 30 39 4e ative-name X509N
30a0: 41 4d 45 20 2a 2f 0a 09 09 53 54 41 43 4b 5f 4f AME */...STACK_O
30b0: 46 28 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 F(X509_NAME_ENTR
30c0: 59 29 20 2a 73 6b 5f 72 65 6c 6e 61 6d 65 20 3d Y) *sk_relname =
30d0: 20 64 69 73 74 70 6f 69 6e 74 2d 3e 6e 61 6d 65 distpoint->name
30e0: 2e 72 65 6c 61 74 69 76 65 6e 61 6d 65 3b 0a 09 .relativename;..
30f0: 09 66 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b .for (int j = 0;
3100: 20 6a 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d j < sk_X509_NAM
3110: 45 5f 45 4e 54 52 59 5f 6e 75 6d 28 73 6b 5f 72 E_ENTRY_num(sk_r
3120: 65 6c 6e 61 6d 65 29 3b 20 6a 2b 2b 29 20 7b 0a elname); j++) {.
3130: 09 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 5f .. X509_NAME_
3140: 45 4e 54 52 59 20 2a 65 20 3d 20 73 6b 5f 58 35 ENTRY *e = sk_X5
3150: 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 5f 76 61 09_NAME_ENTRY_va
3160: 6c 75 65 28 73 6b 5f 72 65 6c 6e 61 6d 65 2c 20 lue(sk_relname,
3170: 6a 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f j);.#if OPENSSL_
3180: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
3190: 20 30 78 34 30 30 30 30 30 30 30 4c 0a 09 09 20 0x40000000L...
31a0: 20 20 20 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a ASN1_STRING *
31b0: 64 20 3d 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e d = X509_NAME_EN
31c0: 54 52 59 5f 67 65 74 5f 64 61 74 61 28 65 29 3b TRY_get_data(e);
31d0: 0a 23 65 6c 73 65 0a 09 09 20 20 20 20 63 6f 6e .#else... con
31e0: 73 74 20 41 53 4e 31 5f 53 54 52 49 4e 47 20 2a st ASN1_STRING *
31f0: 64 20 3d 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e d = X509_NAME_EN
3200: 54 52 59 5f 67 65 74 5f 64 61 74 61 28 65 29 3b TRY_get_data(e);
3210: 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 4c 41 .#endif... LA
3220: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
3230: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 28 63 68 , resultObj, (ch
3240: 61 72 20 2a 29 20 4e 55 4c 4c 2c 0a 09 09 09 28 ar *) NULL,....(
3250: 63 68 61 72 20 2a 29 20 41 53 4e 31 5f 53 54 52 char *) ASN1_STR
3260: 49 4e 47 5f 67 65 74 30 5f 64 61 74 61 28 64 29 ING_get0_data(d)
3270: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e , (Tcl_Size) ASN
3280: 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 1_STRING_length(
3290: 64 29 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a d));...}.. }.
32a0: 09 7d 0a 09 43 52 4c 5f 44 49 53 54 5f 50 4f 49 .}..CRL_DIST_POI
32b0: 4e 54 53 5f 66 72 65 65 28 64 70 73 29 3b 0a 20 NTS_free(dps);.
32c0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
32d0: 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a resultObj;.}../*
32e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
32f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3330: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39 4f . *. * Tls_x509O
3340: 73 63 70 0a 20 2a 0a 20 2a 09 47 65 74 20 6c 69 scp. *. *.Get li
3350: 73 74 20 6f 66 20 4f 6e 2d 6c 69 6e 65 20 43 65 st of On-line Ce
3360: 72 74 69 66 69 63 61 74 65 20 53 74 61 74 75 73 rtificate Status
3370: 20 50 72 6f 74 6f 63 6f 6c 20 28 4f 53 43 50 29 Protocol (OSCP)
3380: 20 55 52 49 73 0a 20 2a 0a 20 2a 20 52 65 73 75 URIs. *. * Resu
3390: 6c 74 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 74 lts:. *.Tcl list
33a0: 20 6f 66 20 55 52 49 73 0a 20 2a 0a 20 2a 20 53 of URIs. *. * S
33b0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
33c0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d None. *. *------
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3410: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f -------. */.Tcl_
3420: 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 4f 73 63 Obj *Tls_x509Osc
3430: 70 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e p(Tcl_Interp *in
3440: 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 terp, X509 *cert
3450: 29 20 7b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 ) {. STACK_OF
3460: 28 4f 50 45 4e 53 53 4c 5f 53 54 52 49 4e 47 29 (OPENSSL_STRING)
3470: 20 2a 6f 63 73 70 3b 0a 20 20 20 20 54 63 6c 5f *ocsp;. Tcl_
3480: 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d Obj *resultObj =
3490: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
34a0: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 0, NULL);.. i
34b0: 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 f (resultObj ==
34c0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
34d0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
34e0: 20 69 66 20 28 28 6f 63 73 70 20 3d 20 58 35 30 if ((ocsp = X50
34f0: 39 5f 67 65 74 31 5f 6f 63 73 70 28 63 65 72 74 9_get1_ocsp(cert
3500: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 66 )) != NULL) {..f
3510: 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 or (int i = 0; i
3520: 20 3c 20 73 6b 5f 4f 50 45 4e 53 53 4c 5f 53 54 < sk_OPENSSL_ST
3530: 52 49 4e 47 5f 6e 75 6d 28 6f 63 73 70 29 3b 20 RING_num(ocsp);
3540: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 i++) {.. LAPP
3550: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
3560: 72 65 73 75 6c 74 4f 62 6a 2c 20 4e 55 4c 4c 2c resultObj, NULL,
3570: 20 73 6b 5f 4f 50 45 4e 53 53 4c 5f 53 54 52 49 sk_OPENSSL_STRI
3580: 4e 47 5f 76 61 6c 75 65 28 6f 63 73 70 2c 20 69 NG_value(ocsp, i
3590: 29 2c 20 2d 31 29 3b 0a 09 7d 0a 09 58 35 30 39 ), -1);..}..X509
35a0: 5f 65 6d 61 69 6c 5f 66 72 65 65 28 6f 63 73 70 _email_free(ocsp
35b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 );. }. ret
35c0: 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d urn resultObj;.}
35d0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3600: 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 ----. *. * Tls_x
3630: 35 30 39 43 61 49 73 73 75 65 72 73 20 2d 2d 0a 509CaIssuers --.
3640: 20 2a 0a 20 2a 09 47 65 74 20 6c 69 73 74 20 6f *. *.Get list o
3650: 66 20 43 65 72 74 69 66 69 63 61 74 65 20 41 75 f Certificate Au
3660: 74 68 6f 72 69 74 79 20 28 43 41 29 20 49 73 73 thority (CA) Iss
3670: 75 65 72 20 55 52 49 73 0a 20 2a 0a 20 2a 20 52 uer URIs. *. * R
3680: 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 6c 20 6c esults:. *.Tcl l
3690: 69 73 74 20 6f 66 20 43 41 20 69 73 73 75 65 72 ist of CA issuer
36a0: 20 55 52 49 73 0a 20 2a 0a 20 2a 20 53 69 64 65 URIs. *. * Side
36b0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
36c0: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3710: 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a ----. */.Tcl_Obj
3720: 20 2a 54 6c 73 5f 78 35 30 39 43 61 49 73 73 75 *Tls_x509CaIssu
3730: 65 72 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a ers(Tcl_Interp *
3740: 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 interp, X509 *ce
3750: 72 74 29 20 7b 0a 20 20 20 20 53 54 41 43 4b 5f rt) {. STACK_
3760: 4f 46 28 41 43 43 45 53 53 5f 44 45 53 43 52 49 OF(ACCESS_DESCRI
3770: 50 54 49 4f 4e 29 20 2a 61 64 73 3b 0a 20 20 20 PTION) *ads;.
3780: 20 41 43 43 45 53 53 5f 44 45 53 43 52 49 50 54 ACCESS_DESCRIPT
3790: 49 4f 4e 20 2a 61 64 3b 0a 20 20 20 20 54 63 6c ION *ad;. Tcl
37a0: 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 _Obj *resultObj
37b0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
37c0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 75 (0, NULL);. u
37d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 nsigned char *bu
37e0: 66 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 f;.. if (resu
37f0: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b ltObj == NULL) {
3800: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
3810: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 61 }.. if ((a
3820: 64 73 20 3d 20 28 53 54 41 43 4b 5f 4f 46 28 41 ds = (STACK_OF(A
3830: 43 43 45 53 53 5f 44 45 53 43 52 49 50 54 49 4f CCESS_DESCRIPTIO
3840: 4e 29 20 2a 29 58 35 30 39 5f 67 65 74 5f 65 78 N) *)X509_get_ex
3850: 74 5f 64 32 69 28 63 65 72 74 2c 20 4e 49 44 5f t_d2i(cert, NID_
3860: 69 6e 66 6f 5f 61 63 63 65 73 73 2c 20 4e 55 4c info_access, NUL
3870: 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c L, NULL)) != NUL
3880: 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69 L) {..for (int i
3890: 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 41 43 43 = 0; i < sk_ACC
38a0: 45 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 5f ESS_DESCRIPTION_
38b0: 6e 75 6d 28 61 64 73 29 3b 20 69 2b 2b 29 20 7b num(ads); i++) {
38c0: 0a 09 20 20 20 20 61 64 20 3d 20 28 41 43 43 45 .. ad = (ACCE
38d0: 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 20 2a SS_DESCRIPTION *
38e0: 29 73 6b 5f 41 43 43 45 53 53 5f 44 45 53 43 52 )sk_ACCESS_DESCR
38f0: 49 50 54 49 4f 4e 5f 76 61 6c 75 65 28 61 64 73 IPTION_value(ads
3900: 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 4f , i);.. if (O
3910: 42 4a 5f 6f 62 6a 32 6e 69 64 28 61 64 2d 3e 6d BJ_obj2nid(ad->m
3920: 65 74 68 6f 64 29 20 3d 3d 20 4e 49 44 5f 61 64 ethod) == NID_ad
3930: 5f 63 61 5f 69 73 73 75 65 72 73 20 26 26 20 61 _ca_issuers && a
3940: 64 2d 3e 6c 6f 63 61 74 69 6f 6e 29 20 7b 0a 09 d->location) {..
3950: 09 69 66 20 28 61 64 2d 3e 6c 6f 63 61 74 69 6f .if (ad->locatio
3960: 6e 2d 3e 74 79 70 65 20 3d 3d 20 47 45 4e 5f 55 n->type == GEN_U
3970: 52 49 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f RI) {... Tcl_
3980: 53 69 7a 65 20 6c 65 6e 20 3d 20 28 54 63 6c 5f Size len = (Tcl_
3990: 53 69 7a 65 29 20 41 53 4e 31 5f 53 54 52 49 4e Size) ASN1_STRIN
39a0: 47 5f 74 6f 5f 55 54 46 38 28 26 62 75 66 2c 20 G_to_UTF8(&buf,
39b0: 61 64 2d 3e 6c 6f 63 61 74 69 6f 6e 2d 3e 64 2e ad->location->d.
39c0: 75 6e 69 66 6f 72 6d 52 65 73 6f 75 72 63 65 49 uniformResourceI
39d0: 64 65 6e 74 69 66 69 65 72 29 3b 0a 09 09 20 20 dentifier);...
39e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
39f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
3a00: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 p, resultObj, Tc
3a10: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 l_NewStringObj((
3a20: 63 68 61 72 20 2a 29 20 62 75 66 2c 20 6c 65 6e char *) buf, len
3a30: 29 29 3b 0a 09 09 20 20 20 20 4f 50 45 4e 53 53 ));... OPENSS
3a40: 4c 5f 66 72 65 65 28 62 75 66 29 3b 0a 09 09 20 L_free(buf);...
3a50: 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 20 break;...}..
3a60: 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 73 6b 5f 41 }..}../* sk_A
3a70: 43 43 45 53 53 5f 44 45 53 43 52 49 50 54 49 4f CCESS_DESCRIPTIO
3a80: 4e 5f 70 6f 70 5f 66 72 65 65 28 61 64 73 2c 20 N_pop_free(ads,
3a90: 41 43 43 45 53 53 5f 44 45 53 43 52 49 50 54 49 ACCESS_DESCRIPTI
3aa0: 4f 4e 5f 66 72 65 65 29 3b 20 2a 2f 0a 09 41 55 ON_free); */..AU
3ab0: 54 48 4f 52 49 54 59 5f 49 4e 46 4f 5f 41 43 43 THORITY_INFO_ACC
3ac0: 45 53 53 5f 66 72 65 65 28 61 64 73 29 3b 0a 20 ESS_free(ads);.
3ad0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
3ae0: 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0c 0a 2f resultObj;.}.../
3af0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
3b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b40: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 4e 65 77 58 -. *. * Tls_NewX
3b50: 35 30 39 4f 62 6a 20 2d 2d 0a 20 2a 0a 20 2a 09 509Obj --. *. *.
3b60: 50 61 72 73 65 73 20 61 20 58 35 30 39 20 63 65 Parses a X509 ce
3b70: 72 74 69 66 69 63 61 74 65 20 61 6e 64 20 72 65 rtificate and re
3b80: 74 75 72 6e 73 20 63 6f 6e 74 65 6e 74 73 20 61 turns contents a
3b90: 73 20 61 20 6b 65 79 2d 76 61 6c 75 65 20 54 63 s a key-value Tc
3ba0: 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 l list.. *. * Re
3bb0: 73 75 6c 74 3a 0a 20 2a 09 41 20 54 63 6c 20 4c sult:. *.A Tcl L
3bc0: 69 73 74 20 77 69 74 68 20 74 68 65 20 58 35 30 ist with the X50
3bd0: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 9 certificate in
3be0: 66 6f 20 61 73 20 61 20 6b 65 79 2d 76 61 6c 75 fo as a key-valu
3bf0: 65 20 6c 69 73 74 0a 20 2a 0a 20 2a 20 53 69 64 e list. *. * Sid
3c00: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
3c10: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ne. *. *--------
3c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c60: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 -----. */.Tcl_Ob
3c70: 6a 20 2a 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 j *Tls_NewX509Ob
3c80: 6a 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e j(Tcl_Interp *in
3c90: 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 terp, X509 *cert
3ca0: 2c 20 69 6e 74 20 61 6c 6c 29 20 7b 0a 20 20 20 , int all) {.
3cb0: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 Tcl_Obj *result
3cc0: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Obj = Tcl_NewLis
3cd0: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 tObj(0, NULL);.
3ce0: 20 20 20 42 49 4f 20 2a 62 69 6f 20 3d 20 42 49 BIO *bio = BI
3cf0: 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 O_new(BIO_s_mem(
3d00: 29 29 3b 0a 20 20 20 20 69 6e 74 20 6d 64 6e 69 ));. int mdni
3d10: 64 2c 20 70 6b 6e 69 64 2c 20 62 69 74 73 3b 0a d, pknid, bits;.
3d20: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e Tcl_Size len
3d30: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 ;. unsigned i
3d40: 6e 74 20 75 6c 65 6e 3b 0a 20 20 20 20 75 69 6e nt ulen;. uin
3d50: 74 33 32 5f 74 20 78 66 6c 61 67 73 3b 0a 20 20 t32_t xflags;.
3d60: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 unsigned long
3d70: 66 6c 61 67 73 20 3d 20 58 4e 5f 46 4c 41 47 5f flags = XN_FLAG_
3d80: 52 46 43 32 32 35 33 20 7c 20 41 53 4e 31 5f 53 RFC2253 | ASN1_S
3d90: 54 52 46 4c 47 53 5f 55 54 46 38 5f 43 4f 4e 56 TRFLGS_UTF8_CONV
3da0: 45 52 54 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 ERT;. flags &
3db0: 3d 20 7e 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e = ~(unsigned lon
3dc0: 67 29 41 53 4e 31 5f 53 54 52 46 4c 47 53 5f 45 g)ASN1_STRFLGS_E
3dd0: 53 43 5f 4d 53 42 3b 0a 0a 20 20 20 20 63 68 61 SC_MSB;.. cha
3de0: 72 20 2a 62 75 66 66 65 72 20 3d 20 28 63 68 61 r *buffer = (cha
3df0: 72 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 42 55 r *)Tcl_Alloc(BU
3e00: 46 53 49 5a 20 3e 20 45 56 50 5f 4d 41 58 5f 4d FSIZ > EVP_MAX_M
3e10: 44 5f 53 49 5a 45 20 3f 20 42 55 46 53 49 5a 20 D_SIZE ? BUFSIZ
3e20: 3a 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a : EVP_MAX_MD_SIZ
3e30: 45 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 E);.. dprintf
3e40: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
3e50: 20 69 66 20 28 69 6e 74 65 72 70 20 3d 3d 20 4e if (interp == N
3e60: 55 4c 4c 20 7c 7c 20 63 65 72 74 20 3d 3d 20 4e ULL || cert == N
3e70: 55 4c 4c 20 7c 7c 20 62 69 6f 20 3d 3d 20 4e 55 ULL || bio == NU
3e80: 4c 4c 20 7c 7c 20 72 65 73 75 6c 74 4f 62 6a 20 LL || resultObj
3e90: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62 75 66 66 65 == NULL || buffe
3ea0: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 r == NULL) {..Tc
3eb0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 72 l_DecrRefCount(r
3ec0: 65 73 75 6c 74 4f 62 6a 29 3b 0a 09 42 49 4f 5f esultObj);..BIO_
3ed0: 66 72 65 65 28 62 69 6f 29 3b 0a 09 69 66 20 28 free(bio);..if (
3ee0: 62 75 66 66 65 72 20 21 3d 20 4e 55 4c 4c 29 20 buffer != NULL)
3ef0: 54 63 6c 5f 46 72 65 65 28 62 75 66 66 65 72 29 Tcl_Free(buffer)
3f00: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
3f10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 69 }.. /* Si
3f20: 67 6e 61 74 75 72 65 20 61 6c 67 6f 72 69 74 68 gnature algorith
3f30: 6d 20 61 6e 64 20 76 61 6c 75 65 20 2d 20 52 46 m and value - RF
3f40: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 C 5280 section 4
3f50: 2e 31 2e 31 2e 32 20 61 6e 64 20 34 2e 31 2e 31 .1.1.2 and 4.1.1
3f60: 2e 33 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 69 67 .3 */. /* sig
3f70: 6e 61 74 75 72 65 41 6c 67 6f 72 69 74 68 6d 20 natureAlgorithm
3f80: 69 73 20 74 68 65 20 69 64 20 6f 66 20 74 68 65 is the id of the
3f90: 20 63 72 79 70 74 6f 67 72 61 70 68 69 63 20 61 cryptographic a
3fa0: 6c 67 6f 72 69 74 68 6d 20 75 73 65 64 20 62 79 lgorithm used by
3fb0: 20 74 68 65 0a 09 43 41 20 74 6f 20 73 69 67 6e the..CA to sign
3fc0: 20 74 68 69 73 20 63 65 72 74 2e 20 73 69 67 6e this cert. sign
3fd0: 61 74 75 72 65 56 61 6c 75 65 20 69 73 20 74 68 atureValue is th
3fe0: 65 20 64 69 67 69 74 61 6c 20 73 69 67 6e 61 74 e digital signat
3ff0: 75 72 65 20 63 6f 6d 70 75 74 65 64 0a 09 75 70 ure computed..up
4000: 6f 6e 20 74 68 65 20 41 53 4e 2e 31 20 44 45 52 on the ASN.1 DER
4010: 20 65 6e 63 6f 64 65 64 20 74 62 73 43 65 72 74 encoded tbsCert
4020: 69 66 69 63 61 74 65 2e 20 2a 2f 0a 20 20 20 20 ificate. */.
4030: 7b 0a 09 63 6f 6e 73 74 20 58 35 30 39 5f 41 4c {..const X509_AL
4040: 47 4f 52 20 2a 73 69 67 5f 61 6c 67 3b 0a 09 63 GOR *sig_alg;..c
4050: 6f 6e 73 74 20 41 53 4e 31 5f 42 49 54 5f 53 54 onst ASN1_BIT_ST
4060: 52 49 4e 47 20 2a 73 69 67 3b 0a 09 69 6e 74 20 RING *sig;..int
4070: 73 69 67 5f 6e 69 64 3b 0a 0a 09 58 35 30 39 5f sig_nid;...X509_
4080: 67 65 74 30 5f 73 69 67 6e 61 74 75 72 65 28 26 get0_signature(&
4090: 73 69 67 2c 20 26 73 69 67 5f 61 6c 67 2c 20 63 sig, &sig_alg, c
40a0: 65 72 74 29 3b 0a 09 2f 2a 20 73 69 67 5f 6e 69 ert);../* sig_ni
40b0: 64 20 3d 20 58 35 30 39 5f 67 65 74 5f 73 69 67 d = X509_get_sig
40c0: 6e 61 74 75 72 65 5f 6e 69 64 28 63 65 72 74 29 nature_nid(cert)
40d0: 20 2a 2f 0a 09 73 69 67 5f 6e 69 64 20 3d 20 4f */..sig_nid = O
40e0: 42 4a 5f 6f 62 6a 32 6e 69 64 28 73 69 67 5f 61 BJ_obj2nid(sig_a
40f0: 6c 67 2d 3e 61 6c 67 6f 72 69 74 68 6d 29 3b 0a lg->algorithm);.
4100: 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
4110: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
4120: 22 73 69 67 6e 61 74 75 72 65 41 6c 67 6f 72 69 "signatureAlgori
4130: 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e thm", OBJ_nid2ln
4140: 28 73 69 67 5f 6e 69 64 29 2c 20 2d 31 29 3b 0a (sig_nid), -1);.
4150: 09 69 66 20 28 73 69 67 5f 6e 69 64 20 21 3d 20 .if (sig_nid !=
4160: 4e 49 44 5f 75 6e 64 65 66 29 20 7b 0a 09 20 20 NID_undef) {..
4170: 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e LAPPEND_OBJ(in
4180: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
4190: 20 22 73 69 67 6e 61 74 75 72 65 56 61 6c 75 65 "signatureValue
41a0: 22 2c 0a 09 09 53 74 72 69 6e 67 5f 74 6f 5f 48 ",...String_to_H
41b0: 65 78 28 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67 ex(ASN1_STRING_g
41c0: 65 74 30 5f 64 61 74 61 28 73 69 67 29 2c 20 41 et0_data(sig), A
41d0: 53 4e 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 SN1_STRING_lengt
41e0: 68 28 73 69 67 29 29 29 3b 0a 09 7d 20 65 6c 73 h(sig)));..} els
41f0: 65 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 e {.. LAPPEND
4200: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 _STR(interp, res
4210: 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75 ultObj, "signatu
4220: 72 65 56 61 6c 75 65 22 2c 20 22 22 2c 20 30 29 reValue", "", 0)
4230: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
4240: 2f 2a 20 56 65 72 73 69 6f 6e 20 6f 66 20 74 68 /* Version of th
4250: 65 20 65 6e 63 6f 64 65 64 20 63 65 72 74 69 66 e encoded certif
4260: 69 63 61 74 65 20 2d 20 52 46 43 20 35 32 38 30 icate - RFC 5280
4270: 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 31 section 4.1.2.1
4280: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f */. LAPPEND_
4290: 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 72 65 73 LONG(interp, res
42a0: 75 6c 74 4f 62 6a 2c 20 22 76 65 72 73 69 6f 6e ultObj, "version
42b0: 22 2c 20 58 35 30 39 5f 67 65 74 5f 76 65 72 73 ", X509_get_vers
42c0: 69 6f 6e 28 63 65 72 74 29 2b 31 29 3b 0a 0a 20 ion(cert)+1);..
42d0: 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 6e 75 6d /* Unique num
42e0: 62 65 72 20 61 73 73 69 67 6e 65 64 20 62 79 20 ber assigned by
42f0: 43 41 20 74 6f 20 63 65 72 74 69 66 69 63 61 74 CA to certificat
4300: 65 20 2d 20 52 46 43 20 35 32 38 30 20 73 65 63 e - RFC 5280 sec
4310: 74 69 6f 6e 20 34 2e 31 2e 32 2e 32 20 2a 2f 0a tion 4.1.2.2 */.
4320: 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f len = BIO_to
4330: 5f 42 75 66 66 65 72 28 69 32 61 5f 41 53 4e 31 _Buffer(i2a_ASN1
4340: 5f 49 4e 54 45 47 45 52 28 62 69 6f 2c 20 58 35 _INTEGER(bio, X5
4350: 30 39 5f 67 65 74 30 5f 73 65 72 69 61 6c 4e 75 09_get0_serialNu
4360: 6d 62 65 72 28 63 65 72 74 29 29 2c 20 62 69 6f mber(cert)), bio
4370: 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a , buffer, BUFSIZ
4380: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 );. LAPPEND_S
4390: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c TR(interp, resul
43a0: 74 4f 62 6a 2c 20 22 73 65 72 69 61 6c 4e 75 6d tObj, "serialNum
43b0: 62 65 72 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 ber", buffer, le
43c0: 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 69 67 6e n);.. /* Sign
43d0: 61 74 75 72 65 20 61 6c 67 6f 72 69 74 68 6d 20 ature algorithm
43e0: 75 73 65 64 20 62 79 20 74 68 65 20 43 41 20 74 used by the CA t
43f0: 6f 20 73 69 67 6e 20 74 68 65 20 63 65 72 74 69 o sign the certi
4400: 66 69 63 61 74 65 2e 20 4d 75 73 74 20 6d 61 74 ficate. Must mat
4410: 63 68 0a 09 73 69 67 6e 61 74 75 72 65 41 6c 67 ch..signatureAlg
4420: 6f 72 69 74 68 6d 2e 20 52 46 43 20 35 32 38 30 orithm. RFC 5280
4430: 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 33 section 4.1.2.3
4440: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f */. LAPPEND_
4450: 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 STR(interp, resu
4460: 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75 72 ltObj, "signatur
4470: 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 58 e", OBJ_nid2ln(X
4480: 35 30 39 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 509_get_signatur
4490: 65 5f 6e 69 64 28 63 65 72 74 29 29 2c 20 2d 31 e_nid(cert)), -1
44a0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 73 73 75 65 );.. /* Issue
44b0: 72 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 r identifies the
44c0: 20 65 6e 74 69 74 79 20 74 68 61 74 20 73 69 67 entity that sig
44d0: 6e 65 64 20 61 6e 64 20 69 73 73 75 65 64 20 74 ned and issued t
44e0: 68 65 20 63 65 72 74 2e 20 52 46 43 20 35 32 38 he cert. RFC 528
44f0: 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 0 section 4.1.2.
4500: 34 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 4 */. len = B
4510: 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 58 35 30 IO_to_Buffer(X50
4520: 39 5f 4e 41 4d 45 5f 70 72 69 6e 74 5f 65 78 28 9_NAME_print_ex(
4530: 62 69 6f 2c 20 58 35 30 39 5f 67 65 74 5f 69 73 bio, X509_get_is
4540: 73 75 65 72 5f 6e 61 6d 65 28 63 65 72 74 29 2c suer_name(cert),
4550: 20 30 2c 20 66 6c 61 67 73 29 2c 20 62 69 6f 2c 0, flags), bio,
4560: 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 buffer, BUFSIZ)
4570: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 ;. LAPPEND_ST
4580: 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 R(interp, result
4590: 4f 62 6a 2c 20 22 69 73 73 75 65 72 22 2c 20 62 Obj, "issuer", b
45a0: 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a 20 20 uffer, len);..
45b0: 20 20 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65 /* Certificate
45c0: 20 76 61 6c 69 64 69 74 79 20 70 65 72 69 6f 64 validity period
45d0: 20 69 73 20 74 68 65 20 69 6e 74 65 72 76 61 6c is the interval
45e0: 20 74 68 65 20 43 41 20 77 61 72 72 61 6e 74 73 the CA warrants
45f0: 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 09 6d that it will..m
4600: 61 69 6e 74 61 69 6e 20 69 6e 66 6f 20 6f 6e 20 aintain info on
4610: 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 74 68 the status of th
4620: 65 20 63 65 72 74 69 66 69 63 61 74 65 2e 20 52 e certificate. R
4630: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 FC 5280 section
4640: 34 2e 31 2e 32 2e 35 20 2a 2f 0a 20 20 20 20 2f 4.1.2.5 */. /
4650: 2a 20 47 65 74 20 56 61 6c 69 64 69 74 79 20 2d * Get Validity -
4660: 20 4e 6f 74 20 42 65 66 6f 72 65 20 2a 2f 0a 20 Not Before */.
4670: 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f len = BIO_to_
4680: 42 75 66 66 65 72 28 41 53 4e 31 5f 54 49 4d 45 Buffer(ASN1_TIME
4690: 5f 70 72 69 6e 74 28 62 69 6f 2c 20 58 35 30 39 _print(bio, X509
46a0: 5f 67 65 74 30 5f 6e 6f 74 42 65 66 6f 72 65 28 _get0_notBefore(
46b0: 63 65 72 74 29 29 2c 20 62 69 6f 2c 20 62 75 66 cert)), bio, buf
46c0: 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 20 20 fer, BUFSIZ);.
46d0: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
46e0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
46f0: 20 22 6e 6f 74 42 65 66 6f 72 65 22 2c 20 62 75 "notBefore", bu
4700: 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a 20 20 20 ffer, len);..
4710: 20 2f 2a 20 47 65 74 20 56 61 6c 69 64 69 74 79 /* Get Validity
4720: 20 2d 20 4e 6f 74 20 41 66 74 65 72 20 2a 2f 0a - Not After */.
4730: 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f len = BIO_to
4740: 5f 42 75 66 66 65 72 28 41 53 4e 31 5f 54 49 4d _Buffer(ASN1_TIM
4750: 45 5f 70 72 69 6e 74 28 62 69 6f 2c 20 58 35 30 E_print(bio, X50
4760: 39 5f 67 65 74 30 5f 6e 6f 74 41 66 74 65 72 28 9_get0_notAfter(
4770: 63 65 72 74 29 29 2c 20 62 69 6f 2c 20 62 75 66 cert)), bio, buf
4780: 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 20 20 fer, BUFSIZ);.
4790: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
47a0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
47b0: 20 22 6e 6f 74 41 66 74 65 72 22 2c 20 62 75 66 "notAfter", buf
47c0: 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 fer, len);..
47d0: 2f 2a 20 53 75 62 6a 65 63 74 20 69 64 65 6e 74 /* Subject ident
47e0: 69 66 69 65 73 20 74 68 65 20 65 6e 74 69 74 79 ifies the entity
47f0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
4800: 20 74 68 65 20 70 75 62 6c 69 63 20 6b 65 79 20 the public key
4810: 73 74 6f 72 65 64 20 69 6e 0a 09 74 68 65 20 73 stored in..the s
4820: 75 62 6a 65 63 74 20 70 75 62 6c 69 63 20 6b 65 ubject public ke
4830: 79 20 66 69 65 6c 64 2e 20 52 46 43 20 35 32 38 y field. RFC 528
4840: 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 0 section 4.1.2.
4850: 36 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 6 */. len = B
4860: 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 58 35 30 IO_to_Buffer(X50
4870: 39 5f 4e 41 4d 45 5f 70 72 69 6e 74 5f 65 78 28 9_NAME_print_ex(
4880: 62 69 6f 2c 20 58 35 30 39 5f 67 65 74 5f 73 75 bio, X509_get_su
4890: 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 bject_name(cert)
48a0: 2c 20 30 2c 20 66 6c 61 67 73 29 2c 20 62 69 6f , 0, flags), bio
48b0: 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a , buffer, BUFSIZ
48c0: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 );. LAPPEND_S
48d0: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c TR(interp, resul
48e0: 74 4f 62 6a 2c 20 22 73 75 62 6a 65 63 74 22 2c tObj, "subject",
48f0: 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a buffer, len);..
4900: 20 20 20 20 2f 2a 20 53 48 41 31 20 44 69 67 65 /* SHA1 Dige
4910: 73 74 20 28 46 69 6e 67 65 72 70 72 69 6e 74 29 st (Fingerprint)
4920: 20 6f 66 20 63 65 72 74 20 2d 20 44 45 52 20 72 of cert - DER r
4930: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f epresentation */
4940: 0a 20 20 20 20 69 66 20 28 58 35 30 39 5f 64 69 . if (X509_di
4950: 67 65 73 74 28 63 65 72 74 2c 20 45 56 50 5f 73 gest(cert, EVP_s
4960: 68 61 31 28 29 2c 20 28 75 6e 73 69 67 6e 65 64 ha1(), (unsigned
4970: 20 63 68 61 72 20 2a 29 62 75 66 66 65 72 2c 20 char *)buffer,
4980: 26 75 6c 65 6e 29 29 20 7b 0a 09 4c 41 50 50 45 &ulen)) {..LAPPE
4990: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 ND_OBJ(interp, r
49a0: 65 73 75 6c 74 4f 62 6a 2c 20 22 73 68 61 31 5f esultObj, "sha1_
49b0: 68 61 73 68 22 2c 20 53 74 72 69 6e 67 5f 74 6f hash", String_to
49c0: 5f 48 65 78 28 28 63 6f 6e 73 74 20 75 6e 73 69 _Hex((const unsi
49d0: 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 gned char *)buff
49e0: 65 72 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 er, (int) ulen))
49f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
4a00: 53 48 41 32 35 36 20 44 69 67 65 73 74 20 28 46 SHA256 Digest (F
4a10: 69 6e 67 65 72 70 72 69 6e 74 29 20 6f 66 20 63 ingerprint) of c
4a20: 65 72 74 20 2d 20 44 45 52 20 72 65 70 72 65 73 ert - DER repres
4a30: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 entation */.
4a40: 69 66 20 28 58 35 30 39 5f 64 69 67 65 73 74 28 if (X509_digest(
4a50: 63 65 72 74 2c 20 45 56 50 5f 73 68 61 32 35 36 cert, EVP_sha256
4a60: 28 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 (), (unsigned ch
4a70: 61 72 20 2a 29 62 75 66 66 65 72 2c 20 26 75 6c ar *)buffer, &ul
4a80: 65 6e 29 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f en)) {..LAPPEND_
4a90: 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 OBJ(interp, resu
4aa0: 6c 74 4f 62 6a 2c 20 22 73 68 61 32 35 36 5f 68 ltObj, "sha256_h
4ab0: 61 73 68 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f ash", String_to_
4ac0: 48 65 78 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 Hex((const unsig
4ad0: 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 ned char *)buffe
4ae0: 72 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b r, (int) ulen));
4af0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
4b00: 75 62 6a 65 63 74 20 50 75 62 6c 69 63 20 4b 65 ubject Public Ke
4b10: 79 20 49 6e 66 6f 20 73 70 65 63 69 66 69 65 73 y Info specifies
4b20: 20 74 68 65 20 70 75 62 6c 69 63 20 6b 65 79 20 the public key
4b30: 61 6e 64 20 69 64 65 6e 74 69 66 69 65 73 20 74 and identifies t
4b40: 68 65 0a 09 61 6c 67 6f 72 69 74 68 6d 20 77 69 he..algorithm wi
4b50: 74 68 20 77 68 69 63 68 20 74 68 65 20 6b 65 79 th which the key
4b60: 20 69 73 20 75 73 65 64 2e 20 52 46 43 20 35 32 is used. RFC 52
4b70: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 80 section 4.1.2
4b80: 2e 37 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35 .7 */. if (X5
4b90: 30 39 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 09_get_signature
4ba0: 5f 69 6e 66 6f 28 63 65 72 74 2c 20 26 6d 64 6e _info(cert, &mdn
4bb0: 69 64 2c 20 26 70 6b 6e 69 64 2c 20 26 62 69 74 id, &pknid, &bit
4bc0: 73 2c 20 26 78 66 6c 61 67 73 29 29 20 7b 0a 23 s, &xflags)) {.#
4bd0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
4be0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 34 30 ON_NUMBER < 0x40
4bf0: 30 30 30 30 30 30 4c 0a 09 41 53 4e 31 5f 42 49 000000L..ASN1_BI
4c00: 54 5f 53 54 52 49 4e 47 20 2a 6b 65 79 3b 0a 23 T_STRING *key;.#
4c10: 65 6c 73 65 0a 09 63 6f 6e 73 74 20 41 53 4e 31 else..const ASN1
4c20: 5f 42 49 54 5f 53 54 52 49 4e 47 20 2a 6b 65 79 _BIT_STRING *key
4c30: 3b 0a 23 65 6e 64 69 66 0a 09 75 6e 73 69 67 6e ;.#endif..unsign
4c40: 65 64 20 69 6e 74 20 6e 3b 0a 0a 09 4c 41 50 50 ed int n;...LAPP
4c50: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
4c60: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e resultObj, "sign
4c70: 69 6e 67 44 69 67 65 73 74 22 2c 20 4f 42 4a 5f ingDigest", OBJ_
4c80: 6e 69 64 32 6c 6e 28 6d 64 6e 69 64 29 2c 20 2d nid2ln(mdnid), -
4c90: 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 1);..LAPPEND_STR
4ca0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
4cb0: 62 6a 2c 20 22 70 75 62 6c 69 63 4b 65 79 41 6c bj, "publicKeyAl
4cc0: 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 gorithm", OBJ_ni
4cd0: 64 32 6c 6e 28 70 6b 6e 69 64 29 2c 20 2d 31 29 d2ln(pknid), -1)
4ce0: 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 ;..LAPPEND_INT(i
4cf0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
4d00: 2c 20 22 62 69 74 73 22 2c 20 62 69 74 73 29 3b , "bits", bits);
4d10: 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 65 /* Effective se
4d20: 63 75 72 69 74 79 20 62 69 74 73 20 2a 2f 0a 0a curity bits */..
4d30: 09 6b 65 79 20 3d 20 58 35 30 39 5f 67 65 74 30 .key = X509_get0
4d40: 5f 70 75 62 6b 65 79 5f 62 69 74 73 74 72 28 63 _pubkey_bitstr(c
4d50: 65 72 74 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 4f ert);..LAPPEND_O
4d60: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c BJ(interp, resul
4d70: 74 4f 62 6a 2c 20 22 70 75 62 6c 69 63 4b 65 79 tObj, "publicKey
4d80: 22 2c 0a 09 20 20 20 20 53 74 72 69 6e 67 5f 74 ",.. String_t
4d90: 6f 5f 48 65 78 28 41 53 4e 31 5f 53 54 52 49 4e o_Hex(ASN1_STRIN
4da0: 47 5f 67 65 74 30 5f 64 61 74 61 28 6b 65 79 29 G_get0_data(key)
4db0: 2c 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c 65 , ASN1_STRING_le
4dc0: 6e 67 74 68 28 6b 65 79 29 29 29 3b 0a 0a 09 69 ngth(key)));...i
4dd0: 66 20 28 58 35 30 39 5f 70 75 62 6b 65 79 5f 64 f (X509_pubkey_d
4de0: 69 67 65 73 74 28 63 65 72 74 2c 20 45 56 50 5f igest(cert, EVP_
4df0: 67 65 74 5f 64 69 67 65 73 74 62 79 6e 69 64 28 get_digestbynid(
4e00: 70 6b 6e 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 pknid), (unsigne
4e10: 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 72 2c d char *)buffer,
4e20: 20 26 6e 29 29 20 7b 0a 09 20 20 20 20 4c 41 50 &n)) {.. LAP
4e30: 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c PEND_OBJ(interp,
4e40: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 75 62 resultObj, "pub
4e50: 6c 69 63 4b 65 79 48 61 73 68 22 2c 20 53 74 72 licKeyHash", Str
4e60: 69 6e 67 5f 74 6f 5f 48 65 78 28 28 63 6f 6e 73 ing_to_Hex((cons
4e70: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
4e80: 2a 29 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20 *)buffer, (int)
4e90: 6e 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 n));..} else {..
4ea0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
4eb0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
4ec0: 6a 2c 20 22 70 75 62 6c 69 63 4b 65 79 48 61 73 j, "publicKeyHas
4ed0: 68 22 2c 20 22 22 2c 20 30 29 3b 0a 09 7d 0a 0a h", "", 0);..}..
4ee0: 09 2f 2a 20 64 69 67 65 73 74 20 6f 66 20 74 68 ./* digest of th
4ef0: 65 20 44 45 52 20 72 65 70 72 65 73 65 6e 74 61 e DER representa
4f00: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 65 72 74 tion of the cert
4f10: 69 66 69 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 ificate */..if (
4f20: 58 35 30 39 5f 64 69 67 65 73 74 28 63 65 72 74 X509_digest(cert
4f30: 2c 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74 , EVP_get_digest
4f40: 62 79 6e 69 64 28 6d 64 6e 69 64 29 2c 20 28 75 bynid(mdnid), (u
4f50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 nsigned char *)b
4f60: 75 66 66 65 72 2c 20 26 6e 29 29 20 7b 0a 09 20 uffer, &n)) {..
4f70: 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 LAPPEND_OBJ(i
4f80: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
4f90: 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 , "signatureHash
4fa0: 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 ", String_to_Hex
4fb0: 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 ((const unsigned
4fc0: 20 63 68 61 72 20 2a 29 62 75 66 66 65 72 2c 20 char *)buffer,
4fd0: 28 69 6e 74 29 20 6e 29 29 3b 0a 09 7d 20 65 6c (int) n));..} el
4fe0: 73 65 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e se {.. LAPPEN
4ff0: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 D_STR(interp, re
5000: 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74 sultObj, "signat
5010: 75 72 65 48 61 73 68 22 2c 20 22 22 2c 20 30 29 ureHash", "", 0)
5020: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
5030: 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65 20 50 /* Certificate P
5040: 75 72 70 6f 73 65 2e 20 43 61 6c 6c 20 62 65 66 urpose. Call bef
5050: 6f 72 65 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 ore checking for
5060: 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 2a 2f 0a extensions. */.
5070: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
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 72 70 6f 73 65 22 2c 20 54 6c j, "purpose", Tl
50a0: 73 5f 78 35 30 39 50 75 72 70 6f 73 65 28 63 65 s_x509Purpose(ce
50b0: 72 74 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 rt), -1);. LA
50c0: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 PPEND_OBJ(interp
50d0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 63 65 , resultObj, "ce
50e0: 72 74 69 66 69 63 61 74 65 50 75 72 70 6f 73 65 rtificatePurpose
50f0: 22 2c 20 54 6c 73 5f 78 35 30 39 50 75 72 70 6f ", Tls_x509Purpo
5100: 73 65 73 28 69 6e 74 65 72 70 2c 20 63 65 72 74 ses(interp, cert
5110: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 ));.. /* Get
5120: 65 78 74 65 6e 73 69 6f 6e 73 20 66 6c 61 67 73 extensions flags
5130: 20 2a 2f 0a 20 20 20 20 78 66 6c 61 67 73 20 3d */. xflags =
5140: 20 58 35 30 39 5f 67 65 74 5f 65 78 74 65 6e 73 X509_get_extens
5150: 69 6f 6e 5f 66 6c 61 67 73 28 63 65 72 74 29 3b ion_flags(cert);
5160: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 . LAPPEND_INT
5170: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
5180: 62 6a 2c 20 22 65 78 74 46 6c 61 67 73 22 2c 20 bj, "extFlags",
5190: 78 66 6c 61 67 73 29 3b 0a 0a 09 2f 2a 20 43 68 xflags);.../* Ch
51a0: 65 63 6b 20 69 66 20 63 65 72 74 20 77 61 73 20 eck if cert was
51b0: 69 73 73 75 65 64 20 62 79 20 43 41 20 63 65 72 issued by CA cer
51c0: 74 20 69 73 73 75 65 72 20 6f 72 20 73 65 6c 66 t issuer or self
51d0: 20 73 69 67 6e 65 64 20 2a 2f 0a 20 20 20 20 4c signed */. L
51e0: 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
51f0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
5200: 73 65 6c 66 49 73 73 75 65 64 22 2c 20 78 66 6c selfIssued", xfl
5210: 61 67 73 20 26 20 45 58 46 4c 41 47 5f 53 49 29 ags & EXFLAG_SI)
5220: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f ;. LAPPEND_BO
5230: 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c OL(interp, resul
5240: 74 4f 62 6a 2c 20 22 73 65 6c 66 53 69 67 6e 65 tObj, "selfSigne
5250: 64 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58 46 d", xflags & EXF
5260: 4c 41 47 5f 53 53 29 3b 0a 20 20 20 20 4c 41 50 LAG_SS);. LAP
5270: 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 PEND_BOOL(interp
5280: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 69 73 , resultObj, "is
5290: 50 72 6f 78 79 43 65 72 74 22 2c 20 78 66 6c 61 ProxyCert", xfla
52a0: 67 73 20 26 20 45 58 46 4c 41 47 5f 50 52 4f 58 gs & EXFLAG_PROX
52b0: 59 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f Y);. LAPPEND_
52c0: 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 BOOL(interp, res
52d0: 75 6c 74 4f 62 6a 2c 20 22 65 78 74 49 6e 76 61 ultObj, "extInva
52e0: 6c 69 64 22 2c 20 78 66 6c 61 67 73 20 26 20 45 lid", xflags & E
52f0: 58 46 4c 41 47 5f 49 4e 56 41 4c 49 44 29 3b 0a XFLAG_INVALID);.
5300: 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c LAPPEND_BOOL
5310: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
5320: 62 6a 2c 20 22 69 73 43 41 43 65 72 74 22 2c 20 bj, "isCACert",
5330: 58 35 30 39 5f 63 68 65 63 6b 5f 63 61 28 63 65 X509_check_ca(ce
5340: 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 rt));.. /* Th
5350: 65 20 55 6e 69 71 75 65 20 49 64 73 20 61 72 65 e Unique Ids are
5360: 20 75 73 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 used to handle
5370: 74 68 65 20 70 6f 73 73 69 62 69 6c 69 74 79 20 the possibility
5380: 6f 66 20 72 65 75 73 65 20 6f 66 20 73 75 62 6a of reuse of subj
5390: 65 63 74 0a 09 61 6e 64 2f 6f 72 20 69 73 73 75 ect..and/or issu
53a0: 65 72 20 6e 61 6d 65 73 20 6f 76 65 72 20 74 69 er names over ti
53b0: 6d 65 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 me. RFC 5280 sec
53c0: 74 69 6f 6e 20 34 2e 31 2e 32 2e 38 20 2a 2f 0a tion 4.1.2.8 */.
53d0: 20 20 20 20 7b 0a 09 63 6f 6e 73 74 20 41 53 4e {..const ASN
53e0: 31 5f 42 49 54 5f 53 54 52 49 4e 47 20 2a 69 75 1_BIT_STRING *iu
53f0: 69 64 2c 20 2a 73 75 69 64 3b 0a 09 58 35 30 39 id, *suid;..X509
5400: 5f 67 65 74 30 5f 75 69 64 73 28 63 65 72 74 2c _get0_uids(cert,
5410: 20 26 69 75 69 64 2c 20 26 73 75 69 64 29 3b 0a &iuid, &suid);.
5420: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
5430: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
5440: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 p, resultObj, Tc
5450: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
5460: 69 73 73 75 65 72 55 6e 69 71 75 65 49 64 22 2c issuerUniqueId",
5470: 20 2d 31 29 29 3b 0a 09 69 66 20 28 69 75 69 64 -1));..if (iuid
5480: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
5490: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
54a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
54b0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 0a 09 09 54 , resultObj,...T
54c0: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f cl_NewByteArrayO
54d0: 62 6a 28 41 53 4e 31 5f 53 54 52 49 4e 47 5f 67 bj(ASN1_STRING_g
54e0: 65 74 30 5f 64 61 74 61 28 69 75 69 64 29 2c 20 et0_data(iuid),
54f0: 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31 5f (Tcl_Size) ASN1_
5500: 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 69 75 STRING_length(iu
5510: 69 64 29 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b id)));..} else {
5520: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
5530: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
5540: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
5550: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
5560: 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a bj("", -1));..}.
5570: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
5580: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
5590: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 p, resultObj, Tc
55a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
55b0: 73 75 62 6a 65 63 74 55 6e 69 71 75 65 49 64 22 subjectUniqueId"
55c0: 2c 20 2d 31 29 29 3b 0a 09 69 66 20 28 73 75 69 , -1));..if (sui
55d0: 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 d != NULL) {..
55e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
55f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
5600: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 0a 09 09 p, resultObj,...
5610: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 Tcl_NewByteArray
5620: 4f 62 6a 28 41 53 4e 31 5f 53 54 52 49 4e 47 5f Obj(ASN1_STRING_
5630: 67 65 74 30 5f 64 61 74 61 28 73 75 69 64 29 2c get0_data(suid),
5640: 20 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31 (Tcl_Size) ASN1
5650: 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 73 _STRING_length(s
5660: 75 69 64 29 29 29 3b 0a 09 7d 20 65 6c 73 65 20 uid)));..} else
5670: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
5680: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
5690: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
56a0: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 j, Tcl_NewString
56b0: 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 09 7d Obj("", -1));..}
56c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 58 . }.. /* X
56d0: 35 30 39 20 76 33 20 45 78 74 65 6e 73 69 6f 6e 509 v3 Extension
56e0: 73 20 2d 20 52 46 43 20 35 32 38 30 20 73 65 63 s - RFC 5280 sec
56f0: 74 69 6f 6e 20 34 2e 31 2e 32 2e 39 20 2a 2f 0a tion 4.1.2.9 */.
5700: 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 LAPPEND_INT(
5710: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
5720: 6a 2c 20 22 65 78 74 43 6f 75 6e 74 22 2c 20 58 j, "extCount", X
5730: 35 30 39 5f 67 65 74 5f 65 78 74 5f 63 6f 75 6e 509_get_ext_coun
5740: 74 28 63 65 72 74 29 29 3b 0a 20 20 20 20 4c 41 t(cert));. LA
5750: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 PPEND_OBJ(interp
5760: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 , resultObj, "ex
5770: 74 65 6e 73 69 6f 6e 73 22 2c 20 54 6c 73 5f 78 tensions", Tls_x
5780: 35 30 39 45 78 74 65 6e 73 69 6f 6e 73 28 69 6e 509Extensions(in
5790: 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 terp, cert));..
57a0: 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 74 79 20 /* Authority
57b0: 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 20 28 Key Identifier (
57c0: 41 4b 49 29 20 69 73 20 74 68 65 20 53 75 62 6a AKI) is the Subj
57d0: 65 63 74 20 4b 65 79 20 49 64 65 6e 74 69 66 69 ect Key Identifi
57e0: 65 72 20 28 53 4b 49 29 20 6f 66 0a 09 69 74 73 er (SKI) of..its
57f0: 20 73 69 67 6e 65 72 20 28 74 68 65 20 43 41 29 signer (the CA)
5800: 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 . RFC 5280 secti
5810: 6f 6e 20 34 2e 32 2e 31 2e 31 2c 20 4e 49 44 5f on 4.2.1.1, NID_
5820: 61 75 74 68 6f 72 69 74 79 5f 6b 65 79 5f 69 64 authority_key_id
5830: 65 6e 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 entifier */.
5840: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 LAPPEND_OBJ(inte
5850: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
5860: 61 75 74 68 6f 72 69 74 79 4b 65 79 49 64 65 6e authorityKeyIden
5870: 74 69 66 69 65 72 22 2c 0a 09 54 6c 73 5f 78 35 tifier",..Tls_x5
5880: 30 39 49 64 65 6e 74 69 66 69 65 72 28 58 35 30 09Identifier(X50
5890: 39 5f 67 65 74 30 5f 61 75 74 68 6f 72 69 74 79 9_get0_authority
58a0: 5f 6b 65 79 5f 69 64 28 63 65 72 74 29 29 29 3b _key_id(cert)));
58b0: 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 .. /* Subject
58c0: 20 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 20 Key Identifier
58d0: 28 53 4b 49 29 20 69 73 20 75 73 65 64 20 74 6f (SKI) is used to
58e0: 20 69 64 65 6e 74 69 66 79 20 63 65 72 74 69 66 identify certif
58f0: 69 63 61 74 65 73 20 74 68 61 74 20 63 6f 6e 74 icates that cont
5900: 61 69 6e 0a 09 61 20 70 61 72 74 69 63 75 6c 61 ain..a particula
5910: 72 20 70 75 62 6c 69 63 20 6b 65 79 2e 20 52 46 r public key. RF
5920: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 C 5280 section 4
5930: 2e 32 2e 31 2e 32 2c 20 4e 49 44 5f 73 75 62 6a .2.1.2, NID_subj
5940: 65 63 74 5f 6b 65 79 5f 69 64 65 6e 74 69 66 69 ect_key_identifi
5950: 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e er */. LAPPEN
5960: 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 D_OBJ(interp, re
5970: 73 75 6c 74 4f 62 6a 2c 20 22 73 75 62 6a 65 63 sultObj, "subjec
5980: 74 4b 65 79 49 64 65 6e 74 69 66 69 65 72 22 2c tKeyIdentifier",
5990: 0a 09 54 6c 73 5f 78 35 30 39 49 64 65 6e 74 69 ..Tls_x509Identi
59a0: 66 69 65 72 28 58 35 30 39 5f 67 65 74 30 5f 73 fier(X509_get0_s
59b0: 75 62 6a 65 63 74 5f 6b 65 79 5f 69 64 28 63 65 ubject_key_id(ce
59c0: 72 74 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4b rt)));.. /* K
59d0: 65 79 20 75 73 61 67 65 20 65 78 74 65 6e 73 69 ey usage extensi
59e0: 6f 6e 20 64 65 66 69 6e 65 73 20 74 68 65 20 70 on defines the p
59f0: 75 72 70 6f 73 65 20 28 65 2e 67 2e 2c 20 65 6e urpose (e.g., en
5a00: 63 69 70 68 65 72 6d 65 6e 74 2c 20 73 69 67 6e cipherment, sign
5a10: 61 74 75 72 65 2c 20 63 65 72 74 69 66 69 63 61 ature, certifica
5a20: 74 65 0a 09 73 69 67 6e 69 6e 67 29 20 6f 66 20 te..signing) of
5a30: 74 68 65 20 6b 65 79 20 69 6e 20 74 68 65 20 63 the key in the c
5a40: 65 72 74 69 66 69 63 61 74 65 2e 20 52 46 43 20 ertificate. RFC
5a50: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 5280 section 4.2
5a60: 2e 31 2e 33 2c 20 4e 49 44 5f 6b 65 79 5f 75 73 .1.3, NID_key_us
5a70: 61 67 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 age */. LAPPE
5a80: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 ND_OBJ(interp, r
5a90: 65 73 75 6c 74 4f 62 6a 2c 20 22 6b 65 79 55 73 esultObj, "keyUs
5aa0: 61 67 65 22 2c 20 54 6c 73 5f 78 35 30 39 4b 65 age", Tls_x509Ke
5ab0: 79 55 73 61 67 65 28 69 6e 74 65 72 70 2c 20 63 yUsage(interp, c
5ac0: 65 72 74 2c 20 78 66 6c 61 67 73 29 29 3b 0a 0a ert, xflags));..
5ad0: 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63 61 /* Certifica
5ae0: 74 65 20 50 6f 6c 69 63 69 65 73 20 2d 20 69 6e te Policies - in
5af0: 64 69 63 61 74 65 73 20 74 68 65 20 69 73 73 75 dicates the issu
5b00: 69 6e 67 20 43 41 20 63 6f 6e 73 69 64 65 72 73 ing CA considers
5b10: 20 69 74 73 20 69 73 73 75 65 72 44 6f 6d 61 69 its issuerDomai
5b20: 6e 50 6f 6c 69 63 79 0a 09 65 71 75 69 76 61 6c nPolicy..equival
5b30: 65 6e 74 20 74 6f 20 74 68 65 20 73 75 62 6a 65 ent to the subje
5b40: 63 74 20 43 41 27 73 20 73 75 62 6a 65 63 74 44 ct CA's subjectD
5b50: 6f 6d 61 69 6e 50 6f 6c 69 63 79 2e 20 52 46 43 omainPolicy. RFC
5b60: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 5280 section 4.
5b70: 32 2e 31 2e 34 2c 20 4e 49 44 5f 63 65 72 74 69 2.1.4, NID_certi
5b80: 66 69 63 61 74 65 5f 70 6f 6c 69 63 69 65 73 20 ficate_policies
5b90: 2a 2f 0a 20 20 20 20 69 66 20 28 78 66 6c 61 67 */. if (xflag
5ba0: 73 20 26 20 45 58 46 4c 41 47 5f 49 4e 56 41 4c s & EXFLAG_INVAL
5bb0: 49 44 5f 50 4f 4c 49 43 59 29 20 7b 0a 09 2f 2a ID_POLICY) {../*
5bc0: 20 52 65 6a 65 63 74 20 63 65 72 74 20 2a 2f 0a Reject cert */.
5bd0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f }.. /* Po
5be0: 6c 69 63 79 20 4d 61 70 70 69 6e 67 73 20 2d 20 licy Mappings -
5bf0: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e RFC 5280 section
5c00: 20 34 2e 32 2e 31 2e 35 2c 20 4e 49 44 5f 70 6f 4.2.1.5, NID_po
5c10: 6c 69 63 79 5f 6d 61 70 70 69 6e 67 73 20 2a 2f licy_mappings */
5c20: 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 .. /* Subject
5c30: 20 41 6c 74 65 72 6e 61 74 69 76 65 20 4e 61 6d Alternative Nam
5c40: 65 20 28 53 41 4e 29 20 63 6f 6e 74 61 69 6e 73 e (SAN) contains
5c50: 20 61 64 64 69 74 69 6f 6e 61 6c 20 55 52 4c 73 additional URLs
5c60: 2c 20 44 4e 53 20 6e 61 6d 65 73 2c 20 6f 72 20 , DNS names, or
5c70: 49 50 0a 09 61 64 64 72 65 73 73 65 73 20 62 6f IP..addresses bo
5c80: 75 6e 64 20 74 6f 20 63 65 72 74 69 66 69 63 61 und to certifica
5c90: 74 65 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 te. RFC 5280 sec
5ca0: 74 69 6f 6e 20 34 2e 32 2e 31 2e 36 2c 20 4e 49 tion 4.2.1.6, NI
5cb0: 44 5f 73 75 62 6a 65 63 74 5f 61 6c 74 5f 6e 61 D_subject_alt_na
5cc0: 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e me */. LAPPEN
5cd0: 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 D_OBJ(interp, re
5ce0: 73 75 6c 74 4f 62 6a 2c 20 22 73 75 62 6a 65 63 sultObj, "subjec
5cf0: 74 41 6c 74 4e 61 6d 65 22 2c 20 54 6c 73 5f 78 tAltName", Tls_x
5d00: 35 30 39 4e 61 6d 65 73 28 69 6e 74 65 72 70 2c 509Names(interp,
5d10: 20 63 65 72 74 2c 20 4e 49 44 5f 73 75 62 6a 65 cert, NID_subje
5d20: 63 74 5f 61 6c 74 5f 6e 61 6d 65 2c 20 62 69 6f ct_alt_name, bio
5d30: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 73 73 75 ));.. /* Issu
5d40: 65 72 20 41 6c 74 65 72 6e 61 74 69 76 65 20 4e er Alternative N
5d50: 61 6d 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 ame is used to a
5d60: 73 73 6f 63 69 61 74 65 20 49 6e 74 65 72 6e 65 ssociate Interne
5d70: 74 20 73 74 79 6c 65 20 69 64 65 6e 74 69 74 69 t style identiti
5d80: 65 73 0a 09 77 69 74 68 20 74 68 65 20 63 65 72 es..with the cer
5d90: 74 69 66 69 63 61 74 65 20 69 73 73 75 65 72 2e tificate issuer.
5da0: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f RFC 5280 sectio
5db0: 6e 20 34 2e 32 2e 31 2e 37 2c 20 4e 49 44 5f 69 n 4.2.1.7, NID_i
5dc0: 73 73 75 65 72 5f 61 6c 74 5f 6e 61 6d 65 20 2a ssuer_alt_name *
5dd0: 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 /. LAPPEND_OB
5de0: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 J(interp, result
5df0: 4f 62 6a 2c 20 22 69 73 73 75 65 72 41 6c 74 4e Obj, "issuerAltN
5e00: 61 6d 65 22 2c 20 54 6c 73 5f 78 35 30 39 4e 61 ame", Tls_x509Na
5e10: 6d 65 73 28 69 6e 74 65 72 70 2c 20 63 65 72 74 mes(interp, cert
5e20: 2c 20 4e 49 44 5f 69 73 73 75 65 72 5f 61 6c 74 , NID_issuer_alt
5e30: 5f 6e 61 6d 65 2c 20 62 69 6f 29 29 3b 0a 0a 20 _name, bio));..
5e40: 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 44 69 /* Subject Di
5e50: 72 65 63 74 6f 72 79 20 41 74 74 72 69 62 75 74 rectory Attribut
5e60: 65 73 20 70 72 6f 76 69 64 65 73 20 69 64 65 6e es provides iden
5e70: 74 69 66 69 63 61 74 69 6f 6e 20 61 74 74 72 69 tification attri
5e80: 62 75 74 65 73 20 28 65 2e 67 2e 2c 20 6e 61 74 butes (e.g., nat
5e90: 69 6f 6e 61 6c 69 74 79 29 0a 09 6f 66 20 74 68 ionality)..of th
5ea0: 65 20 73 75 62 6a 65 63 74 2e 20 52 46 43 20 35 e subject. RFC 5
5eb0: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 280 section 4.2.
5ec0: 31 2e 38 20 28 73 75 62 6a 65 63 74 44 69 72 65 1.8 (subjectDire
5ed0: 63 74 6f 72 79 41 74 74 72 69 62 75 74 65 73 29 ctoryAttributes)
5ee0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 42 61 73 69 */.. /* Basi
5ef0: 63 20 43 6f 6e 73 74 72 61 69 6e 74 73 20 69 64 c Constraints id
5f00: 65 6e 74 69 66 69 65 73 20 77 68 65 74 68 65 72 entifies whether
5f10: 20 74 68 65 20 73 75 62 6a 65 63 74 20 6f 66 20 the subject of
5f20: 74 68 65 20 63 65 72 74 20 69 73 20 61 20 43 41 the cert is a CA
5f30: 20 61 6e 64 0a 09 74 68 65 20 6d 61 78 20 64 65 and..the max de
5f40: 70 74 68 20 6f 66 20 76 61 6c 69 64 20 63 65 72 pth of valid cer
5f50: 74 20 70 61 74 68 73 20 66 6f 72 20 74 68 69 73 t paths for this
5f60: 20 63 65 72 74 2e 20 52 46 43 20 35 32 38 30 20 cert. RFC 5280
5f70: 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 39 2c section 4.2.1.9,
5f80: 20 4e 49 44 5f 62 61 73 69 63 5f 63 6f 6e 73 74 NID_basic_const
5f90: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 69 66 raints */. if
5fa0: 20 28 21 28 78 66 6c 61 67 73 20 26 20 45 58 46 (!(xflags & EXF
5fb0: 4c 41 47 5f 50 52 4f 58 59 29 29 20 7b 0a 09 4c LAG_PROXY)) {..L
5fc0: 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 APPEND_LONG(inte
5fd0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
5fe0: 70 61 74 68 4c 65 6e 22 2c 20 58 35 30 39 5f 67 pathLen", X509_g
5ff0: 65 74 5f 70 61 74 68 6c 65 6e 28 63 65 72 74 29 et_pathlen(cert)
6000: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
6010: 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e .LAPPEND_LONG(in
6020: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
6030: 20 22 70 61 74 68 4c 65 6e 22 2c 20 58 35 30 39 "pathLen", X509
6040: 5f 67 65 74 5f 70 72 6f 78 79 5f 70 61 74 68 6c _get_proxy_pathl
6050: 65 6e 28 63 65 72 74 29 29 3b 0a 20 20 20 20 7d en(cert));. }
6060: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f . LAPPEND_BOO
6070: 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 L(interp, result
6080: 4f 62 6a 2c 20 22 62 61 73 69 63 43 6f 6e 73 74 Obj, "basicConst
6090: 72 61 69 6e 74 73 43 41 22 2c 20 78 66 6c 61 67 raintsCA", xflag
60a0: 73 20 26 20 45 58 46 4c 41 47 5f 43 41 29 3b 0a s & EXFLAG_CA);.
60b0: 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 20 43 6f 6e . /* Name Con
60c0: 73 74 72 61 69 6e 74 73 20 69 73 20 6f 6e 6c 79 straints is only
60d0: 20 75 73 65 64 20 69 6e 20 43 41 20 63 65 72 74 used in CA cert
60e0: 73 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 s to indicate th
60f0: 65 20 6e 61 6d 65 20 73 70 61 63 65 20 66 6f 72 e name space for
6100: 0a 09 61 6c 6c 20 73 75 62 6a 65 63 74 20 6e 61 ..all subject na
6110: 6d 65 73 20 69 6e 20 73 75 62 73 65 71 75 65 6e mes in subsequen
6120: 74 20 63 65 72 74 69 66 69 63 61 74 65 73 20 69 t certificates i
6130: 6e 20 61 20 63 65 72 74 69 66 69 63 61 74 69 6f n a certificatio
6140: 6e 20 70 61 74 68 0a 09 4d 55 53 54 20 62 65 20 n path..MUST be
6150: 6c 6f 63 61 74 65 64 2e 20 52 46 43 20 35 32 38 located. RFC 528
6160: 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 0 section 4.2.1.
6170: 31 30 2c 20 4e 49 44 5f 6e 61 6d 65 5f 63 6f 6e 10, NID_name_con
6180: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20 straints */..
6190: 20 2f 2a 20 50 6f 6c 69 63 79 20 43 6f 6e 73 74 /* Policy Const
61a0: 72 61 69 6e 74 73 20 69 73 20 6f 6e 6c 79 20 75 raints is only u
61b0: 73 65 64 20 69 6e 20 43 41 20 63 65 72 74 73 20 sed in CA certs
61c0: 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6c 65 6e to limit the len
61d0: 67 74 68 20 6f 66 20 61 0a 09 63 65 72 74 20 63 gth of a..cert c
61e0: 68 61 69 6e 20 66 6f 72 20 74 68 61 74 20 43 41 hain for that CA
61f0: 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 . RFC 5280 secti
6200: 6f 6e 20 34 2e 32 2e 31 2e 31 31 2c 20 4e 49 44 on 4.2.1.11, NID
6210: 5f 70 6f 6c 69 63 79 5f 63 6f 6e 73 74 72 61 69 _policy_constrai
6220: 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 nts */.. /* E
6230: 78 74 65 6e 64 65 64 20 4b 65 79 20 55 73 61 67 xtended Key Usag
6240: 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 e indicates the
6250: 70 75 72 70 6f 73 65 73 20 74 68 65 20 63 65 72 purposes the cer
6260: 74 69 66 69 65 64 20 70 75 62 6c 69 63 20 6b 65 tified public ke
6270: 79 20 6d 61 79 20 62 65 0a 09 75 73 65 64 2c 20 y may be..used,
6280: 62 65 79 6f 6e 64 20 74 68 65 20 62 61 73 69 63 beyond the basic
6290: 20 70 75 72 70 6f 73 65 73 2e 20 52 46 43 20 35 purposes. RFC 5
62a0: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 280 section 4.2.
62b0: 31 2e 31 32 2c 20 4e 49 44 5f 65 78 74 5f 6b 65 1.12, NID_ext_ke
62c0: 79 5f 75 73 61 67 65 20 2a 2f 0a 20 20 20 20 4c y_usage */. L
62d0: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 APPEND_OBJ(inter
62e0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 p, resultObj, "e
62f0: 78 74 65 6e 64 65 64 4b 65 79 55 73 61 67 65 22 xtendedKeyUsage"
6300: 2c 20 54 6c 73 5f 78 35 30 39 45 78 74 4b 65 79 , Tls_x509ExtKey
6310: 55 73 61 67 65 28 69 6e 74 65 72 70 2c 20 63 65 Usage(interp, ce
6320: 72 74 2c 20 78 66 6c 61 67 73 29 29 3b 0a 0a 20 rt, xflags));..
6330: 20 20 20 2f 2a 20 43 52 4c 20 44 69 73 74 72 69 /* CRL Distri
6340: 62 75 74 69 6f 6e 20 50 6f 69 6e 74 73 20 69 64 bution Points id
6350: 65 6e 74 69 66 69 65 73 20 77 68 65 72 65 20 43 entifies where C
6360: 52 4c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 RL information c
6370: 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a an be obtained..
6380: 09 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f .RFC 5280 sectio
6390: 6e 20 34 2e 32 2e 31 2e 31 33 2a 2f 0a 20 20 20 n 4.2.1.13*/.
63a0: 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 LAPPEND_OBJ(int
63b0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
63c0: 22 63 72 6c 44 69 73 74 72 69 62 75 74 69 6f 6e "crlDistribution
63d0: 50 6f 69 6e 74 73 22 2c 20 54 6c 73 5f 78 35 30 Points", Tls_x50
63e0: 39 43 72 6c 44 70 28 69 6e 74 65 72 70 2c 20 63 9CrlDp(interp, c
63f0: 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 ert));.. /* F
6400: 72 65 73 68 65 73 74 20 43 52 4c 20 65 78 74 65 reshest CRL exte
6410: 6e 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 nsion */. if
6420: 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 (xflags & EXFLAG
6430: 5f 46 52 45 53 48 45 53 54 29 20 7b 0a 20 20 20 _FRESHEST) {.
6440: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 75 74 68 6f }.. /* Autho
6450: 72 69 74 79 20 49 6e 66 6f 72 6d 61 74 69 6f 6e rity Information
6460: 20 41 63 63 65 73 73 20 69 6e 64 69 63 61 74 65 Access indicate
6470: 73 20 68 6f 77 20 74 6f 20 61 63 63 65 73 73 20 s how to access
6480: 69 6e 66 6f 20 61 6e 64 20 73 65 72 76 69 63 65 info and service
6490: 73 0a 09 66 6f 72 20 74 68 65 20 63 65 72 74 69 s..for the certi
64a0: 66 69 63 61 74 65 20 69 73 73 75 65 72 2e 20 52 ficate issuer. R
64b0: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 FC 5280 section
64c0: 34 2e 32 2e 32 2e 31 2c 20 4e 49 44 5f 69 6e 66 4.2.2.1, NID_inf
64d0: 6f 5f 61 63 63 65 73 73 20 2a 2f 0a 0a 20 20 20 o_access */..
64e0: 20 2f 2a 20 4f 6e 2d 6c 69 6e 65 20 43 65 72 74 /* On-line Cert
64f0: 69 66 69 63 61 74 65 20 53 74 61 74 75 73 20 50 ificate Status P
6500: 72 6f 74 6f 63 6f 6c 20 28 4f 53 43 50 29 20 52 rotocol (OSCP) R
6510: 65 73 70 6f 6e 64 65 72 73 20 55 52 4c 20 2a 2f esponders URL */
6520: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a . LAPPEND_OBJ
6530: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
6540: 62 6a 2c 20 22 6f 63 73 70 52 65 73 70 6f 6e 64 bj, "ocspRespond
6550: 65 72 73 22 2c 20 54 6c 73 5f 78 35 30 39 4f 73 ers", Tls_x509Os
6560: 63 70 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 cp(interp, cert)
6570: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 );.. /* Certi
6580: 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 74 79 ficate Authority
6590: 20 28 43 41 29 20 49 73 73 75 65 72 73 20 55 52 (CA) Issuers UR
65a0: 4c 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 L */. LAPPEND
65b0: 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 _OBJ(interp, res
65c0: 75 6c 74 4f 62 6a 2c 20 22 63 61 49 73 73 75 65 ultObj, "caIssue
65d0: 72 73 22 2c 20 54 6c 73 5f 78 35 30 39 43 61 49 rs", Tls_x509CaI
65e0: 73 73 75 65 72 73 28 69 6e 74 65 72 70 2c 20 63 ssuers(interp, c
65f0: 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 ert));.. /* S
6600: 75 62 6a 65 63 74 20 49 6e 66 6f 72 6d 61 74 69 ubject Informati
6610: 6f 6e 20 41 63 63 65 73 73 20 2d 20 52 46 43 20 on Access - RFC
6620: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 5280 section 4.2
6630: 2e 32 2e 32 2c 20 4e 49 44 5f 73 69 6e 66 6f 5f .2.2, NID_sinfo_
6640: 61 63 63 65 73 73 20 2a 2f 0a 0a 20 20 20 20 2f access */.. /
6650: 2a 20 43 65 72 74 69 66 69 63 61 74 65 20 41 6c * Certificate Al
6660: 69 61 73 2e 20 49 66 20 75 73 65 73 20 61 20 50 ias. If uses a P
6670: 4b 43 53 23 31 32 20 73 74 72 75 63 74 75 72 65 KCS#12 structure
6680: 2c 20 61 6c 69 61 73 20 77 69 6c 6c 20 72 65 66 , alias will ref
6690: 6c 65 63 74 20 74 68 65 0a 09 66 72 69 65 6e 64 lect the..friend
66a0: 6c 79 4e 61 6d 65 20 61 74 74 72 69 62 75 74 65 lyName attribute
66b0: 20 28 52 46 43 20 32 39 38 35 29 2e 20 2a 2f 0a (RFC 2985). */.
66c0: 20 20 20 20 7b 0a 09 69 6e 74 20 69 6c 65 6e 20 {..int ilen
66d0: 3d 20 30 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c = 0;.#if OPENSSL
66e0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
66f0: 3c 20 30 78 34 30 30 30 30 30 30 30 4c 0a 09 75 < 0x40000000L..u
6700: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 74 nsigned char *st
6710: 72 69 6e 67 20 3d 20 58 35 30 39 5f 61 6c 69 61 ring = X509_alia
6720: 73 5f 67 65 74 30 28 63 65 72 74 2c 20 26 69 6c s_get0(cert, &il
6730: 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 63 6f 6e 73 en);.#else..cons
6740: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
6750: 2a 73 74 72 69 6e 67 20 3d 20 58 35 30 39 5f 61 *string = X509_a
6760: 6c 69 61 73 5f 67 65 74 30 28 63 65 72 74 2c 20 lias_get0(cert,
6770: 26 69 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 09 &ilen);.#endif..
6780: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
6790: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
67a0: 61 6c 69 61 73 22 2c 20 28 63 68 61 72 20 2a 29 alias", (char *)
67b0: 20 73 74 72 69 6e 67 2c 20 28 54 63 6c 5f 53 69 string, (Tcl_Si
67c0: 7a 65 29 20 69 6c 65 6e 29 3b 0a 09 73 74 72 69 ze) ilen);..stri
67d0: 6e 67 20 3d 20 58 35 30 39 5f 6b 65 79 69 64 5f ng = X509_keyid_
67e0: 67 65 74 30 28 63 65 72 74 2c 20 26 69 6c 65 6e get0(cert, &ilen
67f0: 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
6800: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
6810: 6a 2c 20 22 6b 65 79 49 64 22 2c 20 28 63 68 61 j, "keyId", (cha
6820: 72 20 2a 29 20 73 74 72 69 6e 67 2c 20 28 54 63 r *) string, (Tc
6830: 6c 5f 53 69 7a 65 29 20 69 6c 65 6e 29 3b 0a 20 l_Size) ilen);.
6840: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 65 72 }.. /* Cer
6850: 74 69 66 69 63 61 74 65 20 61 6e 64 20 64 75 6d tificate and dum
6860: 70 20 61 6c 6c 20 64 61 74 61 20 2a 2f 0a 20 20 p all data */.
6870: 20 20 69 66 20 28 61 6c 6c 29 20 7b 0a 09 54 63 if (all) {..Tc
6880: 6c 5f 4f 62 6a 20 2a 61 6c 6c 4f 62 6a 20 3d 20 l_Obj *allObj =
6890: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 Tcl_NewByteArray
68a0: 4f 62 6a 28 4e 55 4c 4c 2c 20 30 29 3b 0a 09 54 Obj(NULL, 0);..T
68b0: 63 6c 5f 4f 62 6a 20 2a 63 65 72 74 4f 62 6a 20 cl_Obj *certObj
68c0: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 = Tcl_NewByteArr
68d0: 61 79 4f 62 6a 28 4e 55 4c 4c 2c 20 30 29 3b 0a ayObj(NULL, 0);.
68e0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a .unsigned char *
68f0: 61 6c 6c 53 74 72 2c 20 2a 63 65 72 74 53 74 72 allStr, *certStr
6900: 3b 0a 0a 09 69 66 20 28 61 6c 6c 4f 62 6a 20 3d ;...if (allObj =
6910: 3d 20 4e 55 4c 4c 20 7c 7c 20 63 65 72 74 4f 62 = NULL || certOb
6920: 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 j == NULL) {..
6930: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
6940: 6e 74 28 61 6c 6c 4f 62 6a 29 3b 0a 09 20 20 20 nt(allObj);..
6950: 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a BIO_free(bio);.
6960: 09 20 20 20 20 54 63 6c 5f 46 72 65 65 28 62 75 . Tcl_Free(bu
6970: 66 66 65 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ffer);.. retu
6980: 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 09 7d rn resultObj;..}
6990: 0a 0a 09 2f 2a 20 47 65 74 20 63 65 72 74 69 66 .../* Get certif
69a0: 69 63 61 74 65 20 2a 2f 0a 09 63 65 72 74 53 74 icate */..certSt
69b0: 72 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41 r = Tcl_SetByteA
69c0: 72 72 61 79 4c 65 6e 67 74 68 28 63 65 72 74 4f rrayLength(certO
69d0: 62 6a 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 5a bj, CERT_STR_SIZ
69e0: 45 29 3b 0a 09 6c 65 6e 20 3d 20 42 49 4f 5f 74 E);..len = BIO_t
69f0: 6f 5f 42 75 66 66 65 72 28 50 45 4d 5f 77 72 69 o_Buffer(PEM_wri
6a00: 74 65 5f 62 69 6f 5f 58 35 30 39 28 62 69 6f 2c te_bio_X509(bio,
6a10: 20 63 65 72 74 29 2c 20 62 69 6f 2c 20 63 65 72 cert), bio, cer
6a20: 74 53 74 72 2c 20 43 45 52 54 5f 53 54 52 5f 53 tStr, CERT_STR_S
6a30: 49 5a 45 29 3b 0a 09 54 63 6c 5f 53 65 74 42 79 IZE);..Tcl_SetBy
6a40: 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 63 65 teArrayLength(ce
6a50: 72 74 4f 62 6a 2c 20 6c 65 6e 29 3b 0a 09 4c 41 rtObj, len);..LA
6a60: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 PPEND_OBJ(interp
6a70: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 63 65 , resultObj, "ce
6a80: 72 74 69 66 69 63 61 74 65 22 2c 20 63 65 72 74 rtificate", cert
6a90: 4f 62 6a 29 0a 0a 09 2f 2a 20 47 65 74 20 61 6c Obj).../* Get al
6aa0: 6c 20 69 6e 66 6f 20 6f 6e 20 63 65 72 74 69 66 l info on certif
6ab0: 69 63 61 74 65 20 2a 2f 0a 09 61 6c 6c 53 74 72 icate */..allStr
6ac0: 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 = Tcl_SetByteAr
6ad0: 72 61 79 4c 65 6e 67 74 68 28 61 6c 6c 4f 62 6a rayLength(allObj
6ae0: 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 20 , CERT_STR_SIZE
6af0: 2a 20 32 29 3b 0a 09 6c 65 6e 20 3d 20 42 49 4f * 2);..len = BIO
6b00: 5f 74 6f 5f 42 75 66 66 65 72 28 58 35 30 39 5f _to_Buffer(X509_
6b10: 70 72 69 6e 74 5f 65 78 28 62 69 6f 2c 20 63 65 print_ex(bio, ce
6b20: 72 74 2c 20 66 6c 61 67 73 2c 20 30 29 2c 20 62 rt, flags, 0), b
6b30: 69 6f 2c 20 61 6c 6c 53 74 72 2c 20 43 45 52 54 io, allStr, CERT
6b40: 5f 53 54 52 5f 53 49 5a 45 20 2a 20 32 29 3b 0a _STR_SIZE * 2);.
6b50: 09 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 .Tcl_SetByteArra
6b60: 79 4c 65 6e 67 74 68 28 61 6c 6c 4f 62 6a 2c 20 yLength(allObj,
6b70: 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 4f len);..LAPPEND_O
6b80: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c BJ(interp, resul
6b90: 74 4f 62 6a 2c 20 22 61 6c 6c 22 2c 20 61 6c 6c tObj, "all", all
6ba0: 4f 62 6a 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 Obj). }..
6bb0: 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 BIO_free(bio);.
6bc0: 20 20 20 54 63 6c 5f 46 72 65 65 28 62 75 66 66 Tcl_Free(buff
6bd0: 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 er);. return
6be0: 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a resultObj;.}.