0000: 2f 2a 0a 20 2a 20 50 61 72 73 65 20 58 2e 35 30 /*. * Parse X.50
0010: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61 6e 9 certificate an
0020: 64 20 72 65 74 75 72 6e 20 63 6f 6e 74 65 6e 74 d return content
0030: 73 20 61 73 20 61 20 54 43 4c 20 6b 65 79 2d 76 s as a TCL key-v
0040: 61 6c 75 65 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a alue list.. *. *
0050: 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 Copyright (C) 1
0060: 39 39 37 2d 32 30 30 30 20 53 65 6e 73 75 73 20 997-2000 Sensus
0070: 43 6f 6e 73 75 6c 74 69 6e 67 20 4c 74 64 2e 0a Consulting Ltd..
0080: 20 2a 20 4d 61 74 74 20 4e 65 77 6d 61 6e 20 3c * Matt Newman <
0090: 6d 61 74 74 40 73 65 6e 73 75 73 2e 6f 72 67 3e matt@sensus.org>
00a0: 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 43 . * Copyright (C
00b0: 29 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 ) 2023 Brian O'H
00c0: 61 67 61 6e 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 agan. */.#includ
00d0: 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e 63 6c 75 e <tcl.h>.#inclu
00e0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e de <stdio.h>.#in
00f0: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 62 clude <openssl/b
0100: 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c io.h>.#include <
0110: 6f 70 65 6e 73 73 6c 2f 73 68 61 2e 68 3e 0a 23 openssl/sha.h>.#
0120: 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c include <openssl
0130: 2f 78 35 30 39 2e 68 3e 0a 23 69 6e 63 6c 75 64 /x509.h>.#includ
0140: 65 20 3c 6f 70 65 6e 73 73 6c 2f 78 35 30 39 76 e <openssl/x509v
0150: 33 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 3.h>.#include <o
0160: 70 65 6e 73 73 6c 2f 78 35 30 39 5f 76 66 79 2e penssl/x509_vfy.
0170: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 h>.#include <ope
0180: 6e 73 73 6c 2f 61 73 6e 31 2e 68 3e 0a 23 69 6e nssl/asn1.h>.#in
0190: 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 22 clude "tlsInt.h"
01a0: 0a 0a 2f 2a 20 44 65 66 69 6e 65 20 6d 61 78 69 ../* Define maxi
01b0: 6d 75 6d 20 63 65 72 74 69 66 69 63 61 74 65 20 mum certificate
01c0: 73 69 7a 65 2e 20 4d 61 78 20 50 45 4d 20 73 69 size. Max PEM si
01d0: 7a 65 20 31 30 30 6b 42 20 61 6e 64 20 44 45 52 ze 100kB and DER
01e0: 20 73 69 7a 65 20 69 73 20 32 34 6b 42 2e 20 2a size is 24kB. *
01f0: 2f 0a 23 64 65 66 69 6e 65 20 43 45 52 54 5f 53 /.#define CERT_S
0200: 54 52 5f 53 49 5a 45 20 32 34 35 37 36 0a 0a 0c TR_SIZE 24576...
0210: 0a 2f 2a 0a 20 2a 2d 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 0a 20 2a 0a 20 2a 20 53 74 72 69 6e 67 ---. *. * String
0270: 5f 74 6f 5f 48 65 78 20 2d 2d 0a 20 2a 0a 20 2a _to_Hex --. *. *
0280: 09 46 6f 72 6d 61 74 20 63 6f 6e 74 65 6e 74 73 .Format contents
0290: 20 6f 66 20 61 20 62 69 6e 61 72 79 20 73 74 72 of a binary str
02a0: 69 6e 67 20 61 73 20 61 20 68 65 78 20 73 74 72 ing as a hex str
02b0: 69 6e 67 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ing. *. * Result
02c0: 73 3a 0a 20 2a 09 54 43 4c 20 62 79 74 65 20 61 s:. *.TCL byte a
02d0: 72 72 61 79 20 6f 62 6a 65 63 74 20 77 69 74 68 rray object with
02e0: 20 78 35 30 39 20 69 64 65 6e 74 69 66 69 65 72 x509 identifier
02f0: 20 61 73 20 61 20 68 65 78 20 73 74 72 69 6e 67 as a hex string
0300: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 45 66 66 65 . *. * Side Effe
0310: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a cts:. *.None. *.
0320: 20 2a 2d 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 0a ---------------.
0370: 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 53 74 72 */.Tcl_Obj *Str
0380: 69 6e 67 5f 74 6f 5f 48 65 78 28 75 6e 73 69 67 ing_to_Hex(unsig
0390: 6e 65 64 20 63 68 61 72 2a 20 69 6e 70 75 74 2c ned char* input,
03a0: 20 69 6e 74 20 69 6c 65 6e 29 20 7b 0a 20 20 20 int ilen) {.
03b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
03c0: 69 70 74 72 20 3d 20 69 6e 70 75 74 3b 0a 20 20 iptr = input;.
03d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c Tcl_Obj *resul
03e0: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79 tObj = Tcl_NewBy
03f0: 74 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c 2c teArrayObj(NULL,
0400: 20 30 29 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 0);. unsigne
0410: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 54 d char *data = T
0420: 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c cl_SetByteArrayL
0430: 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c ength(resultObj,
0440: 20 28 54 63 6c 5f 53 69 7a 65 29 69 6c 65 6e 2a (Tcl_Size)ilen*
0450: 32 29 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 2);. unsigned
0460: 20 63 68 61 72 20 2a 64 70 74 72 20 3d 20 26 64 char *dptr = &d
0470: 61 74 61 5b 30 5d 3b 0a 20 20 20 20 63 6f 6e 73 ata[0];. cons
0480: 74 20 63 68 61 72 20 2a 68 65 78 20 3d 20 22 30 t char *hex = "0
0490: 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22 123456789abcdef"
04a0: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c ;.. if (resul
04b0: 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a tObj == NULL) {.
04c0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
04d0: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 69 6e }.. for (in
04e0: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 69 6c 65 t i = 0; i < ile
04f0: 6e 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 n; i++) {.
0500: 20 20 2a 64 70 74 72 2b 2b 20 3d 20 68 65 78 5b *dptr++ = hex[
0510: 28 2a 69 70 74 72 3e 3e 34 29 26 30 78 46 5d 3b (*iptr>>4)&0xF];
0520: 0a 20 20 20 20 20 20 20 20 2a 64 70 74 72 2b 2b . *dptr++
0530: 20 3d 20 68 65 78 5b 28 2a 69 70 74 72 2b 2b 29 = hex[(*iptr++)
0540: 26 30 78 46 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 &0xF];. }.
0550: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 return resultOb
0560: 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d j;.}../*. *-----
0570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 --------. *. * B
05c0: 49 4f 5f 74 6f 5f 42 75 66 66 65 72 20 2d 2d 0a IO_to_Buffer --.
05d0: 20 2a 0a 20 2a 09 4f 75 74 70 75 74 20 63 6f 6e *. *.Output con
05e0: 74 65 6e 74 73 20 6f 66 20 61 20 42 49 4f 20 74 tents of a BIO t
05f0: 6f 20 61 20 62 75 66 66 65 72 0a 20 2a 0a 20 2a o a buffer. *. *
0600: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 Results:. *.Ret
0610: 75 72 6e 73 20 6c 65 6e 67 74 68 20 6f 66 20 73 urns length of s
0620: 74 72 69 6e 67 20 69 6e 20 62 75 66 66 65 72 0a tring in buffer.
0630: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
0640: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
0650: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
06a0: 2a 2f 0a 54 63 6c 5f 53 69 7a 65 20 42 49 4f 5f */.Tcl_Size BIO_
06b0: 74 6f 5f 42 75 66 66 65 72 28 69 6e 74 20 72 65 to_Buffer(int re
06c0: 73 75 6c 74 2c 20 42 49 4f 20 2a 62 69 6f 2c 20 sult, BIO *bio,
06d0: 76 6f 69 64 20 2a 6f 75 74 70 75 74 2c 20 69 6e void *output, in
06e0: 74 20 6f 6c 65 6e 29 20 7b 0a 20 20 20 20 54 63 t olen) {. Tc
06f0: 6c 5f 53 69 7a 65 20 6c 65 6e 20 3d 20 30 3b 0a l_Size len = 0;.
0700: 20 20 20 20 69 6e 74 20 70 65 6e 64 69 6e 67 20 int pending
0710: 3d 20 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 = BIO_pending(bi
0720: 6f 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 o);.. if (res
0730: 75 6c 74 29 20 7b 0a 09 6c 65 6e 20 3d 20 28 54 ult) {..len = (T
0740: 63 6c 5f 53 69 7a 65 29 20 42 49 4f 5f 72 65 61 cl_Size) BIO_rea
0750: 64 28 62 69 6f 2c 20 6f 75 74 70 75 74 2c 20 28 d(bio, output, (
0760: 70 65 6e 64 69 6e 67 20 3c 20 6f 6c 65 6e 29 20 pending < olen)
0770: 3f 20 70 65 6e 64 69 6e 67 20 3a 20 6f 6c 65 6e ? pending : olen
0780: 29 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f 66 6c );..(void)BIO_fl
0790: 75 73 68 28 62 69 6f 29 3b 0a 09 69 66 20 28 6c ush(bio);..if (l
07a0: 65 6e 20 3c 20 30 29 20 7b 0a 09 20 20 20 20 6c en < 0) {.. l
07b0: 65 6e 20 3d 20 30 3b 0a 09 7d 0a 20 20 20 20 7d en = 0;..}. }
07c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b . return len;
07d0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
0830: 73 5f 78 35 30 39 45 78 74 65 6e 73 69 6f 6e 73 s_x509Extensions
0840: 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 6c 69 --. *. *.Get li
0850: 73 74 20 6f 66 20 58 2e 35 30 39 20 43 65 72 74 st of X.509 Cert
0860: 69 66 69 63 61 74 65 20 45 78 74 65 6e 73 69 6f ificate Extensio
0870: 6e 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 ns. *. * Results
0880: 3a 0a 20 2a 09 54 43 4c 20 6c 69 73 74 20 6f 66 :. *.TCL list of
0890: 20 65 78 74 65 6e 73 69 6f 6e 73 20 61 6e 64 20 extensions and
08a0: 62 6f 6f 6c 65 61 6e 20 63 72 69 74 69 63 61 6c boolean critical
08b0: 20 73 74 61 74 75 73 0a 20 2a 0a 20 2a 20 53 69 status. *. * Si
08c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
08d0: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d one. *. *-------
08e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
08f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0920: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f ------. */.Tcl_O
0930: 62 6a 20 2a 54 6c 73 5f 78 35 30 39 45 78 74 65 bj *Tls_x509Exte
0940: 6e 73 69 6f 6e 73 28 54 63 6c 5f 49 6e 74 65 72 nsions(Tcl_Inter
0950: 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20 p *interp, X509
0960: 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 63 6f 6e *cert) {. con
0970: 73 74 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 st STACK_OF(X509
0980: 5f 45 58 54 45 4e 53 49 4f 4e 29 20 2a 65 78 74 _EXTENSION) *ext
0990: 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a s;. Tcl_Obj *
09a0: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f resultObj = Tcl_
09b0: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
09c0: 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 LL);.. if (re
09d0: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 sultObj == NULL)
09e0: 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b {..return NULL;
09f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
0a00: 28 65 78 74 73 20 3d 20 58 35 30 39 5f 67 65 74 (exts = X509_get
0a10: 30 5f 65 78 74 65 6e 73 69 6f 6e 73 28 63 65 72 0_extensions(cer
0a20: 74 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 t)) != NULL) {..
0a30: 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b 20 69 20 for (int i=0; i
0a40: 3c 20 58 35 30 39 5f 67 65 74 5f 65 78 74 5f 63 < X509_get_ext_c
0a50: 6f 75 6e 74 28 63 65 72 74 29 3b 20 69 2b 2b 29 ount(cert); i++)
0a60: 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 45 58 54 {.. X509_EXT
0a70: 45 4e 53 49 4f 4e 20 2a 65 78 20 3d 20 73 6b 5f ENSION *ex = sk_
0a80: 58 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 76 X509_EXTENSION_v
0a90: 61 6c 75 65 28 65 78 74 73 2c 20 69 29 3b 0a 09 alue(exts, i);..
0aa0: 20 20 20 20 41 53 4e 31 5f 4f 42 4a 45 43 54 20 ASN1_OBJECT
0ab0: 2a 6f 62 6a 20 3d 20 58 35 30 39 5f 45 58 54 45 *obj = X509_EXTE
0ac0: 4e 53 49 4f 4e 5f 67 65 74 5f 6f 62 6a 65 63 74 NSION_get_object
0ad0: 28 65 78 29 3b 0a 09 20 20 20 20 2f 2a 20 41 53 (ex);.. /* AS
0ae0: 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49 4e 47 20 N1_OCTET_STRING
0af0: 2a 64 61 74 61 20 3d 20 58 35 30 39 5f 45 58 54 *data = X509_EXT
0b00: 45 4e 53 49 4f 4e 5f 67 65 74 5f 64 61 74 61 28 ENSION_get_data(
0b10: 65 78 29 3b 20 2a 2f 0a 09 20 20 20 20 69 6e 74 ex); */.. int
0b20: 20 63 72 69 74 69 63 61 6c 20 3d 20 58 35 30 39 critical = X509
0b30: 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74 5f 63 _EXTENSION_get_c
0b40: 72 69 74 69 63 61 6c 28 65 78 29 3b 0a 09 20 20 ritical(ex);..
0b50: 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 LAPPEND_BOOL(i
0b60: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
0b70: 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 4f 42 4a , OBJ_nid2ln(OBJ
0b80: 5f 6f 62 6a 32 6e 69 64 28 6f 62 6a 29 29 2c 20 _obj2nid(obj)),
0b90: 63 72 69 74 69 63 61 6c 29 3b 0a 09 7d 0a 20 20 critical);..}.
0ba0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 }. return r
0bb0: 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a esultObj;.}../*.
0bc0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
0bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0c10: 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39 49 64 *. * Tls_x509Id
0c20: 65 6e 74 69 66 69 65 72 20 2d 2d 0a 20 2a 0a 20 entifier --. *.
0c30: 2a 09 47 65 74 20 58 2e 35 30 39 20 63 65 72 74 *.Get X.509 cert
0c40: 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 74 ificate Authorit
0c50: 79 20 6f 72 20 53 75 62 6a 65 63 74 20 4b 65 79 y or Subject Key
0c60: 20 49 64 65 6e 74 69 66 69 65 72 73 0a 20 2a 0a Identifiers. *.
0c70: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 * Results:. *.T
0c80: 43 4c 20 62 79 74 65 20 61 72 72 61 79 20 6f 62 CL byte array ob
0c90: 6a 65 63 74 20 77 69 74 68 20 78 35 30 39 20 69 ject with x509 i
0ca0: 64 65 6e 74 69 66 69 65 72 20 61 73 20 61 20 68 dentifier as a h
0cb0: 65 78 20 73 74 72 69 6e 67 0a 20 2a 0a 20 2a 20 ex string. *. *
0cc0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
0cd0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d .None. *. *-----
0ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d20: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c --------. */.Tcl
0d30: 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 49 64 _Obj *Tls_x509Id
0d40: 65 6e 74 69 66 69 65 72 28 63 6f 6e 73 74 20 41 entifier(const A
0d50: 53 4e 31 5f 4f 43 54 45 54 5f 53 54 52 49 4e 47 SN1_OCTET_STRING
0d60: 20 2a 61 73 74 72 69 6e 67 29 20 7b 0a 20 20 20 *astring) {.
0d70: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 Tcl_Obj *result
0d80: 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 Obj = NULL;..
0d90: 20 69 66 20 28 61 73 74 72 69 6e 67 20 21 3d 20 if (astring !=
0da0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 75 6c 74 4f NULL) {..resultO
0db0: 62 6a 20 3d 20 53 74 72 69 6e 67 5f 74 6f 5f 48 bj = String_to_H
0dc0: 65 78 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 ex((unsigned cha
0dd0: 72 20 2a 29 41 53 4e 31 5f 53 54 52 49 4e 47 5f r *)ASN1_STRING_
0de0: 67 65 74 30 5f 64 61 74 61 28 61 73 74 72 69 6e get0_data(astrin
0df0: 67 29 2c 0a 09 20 20 20 20 41 53 4e 31 5f 53 54 g),.. ASN1_ST
0e00: 52 49 4e 47 5f 6c 65 6e 67 74 68 28 61 73 74 72 RING_length(astr
0e10: 69 6e 67 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 ing));. }.
0e20: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 return resultOb
0e30: 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d j;.}../*. *-----
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
0e90: 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65 20 ls_x509KeyUsage
0ea0: 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 58 2e 35 --. *. *.Get X.5
0eb0: 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 6b 09 certificate k
0ec0: 65 79 20 75 73 61 67 65 20 74 79 70 65 73 0a 20 ey usage types.
0ed0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
0ee0: 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 74 79 70 .Tcl list of typ
0ef0: 65 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 es. *. * Side ef
0f00: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 fects:. *.None.
0f10: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
0f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f60: 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 -. */.Tcl_Obj *T
0f70: 6c 73 5f 78 35 30 39 4b 65 79 55 73 61 67 65 28 ls_x509KeyUsage(
0f80: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
0f90: 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c 20 rp, X509 *cert,
0fa0: 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 73 29 uint32_t xflags)
0fb0: 20 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 {. uint32_t
0fc0: 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 74 usage = X509_get
0fd0: 5f 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74 29 _key_usage(cert)
0fe0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 ;. Tcl_Obj *r
0ff0: 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e esultObj = Tcl_N
1000: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
1010: 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 L);.. if (res
1020: 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 ultObj == NULL)
1030: 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a {..return NULL;.
1040: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 }.. if ((
1050: 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f xflags & EXFLAG_
1060: 4b 55 53 41 47 45 29 20 26 26 20 75 73 61 67 65 KUSAGE) && usage
1070: 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58 29 20 7b < UINT32_MAX) {
1080: 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 ..if (usage & KU
1090: 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 54 55 _DIGITAL_SIGNATU
10a0: 52 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c RE) {.. Tcl_L
10b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10c0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 ent(interp, resu
10d0: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 ltObj, Tcl_NewSt
10e0: 72 69 6e 67 4f 62 6a 28 22 44 69 67 69 74 61 6c ringObj("Digital
10f0: 20 53 69 67 6e 61 74 75 72 65 22 2c 20 2d 31 29 Signature", -1)
1100: 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 );..}..if (usage
1110: 20 26 20 4b 55 5f 4e 4f 4e 5f 52 45 50 55 44 49 & KU_NON_REPUDI
1120: 41 54 49 4f 4e 29 20 7b 0a 09 20 20 20 20 54 63 ATION) {.. Tc
1130: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
1140: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 lement(interp, r
1150: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 esultObj, Tcl_Ne
1160: 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 6f 6e 2d wStringObj("Non-
1170: 52 65 70 75 64 69 61 74 69 6f 6e 22 2c 20 2d 31 Repudiation", -1
1180: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 ));..}..if (usag
1190: 65 20 26 20 4b 55 5f 4b 45 59 5f 45 4e 43 49 50 e & KU_KEY_ENCIP
11a0: 48 45 52 4d 45 4e 54 29 20 7b 0a 09 20 20 20 20 HERMENT) {..
11b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
11c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
11d0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f resultObj, Tcl_
11e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4b 65 NewStringObj("Ke
11f0: 79 20 45 6e 63 69 70 68 65 72 6d 65 6e 74 22 2c y Encipherment",
1200: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 -1));..}..if (u
1210: 73 61 67 65 20 26 20 4b 55 5f 44 41 54 41 5f 45 sage & KU_DATA_E
1220: 4e 43 49 50 48 45 52 4d 45 4e 54 29 20 7b 0a 09 NCIPHERMENT) {..
1230: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
1240: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
1250: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
1260: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1270: 28 22 44 61 74 61 20 45 6e 63 69 70 68 65 72 6d ("Data Encipherm
1280: 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 ent", -1));..}..
1290: 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f 4b if (usage & KU_K
12a0: 45 59 5f 41 47 52 45 45 4d 45 4e 54 29 20 7b 0a EY_AGREEMENT) {.
12b0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
12c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
12d0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
12e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
12f0: 6a 28 22 4b 65 79 20 41 67 72 65 65 6d 65 6e 74 j("Key Agreement
1300: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 ", -1));..}..if
1310: 28 75 73 61 67 65 20 26 20 4b 55 5f 4b 45 59 5f (usage & KU_KEY_
1320: 43 45 52 54 5f 53 49 47 4e 29 20 7b 0a 09 20 20 CERT_SIGN) {..
1330: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
1340: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1350: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 p, resultObj, Tc
1360: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
1370: 43 65 72 74 69 66 69 63 61 74 65 20 53 69 67 6e Certificate Sign
1380: 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 ing", -1));..}..
1390: 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f 43 if (usage & KU_C
13a0: 52 4c 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 20 RL_SIGN) {..
13b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
13c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
13d0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f resultObj, Tcl_
13e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 43 52 NewStringObj("CR
13f0: 4c 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 L Signing", -1))
1400: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 ;..}..if (usage
1410: 26 20 4b 55 5f 45 4e 43 49 50 48 45 52 5f 4f 4e & KU_ENCIPHER_ON
1420: 4c 59 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c LY) {.. Tcl_L
1430: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1440: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 ent(interp, resu
1450: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 ltObj, Tcl_NewSt
1460: 72 69 6e 67 4f 62 6a 28 22 45 6e 63 69 70 68 65 ringObj("Enciphe
1470: 72 20 4f 6e 6c 79 22 2c 20 2d 31 29 29 3b 0a 09 r Only", -1));..
1480: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b }..if (usage & K
1490: 55 5f 44 45 43 49 50 48 45 52 5f 4f 4e 4c 59 29 U_DECIPHER_ONLY)
14a0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
14b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
14c0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
14d0: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e bj, Tcl_NewStrin
14e0: 67 4f 62 6a 28 22 44 65 63 69 70 68 65 72 20 4f gObj("Decipher O
14f0: 6e 6c 79 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 nly", -1));..}.
1500: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 } else {..
1510: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
1520: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
1530: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c , resultObj, Tcl
1540: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 _NewStringObj("u
1550: 6e 72 65 73 74 72 69 63 74 65 64 22 2c 20 2d 31 nrestricted", -1
1560: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 ));. }. re
1570: 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a turn resultObj;.
1580: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
1590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
15e0: 78 35 30 39 50 75 72 70 6f 73 65 20 2d 2d 0a 20 x509Purpose --.
15f0: 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30 39 20 63 *. *.Get X.509 c
1600: 65 72 74 69 66 69 63 61 74 65 20 70 75 72 70 6f ertificate purpo
1610: 73 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 se. *. * Results
1620: 3a 0a 20 2a 09 50 75 72 70 6f 73 65 20 73 74 72 :. *.Purpose str
1630: 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ing. *. * Side e
1640: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a ffects:. *.None.
1650: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
1660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a0: 2d 2d 0a 20 2a 2f 0a 63 68 61 72 20 2a 54 6c 73 --. */.char *Tls
16b0: 5f 78 35 30 39 50 75 72 70 6f 73 65 28 58 35 30 _x509Purpose(X50
16c0: 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 63 9 *cert) {. c
16d0: 68 61 72 20 2a 70 75 72 70 6f 73 65 20 3d 20 4e har *purpose = N
16e0: 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 28 58 35 ULL;.. if (X5
16f0: 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 09_check_purpose
1700: 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 (cert, X509_PURP
1710: 4f 53 45 5f 53 53 4c 5f 43 4c 49 45 4e 54 2c 20 OSE_SSL_CLIENT,
1720: 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 0) > 0) {..purpo
1730: 73 65 20 3d 20 22 53 53 4c 20 43 6c 69 65 6e 74 se = "SSL Client
1740: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ";. } else if
1750: 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 (X509_check_pur
1760: 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f pose(cert, X509_
1770: 50 55 52 50 4f 53 45 5f 53 53 4c 5f 53 45 52 56 PURPOSE_SSL_SERV
1780: 45 52 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 ER, 0) > 0) {..p
1790: 75 72 70 6f 73 65 20 3d 20 22 53 53 4c 20 53 65 urpose = "SSL Se
17a0: 72 76 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 rver";. } els
17b0: 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b e if (X509_check
17c0: 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 _purpose(cert, X
17d0: 35 30 39 5f 50 55 52 50 4f 53 45 5f 4e 53 5f 53 509_PURPOSE_NS_S
17e0: 53 4c 5f 53 45 52 56 45 52 2c 20 30 29 20 3e 20 SL_SERVER, 0) >
17f0: 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 0) {..purpose =
1800: 22 4d 53 53 20 53 53 4c 20 53 65 72 76 65 72 22 "MSS SSL Server"
1810: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
1820: 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 (X509_check_purp
1830: 6f 73 65 28 63 65 72 74 2c 20 58 35 30 39 5f 50 ose(cert, X509_P
1840: 55 52 50 4f 53 45 5f 53 4d 49 4d 45 5f 53 49 47 URPOSE_SMIME_SIG
1850: 4e 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 N, 0) > 0) {..pu
1860: 72 70 6f 73 65 20 3d 20 22 53 4d 49 4d 45 20 53 rpose = "SMIME S
1870: 69 67 6e 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 igning";. } e
1880: 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 lse if (X509_che
1890: 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c ck_purpose(cert,
18a0: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 53 4d X509_PURPOSE_SM
18b0: 49 4d 45 5f 45 4e 43 52 59 50 54 2c 20 30 29 20 IME_ENCRYPT, 0)
18c0: 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 > 0) {..purpose
18d0: 3d 20 22 53 4d 49 4d 45 20 45 6e 63 72 79 70 74 = "SMIME Encrypt
18e0: 69 6f 6e 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ion";. } else
18f0: 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f if (X509_check_
1900: 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 purpose(cert, X5
1910: 30 39 5f 50 55 52 50 4f 53 45 5f 43 52 4c 5f 53 09_PURPOSE_CRL_S
1920: 49 47 4e 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 IGN, 0) > 0) {..
1930: 70 75 72 70 6f 73 65 20 3d 20 22 43 52 4c 20 53 purpose = "CRL S
1940: 69 67 6e 69 6e 67 22 3b 0a 20 20 20 20 7d 20 65 igning";. } e
1950: 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 lse if (X509_che
1960: 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c ck_purpose(cert,
1970: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 41 4e X509_PURPOSE_AN
1980: 59 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 Y, 0) > 0) {..pu
1990: 72 70 6f 73 65 20 3d 20 22 41 6e 79 22 3b 0a 20 rpose = "Any";.
19a0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35 } else if (X5
19b0: 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 09_check_purpose
19c0: 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 (cert, X509_PURP
19d0: 4f 53 45 5f 4f 43 53 50 5f 48 45 4c 50 45 52 2c OSE_OCSP_HELPER,
19e0: 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 0) > 0) {..purp
19f0: 6f 73 65 20 3d 20 22 4f 43 53 50 20 48 65 6c 70 ose = "OCSP Help
1a00: 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 er";. } else
1a10: 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 if (X509_check_p
1a20: 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 urpose(cert, X50
1a30: 39 5f 50 55 52 50 4f 53 45 5f 54 49 4d 45 53 54 9_PURPOSE_TIMEST
1a40: 41 4d 50 5f 53 49 47 4e 2c 20 30 29 20 3e 20 30 AMP_SIGN, 0) > 0
1a50: 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 ) {..purpose = "
1a60: 54 69 6d 65 73 74 61 6d 70 20 53 69 67 6e 69 6e Timestamp Signin
1a70: 67 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b g";. } else {
1a80: 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 22 3b 0a ..purpose = "";.
1a90: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
1aa0: 20 70 75 72 70 6f 73 65 3b 0a 7d 0a 0a 2f 2a 0a purpose;.}../*.
1ab0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
1ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
1b00: 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39 50 75 *. * Tls_x509Pu
1b10: 72 70 6f 73 65 73 20 2d 2d 0a 20 2a 0a 20 2a 09 rposes --. *. *.
1b20: 47 65 74 20 58 2e 35 30 39 20 63 65 72 74 69 66 Get X.509 certif
1b30: 69 63 61 74 65 20 70 75 72 70 6f 73 65 20 74 79 icate purpose ty
1b40: 70 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 pes. *. * Result
1b50: 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f s:. *.Tcl list o
1b60: 66 20 65 61 63 68 20 70 75 72 70 6f 73 65 20 61 f each purpose a
1b70: 6e 64 20 77 68 65 74 68 65 72 20 69 74 20 69 73 nd whether it is
1b80: 20 43 41 20 6f 72 20 6e 6f 6e 2d 43 41 0a 20 2a CA or non-CA. *
1b90: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
1ba0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d :. *.None. *. *-
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
1c00: 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 .Tcl_Obj *Tls_x5
1c10: 30 39 50 75 72 70 6f 73 65 73 28 54 63 6c 5f 49 09Purposes(Tcl_I
1c20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 nterp *interp, X
1c30: 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 509 *cert) {.
1c40: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 Tcl_Obj *result
1c50: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Obj = Tcl_NewLis
1c60: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 tObj(0, NULL);.
1c70: 20 20 20 58 35 30 39 5f 50 55 52 50 4f 53 45 20 X509_PURPOSE
1c80: 2a 70 74 6d 70 3b 0a 0a 20 20 20 20 69 66 20 28 *ptmp;.. if (
1c90: 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c resultObj == NUL
1ca0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c L) {..return NUL
1cb0: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f L;. }.. fo
1cc0: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 r (int i = 0; i
1cd0: 3c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 < X509_PURPOSE_g
1ce0: 65 74 5f 63 6f 75 6e 74 28 29 3b 20 69 2b 2b 29 et_count(); i++)
1cf0: 20 7b 0a 09 70 74 6d 70 20 3d 20 58 35 30 39 5f {..ptmp = X509_
1d00: 50 55 52 50 4f 53 45 5f 67 65 74 30 28 69 29 3b PURPOSE_get0(i);
1d10: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 74 6d 70 50 74 ..Tcl_Obj *tmpPt
1d20: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
1d30: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 66 bj(0, NULL);...f
1d40: 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a or (int j = 0; j
1d50: 20 3c 20 32 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 < 2; j++) {..
1d60: 20 20 69 6e 74 20 69 64 72 65 74 20 3d 20 58 35 int idret = X5
1d70: 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 09_check_purpose
1d80: 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 (cert, X509_PURP
1d90: 4f 53 45 5f 67 65 74 5f 69 64 28 70 74 6d 70 29 OSE_get_id(ptmp)
1da0: 2c 20 6a 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c , j);.. Tcl_L
1db0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1dc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 74 6d 70 50 ent(interp, tmpP
1dd0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
1de0: 67 4f 62 6a 28 6a 20 3f 20 22 43 41 22 20 3a 20 gObj(j ? "CA" :
1df0: 22 6e 6f 6e 43 41 22 2c 20 2d 31 29 29 3b 0a 09 "nonCA", -1));..
1e00: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
1e10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
1e20: 65 72 70 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c erp, tmpPtr, Tcl
1e30: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 69 64 _NewStringObj(id
1e40: 72 65 74 20 3d 3d 20 31 20 3f 20 22 59 65 73 22 ret == 1 ? "Yes"
1e50: 20 3a 20 22 4e 6f 22 2c 20 2d 31 29 29 3b 0a 09 : "No", -1));..
1e60: 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 }..LAPPEND_OBJ(i
1e70: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
1e80: 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 , X509_PURPOSE_g
1e90: 65 74 30 5f 6e 61 6d 65 28 70 74 6d 70 29 2c 20 et0_name(ptmp),
1ea0: 74 6d 70 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 tmpPtr);. }.
1eb0: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 return result
1ec0: 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d Obj;.}../*. *---
1ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
1f20: 20 54 6c 73 5f 78 35 30 39 4e 61 6d 65 73 20 2d Tls_x509Names -
1f30: 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 61 20 6c 69 -. *. *.Get a li
1f40: 73 74 20 6f 66 20 53 75 62 6a 65 63 74 20 41 6c st of Subject Al
1f50: 74 65 72 6e 61 74 65 20 4e 61 6d 65 73 20 28 53 ternate Names (S
1f60: 41 4e 29 20 6f 72 20 49 73 73 75 65 72 20 41 6c AN) or Issuer Al
1f70: 74 65 72 6e 61 74 65 20 4e 61 6d 65 73 0a 20 2a ternate Names. *
1f80: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
1f90: 54 63 6c 20 6c 69 73 74 20 6f 66 20 61 6c 74 65 Tcl list of alte
1fa0: 72 6e 61 74 65 20 6e 61 6d 65 73 0a 20 2a 0a 20 rnate names. *.
1fb0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
1fc0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *.None. *. *---
1fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 ----------. */.T
2020: 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 cl_Obj *Tls_x509
2030: 4e 61 6d 65 73 28 54 63 6c 5f 49 6e 74 65 72 70 Names(Tcl_Interp
2040: 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a *interp, X509 *
2050: 63 65 72 74 2c 20 69 6e 74 20 6e 69 64 2c 20 42 cert, int nid, B
2060: 49 4f 20 2a 62 69 6f 29 20 7b 0a 20 20 20 20 53 IO *bio) {. S
2070: 54 41 43 4b 5f 4f 46 28 47 45 4e 45 52 41 4c 5f TACK_OF(GENERAL_
2080: 4e 41 4d 45 29 20 2a 6e 61 6d 65 73 3b 0a 20 20 NAME) *names;.
2090: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c Tcl_Obj *resul
20a0: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 tObj = Tcl_NewLi
20b0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
20c0: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e Tcl_Size len
20d0: 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 65 ;. char buffe
20e0: 72 5b 31 30 32 34 5d 3b 0a 0a 20 20 20 20 69 66 r[1024];.. if
20f0: 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e (resultObj == N
2100: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e ULL) {..return N
2110: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
2120: 69 66 20 28 28 6e 61 6d 65 73 20 3d 20 58 35 30 if ((names = X50
2130: 39 5f 67 65 74 5f 65 78 74 5f 64 32 69 28 63 65 9_get_ext_d2i(ce
2140: 72 74 2c 20 6e 69 64 2c 20 4e 55 4c 4c 2c 20 4e rt, nid, NULL, N
2150: 55 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b ULL)) != NULL) {
2160: 0a 09 66 6f 72 20 28 69 6e 74 20 69 3d 30 3b 20 ..for (int i=0;
2170: 69 20 3c 20 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e i < sk_GENERAL_N
2180: 41 4d 45 5f 6e 75 6d 28 6e 61 6d 65 73 29 3b 20 AME_num(names);
2190: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 63 6f 6e 73 i++) {.. cons
21a0: 74 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 20 2a t GENERAL_NAME *
21b0: 6e 61 6d 65 20 3d 20 73 6b 5f 47 45 4e 45 52 41 name = sk_GENERA
21c0: 4c 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 6e 61 6d L_NAME_value(nam
21d0: 65 73 2c 20 69 29 3b 0a 0a 09 20 20 20 20 6c 65 es, i);... le
21e0: 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 n = BIO_to_Buffe
21f0: 72 28 6e 61 6d 65 20 26 26 20 47 45 4e 45 52 41 r(name && GENERA
2200: 4c 5f 4e 41 4d 45 5f 70 72 69 6e 74 28 62 69 6f L_NAME_print(bio
2210: 2c 20 28 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 20 , (GENERAL_NAME
2220: 2a 29 20 6e 61 6d 65 29 2c 20 62 69 6f 2c 20 62 *) name), bio, b
2230: 75 66 66 65 72 2c 20 31 30 32 34 29 3b 0a 09 20 uffer, 1024);..
2240: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
2250: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
2260: 2c 20 4e 55 4c 4c 2c 20 62 75 66 66 65 72 2c 20 , NULL, buffer,
2270: 6c 65 6e 29 3b 0a 09 7d 0a 09 73 6b 5f 47 45 4e len);..}..sk_GEN
2280: 45 52 41 4c 5f 4e 41 4d 45 5f 70 6f 70 5f 66 72 ERAL_NAME_pop_fr
2290: 65 65 28 6e 61 6d 65 73 2c 20 47 45 4e 45 52 41 ee(names, GENERA
22a0: 4c 5f 4e 41 4d 45 5f 66 72 65 65 29 3b 0a 20 20 L_NAME_free);.
22b0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 }. return r
22c0: 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a esultObj;.}../*.
22d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2320: 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39 45 78 *. * Tls_x509Ex
2330: 74 4b 65 79 55 73 61 67 65 20 2d 2d 0a 20 2a 0a tKeyUsage --. *.
2340: 20 2a 09 47 65 74 20 61 20 6c 69 73 74 20 6f 66 *.Get a list of
2350: 20 45 78 74 65 6e 64 65 64 20 4b 65 79 20 55 73 Extended Key Us
2360: 61 67 65 73 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ages. *. * Retur
2370: 6e 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 74 20 ns:. *.Tcl list
2380: 6f 66 20 75 73 61 67 65 73 0a 20 2a 0a 20 2a 20 of usages. *. *
2390: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
23a0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d .None. *. *-----
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c --------. */.Tcl
2400: 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 45 78 _Obj *Tls_x509Ex
2410: 74 4b 65 79 55 73 61 67 65 28 54 63 6c 5f 49 6e tKeyUsage(Tcl_In
2420: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 terp *interp, X5
2430: 30 39 20 2a 63 65 72 74 2c 20 75 69 6e 74 33 32 09 *cert, uint32
2440: 5f 74 20 78 66 6c 61 67 73 29 20 7b 0a 20 20 20 _t xflags) {.
2450: 20 75 69 6e 74 33 32 5f 74 20 75 73 61 67 65 20 uint32_t usage
2460: 3d 20 58 35 30 39 5f 67 65 74 5f 6b 65 79 5f 75 = X509_get_key_u
2470: 73 61 67 65 28 63 65 72 74 29 3b 0a 20 20 20 20 sage(cert);.
2480: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f Tcl_Obj *resultO
2490: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 bj = Tcl_NewList
24a0: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 Obj(0, NULL);..
24b0: 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a if (resultObj
24c0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
24d0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
24e0: 0a 20 20 20 20 69 66 20 28 28 78 66 6c 61 67 73 . if ((xflags
24f0: 20 26 20 45 58 46 4c 41 47 5f 58 4b 55 53 41 47 & EXFLAG_XKUSAG
2500: 45 29 20 26 26 20 75 73 61 67 65 20 3c 20 55 49 E) && usage < UI
2510: 4e 54 33 32 5f 4d 41 58 29 20 7b 0a 09 75 73 61 NT32_MAX) {..usa
2520: 67 65 20 3d 20 58 35 30 39 5f 67 65 74 5f 65 78 ge = X509_get_ex
2530: 74 65 6e 64 65 64 5f 6b 65 79 5f 75 73 61 67 65 tended_key_usage
2540: 28 63 65 72 74 29 3b 0a 0a 09 69 66 20 28 75 73 (cert);...if (us
2550: 61 67 65 20 26 20 58 4b 55 5f 53 53 4c 5f 53 45 age & XKU_SSL_SE
2560: 52 56 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c RVER) {.. Tcl
2570: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
2580: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 ement(interp, re
2590: 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 sultObj, Tcl_New
25a0: 53 74 72 69 6e 67 4f 62 6a 28 22 54 4c 53 20 57 StringObj("TLS W
25b0: 65 62 20 53 65 72 76 65 72 20 41 75 74 68 65 6e eb Server Authen
25c0: 74 69 63 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b tication", -1));
25d0: 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 ..}..if (usage &
25e0: 20 58 4b 55 5f 53 53 4c 5f 43 4c 49 45 4e 54 29 XKU_SSL_CLIENT)
25f0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
2600: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2610: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
2620: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e bj, Tcl_NewStrin
2630: 67 4f 62 6a 28 22 54 4c 53 20 57 65 62 20 43 6c gObj("TLS Web Cl
2640: 69 65 6e 74 20 41 75 74 68 65 6e 74 69 63 61 74 ient Authenticat
2650: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 ion", -1));..}..
2660: 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f if (usage & XKU_
2670: 53 4d 49 4d 45 29 20 7b 0a 09 20 20 20 20 54 63 SMIME) {.. Tc
2680: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2690: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 lement(interp, r
26a0: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 esultObj, Tcl_Ne
26b0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 45 2d 6d 61 wStringObj("E-ma
26c0: 69 6c 20 50 72 6f 74 65 63 74 69 6f 6e 22 2c 20 il Protection",
26d0: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 -1));..}..if (us
26e0: 61 67 65 20 26 20 58 4b 55 5f 43 4f 44 45 5f 53 age & XKU_CODE_S
26f0: 49 47 4e 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f IGN) {.. Tcl_
2700: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
2710: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 ment(interp, res
2720: 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 ultObj, Tcl_NewS
2730: 74 72 69 6e 67 4f 62 6a 28 22 43 6f 64 65 20 53 tringObj("Code S
2740: 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 igning", -1));..
2750: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 }..if (usage & X
2760: 4b 55 5f 53 47 43 29 20 7b 0a 09 20 20 20 20 54 KU_SGC) {.. T
2770: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2780: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2790: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e resultObj, Tcl_N
27a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 53 47 43 ewStringObj("SGC
27b0: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 ", -1));..}..if
27c0: 28 75 73 61 67 65 20 26 20 58 4b 55 5f 4f 43 53 (usage & XKU_OCS
27d0: 50 5f 53 49 47 4e 29 20 7b 0a 09 20 20 20 20 54 P_SIGN) {.. T
27e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
27f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2800: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e resultObj, Tcl_N
2810: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4f 43 53 ewStringObj("OCS
2820: 50 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 P Signing", -1))
2830: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 ;..}..if (usage
2840: 26 20 58 4b 55 5f 54 49 4d 45 53 54 41 4d 50 29 & XKU_TIMESTAMP)
2850: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
2860: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2870: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
2880: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e bj, Tcl_NewStrin
2890: 67 4f 62 6a 28 22 54 69 6d 65 20 53 74 61 6d 70 gObj("Time Stamp
28a0: 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 ing", -1));..}..
28b0: 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f if (usage & XKU_
28c0: 44 56 43 53 20 29 20 7b 0a 09 20 20 20 20 54 63 DVCS ) {.. Tc
28d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
28e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 lement(interp, r
28f0: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 esultObj, Tcl_Ne
2900: 77 53 74 72 69 6e 67 4f 62 6a 28 22 44 56 43 53 wStringObj("DVCS
2910: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 ", -1));..}..if
2920: 28 75 73 61 67 65 20 26 20 58 4b 55 5f 41 4e 59 (usage & XKU_ANY
2930: 45 4b 55 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f EKU) {.. Tcl_
2940: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
2950: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 ment(interp, res
2960: 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 ultObj, Tcl_NewS
2970: 74 72 69 6e 67 4f 62 6a 28 22 41 6e 79 20 45 78 tringObj("Any Ex
2980: 74 65 6e 64 65 64 20 4b 65 79 20 55 73 61 67 65 tended Key Usage
2990: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 ", -1));..}.
29a0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 } else {.. Tc
29b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
29c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 lement(interp, r
29d0: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 esultObj, Tcl_Ne
29e0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e 72 65 wStringObj("unre
29f0: 73 74 72 69 63 74 65 64 22 2c 20 2d 31 29 29 3b stricted", -1));
2a00: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
2a10: 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a n resultObj;.}..
2a20: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
2a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a70: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 --. *. * Tls_x50
2a80: 39 43 72 6c 44 70 20 2d 2d 0a 20 2a 0a 20 2a 09 9CrlDp --. *. *.
2a90: 47 65 74 20 6c 69 73 74 20 6f 66 20 43 52 4c 20 Get list of CRL
2aa0: 44 69 73 74 72 69 62 75 74 69 6f 6e 20 50 6f 69 Distribution Poi
2ab0: 6e 74 73 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e nts. *. * Return
2ac0: 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f s:. *.Tcl list o
2ad0: 66 20 55 52 49 73 20 61 6e 64 20 72 65 6c 61 74 f URIs and relat
2ae0: 69 76 65 2d 6e 61 6d 65 73 0a 20 2a 0a 20 2a 20 ive-names. *. *
2af0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
2b00: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d .None. *. *-----
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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b50: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c --------. */.Tcl
2b60: 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 43 72 _Obj *Tls_x509Cr
2b70: 6c 44 70 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a lDp(Tcl_Interp *
2b80: 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a 63 65 interp, X509 *ce
2b90: 72 74 29 20 7b 0a 20 20 20 20 53 54 41 43 4b 5f rt) {. STACK_
2ba0: 4f 46 28 44 49 53 54 5f 50 4f 49 4e 54 29 20 2a OF(DIST_POINT) *
2bb0: 63 72 6c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a crl;. Tcl_Obj
2bc0: 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 *resultObj = Tc
2bd0: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
2be0: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 NULL);.. if (
2bf0: 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c resultObj == NUL
2c00: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c L) {..return NUL
2c10: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 L;. }.. if
2c20: 20 28 28 63 72 6c 20 3d 20 58 35 30 39 5f 67 65 ((crl = X509_ge
2c30: 74 5f 65 78 74 5f 64 32 69 28 63 65 72 74 2c 20 t_ext_d2i(cert,
2c40: 4e 49 44 5f 63 72 6c 5f 64 69 73 74 72 69 62 75 NID_crl_distribu
2c50: 74 69 6f 6e 5f 70 6f 69 6e 74 73 2c 20 4e 55 4c tion_points, NUL
2c60: 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c L, NULL)) != NUL
2c70: 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69 L) {..for (int i
2c80: 3d 30 3b 20 69 20 3c 20 73 6b 5f 44 49 53 54 5f =0; i < sk_DIST_
2c90: 50 4f 49 4e 54 5f 6e 75 6d 28 63 72 6c 29 3b 20 POINT_num(crl);
2ca0: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 44 49 53 54 i++) {.. DIST
2cb0: 5f 50 4f 49 4e 54 20 2a 64 70 20 3d 20 73 6b 5f _POINT *dp = sk_
2cc0: 44 49 53 54 5f 50 4f 49 4e 54 5f 76 61 6c 75 65 DIST_POINT_value
2cd0: 28 63 72 6c 2c 20 69 29 3b 0a 09 20 20 20 20 44 (crl, i);.. D
2ce0: 49 53 54 5f 50 4f 49 4e 54 5f 4e 41 4d 45 20 2a IST_POINT_NAME *
2cf0: 64 69 73 74 70 6f 69 6e 74 20 3d 20 64 70 2d 3e distpoint = dp->
2d00: 64 69 73 74 70 6f 69 6e 74 3b 0a 0a 09 20 20 20 distpoint;...
2d10: 20 69 66 20 28 64 69 73 74 70 6f 69 6e 74 2d 3e if (distpoint->
2d20: 74 79 70 65 20 3d 3d 20 30 29 20 7b 0a 09 09 2f type == 0) {.../
2d30: 2a 20 66 75 6c 6c 2d 6e 61 6d 65 20 47 45 4e 45 * full-name GENE
2d40: 52 41 4c 49 5a 45 44 4e 41 4d 45 20 2a 2f 0a 09 RALIZEDNAME */..
2d50: 09 66 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30 3b .for (int j = 0;
2d60: 20 6a 20 3c 20 73 6b 5f 47 45 4e 45 52 41 4c 5f j < sk_GENERAL_
2d70: 4e 41 4d 45 5f 6e 75 6d 28 64 69 73 74 70 6f 69 NAME_num(distpoi
2d80: 6e 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c 6e 61 6d nt->name.fullnam
2d90: 65 29 3b 20 6a 2b 2b 29 20 7b 0a 09 09 20 20 20 e); j++) {...
2da0: 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 20 2a 67 GENERAL_NAME *g
2db0: 65 6e 20 3d 20 73 6b 5f 47 45 4e 45 52 41 4c 5f en = sk_GENERAL_
2dc0: 4e 41 4d 45 5f 76 61 6c 75 65 28 64 69 73 74 70 NAME_value(distp
2dd0: 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 66 75 6c 6c 6e oint->name.fulln
2de0: 61 6d 65 2c 20 6a 29 3b 0a 09 09 20 20 20 20 69 ame, j);... i
2df0: 6e 74 20 74 79 70 65 3b 0a 09 09 20 20 20 20 41 nt type;... A
2e00: 53 4e 31 5f 53 54 52 49 4e 47 20 2a 75 72 69 20 SN1_STRING *uri
2e10: 3d 20 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 67 = GENERAL_NAME_g
2e20: 65 74 30 5f 76 61 6c 75 65 28 67 65 6e 2c 20 26 et0_value(gen, &
2e30: 74 79 70 65 29 3b 0a 09 09 20 20 20 20 69 66 20 type);... if
2e40: 28 74 79 70 65 20 3d 3d 20 47 45 4e 5f 55 52 49 (type == GEN_URI
2e50: 29 20 7b 0a 09 09 09 4c 41 50 50 45 4e 44 5f 53 ) {....LAPPEND_S
2e60: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c TR(interp, resul
2e70: 74 4f 62 6a 2c 20 28 63 68 61 72 20 2a 29 20 4e tObj, (char *) N
2e80: 55 4c 4c 2c 20 28 63 68 61 72 20 2a 29 20 41 53 ULL, (char *) AS
2e90: 4e 31 5f 53 54 52 49 4e 47 5f 67 65 74 30 5f 64 N1_STRING_get0_d
2ea0: 61 74 61 28 75 72 69 29 2c 20 28 54 63 6c 5f 53 ata(uri), (Tcl_S
2eb0: 69 7a 65 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 ize) ASN1_STRING
2ec0: 5f 6c 65 6e 67 74 68 28 75 72 69 29 29 3b 0a 09 _length(uri));..
2ed0: 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 . }...}..
2ee0: 7d 20 65 6c 73 65 20 69 66 20 28 64 69 73 74 70 } else if (distp
2ef0: 6f 69 6e 74 2d 3e 74 79 70 65 20 3d 3d 20 31 29 oint->type == 1)
2f00: 20 7b 0a 09 09 2f 2a 20 72 65 6c 61 74 69 76 65 {.../* relative
2f10: 2d 6e 61 6d 65 20 58 35 30 39 4e 41 4d 45 20 2a -name X509NAME *
2f20: 2f 0a 09 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 /...STACK_OF(X50
2f30: 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 29 20 2a 73 9_NAME_ENTRY) *s
2f40: 6b 5f 72 65 6c 6e 61 6d 65 20 3d 20 64 69 73 74 k_relname = dist
2f50: 70 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 72 65 6c 61 point->name.rela
2f60: 74 69 76 65 6e 61 6d 65 3b 0a 09 09 66 6f 72 20 tivename;...for
2f70: 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 3c 20 (int j = 0; j <
2f80: 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 sk_X509_NAME_ENT
2f90: 52 59 5f 6e 75 6d 28 73 6b 5f 72 65 6c 6e 61 6d RY_num(sk_relnam
2fa0: 65 29 3b 20 6a 2b 2b 29 20 7b 0a 09 09 20 20 20 e); j++) {...
2fb0: 20 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 X509_NAME_ENTRY
2fc0: 20 2a 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 *e = sk_X509_NA
2fd0: 4d 45 5f 45 4e 54 52 59 5f 76 61 6c 75 65 28 73 ME_ENTRY_value(s
2fe0: 6b 5f 72 65 6c 6e 61 6d 65 2c 20 6a 29 3b 0a 09 k_relname, j);..
2ff0: 09 20 20 20 20 41 53 4e 31 5f 53 54 52 49 4e 47 . ASN1_STRING
3000: 20 2a 64 20 3d 20 58 35 30 39 5f 4e 41 4d 45 5f *d = X509_NAME_
3010: 45 4e 54 52 59 5f 67 65 74 5f 64 61 74 61 28 65 ENTRY_get_data(e
3020: 29 3b 0a 09 09 20 20 20 20 4c 41 50 50 45 4e 44 );... LAPPEND
3030: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 _STR(interp, res
3040: 75 6c 74 4f 62 6a 2c 20 28 63 68 61 72 20 2a 29 ultObj, (char *)
3050: 20 4e 55 4c 4c 2c 20 28 63 68 61 72 20 2a 29 20 NULL, (char *)
3060: 41 53 4e 31 5f 53 54 52 49 4e 47 5f 64 61 74 61 ASN1_STRING_data
3070: 28 64 29 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 (d), (Tcl_Size)
3080: 41 53 4e 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 ASN1_STRING_leng
3090: 74 68 28 64 29 29 3b 0a 09 09 7d 0a 09 20 20 20 th(d));...}..
30a0: 20 7d 0a 09 7d 0a 09 43 52 4c 5f 44 49 53 54 5f }..}..CRL_DIST_
30b0: 50 4f 49 4e 54 53 5f 66 72 65 65 28 63 72 6c 29 POINTS_free(crl)
30c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
30d0: 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a rn resultObj;.}.
30e0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3130: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 ---. *. * Tls_x5
3140: 30 39 4f 73 63 70 0a 20 2a 0a 20 2a 09 47 65 74 09Oscp. *. *.Get
3150: 20 6c 69 73 74 20 6f 66 20 4f 6e 2d 6c 69 6e 65 list of On-line
3160: 20 43 65 72 74 69 66 69 63 61 74 65 20 53 74 61 Certificate Sta
3170: 74 75 73 20 50 72 6f 74 6f 63 6f 6c 20 28 4f 53 tus Protocol (OS
3180: 43 50 29 20 55 52 49 73 0a 20 2a 0a 20 2a 20 52 CP) URIs. *. * R
3190: 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 6c 20 6c esults:. *.Tcl l
31a0: 69 73 74 20 6f 66 20 55 52 49 73 0a 20 2a 0a 20 ist of URIs. *.
31b0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
31c0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *.None. *. *---
31d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 ----------. */.T
3220: 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 cl_Obj *Tls_x509
3230: 4f 73 63 70 28 54 63 6c 5f 49 6e 74 65 72 70 20 Oscp(Tcl_Interp
3240: 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a 63 *interp, X509 *c
3250: 65 72 74 29 20 7b 0a 20 20 20 20 53 54 41 43 4b ert) {. STACK
3260: 5f 4f 46 28 4f 50 45 4e 53 53 4c 5f 53 54 52 49 _OF(OPENSSL_STRI
3270: 4e 47 29 20 2a 6f 63 73 70 3b 0a 20 20 20 20 54 NG) *ocsp;. T
3280: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 cl_Obj *resultOb
3290: 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f j = Tcl_NewListO
32a0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 bj(0, NULL);..
32b0: 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 if (resultObj
32c0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
32d0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a rn NULL;. }..
32e0: 20 20 20 20 69 66 20 28 28 6f 63 73 70 20 3d 20 if ((ocsp =
32f0: 58 35 30 39 5f 67 65 74 31 5f 6f 63 73 70 28 63 X509_get1_ocsp(c
3300: 65 72 74 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b ert)) != NULL) {
3310: 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 ..for (int i = 0
3320: 3b 20 69 20 3c 20 73 6b 5f 4f 50 45 4e 53 53 4c ; i < sk_OPENSSL
3330: 5f 53 54 52 49 4e 47 5f 6e 75 6d 28 6f 63 73 70 _STRING_num(ocsp
3340: 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 4c ); i++) {.. L
3350: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
3360: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 4e 55 p, resultObj, NU
3370: 4c 4c 2c 20 73 6b 5f 4f 50 45 4e 53 53 4c 5f 53 LL, sk_OPENSSL_S
3380: 54 52 49 4e 47 5f 76 61 6c 75 65 28 6f 63 73 70 TRING_value(ocsp
3390: 2c 20 69 29 2c 20 2d 31 29 3b 0a 09 7d 0a 09 58 , i), -1);..}..X
33a0: 35 30 39 5f 65 6d 61 69 6c 5f 66 72 65 65 28 6f 509_email_free(o
33b0: 63 73 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 csp);. }.
33c0: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a return resultObj
33d0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
3430: 73 5f 78 35 30 39 43 61 49 73 73 75 65 72 73 20 s_x509CaIssuers
3440: 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 6c 69 73 --. *. *.Get lis
3450: 74 20 6f 66 20 43 65 72 74 69 66 69 63 61 74 65 t of Certificate
3460: 20 41 75 74 68 6f 72 69 74 79 20 28 43 41 29 20 Authority (CA)
3470: 49 73 73 75 65 72 20 55 52 49 73 0a 20 2a 0a 20 Issuer URIs. *.
3480: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 * Results:. *.Tc
3490: 6c 20 6c 69 73 74 20 6f 66 20 43 41 20 69 73 73 l list of CA iss
34a0: 75 65 72 20 55 52 49 73 0a 20 2a 0a 20 2a 20 53 uer URIs. *. * S
34b0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
34c0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d None. *. *------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f -------. */.Tcl_
3520: 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 43 61 49 Obj *Tls_x509CaI
3530: 73 73 75 65 72 73 28 54 63 6c 5f 49 6e 74 65 72 ssuers(Tcl_Inter
3540: 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20 p *interp, X509
3550: 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 53 54 41 *cert) {. STA
3560: 43 4b 5f 4f 46 28 41 43 43 45 53 53 5f 44 45 53 CK_OF(ACCESS_DES
3570: 43 52 49 50 54 49 4f 4e 29 20 2a 61 64 73 3b 0a CRIPTION) *ads;.
3580: 20 20 20 20 41 43 43 45 53 53 5f 44 45 53 43 52 ACCESS_DESCR
3590: 49 50 54 49 4f 4e 20 2a 61 64 3b 0a 20 20 20 20 IPTION *ad;.
35a0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f Tcl_Obj *resultO
35b0: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 bj = Tcl_NewList
35c0: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 Obj(0, NULL);.
35d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
35e0: 2a 62 75 66 3b 0a 0a 20 20 20 20 69 66 20 28 72 *buf;.. if (r
35f0: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c esultObj == NULL
3600: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c ) {..return NULL
3610: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
3620: 28 28 61 64 73 20 3d 20 58 35 30 39 5f 67 65 74 ((ads = X509_get
3630: 5f 65 78 74 5f 64 32 69 28 63 65 72 74 2c 20 4e _ext_d2i(cert, N
3640: 49 44 5f 69 6e 66 6f 5f 61 63 63 65 73 73 2c 20 ID_info_access,
3650: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 NULL, NULL)) !=
3660: 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e NULL) {..for (in
3670: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f t i = 0; i < sk_
3680: 41 43 43 45 53 53 5f 44 45 53 43 52 49 50 54 49 ACCESS_DESCRIPTI
3690: 4f 4e 5f 6e 75 6d 28 61 64 73 29 3b 20 69 2b 2b ON_num(ads); i++
36a0: 29 20 7b 0a 09 20 20 20 20 61 64 20 3d 20 73 6b ) {.. ad = sk
36b0: 5f 41 43 43 45 53 53 5f 44 45 53 43 52 49 50 54 _ACCESS_DESCRIPT
36c0: 49 4f 4e 5f 76 61 6c 75 65 28 61 64 73 2c 20 69 ION_value(ads, i
36d0: 29 3b 0a 09 20 20 20 20 69 66 20 28 4f 42 4a 5f );.. if (OBJ_
36e0: 6f 62 6a 32 6e 69 64 28 61 64 2d 3e 6d 65 74 68 obj2nid(ad->meth
36f0: 6f 64 29 20 3d 3d 20 4e 49 44 5f 61 64 5f 63 61 od) == NID_ad_ca
3700: 5f 69 73 73 75 65 72 73 20 26 26 20 61 64 2d 3e _issuers && ad->
3710: 6c 6f 63 61 74 69 6f 6e 29 20 7b 0a 09 09 69 66 location) {...if
3720: 20 28 61 64 2d 3e 6c 6f 63 61 74 69 6f 6e 2d 3e (ad->location->
3730: 74 79 70 65 20 3d 3d 20 47 45 4e 5f 55 52 49 29 type == GEN_URI)
3740: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 69 7a {... Tcl_Siz
3750: 65 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a e len = (Tcl_Siz
3760: 65 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f 74 e) ASN1_STRING_t
3770: 6f 5f 55 54 46 38 28 26 62 75 66 2c 20 61 64 2d o_UTF8(&buf, ad-
3780: 3e 6c 6f 63 61 74 69 6f 6e 2d 3e 64 2e 75 6e 69 >location->d.uni
3790: 66 6f 72 6d 52 65 73 6f 75 72 63 65 49 64 65 6e formResourceIden
37a0: 74 69 66 69 65 72 29 3b 0a 09 09 20 20 20 20 54 tifier);... T
37b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
37c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
37d0: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e resultObj, Tcl_N
37e0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 ewStringObj((cha
37f0: 72 20 2a 29 20 62 75 66 2c 20 6c 65 6e 29 29 3b r *) buf, len));
3800: 0a 09 09 20 20 20 20 4f 50 45 4e 53 53 4c 5f 66 ... OPENSSL_f
3810: 72 65 65 28 62 75 66 29 3b 0a 09 09 20 20 20 20 ree(buf);...
3820: 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 20 20 20 20 break;...}..
3830: 7d 0a 09 7d 0a 09 2f 2a 20 73 6b 5f 41 43 43 45 }..}../* sk_ACCE
3840: 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 5f 70 SS_DESCRIPTION_p
3850: 6f 70 5f 66 72 65 65 28 61 64 73 2c 20 41 43 43 op_free(ads, ACC
3860: 45 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 5f ESS_DESCRIPTION_
3870: 66 72 65 65 29 3b 20 2a 2f 0a 09 41 55 54 48 4f free); */..AUTHO
3880: 52 49 54 59 5f 49 4e 46 4f 5f 41 43 43 45 53 53 RITY_INFO_ACCESS
3890: 5f 66 72 65 65 28 61 64 73 29 3b 0a 20 20 20 20 _free(ads);.
38a0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 }. return res
38b0: 75 6c 74 4f 62 6a 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ultObj;.}.../*.
38c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
38d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
3910: 2a 0a 20 2a 20 54 6c 73 5f 4e 65 77 58 35 30 39 *. * Tls_NewX509
3920: 4f 62 6a 20 2d 2d 0a 20 2a 0a 20 2a 09 50 61 72 Obj --. *. *.Par
3930: 73 65 73 20 61 20 58 35 30 39 20 63 65 72 74 69 ses a X509 certi
3940: 66 69 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 ficate and retur
3950: 6e 73 20 63 6f 6e 74 65 6e 74 73 20 61 73 20 61 ns contents as a
3960: 20 6b 65 79 2d 76 61 6c 75 65 20 54 63 6c 20 6c key-value Tcl l
3970: 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ist.. *. * Resul
3980: 74 3a 0a 20 2a 09 41 20 54 63 6c 20 4c 69 73 74 t:. *.A Tcl List
3990: 20 77 69 74 68 20 74 68 65 20 58 35 30 39 20 63 with the X509 c
39a0: 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20 ertificate info
39b0: 61 73 20 61 20 6b 65 79 2d 76 61 6c 75 65 20 6c as a key-value l
39c0: 69 73 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ist. *. * Side e
39d0: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a ffects:. *.None.
39e0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a30: 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a --. */.Tcl_Obj *
3a40: 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 54 Tls_NewX509Obj(T
3a50: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
3a60: 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c 20 69 p, X509 *cert, i
3a70: 6e 74 20 61 6c 6c 29 20 7b 0a 20 20 20 20 54 63 nt all) {. Tc
3a80: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a l_Obj *resultObj
3a90: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
3aa0: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 j(0, NULL);.
3ab0: 42 49 4f 20 2a 62 69 6f 20 3d 20 42 49 4f 5f 6e BIO *bio = BIO_n
3ac0: 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b ew(BIO_s_mem());
3ad0: 0a 20 20 20 20 69 6e 74 20 6d 64 6e 69 64 2c 20 . int mdnid,
3ae0: 70 6b 6e 69 64 2c 20 62 69 74 73 3b 0a 20 20 20 pknid, bits;.
3af0: 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 Tcl_Size len;.
3b00: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 unsigned int
3b10: 75 6c 65 6e 3b 0a 20 20 20 20 75 69 6e 74 33 32 ulen;. uint32
3b20: 5f 74 20 78 66 6c 61 67 73 3b 0a 20 20 20 20 75 _t xflags;. u
3b30: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 66 6c 61 nsigned long fla
3b40: 67 73 20 3d 20 58 4e 5f 46 4c 41 47 5f 52 46 43 gs = XN_FLAG_RFC
3b50: 32 32 35 33 20 7c 20 41 53 4e 31 5f 53 54 52 46 2253 | ASN1_STRF
3b60: 4c 47 53 5f 55 54 46 38 5f 43 4f 4e 56 45 52 54 LGS_UTF8_CONVERT
3b70: 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e ;. flags &= ~
3b80: 41 53 4e 31 5f 53 54 52 46 4c 47 53 5f 45 53 43 ASN1_STRFLGS_ESC
3b90: 5f 4d 53 42 3b 0a 0a 20 20 20 20 63 68 61 72 20 _MSB;.. char
3ba0: 2a 62 75 66 66 65 72 20 3d 20 63 6b 61 6c 6c 6f *buffer = ckallo
3bb0: 63 28 42 55 46 53 49 5a 20 3e 20 45 56 50 5f 4d c(BUFSIZ > EVP_M
3bc0: 41 58 5f 4d 44 5f 53 49 5a 45 20 3f 20 42 55 46 AX_MD_SIZE ? BUF
3bd0: 53 49 5a 20 3a 20 45 56 50 5f 4d 41 58 5f 4d 44 SIZ : EVP_MAX_MD
3be0: 5f 53 49 5a 45 29 3b 0a 0a 20 20 20 20 64 70 72 _SIZE);.. dpr
3bf0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
3c00: 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 20 . if (interp
3c10: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 65 72 74 20 == NULL || cert
3c20: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62 69 6f 20 3d == NULL || bio =
3c30: 3d 20 4e 55 4c 4c 20 7c 7c 20 72 65 73 75 6c 74 = NULL || result
3c40: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62 Obj == NULL || b
3c50: 75 66 66 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b uffer == NULL) {
3c60: 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 ..Tcl_DecrRefCou
3c70: 6e 74 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 09 nt(resultObj);..
3c80: 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 BIO_free(bio);..
3c90: 69 66 20 28 62 75 66 66 65 72 20 21 3d 20 4e 55 if (buffer != NU
3ca0: 4c 4c 29 20 63 6b 66 72 65 65 28 62 75 66 66 65 LL) ckfree(buffe
3cb0: 72 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c r);..return NULL
3cc0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
3cd0: 53 69 67 6e 61 74 75 72 65 20 61 6c 67 6f 72 69 Signature algori
3ce0: 74 68 6d 20 61 6e 64 20 76 61 6c 75 65 20 2d 20 thm and value -
3cf0: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e RFC 5280 section
3d00: 20 34 2e 31 2e 31 2e 32 20 61 6e 64 20 34 2e 31 4.1.1.2 and 4.1
3d10: 2e 31 2e 33 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 .1.3 */. /* s
3d20: 69 67 6e 61 74 75 72 65 41 6c 67 6f 72 69 74 68 ignatureAlgorith
3d30: 6d 20 69 73 20 74 68 65 20 69 64 20 6f 66 20 74 m is the id of t
3d40: 68 65 20 63 72 79 70 74 6f 67 72 61 70 68 69 63 he cryptographic
3d50: 20 61 6c 67 6f 72 69 74 68 6d 20 75 73 65 64 20 algorithm used
3d60: 62 79 20 74 68 65 0a 09 43 41 20 74 6f 20 73 69 by the..CA to si
3d70: 67 6e 20 74 68 69 73 20 63 65 72 74 2e 20 73 69 gn this cert. si
3d80: 67 6e 61 74 75 72 65 56 61 6c 75 65 20 69 73 20 gnatureValue is
3d90: 74 68 65 20 64 69 67 69 74 61 6c 20 73 69 67 6e the digital sign
3da0: 61 74 75 72 65 20 63 6f 6d 70 75 74 65 64 0a 09 ature computed..
3db0: 75 70 6f 6e 20 74 68 65 20 41 53 4e 2e 31 20 44 upon the ASN.1 D
3dc0: 45 52 20 65 6e 63 6f 64 65 64 20 74 62 73 43 65 ER encoded tbsCe
3dd0: 72 74 69 66 69 63 61 74 65 2e 20 2a 2f 0a 20 20 rtificate. */.
3de0: 20 20 7b 0a 09 63 6f 6e 73 74 20 58 35 30 39 5f {..const X509_
3df0: 41 4c 47 4f 52 20 2a 73 69 67 5f 61 6c 67 3b 0a ALGOR *sig_alg;.
3e00: 09 63 6f 6e 73 74 20 41 53 4e 31 5f 42 49 54 5f .const ASN1_BIT_
3e10: 53 54 52 49 4e 47 20 2a 73 69 67 3b 0a 09 69 6e STRING *sig;..in
3e20: 74 20 73 69 67 5f 6e 69 64 3b 0a 0a 09 58 35 30 t sig_nid;...X50
3e30: 39 5f 67 65 74 30 5f 73 69 67 6e 61 74 75 72 65 9_get0_signature
3e40: 28 26 73 69 67 2c 20 26 73 69 67 5f 61 6c 67 2c (&sig, &sig_alg,
3e50: 20 63 65 72 74 29 3b 0a 09 2f 2a 20 73 69 67 5f cert);../* sig_
3e60: 6e 69 64 20 3d 20 58 35 30 39 5f 67 65 74 5f 73 nid = X509_get_s
3e70: 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 63 65 72 ignature_nid(cer
3e80: 74 29 20 2a 2f 0a 09 73 69 67 5f 6e 69 64 20 3d t) */..sig_nid =
3e90: 20 4f 42 4a 5f 6f 62 6a 32 6e 69 64 28 73 69 67 OBJ_obj2nid(sig
3ea0: 5f 61 6c 67 2d 3e 61 6c 67 6f 72 69 74 68 6d 29 _alg->algorithm)
3eb0: 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
3ec0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
3ed0: 2c 20 22 73 69 67 6e 61 74 75 72 65 41 6c 67 6f , "signatureAlgo
3ee0: 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 rithm", OBJ_nid2
3ef0: 6c 6e 28 73 69 67 5f 6e 69 64 29 2c 20 2d 31 29 ln(sig_nid), -1)
3f00: 3b 0a 09 69 66 20 28 73 69 67 5f 6e 69 64 20 21 ;..if (sig_nid !
3f10: 3d 20 4e 49 44 5f 75 6e 64 65 66 29 20 7b 0a 09 = NID_undef) {..
3f20: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 LAPPEND_OBJ(
3f30: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
3f40: 6a 2c 20 22 73 69 67 6e 61 74 75 72 65 56 61 6c j, "signatureVal
3f50: 75 65 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f 48 ue", String_to_H
3f60: 65 78 28 73 69 67 2d 3e 64 61 74 61 2c 20 73 69 ex(sig->data, si
3f70: 67 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a 09 7d 20 g->length));..}
3f80: 65 6c 73 65 20 7b 0a 09 20 20 20 20 4c 41 50 50 else {.. LAPP
3f90: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
3fa0: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e resultObj, "sign
3fb0: 61 74 75 72 65 56 61 6c 75 65 22 2c 20 22 22 2c atureValue", "",
3fc0: 20 30 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 0);..}. }..
3fd0: 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 20 6f 66 /* Version of
3fe0: 20 74 68 65 20 65 6e 63 6f 64 65 64 20 63 65 72 the encoded cer
3ff0: 74 69 66 69 63 61 74 65 20 2d 20 52 46 43 20 35 tificate - RFC 5
4000: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 280 section 4.1.
4010: 32 2e 31 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 2.1 */. LAPPE
4020: 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
4030: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 76 65 72 73 resultObj, "vers
4040: 69 6f 6e 22 2c 20 58 35 30 39 5f 67 65 74 5f 76 ion", X509_get_v
4050: 65 72 73 69 6f 6e 28 63 65 72 74 29 2b 31 29 3b ersion(cert)+1);
4060: 0a 0a 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 .. /* Unique
4070: 6e 75 6d 62 65 72 20 61 73 73 69 67 6e 65 64 20 number assigned
4080: 62 79 20 43 41 20 74 6f 20 63 65 72 74 69 66 69 by CA to certifi
4090: 63 61 74 65 20 2d 20 52 46 43 20 35 32 38 30 20 cate - RFC 5280
40a0: 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 32 20 section 4.1.2.2
40b0: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f */. len = BIO
40c0: 5f 74 6f 5f 42 75 66 66 65 72 28 69 32 61 5f 41 _to_Buffer(i2a_A
40d0: 53 4e 31 5f 49 4e 54 45 47 45 52 28 62 69 6f 2c SN1_INTEGER(bio,
40e0: 20 58 35 30 39 5f 67 65 74 30 5f 73 65 72 69 61 X509_get0_seria
40f0: 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 29 2c 20 lNumber(cert)),
4100: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46 bio, buffer, BUF
4110: 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e SIZ);. LAPPEN
4120: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 D_STR(interp, re
4130: 73 75 6c 74 4f 62 6a 2c 20 22 73 65 72 69 61 6c sultObj, "serial
4140: 4e 75 6d 62 65 72 22 2c 20 62 75 66 66 65 72 2c Number", buffer,
4150: 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 len);.. /* S
4160: 69 67 6e 61 74 75 72 65 20 61 6c 67 6f 72 69 74 ignature algorit
4170: 68 6d 20 75 73 65 64 20 62 79 20 74 68 65 20 43 hm used by the C
4180: 41 20 74 6f 20 73 69 67 6e 20 74 68 65 20 63 65 A to sign the ce
4190: 72 74 69 66 69 63 61 74 65 2e 20 4d 75 73 74 20 rtificate. Must
41a0: 6d 61 74 63 68 0a 09 73 69 67 6e 61 74 75 72 65 match..signature
41b0: 41 6c 67 6f 72 69 74 68 6d 2e 20 52 46 43 20 35 Algorithm. RFC 5
41c0: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 280 section 4.1.
41d0: 32 2e 33 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 2.3 */. LAPPE
41e0: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 ND_STR(interp, r
41f0: 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 esultObj, "signa
4200: 74 75 72 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c ture", OBJ_nid2l
4210: 6e 28 58 35 30 39 5f 67 65 74 5f 73 69 67 6e 61 n(X509_get_signa
4220: 74 75 72 65 5f 6e 69 64 28 63 65 72 74 29 29 2c ture_nid(cert)),
4230: 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 73 -1);.. /* Is
4240: 73 75 65 72 20 69 64 65 6e 74 69 66 69 65 73 20 suer identifies
4250: 74 68 65 20 65 6e 74 69 74 79 20 74 68 61 74 20 the entity that
4260: 73 69 67 6e 65 64 20 61 6e 64 20 69 73 73 75 65 signed and issue
4270: 64 20 74 68 65 20 63 65 72 74 2e 20 52 46 43 20 d the cert. RFC
4280: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 5280 section 4.1
4290: 2e 32 2e 34 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 .2.4 */. len
42a0: 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 = BIO_to_Buffer(
42b0: 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e 74 5f X509_NAME_print_
42c0: 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 74 ex(bio, X509_get
42d0: 5f 69 73 73 75 65 72 5f 6e 61 6d 65 28 63 65 72 _issuer_name(cer
42e0: 74 29 2c 20 30 2c 20 66 6c 61 67 73 29 2c 20 62 t), 0, flags), b
42f0: 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 io, buffer, BUFS
4300: 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 IZ);. LAPPEND
4310: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 _STR(interp, res
4320: 75 6c 74 4f 62 6a 2c 20 22 69 73 73 75 65 72 22 ultObj, "issuer"
4330: 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a , buffer, len);.
4340: 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63 . /* Certific
4350: 61 74 65 20 76 61 6c 69 64 69 74 79 20 70 65 72 ate validity per
4360: 69 6f 64 20 69 73 20 74 68 65 20 69 6e 74 65 72 iod is the inter
4370: 76 61 6c 20 74 68 65 20 43 41 20 77 61 72 72 61 val the CA warra
4380: 6e 74 73 20 74 68 61 74 20 69 74 20 77 69 6c 6c nts that it will
4390: 0a 09 6d 61 69 6e 74 61 69 6e 20 69 6e 66 6f 20 ..maintain info
43a0: 6f 6e 20 74 68 65 20 73 74 61 74 75 73 20 6f 66 on the status of
43b0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
43c0: 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 . RFC 5280 secti
43d0: 6f 6e 20 34 2e 31 2e 32 2e 35 20 2a 2f 0a 20 20 on 4.1.2.5 */.
43e0: 20 20 2f 2a 20 47 65 74 20 56 61 6c 69 64 69 74 /* Get Validit
43f0: 79 20 2d 20 4e 6f 74 20 42 65 66 6f 72 65 20 2a y - Not Before *
4400: 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f /. len = BIO_
4410: 74 6f 5f 42 75 66 66 65 72 28 41 53 4e 31 5f 54 to_Buffer(ASN1_T
4420: 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c 20 58 IME_print(bio, X
4430: 35 30 39 5f 67 65 74 30 5f 6e 6f 74 42 65 66 6f 509_get0_notBefo
4440: 72 65 28 63 65 72 74 29 29 2c 20 62 69 6f 2c 20 re(cert)), bio,
4450: 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b buffer, BUFSIZ);
4460: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
4470: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
4480: 62 6a 2c 20 22 6e 6f 74 42 65 66 6f 72 65 22 2c bj, "notBefore",
4490: 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a buffer, len);..
44a0: 20 20 20 20 2f 2a 20 47 65 74 20 56 61 6c 69 64 /* Get Valid
44b0: 69 74 79 20 2d 20 4e 6f 74 20 41 66 74 65 72 20 ity - Not After
44c0: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f */. len = BIO
44d0: 5f 74 6f 5f 42 75 66 66 65 72 28 41 53 4e 31 5f _to_Buffer(ASN1_
44e0: 54 49 4d 45 5f 70 72 69 6e 74 28 62 69 6f 2c 20 TIME_print(bio,
44f0: 58 35 30 39 5f 67 65 74 30 5f 6e 6f 74 41 66 74 X509_get0_notAft
4500: 65 72 28 63 65 72 74 29 29 2c 20 62 69 6f 2c 20 er(cert)), bio,
4510: 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b buffer, BUFSIZ);
4520: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
4530: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
4540: 62 6a 2c 20 22 6e 6f 74 41 66 74 65 72 22 2c 20 bj, "notAfter",
4550: 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a 20 buffer, len);..
4560: 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 69 64 /* Subject id
4570: 65 6e 74 69 66 69 65 73 20 74 68 65 20 65 6e 74 entifies the ent
4580: 69 74 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 ity associated w
4590: 69 74 68 20 74 68 65 20 70 75 62 6c 69 63 20 6b ith the public k
45a0: 65 79 20 73 74 6f 72 65 64 20 69 6e 0a 09 74 68 ey stored in..th
45b0: 65 20 73 75 62 6a 65 63 74 20 70 75 62 6c 69 63 e subject public
45c0: 20 6b 65 79 20 66 69 65 6c 64 2e 20 52 46 43 20 key field. RFC
45d0: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 5280 section 4.1
45e0: 2e 32 2e 36 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 .2.6 */. len
45f0: 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 = BIO_to_Buffer(
4600: 58 35 30 39 5f 4e 41 4d 45 5f 70 72 69 6e 74 5f X509_NAME_print_
4610: 65 78 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 74 ex(bio, X509_get
4620: 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 _subject_name(ce
4630: 72 74 29 2c 20 30 2c 20 66 6c 61 67 73 29 2c 20 rt), 0, flags),
4640: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 55 46 bio, buffer, BUF
4650: 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e SIZ);. LAPPEN
4660: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 D_STR(interp, re
4670: 73 75 6c 74 4f 62 6a 2c 20 22 73 75 62 6a 65 63 sultObj, "subjec
4680: 74 22 2c 20 62 75 66 66 65 72 2c 20 6c 65 6e 29 t", buffer, len)
4690: 3b 0a 0a 20 20 20 20 2f 2a 20 53 48 41 31 20 44 ;.. /* SHA1 D
46a0: 69 67 65 73 74 20 28 46 69 6e 67 65 72 70 72 69 igest (Fingerpri
46b0: 6e 74 29 20 6f 66 20 63 65 72 74 20 2d 20 44 45 nt) of cert - DE
46c0: 52 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e R representation
46d0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35 30 39 */. if (X509
46e0: 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 45 56 _digest(cert, EV
46f0: 50 5f 73 68 61 31 28 29 2c 20 28 75 6e 73 69 67 P_sha1(), (unsig
4700: 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 ned char *)buffe
4710: 72 2c 20 26 75 6c 65 6e 29 29 20 7b 0a 09 4c 41 r, &ulen)) {..LA
4720: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 PPEND_OBJ(interp
4730: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 68 , resultObj, "sh
4740: 61 31 5f 68 61 73 68 22 2c 20 53 74 72 69 6e 67 a1_hash", String
4750: 5f 74 6f 5f 48 65 78 28 28 75 6e 73 69 67 6e 65 _to_Hex((unsigne
4760: 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 72 2c d char *)buffer,
4770: 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 20 (int) ulen));.
4780: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 48 41 }.. /* SHA
4790: 32 35 36 20 44 69 67 65 73 74 20 28 46 69 6e 67 256 Digest (Fing
47a0: 65 72 70 72 69 6e 74 29 20 6f 66 20 63 65 72 74 erprint) of cert
47b0: 20 2d 20 44 45 52 20 72 65 70 72 65 73 65 6e 74 - DER represent
47c0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 ation */. if
47d0: 28 58 35 30 39 5f 64 69 67 65 73 74 28 63 65 72 (X509_digest(cer
47e0: 74 2c 20 45 56 50 5f 73 68 61 32 35 36 28 29 2c t, EVP_sha256(),
47f0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 (unsigned char
4800: 2a 29 62 75 66 66 65 72 2c 20 26 75 6c 65 6e 29 *)buffer, &ulen)
4810: 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a ) {..LAPPEND_OBJ
4820: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
4830: 62 6a 2c 20 22 73 68 61 32 35 36 5f 68 61 73 68 bj, "sha256_hash
4840: 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 ", String_to_Hex
4850: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ((unsigned char
4860: 2a 29 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20 *)buffer, (int)
4870: 75 6c 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 ulen));. }..
4880: 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 50 75 /* Subject Pu
4890: 62 6c 69 63 20 4b 65 79 20 49 6e 66 6f 20 73 70 blic Key Info sp
48a0: 65 63 69 66 69 65 73 20 74 68 65 20 70 75 62 6c ecifies the publ
48b0: 69 63 20 6b 65 79 20 61 6e 64 20 69 64 65 6e 74 ic key and ident
48c0: 69 66 69 65 73 20 74 68 65 0a 09 61 6c 67 6f 72 ifies the..algor
48d0: 69 74 68 6d 20 77 69 74 68 20 77 68 69 63 68 20 ithm with which
48e0: 74 68 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e the key is used.
48f0: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f RFC 5280 sectio
4900: 6e 20 34 2e 31 2e 32 2e 37 20 2a 2f 0a 20 20 20 n 4.1.2.7 */.
4910: 20 69 66 20 28 58 35 30 39 5f 67 65 74 5f 73 69 if (X509_get_si
4920: 67 6e 61 74 75 72 65 5f 69 6e 66 6f 28 63 65 72 gnature_info(cer
4930: 74 2c 20 26 6d 64 6e 69 64 2c 20 26 70 6b 6e 69 t, &mdnid, &pkni
4940: 64 2c 20 26 62 69 74 73 2c 20 26 78 66 6c 61 67 d, &bits, &xflag
4950: 73 29 29 20 7b 0a 09 41 53 4e 31 5f 42 49 54 5f s)) {..ASN1_BIT_
4960: 53 54 52 49 4e 47 20 2a 6b 65 79 3b 0a 09 75 6e STRING *key;..un
4970: 73 69 67 6e 65 64 20 69 6e 74 20 6e 3b 0a 0a 09 signed int n;...
4980: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
4990: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
49a0: 73 69 67 6e 69 6e 67 44 69 67 65 73 74 22 2c 20 signingDigest",
49b0: 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6d 64 6e 69 64 OBJ_nid2ln(mdnid
49c0: 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 ), -1);..LAPPEND
49d0: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 _STR(interp, res
49e0: 75 6c 74 4f 62 6a 2c 20 22 70 75 62 6c 69 63 4b ultObj, "publicK
49f0: 65 79 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 eyAlgorithm", OB
4a00: 4a 5f 6e 69 64 32 6c 6e 28 70 6b 6e 69 64 29 2c J_nid2ln(pknid),
4a10: 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 -1);..LAPPEND_I
4a20: 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c NT(interp, resul
4a30: 74 4f 62 6a 2c 20 22 62 69 74 73 22 2c 20 62 69 tObj, "bits", bi
4a40: 74 73 29 3b 20 2f 2a 20 45 66 66 65 63 74 69 76 ts); /* Effectiv
4a50: 65 20 73 65 63 75 72 69 74 79 20 62 69 74 73 20 e security bits
4a60: 2a 2f 0a 0a 09 6b 65 79 20 3d 20 58 35 30 39 5f */...key = X509_
4a70: 67 65 74 30 5f 70 75 62 6b 65 79 5f 62 69 74 73 get0_pubkey_bits
4a80: 74 72 28 63 65 72 74 29 3b 0a 09 4c 41 50 50 45 tr(cert);..LAPPE
4a90: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 ND_OBJ(interp, r
4aa0: 65 73 75 6c 74 4f 62 6a 2c 20 22 70 75 62 6c 69 esultObj, "publi
4ab0: 63 4b 65 79 22 2c 20 53 74 72 69 6e 67 5f 74 6f cKey", String_to
4ac0: 5f 48 65 78 28 6b 65 79 2d 3e 64 61 74 61 2c 20 _Hex(key->data,
4ad0: 6b 65 79 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a 0a key->length));..
4ae0: 09 69 66 20 28 58 35 30 39 5f 70 75 62 6b 65 79 .if (X509_pubkey
4af0: 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 45 56 _digest(cert, EV
4b00: 50 5f 67 65 74 5f 64 69 67 65 73 74 62 79 6e 69 P_get_digestbyni
4b10: 64 28 70 6b 6e 69 64 29 2c 20 28 75 6e 73 69 67 d(pknid), (unsig
4b20: 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 ned char *)buffe
4b30: 72 2c 20 26 6e 29 29 20 7b 0a 09 20 20 20 20 4c r, &n)) {.. L
4b40: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 APPEND_OBJ(inter
4b50: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 p, resultObj, "p
4b60: 75 62 6c 69 63 4b 65 79 48 61 73 68 22 2c 20 53 ublicKeyHash", S
4b70: 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 28 75 6e tring_to_Hex((un
4b80: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75 signed char *)bu
4b90: 66 66 65 72 2c 20 28 69 6e 74 29 20 6e 29 29 3b ffer, (int) n));
4ba0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
4bb0: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
4bc0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
4bd0: 70 75 62 6c 69 63 4b 65 79 48 61 73 68 22 2c 20 publicKeyHash",
4be0: 22 22 2c 20 30 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 "", 0);..}.../*
4bf0: 64 69 67 65 73 74 20 6f 66 20 74 68 65 20 44 45 digest of the DE
4c00: 52 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e R representation
4c10: 20 6f 66 20 74 68 65 20 63 65 72 74 69 66 69 63 of the certific
4c20: 61 74 65 20 2a 2f 0a 09 69 66 20 28 58 35 30 39 ate */..if (X509
4c30: 5f 64 69 67 65 73 74 28 63 65 72 74 2c 20 45 56 _digest(cert, EV
4c40: 50 5f 67 65 74 5f 64 69 67 65 73 74 62 79 6e 69 P_get_digestbyni
4c50: 64 28 6d 64 6e 69 64 29 2c 20 28 75 6e 73 69 67 d(mdnid), (unsig
4c60: 6e 65 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 ned char *)buffe
4c70: 72 2c 20 26 6e 29 29 20 7b 0a 09 20 20 20 20 4c r, &n)) {.. L
4c80: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 APPEND_OBJ(inter
4c90: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 p, resultObj, "s
4ca0: 69 67 6e 61 74 75 72 65 48 61 73 68 22 2c 20 53 ignatureHash", S
4cb0: 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 28 75 6e tring_to_Hex((un
4cc0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 75 signed char *)bu
4cd0: 66 66 65 72 2c 20 28 69 6e 74 29 20 6e 29 29 3b ffer, (int) n));
4ce0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
4cf0: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
4d00: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
4d10: 73 69 67 6e 61 74 75 72 65 48 61 73 68 22 2c 20 signatureHash",
4d20: 22 22 2c 20 30 29 3b 0a 09 7d 0a 20 20 20 20 7d "", 0);..}. }
4d30: 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 .. /* Certifi
4d40: 63 61 74 65 20 50 75 72 70 6f 73 65 2e 20 43 61 cate Purpose. Ca
4d50: 6c 6c 20 62 65 66 6f 72 65 20 63 68 65 63 6b 69 ll before checki
4d60: 6e 67 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e ng for extension
4d70: 73 2e 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e s. */. LAPPEN
4d80: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 D_STR(interp, re
4d90: 73 75 6c 74 4f 62 6a 2c 20 22 70 75 72 70 6f 73 sultObj, "purpos
4da0: 65 22 2c 20 54 6c 73 5f 78 35 30 39 50 75 72 70 e", Tls_x509Purp
4db0: 6f 73 65 28 63 65 72 74 29 2c 20 2d 31 29 3b 0a ose(cert), -1);.
4dc0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 LAPPEND_OBJ(
4dd0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
4de0: 6a 2c 20 22 63 65 72 74 69 66 69 63 61 74 65 50 j, "certificateP
4df0: 75 72 70 6f 73 65 22 2c 20 54 6c 73 5f 78 35 30 urpose", Tls_x50
4e00: 39 50 75 72 70 6f 73 65 73 28 69 6e 74 65 72 70 9Purposes(interp
4e10: 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f , cert));.. /
4e20: 2a 20 47 65 74 20 65 78 74 65 6e 73 69 6f 6e 73 * Get extensions
4e30: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20 78 66 flags */. xf
4e40: 6c 61 67 73 20 3d 20 58 35 30 39 5f 67 65 74 5f lags = X509_get_
4e50: 65 78 74 65 6e 73 69 6f 6e 5f 66 6c 61 67 73 28 extension_flags(
4e60: 63 65 72 74 29 3b 0a 20 20 20 20 4c 41 50 50 45 cert);. LAPPE
4e70: 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 ND_INT(interp, r
4e80: 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74 46 6c esultObj, "extFl
4e90: 61 67 73 22 2c 20 78 66 6c 61 67 73 29 3b 0a 0a ags", xflags);..
4ea0: 09 2f 2a 20 43 68 65 63 6b 20 69 66 20 63 65 72 ./* Check if cer
4eb0: 74 20 77 61 73 20 69 73 73 75 65 64 20 62 79 20 t was issued by
4ec0: 43 41 20 63 65 72 74 20 69 73 73 75 65 72 20 6f CA cert issuer o
4ed0: 72 20 73 65 6c 66 20 73 69 67 6e 65 64 20 2a 2f r self signed */
4ee0: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f . LAPPEND_BOO
4ef0: 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 L(interp, result
4f00: 4f 62 6a 2c 20 22 73 65 6c 66 49 73 73 75 65 64 Obj, "selfIssued
4f10: 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c ", xflags & EXFL
4f20: 41 47 5f 53 49 29 3b 0a 20 20 20 20 4c 41 50 50 AG_SI);. LAPP
4f30: 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
4f40: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 65 6c resultObj, "sel
4f50: 66 53 69 67 6e 65 64 22 2c 20 78 66 6c 61 67 73 fSigned", xflags
4f60: 20 26 20 45 58 46 4c 41 47 5f 53 53 29 3b 0a 20 & EXFLAG_SS);.
4f70: 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 LAPPEND_BOOL(
4f80: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
4f90: 6a 2c 20 22 69 73 50 72 6f 78 79 43 65 72 74 22 j, "isProxyCert"
4fa0: 2c 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 , xflags & EXFLA
4fb0: 47 5f 50 52 4f 58 59 29 3b 0a 20 20 20 20 4c 41 G_PROXY);. LA
4fc0: 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
4fd0: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 p, resultObj, "e
4fe0: 78 74 49 6e 76 61 6c 69 64 22 2c 20 78 66 6c 61 xtInvalid", xfla
4ff0: 67 73 20 26 20 45 58 46 4c 41 47 5f 49 4e 56 41 gs & EXFLAG_INVA
5000: 4c 49 44 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e LID);. LAPPEN
5010: 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 D_BOOL(interp, r
5020: 65 73 75 6c 74 4f 62 6a 2c 20 22 69 73 43 41 43 esultObj, "isCAC
5030: 65 72 74 22 2c 20 58 35 30 39 5f 63 68 65 63 6b ert", X509_check
5040: 5f 63 61 28 63 65 72 74 29 29 3b 0a 0a 20 20 20 _ca(cert));..
5050: 20 2f 2a 20 54 68 65 20 55 6e 69 71 75 65 20 49 /* The Unique I
5060: 64 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 68 ds are used to h
5070: 61 6e 64 6c 65 20 74 68 65 20 70 6f 73 73 69 62 andle the possib
5080: 69 6c 69 74 79 20 6f 66 20 72 65 75 73 65 20 6f ility of reuse o
5090: 66 20 73 75 62 6a 65 63 74 0a 09 61 6e 64 2f 6f f subject..and/o
50a0: 72 20 69 73 73 75 65 72 20 6e 61 6d 65 73 20 6f r issuer names o
50b0: 76 65 72 20 74 69 6d 65 2e 20 52 46 43 20 35 32 ver time. RFC 52
50c0: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 80 section 4.1.2
50d0: 2e 38 20 2a 2f 0a 20 20 20 20 7b 0a 09 63 6f 6e .8 */. {..con
50e0: 73 74 20 41 53 4e 31 5f 42 49 54 5f 53 54 52 49 st ASN1_BIT_STRI
50f0: 4e 47 20 2a 69 75 69 64 2c 20 2a 73 75 69 64 3b NG *iuid, *suid;
5100: 0a 20 20 20 20 20 20 20 20 58 35 30 39 5f 67 65 . X509_ge
5110: 74 30 5f 75 69 64 73 28 63 65 72 74 2c 20 26 69 t0_uids(cert, &i
5120: 75 69 64 2c 20 26 73 75 69 64 29 3b 0a 0a 09 54 uid, &suid);...T
5130: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
5140: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
5150: 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e resultObj, Tcl_N
5160: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 73 73 ewStringObj("iss
5170: 75 65 72 55 6e 69 71 75 65 49 64 22 2c 20 2d 31 uerUniqueId", -1
5180: 29 29 3b 0a 09 69 66 20 28 69 75 69 64 20 21 3d ));..if (iuid !=
5190: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 NULL) {.. Tc
51a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
51b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 lement(interp, r
51c0: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 esultObj, Tcl_Ne
51d0: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 63 wByteArrayObj((c
51e0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
51f0: 61 72 20 2a 29 69 75 69 64 2d 3e 64 61 74 61 2c ar *)iuid->data,
5200: 20 28 54 63 6c 5f 53 69 7a 65 29 20 69 75 69 64 (Tcl_Size) iuid
5210: 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a 09 7d 20 65 ->length));..} e
5220: 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c lse {.. Tcl_L
5230: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5240: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 ent(interp, resu
5250: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 ltObj, Tcl_NewSt
5260: 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 ringObj("", -1))
5270: 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f ;..}...Tcl_ListO
5280: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
5290: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
52a0: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 j, Tcl_NewString
52b0: 4f 62 6a 28 22 73 75 62 6a 65 63 74 55 6e 69 71 Obj("subjectUniq
52c0: 75 65 49 64 22 2c 20 2d 31 29 29 3b 0a 09 69 66 ueId", -1));..if
52d0: 20 28 73 75 69 64 20 21 3d 20 4e 55 4c 4c 29 20 (suid != NULL)
52e0: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
52f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
5300: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
5310: 6a 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 j, Tcl_NewByteAr
5320: 72 61 79 4f 62 6a 28 28 63 6f 6e 73 74 20 75 6e rayObj((const un
5330: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 75 signed char *)su
5340: 69 64 2d 3e 64 61 74 61 2c 20 28 54 63 6c 5f 53 id->data, (Tcl_S
5350: 69 7a 65 29 20 73 75 69 64 2d 3e 6c 65 6e 67 74 ize) suid->lengt
5360: 68 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 h));..} else {..
5370: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
5380: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
5390: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
53a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
53b0: 28 22 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 ("", -1));..}.
53c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 58 35 30 39 }.. /* X509
53d0: 20 76 33 20 45 78 74 65 6e 73 69 6f 6e 73 20 2d v3 Extensions -
53e0: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f RFC 5280 sectio
53f0: 6e 20 34 2e 31 2e 32 2e 39 20 2a 2f 0a 20 20 20 n 4.1.2.9 */.
5400: 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 LAPPEND_INT(int
5410: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
5420: 22 65 78 74 43 6f 75 6e 74 22 2c 20 58 35 30 39 "extCount", X509
5430: 5f 67 65 74 5f 65 78 74 5f 63 6f 75 6e 74 28 63 _get_ext_count(c
5440: 65 72 74 29 29 3b 0a 20 20 20 20 4c 41 50 50 45 ert));. LAPPE
5450: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 ND_OBJ(interp, r
5460: 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74 65 6e esultObj, "exten
5470: 73 69 6f 6e 73 22 2c 20 54 6c 73 5f 78 35 30 39 sions", Tls_x509
5480: 45 78 74 65 6e 73 69 6f 6e 73 28 69 6e 74 65 72 Extensions(inter
5490: 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 p, cert));..
54a0: 2f 2a 20 41 75 74 68 6f 72 69 74 79 20 4b 65 79 /* Authority Key
54b0: 20 49 64 65 6e 74 69 66 69 65 72 20 28 41 4b 49 Identifier (AKI
54c0: 29 20 69 73 20 74 68 65 20 53 75 62 6a 65 63 74 ) is the Subject
54d0: 20 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 20 Key Identifier
54e0: 28 53 4b 49 29 20 6f 66 0a 09 69 74 73 20 73 69 (SKI) of..its si
54f0: 67 6e 65 72 20 28 74 68 65 20 43 41 29 2e 20 52 gner (the CA). R
5500: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 FC 5280 section
5510: 34 2e 32 2e 31 2e 31 2c 20 4e 49 44 5f 61 75 74 4.2.1.1, NID_aut
5520: 68 6f 72 69 74 79 5f 6b 65 79 5f 69 64 65 6e 74 hority_key_ident
5530: 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 ifier */. LAP
5540: 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c PEND_OBJ(interp,
5550: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 61 75 74 resultObj, "aut
5560: 68 6f 72 69 74 79 4b 65 79 49 64 65 6e 74 69 66 horityKeyIdentif
5570: 69 65 72 22 2c 0a 09 54 6c 73 5f 78 35 30 39 49 ier",..Tls_x509I
5580: 64 65 6e 74 69 66 69 65 72 28 58 35 30 39 5f 67 dentifier(X509_g
5590: 65 74 30 5f 61 75 74 68 6f 72 69 74 79 5f 6b 65 et0_authority_ke
55a0: 79 5f 69 64 28 63 65 72 74 29 29 29 3b 0a 0a 20 y_id(cert)));..
55b0: 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 4b 65 /* Subject Ke
55c0: 79 20 49 64 65 6e 74 69 66 69 65 72 20 28 53 4b y Identifier (SK
55d0: 49 29 20 69 73 20 75 73 65 64 20 74 6f 20 69 64 I) is used to id
55e0: 65 6e 74 69 66 79 20 63 65 72 74 69 66 69 63 61 entify certifica
55f0: 74 65 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e tes that contain
5600: 0a 09 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 ..a particular p
5610: 75 62 6c 69 63 20 6b 65 79 2e 20 52 46 43 20 35 ublic key. RFC 5
5620: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 280 section 4.2.
5630: 31 2e 32 2c 20 4e 49 44 5f 73 75 62 6a 65 63 74 1.2, NID_subject
5640: 5f 6b 65 79 5f 69 64 65 6e 74 69 66 69 65 72 20 _key_identifier
5650: 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f */. LAPPEND_O
5660: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c BJ(interp, resul
5670: 74 4f 62 6a 2c 20 22 73 75 62 6a 65 63 74 4b 65 tObj, "subjectKe
5680: 79 49 64 65 6e 74 69 66 69 65 72 22 2c 0a 09 54 yIdentifier",..T
5690: 6c 73 5f 78 35 30 39 49 64 65 6e 74 69 66 69 65 ls_x509Identifie
56a0: 72 28 58 35 30 39 5f 67 65 74 30 5f 73 75 62 6a r(X509_get0_subj
56b0: 65 63 74 5f 6b 65 79 5f 69 64 28 63 65 72 74 29 ect_key_id(cert)
56c0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4b 65 79 20 ));.. /* Key
56d0: 75 73 61 67 65 20 65 78 74 65 6e 73 69 6f 6e 20 usage extension
56e0: 64 65 66 69 6e 65 73 20 74 68 65 20 70 75 72 70 defines the purp
56f0: 6f 73 65 20 28 65 2e 67 2e 2c 20 65 6e 63 69 70 ose (e.g., encip
5700: 68 65 72 6d 65 6e 74 2c 20 73 69 67 6e 61 74 75 herment, signatu
5710: 72 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 0a re, certificate.
5720: 09 73 69 67 6e 69 6e 67 29 20 6f 66 20 74 68 65 .signing) of the
5730: 20 6b 65 79 20 69 6e 20 74 68 65 20 63 65 72 74 key in the cert
5740: 69 66 69 63 61 74 65 2e 20 52 46 43 20 35 32 38 ificate. RFC 528
5750: 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 0 section 4.2.1.
5760: 33 2c 20 4e 49 44 5f 6b 65 79 5f 75 73 61 67 65 3, NID_key_usage
5770: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f */. LAPPEND_
5780: 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 OBJ(interp, resu
5790: 6c 74 4f 62 6a 2c 20 22 6b 65 79 55 73 61 67 65 ltObj, "keyUsage
57a0: 22 2c 20 54 6c 73 5f 78 35 30 39 4b 65 79 55 73 ", Tls_x509KeyUs
57b0: 61 67 65 28 69 6e 74 65 72 70 2c 20 63 65 72 74 age(interp, cert
57c0: 2c 20 78 66 6c 61 67 73 29 29 3b 0a 0a 20 20 20 , xflags));..
57d0: 20 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65 20 /* Certificate
57e0: 50 6f 6c 69 63 69 65 73 20 2d 20 69 6e 64 69 63 Policies - indic
57f0: 61 74 65 73 20 74 68 65 20 69 73 73 75 69 6e 67 ates the issuing
5800: 20 43 41 20 63 6f 6e 73 69 64 65 72 73 20 69 74 CA considers it
5810: 73 20 69 73 73 75 65 72 44 6f 6d 61 69 6e 50 6f s issuerDomainPo
5820: 6c 69 63 79 0a 09 65 71 75 69 76 61 6c 65 6e 74 licy..equivalent
5830: 20 74 6f 20 74 68 65 20 73 75 62 6a 65 63 74 20 to the subject
5840: 43 41 27 73 20 73 75 62 6a 65 63 74 44 6f 6d 61 CA's subjectDoma
5850: 69 6e 50 6f 6c 69 63 79 2e 20 52 46 43 20 35 32 inPolicy. RFC 52
5860: 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 80 section 4.2.1
5870: 2e 34 2c 20 4e 49 44 5f 63 65 72 74 69 66 69 63 .4, NID_certific
5880: 61 74 65 5f 70 6f 6c 69 63 69 65 73 20 2a 2f 0a ate_policies */.
5890: 20 20 20 20 69 66 20 28 78 66 6c 61 67 73 20 26 if (xflags &
58a0: 20 45 58 46 4c 41 47 5f 49 4e 56 41 4c 49 44 5f EXFLAG_INVALID_
58b0: 50 4f 4c 49 43 59 29 20 7b 0a 09 2f 2a 20 52 65 POLICY) {../* Re
58c0: 6a 65 63 74 20 63 65 72 74 20 2a 2f 0a 20 20 20 ject cert */.
58d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 6c 69 63 }.. /* Polic
58e0: 79 20 4d 61 70 70 69 6e 67 73 20 2d 20 52 46 43 y Mappings - RFC
58f0: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 5280 section 4.
5900: 32 2e 31 2e 35 2c 20 4e 49 44 5f 70 6f 6c 69 63 2.1.5, NID_polic
5910: 79 5f 6d 61 70 70 69 6e 67 73 20 2a 2f 0a 0a 20 y_mappings */..
5920: 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 41 6c /* Subject Al
5930: 74 65 72 6e 61 74 69 76 65 20 4e 61 6d 65 20 28 ternative Name (
5940: 53 41 4e 29 20 63 6f 6e 74 61 69 6e 73 20 61 64 SAN) contains ad
5950: 64 69 74 69 6f 6e 61 6c 20 55 52 4c 73 2c 20 44 ditional URLs, D
5960: 4e 53 20 6e 61 6d 65 73 2c 20 6f 72 20 49 50 0a NS names, or IP.
5970: 09 61 64 64 72 65 73 73 65 73 20 62 6f 75 6e 64 .addresses bound
5980: 20 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 2e to certificate.
5990: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f RFC 5280 sectio
59a0: 6e 20 34 2e 32 2e 31 2e 36 2c 20 4e 49 44 5f 73 n 4.2.1.6, NID_s
59b0: 75 62 6a 65 63 74 5f 61 6c 74 5f 6e 61 6d 65 20 ubject_alt_name
59c0: 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f */. LAPPEND_O
59d0: 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c BJ(interp, resul
59e0: 74 4f 62 6a 2c 20 22 73 75 62 6a 65 63 74 41 6c tObj, "subjectAl
59f0: 74 4e 61 6d 65 22 2c 20 54 6c 73 5f 78 35 30 39 tName", Tls_x509
5a00: 4e 61 6d 65 73 28 69 6e 74 65 72 70 2c 20 63 65 Names(interp, ce
5a10: 72 74 2c 20 4e 49 44 5f 73 75 62 6a 65 63 74 5f rt, NID_subject_
5a20: 61 6c 74 5f 6e 61 6d 65 2c 20 62 69 6f 29 29 3b alt_name, bio));
5a30: 0a 0a 20 20 20 20 2f 2a 20 49 73 73 75 65 72 20 .. /* Issuer
5a40: 41 6c 74 65 72 6e 61 74 69 76 65 20 4e 61 6d 65 Alternative Name
5a50: 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 6f is used to asso
5a60: 63 69 61 74 65 20 49 6e 74 65 72 6e 65 74 20 73 ciate Internet s
5a70: 74 79 6c 65 20 69 64 65 6e 74 69 74 69 65 73 0a tyle identities.
5a80: 09 77 69 74 68 20 74 68 65 20 63 65 72 74 69 66 .with the certif
5a90: 69 63 61 74 65 20 69 73 73 75 65 72 2e 20 52 46 icate issuer. RF
5aa0: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 C 5280 section 4
5ab0: 2e 32 2e 31 2e 37 2c 20 4e 49 44 5f 69 73 73 75 .2.1.7, NID_issu
5ac0: 65 72 5f 61 6c 74 5f 6e 61 6d 65 20 2a 2f 0a 20 er_alt_name */.
5ad0: 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 LAPPEND_OBJ(i
5ae0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
5af0: 2c 20 22 69 73 73 75 65 72 41 6c 74 4e 61 6d 65 , "issuerAltName
5b00: 22 2c 20 54 6c 73 5f 78 35 30 39 4e 61 6d 65 73 ", Tls_x509Names
5b10: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 2c 20 4e (interp, cert, N
5b20: 49 44 5f 69 73 73 75 65 72 5f 61 6c 74 5f 6e 61 ID_issuer_alt_na
5b30: 6d 65 2c 20 62 69 6f 29 29 3b 0a 0a 20 20 20 20 me, bio));..
5b40: 2f 2a 20 53 75 62 6a 65 63 74 20 44 69 72 65 63 /* Subject Direc
5b50: 74 6f 72 79 20 41 74 74 72 69 62 75 74 65 73 20 tory Attributes
5b60: 70 72 6f 76 69 64 65 73 20 69 64 65 6e 74 69 66 provides identif
5b70: 69 63 61 74 69 6f 6e 20 61 74 74 72 69 62 75 74 ication attribut
5b80: 65 73 20 28 65 2e 67 2e 2c 20 6e 61 74 69 6f 6e es (e.g., nation
5b90: 61 6c 69 74 79 29 0a 09 6f 66 20 74 68 65 20 73 ality)..of the s
5ba0: 75 62 6a 65 63 74 2e 20 52 46 43 20 35 32 38 30 ubject. RFC 5280
5bb0: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 38 section 4.2.1.8
5bc0: 20 28 73 75 62 6a 65 63 74 44 69 72 65 63 74 6f (subjectDirecto
5bd0: 72 79 41 74 74 72 69 62 75 74 65 73 29 20 2a 2f ryAttributes) */
5be0: 0a 0a 20 20 20 20 2f 2a 20 42 61 73 69 63 20 43 .. /* Basic C
5bf0: 6f 6e 73 74 72 61 69 6e 74 73 20 69 64 65 6e 74 onstraints ident
5c00: 69 66 69 65 73 20 77 68 65 74 68 65 72 20 74 68 ifies whether th
5c10: 65 20 73 75 62 6a 65 63 74 20 6f 66 20 74 68 65 e subject of the
5c20: 20 63 65 72 74 20 69 73 20 61 20 43 41 20 61 6e cert is a CA an
5c30: 64 0a 09 74 68 65 20 6d 61 78 20 64 65 70 74 68 d..the max depth
5c40: 20 6f 66 20 76 61 6c 69 64 20 63 65 72 74 20 70 of valid cert p
5c50: 61 74 68 73 20 66 6f 72 20 74 68 69 73 20 63 65 aths for this ce
5c60: 72 74 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 rt. RFC 5280 sec
5c70: 74 69 6f 6e 20 34 2e 32 2e 31 2e 39 2c 20 4e 49 tion 4.2.1.9, NI
5c80: 44 5f 62 61 73 69 63 5f 63 6f 6e 73 74 72 61 69 D_basic_constrai
5c90: 6e 74 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 nts */. if (!
5ca0: 28 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 (xflags & EXFLAG
5cb0: 5f 50 52 4f 58 59 29 29 20 7b 0a 09 4c 41 50 50 _PROXY)) {..LAPP
5cc0: 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c END_LONG(interp,
5cd0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 61 74 resultObj, "pat
5ce0: 68 4c 65 6e 22 2c 20 58 35 30 39 5f 67 65 74 5f hLen", X509_get_
5cf0: 70 61 74 68 6c 65 6e 28 63 65 72 74 29 29 3b 0a pathlen(cert));.
5d00: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 4c 41 } else {..LA
5d10: 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 PPEND_LONG(inter
5d20: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 70 p, resultObj, "p
5d30: 61 74 68 4c 65 6e 22 2c 20 58 35 30 39 5f 67 65 athLen", X509_ge
5d40: 74 5f 70 72 6f 78 79 5f 70 61 74 68 6c 65 6e 28 t_proxy_pathlen(
5d50: 63 65 72 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 cert));. }.
5d60: 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 LAPPEND_BOOL(i
5d70: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
5d80: 2c 20 22 62 61 73 69 63 43 6f 6e 73 74 72 61 69 , "basicConstrai
5d90: 6e 74 73 43 41 22 2c 20 78 66 6c 61 67 73 20 26 ntsCA", xflags &
5da0: 20 45 58 46 4c 41 47 5f 43 41 29 3b 0a 0a 20 20 EXFLAG_CA);..
5db0: 20 20 2f 2a 20 4e 61 6d 65 20 43 6f 6e 73 74 72 /* Name Constr
5dc0: 61 69 6e 74 73 20 69 73 20 6f 6e 6c 79 20 75 73 aints is only us
5dd0: 65 64 20 69 6e 20 43 41 20 63 65 72 74 73 20 74 ed in CA certs t
5de0: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 6e o indicate the n
5df0: 61 6d 65 20 73 70 61 63 65 20 66 6f 72 0a 09 61 ame space for..a
5e00: 6c 6c 20 73 75 62 6a 65 63 74 20 6e 61 6d 65 73 ll subject names
5e10: 20 69 6e 20 73 75 62 73 65 71 75 65 6e 74 20 63 in subsequent c
5e20: 65 72 74 69 66 69 63 61 74 65 73 20 69 6e 20 61 ertificates in a
5e30: 20 63 65 72 74 69 66 69 63 61 74 69 6f 6e 20 70 certification p
5e40: 61 74 68 0a 09 4d 55 53 54 20 62 65 20 6c 6f 63 ath..MUST be loc
5e50: 61 74 65 64 2e 20 52 46 43 20 35 32 38 30 20 73 ated. RFC 5280 s
5e60: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 30 2c ection 4.2.1.10,
5e70: 20 4e 49 44 5f 6e 61 6d 65 5f 63 6f 6e 73 74 72 NID_name_constr
5e80: 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a aints */.. /*
5e90: 20 50 6f 6c 69 63 79 20 43 6f 6e 73 74 72 61 69 Policy Constrai
5ea0: 6e 74 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 nts is only used
5eb0: 20 69 6e 20 43 41 20 63 65 72 74 73 20 74 6f 20 in CA certs to
5ec0: 6c 69 6d 69 74 20 74 68 65 20 6c 65 6e 67 74 68 limit the length
5ed0: 20 6f 66 20 61 0a 09 63 65 72 74 20 63 68 61 69 of a..cert chai
5ee0: 6e 20 66 6f 72 20 74 68 61 74 20 43 41 2e 20 52 n for that CA. R
5ef0: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 FC 5280 section
5f00: 34 2e 32 2e 31 2e 31 31 2c 20 4e 49 44 5f 70 6f 4.2.1.11, NID_po
5f10: 6c 69 63 79 5f 63 6f 6e 73 74 72 61 69 6e 74 73 licy_constraints
5f20: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65 */.. /* Exte
5f30: 6e 64 65 64 20 4b 65 79 20 55 73 61 67 65 20 69 nded Key Usage i
5f40: 6e 64 69 63 61 74 65 73 20 74 68 65 20 70 75 72 ndicates the pur
5f50: 70 6f 73 65 73 20 74 68 65 20 63 65 72 74 69 66 poses the certif
5f60: 69 65 64 20 70 75 62 6c 69 63 20 6b 65 79 20 6d ied public key m
5f70: 61 79 20 62 65 0a 09 75 73 65 64 2c 20 62 65 79 ay be..used, bey
5f80: 6f 6e 64 20 74 68 65 20 62 61 73 69 63 20 70 75 ond the basic pu
5f90: 72 70 6f 73 65 73 2e 20 52 46 43 20 35 32 38 30 rposes. RFC 5280
5fa0: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 section 4.2.1.1
5fb0: 32 2c 20 4e 49 44 5f 65 78 74 5f 6b 65 79 5f 75 2, NID_ext_key_u
5fc0: 73 61 67 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 sage */. LAPP
5fd0: 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 END_OBJ(interp,
5fe0: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 65 78 74 65 resultObj, "exte
5ff0: 6e 64 65 64 4b 65 79 55 73 61 67 65 22 2c 20 54 ndedKeyUsage", T
6000: 6c 73 5f 78 35 30 39 45 78 74 4b 65 79 55 73 61 ls_x509ExtKeyUsa
6010: 67 65 28 69 6e 74 65 72 70 2c 20 63 65 72 74 2c ge(interp, cert,
6020: 20 78 66 6c 61 67 73 29 29 3b 0a 0a 20 20 20 20 xflags));..
6030: 2f 2a 20 43 52 4c 20 44 69 73 74 72 69 62 75 74 /* CRL Distribut
6040: 69 6f 6e 20 50 6f 69 6e 74 73 20 69 64 65 6e 74 ion Points ident
6050: 69 66 69 65 73 20 77 68 65 72 65 20 43 52 4c 20 ifies where CRL
6060: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 61 6e 20 information can
6070: 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 09 52 46 be obtained...RF
6080: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 C 5280 section 4
6090: 2e 32 2e 31 2e 31 33 2a 2f 0a 20 20 20 20 4c 41 .2.1.13*/. LA
60a0: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 PPEND_OBJ(interp
60b0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 63 72 , resultObj, "cr
60c0: 6c 44 69 73 74 72 69 62 75 74 69 6f 6e 50 6f 69 lDistributionPoi
60d0: 6e 74 73 22 2c 20 54 6c 73 5f 78 35 30 39 43 72 nts", Tls_x509Cr
60e0: 6c 44 70 28 69 6e 74 65 72 70 2c 20 63 65 72 74 lDp(interp, cert
60f0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 72 65 73 ));.. /* Fres
6100: 68 65 73 74 20 43 52 4c 20 65 78 74 65 6e 73 69 hest CRL extensi
6110: 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 78 66 on */. if (xf
6120: 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 46 52 lags & EXFLAG_FR
6130: 45 53 48 45 53 54 29 20 7b 0a 20 20 20 20 7d 0a ESHEST) {. }.
6140: 0a 20 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 74 . /* Authorit
6150: 79 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 41 63 y Information Ac
6160: 63 65 73 73 20 69 6e 64 69 63 61 74 65 73 20 68 cess indicates h
6170: 6f 77 20 74 6f 20 61 63 63 65 73 73 20 69 6e 66 ow to access inf
6180: 6f 20 61 6e 64 20 73 65 72 76 69 63 65 73 0a 09 o and services..
6190: 66 6f 72 20 74 68 65 20 63 65 72 74 69 66 69 63 for the certific
61a0: 61 74 65 20 69 73 73 75 65 72 2e 20 52 46 43 20 ate issuer. RFC
61b0: 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 5280 section 4.2
61c0: 2e 32 2e 31 2c 20 4e 49 44 5f 69 6e 66 6f 5f 61 .2.1, NID_info_a
61d0: 63 63 65 73 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a ccess */.. /*
61e0: 20 4f 6e 2d 6c 69 6e 65 20 43 65 72 74 69 66 69 On-line Certifi
61f0: 63 61 74 65 20 53 74 61 74 75 73 20 50 72 6f 74 cate Status Prot
6200: 6f 63 6f 6c 20 28 4f 53 43 50 29 20 52 65 73 70 ocol (OSCP) Resp
6210: 6f 6e 64 65 72 73 20 55 52 4c 20 2a 2f 0a 20 20 onders URL */.
6220: 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e LAPPEND_OBJ(in
6230: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
6240: 20 22 6f 63 73 70 52 65 73 70 6f 6e 64 65 72 73 "ocspResponders
6250: 22 2c 20 54 6c 73 5f 78 35 30 39 4f 73 63 70 28 ", Tls_x509Oscp(
6260: 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a interp, cert));.
6270: 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63 . /* Certific
6280: 61 74 65 20 41 75 74 68 6f 72 69 74 79 20 28 43 ate Authority (C
6290: 41 29 20 49 73 73 75 65 72 73 20 55 52 4c 20 2a A) Issuers URL *
62a0: 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 /. LAPPEND_OB
62b0: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 J(interp, result
62c0: 4f 62 6a 2c 20 22 63 61 49 73 73 75 65 72 73 22 Obj, "caIssuers"
62d0: 2c 20 54 6c 73 5f 78 35 30 39 43 61 49 73 73 75 , Tls_x509CaIssu
62e0: 65 72 73 28 69 6e 74 65 72 70 2c 20 63 65 72 74 ers(interp, cert
62f0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a ));.. /* Subj
6300: 65 63 74 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 ect Information
6310: 41 63 63 65 73 73 20 2d 20 52 46 43 20 35 32 38 Access - RFC 528
6320: 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 32 2e 0 section 4.2.2.
6330: 32 2c 20 4e 49 44 5f 73 69 6e 66 6f 5f 61 63 63 2, NID_sinfo_acc
6340: 65 73 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 ess */.. /* C
6350: 65 72 74 69 66 69 63 61 74 65 20 41 6c 69 61 73 ertificate Alias
6360: 2e 20 49 66 20 75 73 65 73 20 61 20 50 4b 43 53 . If uses a PKCS
6370: 23 31 32 20 73 74 72 75 63 74 75 72 65 2c 20 61 #12 structure, a
6380: 6c 69 61 73 20 77 69 6c 6c 20 72 65 66 6c 65 63 lias will reflec
6390: 74 20 74 68 65 0a 09 66 72 69 65 6e 64 6c 79 4e t the..friendlyN
63a0: 61 6d 65 20 61 74 74 72 69 62 75 74 65 20 28 52 ame attribute (R
63b0: 46 43 20 32 39 38 35 29 2e 20 2a 2f 0a 20 20 20 FC 2985). */.
63c0: 20 7b 0a 09 69 6e 74 20 69 6c 65 6e 20 3d 20 30 {..int ilen = 0
63d0: 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e ;. unsign
63e0: 65 64 20 63 68 61 72 20 2a 73 74 72 69 6e 67 20 ed char *string
63f0: 3d 20 58 35 30 39 5f 61 6c 69 61 73 5f 67 65 74 = X509_alias_get
6400: 30 28 63 65 72 74 2c 20 26 69 6c 65 6e 29 3b 0a 0(cert, &ilen);.
6410: 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
6420: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
6430: 22 61 6c 69 61 73 22 2c 20 28 63 68 61 72 20 2a "alias", (char *
6440: 29 20 73 74 72 69 6e 67 2c 20 28 54 63 6c 5f 53 ) string, (Tcl_S
6450: 69 7a 65 29 20 69 6c 65 6e 29 3b 0a 20 20 20 20 ize) ilen);.
6460: 20 20 20 20 73 74 72 69 6e 67 20 3d 20 58 35 30 string = X50
6470: 39 5f 6b 65 79 69 64 5f 67 65 74 30 28 63 65 72 9_keyid_get0(cer
6480: 74 2c 20 26 69 6c 65 6e 29 3b 0a 09 4c 41 50 50 t, &ilen);..LAPP
6490: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
64a0: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6b 65 79 49 resultObj, "keyI
64b0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 73 74 72 d", (char *) str
64c0: 69 6e 67 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 ing, (Tcl_Size)
64d0: 69 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 ilen);. }..
64e0: 20 20 2f 2a 20 43 65 72 74 69 66 69 63 61 74 65 /* Certificate
64f0: 20 61 6e 64 20 64 75 6d 70 20 61 6c 6c 20 64 61 and dump all da
6500: 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c ta */. if (al
6510: 6c 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 61 l) {..Tcl_Obj *a
6520: 6c 6c 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 llObj = Tcl_NewB
6530: 79 74 65 41 72 72 61 79 4f 62 6a 28 4e 55 4c 4c yteArrayObj(NULL
6540: 2c 20 30 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a , 0);..Tcl_Obj *
6550: 63 65 72 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 certObj = Tcl_Ne
6560: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 4e 55 wByteArrayObj(NU
6570: 4c 4c 2c 20 30 29 3b 0a 09 75 6e 73 69 67 6e 65 LL, 0);..unsigne
6580: 64 20 63 68 61 72 20 2a 61 6c 6c 53 74 72 2c 20 d char *allStr,
6590: 2a 63 65 72 74 53 74 72 3b 0a 0a 09 69 66 20 28 *certStr;...if (
65a0: 61 6c 6c 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 20 7c allObj == NULL |
65b0: 7c 20 63 65 72 74 4f 62 6a 20 3d 3d 20 4e 55 4c | certObj == NUL
65c0: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 L) {.. Tcl_De
65d0: 63 72 52 65 66 43 6f 75 6e 74 28 61 6c 6c 4f 62 crRefCount(allOb
65e0: 6a 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 j);.. BIO_fre
65f0: 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 63 6b 66 e(bio);.. ckf
6600: 72 65 65 28 62 75 66 66 65 72 29 3b 0a 09 20 20 ree(buffer);..
6610: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f return resultO
6620: 62 6a 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 bj;..}.../* Get
6630: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 certificate */..
6640: 63 65 72 74 53 74 72 20 3d 20 54 63 6c 5f 53 65 certStr = Tcl_Se
6650: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 tByteArrayLength
6660: 28 63 65 72 74 4f 62 6a 2c 20 43 45 52 54 5f 53 (certObj, CERT_S
6670: 54 52 5f 53 49 5a 45 29 3b 0a 09 6c 65 6e 20 3d TR_SIZE);..len =
6680: 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 50 BIO_to_Buffer(P
6690: 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 EM_write_bio_X50
66a0: 39 28 62 69 6f 2c 20 63 65 72 74 29 2c 20 62 69 9(bio, cert), bi
66b0: 6f 2c 20 63 65 72 74 53 74 72 2c 20 43 45 52 54 o, certStr, CERT
66c0: 5f 53 54 52 5f 53 49 5a 45 29 3b 0a 09 54 63 6c _STR_SIZE);..Tcl
66d0: 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e _SetByteArrayLen
66e0: 67 74 68 28 63 65 72 74 4f 62 6a 2c 20 6c 65 6e gth(certObj, len
66f0: 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 );..LAPPEND_OBJ(
6700: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
6710: 6a 2c 20 22 63 65 72 74 69 66 69 63 61 74 65 22 j, "certificate"
6720: 2c 20 63 65 72 74 4f 62 6a 29 0a 0a 09 2f 2a 20 , certObj).../*
6730: 47 65 74 20 61 6c 6c 20 69 6e 66 6f 20 6f 6e 20 Get all info on
6740: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 certificate */..
6750: 61 6c 6c 53 74 72 20 3d 20 54 63 6c 5f 53 65 74 allStr = Tcl_Set
6760: 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 ByteArrayLength(
6770: 61 6c 6c 4f 62 6a 2c 20 43 45 52 54 5f 53 54 52 allObj, CERT_STR
6780: 5f 53 49 5a 45 20 2a 20 32 29 3b 0a 09 6c 65 6e _SIZE * 2);..len
6790: 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 = BIO_to_Buffer
67a0: 28 58 35 30 39 5f 70 72 69 6e 74 5f 65 78 28 62 (X509_print_ex(b
67b0: 69 6f 2c 20 63 65 72 74 2c 20 66 6c 61 67 73 2c io, cert, flags,
67c0: 20 30 29 2c 20 62 69 6f 2c 20 61 6c 6c 53 74 72 0), bio, allStr
67d0: 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 20 , CERT_STR_SIZE
67e0: 2a 20 32 29 3b 0a 09 54 63 6c 5f 53 65 74 42 79 * 2);..Tcl_SetBy
67f0: 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 61 6c teArrayLength(al
6800: 6c 4f 62 6a 2c 20 6c 65 6e 29 3b 0a 09 4c 41 50 lObj, len);..LAP
6810: 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c PEND_OBJ(interp,
6820: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 61 6c 6c resultObj, "all
6830: 22 2c 20 61 6c 6c 4f 62 6a 29 0a 20 20 20 20 7d ", allObj). }
6840: 0a 0a 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 .. BIO_free(b
6850: 69 6f 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 io);. ckfree(
6860: 62 75 66 66 65 72 29 3b 0a 20 20 20 20 72 65 74 buffer);. ret
6870: 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d urn resultObj;.}
6880: 0a .