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 69 6c 65 6e 2a 32 29 3b 0a 20 20 20 20 75 6e ilen*2);. un
0450: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 70 74 signed char *dpt
0460: 72 20 3d 20 26 64 61 74 61 5b 30 5d 3b 0a 20 20 r = &data[0];.
0470: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 65 const char *he
0480: 78 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 x = "0123456789a
0490: 62 63 64 65 66 22 3b 0a 0a 20 20 20 20 69 66 20 bcdef";.. if
04a0: 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 (resultObj == NU
04b0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 LL) {..return NU
04c0: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 LL;. }.. f
04d0: 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 or (int i = 0; i
04e0: 20 3c 20 69 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a < ilen; i++) {.
04f0: 20 20 20 20 20 20 20 20 2a 64 70 74 72 2b 2b 20 *dptr++
0500: 3d 20 68 65 78 5b 28 2a 69 70 74 72 3e 3e 34 29 = hex[(*iptr>>4)
0510: 26 30 78 46 5d 3b 0a 20 20 20 20 20 20 20 20 2a &0xF];. *
0520: 64 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 2a 69 dptr++ = hex[(*i
0530: 70 74 72 2b 2b 29 26 30 78 46 5d 3b 0a 20 20 20 ptr++)&0xF];.
0540: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 }. return re
0550: 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 sultObj;.}../*.
0560: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
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 0a 20 --------------.
05b0: 2a 0a 20 2a 20 42 49 4f 5f 74 6f 5f 42 75 66 66 *. * BIO_to_Buff
05c0: 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 4f 75 74 70 er --. *. *.Outp
05d0: 75 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 ut contents of a
05e0: 20 42 49 4f 20 74 6f 20 61 20 62 75 66 66 65 72 BIO to a buffer
05f0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
0600: 20 2a 09 52 65 74 75 72 6e 73 20 6c 65 6e 67 74 *.Returns lengt
0610: 68 20 6f 66 20 73 74 72 69 6e 67 20 69 6e 20 62 h of string in b
0620: 75 66 66 65 72 0a 20 2a 0a 20 2a 20 53 69 64 65 uffer. *. * Side
0630: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
0640: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
0650: 2d 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 0a 20 2a 2f 0a 54 63 6c 5f 53 69 7a ----. */.Tcl_Siz
06a0: 65 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 28 e BIO_to_Buffer(
06b0: 69 6e 74 20 72 65 73 75 6c 74 2c 20 42 49 4f 20 int result, BIO
06c0: 2a 62 69 6f 2c 20 76 6f 69 64 20 2a 6f 75 74 70 *bio, void *outp
06d0: 75 74 2c 20 69 6e 74 20 6f 6c 65 6e 29 20 7b 0a ut, int olen) {.
06e0: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e Tcl_Size len
06f0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 70 65 = 0;. int pe
0700: 6e 64 69 6e 67 20 3d 20 42 49 4f 5f 70 65 6e 64 nding = BIO_pend
0710: 69 6e 67 28 62 69 6f 29 3b 0a 0a 20 20 20 20 69 ing(bio);.. i
0720: 66 20 28 72 65 73 75 6c 74 29 20 7b 0a 09 6c 65 f (result) {..le
0730: 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 42 n = (Tcl_Size) B
0740: 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 6f 75 74 IO_read(bio, out
0750: 70 75 74 2c 20 28 70 65 6e 64 69 6e 67 20 3c 20 put, (pending <
0760: 6f 6c 65 6e 29 20 3f 20 70 65 6e 64 69 6e 67 20 olen) ? pending
0770: 3a 20 6f 6c 65 6e 29 3b 0a 09 28 76 6f 69 64 29 : olen);..(void)
0780: 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a BIO_flush(bio);.
0790: 09 69 66 20 28 6c 65 6e 20 3c 20 30 29 20 7b 0a .if (len < 0) {.
07a0: 09 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 09 7d . len = 0;..}
07b0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
07c0: 6e 20 6c 65 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a n len;.}.../*. *
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a -------------. *
0820: 0a 20 2a 20 54 6c 73 5f 78 35 30 39 45 78 74 65 . * Tls_x509Exte
0830: 6e 73 69 6f 6e 73 20 2d 2d 0a 20 2a 0a 20 2a 09 nsions --. *. *.
0840: 47 65 74 20 6c 69 73 74 20 6f 66 20 58 2e 35 30 Get list of X.50
0850: 39 20 43 65 72 74 69 66 69 63 61 74 65 20 45 78 9 Certificate Ex
0860: 74 65 6e 73 69 6f 6e 73 0a 20 2a 0a 20 2a 20 52 tensions. *. * R
0870: 65 73 75 6c 74 73 3a 0a 20 2a 09 54 43 4c 20 6c esults:. *.TCL l
0880: 69 73 74 20 6f 66 20 65 78 74 65 6e 73 69 6f 6e ist of extension
0890: 73 20 61 6e 64 20 62 6f 6f 6c 65 61 6e 20 63 72 s and boolean cr
08a0: 69 74 69 63 61 6c 20 73 74 61 74 75 73 0a 20 2a itical status. *
08b0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
08c0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d :. *.None. *. *-
08d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f ------------. */
0920: 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 35 .Tcl_Obj *Tls_x5
0930: 30 39 45 78 74 65 6e 73 69 6f 6e 73 28 54 63 6c 09Extensions(Tcl
0940: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
0950: 20 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 X509 *cert) {.
0960: 20 20 20 63 6f 6e 73 74 20 53 54 41 43 4b 5f 4f const STACK_O
0970: 46 28 58 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e F(X509_EXTENSION
0980: 29 20 2a 65 78 74 73 3b 0a 20 20 20 20 54 63 6c ) *exts;. Tcl
0990: 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 _Obj *resultObj
09a0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
09b0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 (0, NULL);..
09c0: 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d if (resultObj ==
09d0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
09e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
09f0: 20 20 69 66 20 28 28 65 78 74 73 20 3d 20 58 35 if ((exts = X5
0a00: 30 39 5f 67 65 74 30 5f 65 78 74 65 6e 73 69 6f 09_get0_extensio
0a10: 6e 73 28 63 65 72 74 29 29 20 21 3d 20 4e 55 4c ns(cert)) != NUL
0a20: 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 20 69 L) {..for (int i
0a30: 3d 30 3b 20 69 20 3c 20 58 35 30 39 5f 67 65 74 =0; i < X509_get
0a40: 5f 65 78 74 5f 63 6f 75 6e 74 28 63 65 72 74 29 _ext_count(cert)
0a50: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 ; i++) {.. X5
0a60: 30 39 5f 45 58 54 45 4e 53 49 4f 4e 20 2a 65 78 09_EXTENSION *ex
0a70: 20 3d 20 73 6b 5f 58 35 30 39 5f 45 58 54 45 4e = sk_X509_EXTEN
0a80: 53 49 4f 4e 5f 76 61 6c 75 65 28 65 78 74 73 2c SION_value(exts,
0a90: 20 69 29 3b 0a 09 20 20 20 20 41 53 4e 31 5f 4f i);.. ASN1_O
0aa0: 42 4a 45 43 54 20 2a 6f 62 6a 20 3d 20 58 35 30 BJECT *obj = X50
0ab0: 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74 5f 9_EXTENSION_get_
0ac0: 6f 62 6a 65 63 74 28 65 78 29 3b 0a 09 20 20 20 object(ex);..
0ad0: 20 2f 2a 20 41 53 4e 31 5f 4f 43 54 45 54 5f 53 /* ASN1_OCTET_S
0ae0: 54 52 49 4e 47 20 2a 64 61 74 61 20 3d 20 58 35 TRING *data = X5
0af0: 30 39 5f 45 58 54 45 4e 53 49 4f 4e 5f 67 65 74 09_EXTENSION_get
0b00: 5f 64 61 74 61 28 65 78 29 3b 20 2a 2f 0a 09 20 _data(ex); */..
0b10: 20 20 20 69 6e 74 20 63 72 69 74 69 63 61 6c 20 int critical
0b20: 3d 20 58 35 30 39 5f 45 58 54 45 4e 53 49 4f 4e = X509_EXTENSION
0b30: 5f 67 65 74 5f 63 72 69 74 69 63 61 6c 28 65 78 _get_critical(ex
0b40: 29 3b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f );.. LAPPEND_
0b50: 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 BOOL(interp, res
0b60: 75 6c 74 4f 62 6a 2c 20 4f 42 4a 5f 6e 69 64 32 ultObj, OBJ_nid2
0b70: 6c 6e 28 4f 42 4a 5f 6f 62 6a 32 6e 69 64 28 6f ln(OBJ_obj2nid(o
0b80: 62 6a 29 29 2c 20 63 72 69 74 69 63 61 6c 29 3b bj)), critical);
0b90: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 ..}. }. re
0ba0: 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a turn resultObj;.
0bb0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
0bc0: 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
0c10: 78 35 30 39 49 64 65 6e 74 69 66 69 65 72 20 2d x509Identifier -
0c20: 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30 -. *. *.Get X.50
0c30: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 41 75 9 certificate Au
0c40: 74 68 6f 72 69 74 79 20 6f 72 20 53 75 62 6a 65 thority or Subje
0c50: 63 74 20 4b 65 79 20 49 64 65 6e 74 69 66 69 65 ct Key Identifie
0c60: 72 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 rs. *. * Results
0c70: 3a 0a 20 2a 09 54 43 4c 20 62 79 74 65 20 61 72 :. *.TCL byte ar
0c80: 72 61 79 20 6f 62 6a 65 63 74 20 77 69 74 68 20 ray object with
0c90: 78 35 30 39 20 69 64 65 6e 74 69 66 69 65 72 20 x509 identifier
0ca0: 61 73 20 61 20 68 65 78 20 73 74 72 69 6e 67 0a as a hex string.
0cb0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
0cc0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
0cd0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
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 0a 20 --------------.
0d20: 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f */.Tcl_Obj *Tls_
0d30: 78 35 30 39 49 64 65 6e 74 69 66 69 65 72 28 63 x509Identifier(c
0d40: 6f 6e 73 74 20 41 53 4e 31 5f 4f 43 54 45 54 5f onst ASN1_OCTET_
0d50: 53 54 52 49 4e 47 20 2a 61 73 74 72 69 6e 67 29 STRING *astring)
0d60: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
0d70: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 4e 55 4c 4c resultObj = NULL
0d80: 3b 0a 0a 20 20 20 20 69 66 20 28 61 73 74 72 69 ;.. if (astri
0d90: 6e 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 ng != NULL) {..r
0da0: 65 73 75 6c 74 4f 62 6a 20 3d 20 53 74 72 69 6e esultObj = Strin
0db0: 67 5f 74 6f 5f 48 65 78 28 28 75 6e 73 69 67 6e g_to_Hex((unsign
0dc0: 65 64 20 63 68 61 72 20 2a 29 41 53 4e 31 5f 53 ed char *)ASN1_S
0dd0: 54 52 49 4e 47 5f 67 65 74 30 5f 64 61 74 61 28 TRING_get0_data(
0de0: 61 73 74 72 69 6e 67 29 2c 0a 09 20 20 20 20 41 astring),.. A
0df0: 53 4e 31 5f 53 54 52 49 4e 47 5f 6c 65 6e 67 74 SN1_STRING_lengt
0e00: 68 28 61 73 74 72 69 6e 67 29 29 3b 0a 20 20 20 h(astring));.
0e10: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 }. return re
0e20: 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 sultObj;.}../*.
0e30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
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 0a 20 --------------.
0e80: 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39 4b 65 79 *. * Tls_x509Key
0e90: 55 73 61 67 65 20 2d 2d 0a 20 2a 0a 20 2a 09 47 Usage --. *. *.G
0ea0: 65 74 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 et X.509 certifi
0eb0: 63 61 74 65 20 6b 65 79 20 75 73 61 67 65 20 74 cate key usage t
0ec0: 79 70 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ypes. *. * Resul
0ed0: 74 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 74 20 ts:. *.Tcl list
0ee0: 6f 66 20 74 79 70 65 73 0a 20 2a 0a 20 2a 20 53 of types. *. * S
0ef0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
0f00: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d None. *. *------
0f10: 2d 2d 2d 2d 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 0a 20 2a 2f 0a 54 63 6c 5f -------. */.Tcl_
0f60: 4f 62 6a 20 2a 54 6c 73 5f 78 35 30 39 4b 65 79 Obj *Tls_x509Key
0f70: 55 73 61 67 65 28 54 63 6c 5f 49 6e 74 65 72 70 Usage(Tcl_Interp
0f80: 20 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a *interp, X509 *
0f90: 63 65 72 74 2c 20 75 69 6e 74 33 32 5f 74 20 78 cert, uint32_t x
0fa0: 66 6c 61 67 73 29 20 7b 0a 20 20 20 20 75 69 6e flags) {. uin
0fb0: 74 33 32 5f 74 20 75 73 61 67 65 20 3d 20 58 35 t32_t usage = X5
0fc0: 30 39 5f 67 65 74 5f 6b 65 79 5f 75 73 61 67 65 09_get_key_usage
0fd0: 28 63 65 72 74 29 3b 0a 20 20 20 20 54 63 6c 5f (cert);. Tcl_
0fe0: 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d Obj *resultObj =
0ff0: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
1000: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 0, NULL);.. i
1010: 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 f (resultObj ==
1020: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
1030: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
1040: 20 69 66 20 28 28 78 66 6c 61 67 73 20 26 20 45 if ((xflags & E
1050: 58 46 4c 41 47 5f 4b 55 53 41 47 45 29 20 26 26 XFLAG_KUSAGE) &&
1060: 20 75 73 61 67 65 20 3c 20 55 49 4e 54 33 32 5f usage < UINT32_
1070: 4d 41 58 29 20 7b 0a 09 69 66 20 28 75 73 61 67 MAX) {..if (usag
1080: 65 20 26 20 4b 55 5f 44 49 47 49 54 41 4c 5f 53 e & KU_DIGITAL_S
1090: 49 47 4e 41 54 55 52 45 29 20 7b 0a 09 20 20 20 IGNATURE) {..
10a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
10b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
10c0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c , resultObj, Tcl
10d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 44 _NewStringObj("D
10e0: 69 67 69 74 61 6c 20 53 69 67 6e 61 74 75 72 65 igital Signature
10f0: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 ", -1));..}..if
1100: 28 75 73 61 67 65 20 26 20 4b 55 5f 4e 4f 4e 5f (usage & KU_NON_
1110: 52 45 50 55 44 49 41 54 49 4f 4e 29 20 7b 0a 09 REPUDIATION) {..
1120: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
1130: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
1140: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
1150: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1160: 28 22 4e 6f 6e 2d 52 65 70 75 64 69 61 74 69 6f ("Non-Repudiatio
1170: 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 n", -1));..}..if
1180: 20 28 75 73 61 67 65 20 26 20 4b 55 5f 4b 45 59 (usage & KU_KEY
1190: 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 29 20 7b _ENCIPHERMENT) {
11a0: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
11b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
11c0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
11d0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
11e0: 62 6a 28 22 4b 65 79 20 45 6e 63 69 70 68 65 72 bj("Key Encipher
11f0: 6d 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a ment", -1));..}.
1200: 09 69 66 20 28 75 73 61 67 65 20 26 20 4b 55 5f .if (usage & KU_
1210: 44 41 54 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e DATA_ENCIPHERMEN
1220: 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 T) {.. Tcl_Li
1230: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1240: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c nt(interp, resul
1250: 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tObj, Tcl_NewStr
1260: 69 6e 67 4f 62 6a 28 22 44 61 74 61 20 45 6e 63 ingObj("Data Enc
1270: 69 70 68 65 72 6d 65 6e 74 22 2c 20 2d 31 29 29 ipherment", -1))
1280: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 ;..}..if (usage
1290: 26 20 4b 55 5f 4b 45 59 5f 41 47 52 45 45 4d 45 & KU_KEY_AGREEME
12a0: 4e 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c NT) {.. Tcl_L
12b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
12c0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 ent(interp, resu
12d0: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 ltObj, Tcl_NewSt
12e0: 72 69 6e 67 4f 62 6a 28 22 4b 65 79 20 41 67 72 ringObj("Key Agr
12f0: 65 65 6d 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 09 eement", -1));..
1300: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 4b }..if (usage & K
1310: 55 5f 4b 45 59 5f 43 45 52 54 5f 53 49 47 4e 29 U_KEY_CERT_SIGN)
1320: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
1330: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1340: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
1350: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e bj, Tcl_NewStrin
1360: 67 4f 62 6a 28 22 43 65 72 74 69 66 69 63 61 74 gObj("Certificat
1370: 65 20 53 69 67 6e 69 6e 67 22 2c 20 2d 31 29 29 e Signing", -1))
1380: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 ;..}..if (usage
1390: 26 20 4b 55 5f 43 52 4c 5f 53 49 47 4e 29 20 7b & KU_CRL_SIGN) {
13a0: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
13b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
13c0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
13d0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
13e0: 62 6a 28 22 43 52 4c 20 53 69 67 6e 69 6e 67 22 bj("CRL Signing"
13f0: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
1400: 75 73 61 67 65 20 26 20 4b 55 5f 45 4e 43 49 50 usage & KU_ENCIP
1410: 48 45 52 5f 4f 4e 4c 59 29 20 7b 0a 09 20 20 20 HER_ONLY) {..
1420: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
1430: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
1440: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c , resultObj, Tcl
1450: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 45 _NewStringObj("E
1460: 6e 63 69 70 68 65 72 20 4f 6e 6c 79 22 2c 20 2d ncipher Only", -
1470: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 1));..}..if (usa
1480: 67 65 20 26 20 4b 55 5f 44 45 43 49 50 48 45 52 ge & KU_DECIPHER
1490: 5f 4f 4e 4c 59 29 20 7b 0a 09 20 20 20 20 54 63 _ONLY) {.. Tc
14a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
14b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 lement(interp, r
14c0: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 esultObj, Tcl_Ne
14d0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 44 65 63 69 wStringObj("Deci
14e0: 70 68 65 72 20 4f 6e 6c 79 22 2c 20 2d 31 29 29 pher Only", -1))
14f0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
1500: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
1510: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1520: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
1530: 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 j, Tcl_NewString
1540: 4f 62 6a 28 22 75 6e 72 65 73 74 72 69 63 74 65 Obj("unrestricte
1550: 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a d", -1));. }.
1560: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c return resul
1570: 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d tObj;.}../*. *--
1580: 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 -----------. *.
15d0: 2a 20 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 * Tls_x509Purpos
15e0: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 58 e --. *. *.Get X
15f0: 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 .509 certificate
1600: 20 70 75 72 70 6f 73 65 0a 20 2a 0a 20 2a 20 52 purpose. *. * R
1610: 65 73 75 6c 74 73 3a 0a 20 2a 09 50 75 72 70 6f esults:. *.Purpo
1620: 73 65 20 73 74 72 69 6e 67 0a 20 2a 0a 20 2a 20 se string. *. *
1630: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
1640: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d .None. *. *-----
1650: 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 63 68 61 --------. */.cha
16a0: 72 20 2a 54 6c 73 5f 78 35 30 39 50 75 72 70 6f r *Tls_x509Purpo
16b0: 73 65 28 58 35 30 39 20 2a 63 65 72 74 29 20 7b se(X509 *cert) {
16c0: 0a 20 20 20 20 63 68 61 72 20 2a 70 75 72 70 6f . char *purpo
16d0: 73 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 se = NULL;..
16e0: 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 if (X509_check_p
16f0: 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 urpose(cert, X50
1700: 39 5f 50 55 52 50 4f 53 45 5f 53 53 4c 5f 43 4c 9_PURPOSE_SSL_CL
1710: 49 45 4e 54 2c 20 30 29 20 3e 20 30 29 20 7b 0a IENT, 0) > 0) {.
1720: 09 70 75 72 70 6f 73 65 20 3d 20 22 53 53 4c 20 .purpose = "SSL
1730: 43 6c 69 65 6e 74 22 3b 0a 20 20 20 20 7d 20 65 Client";. } e
1740: 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 lse if (X509_che
1750: 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c ck_purpose(cert,
1760: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 53 53 X509_PURPOSE_SS
1770: 4c 5f 53 45 52 56 45 52 2c 20 30 29 20 3e 20 30 L_SERVER, 0) > 0
1780: 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 ) {..purpose = "
1790: 53 53 4c 20 53 65 72 76 65 72 22 3b 0a 20 20 20 SSL Server";.
17a0: 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 } else if (X509
17b0: 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 _check_purpose(c
17c0: 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 ert, X509_PURPOS
17d0: 45 5f 4e 53 5f 53 53 4c 5f 53 45 52 56 45 52 2c E_NS_SSL_SERVER,
17e0: 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 0) > 0) {..purp
17f0: 6f 73 65 20 3d 20 22 4d 53 53 20 53 53 4c 20 53 ose = "MSS SSL S
1800: 65 72 76 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c erver";. } el
1810: 73 65 20 69 66 20 28 58 35 30 39 5f 63 68 65 63 se if (X509_chec
1820: 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 74 2c 20 k_purpose(cert,
1830: 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 53 4d 49 X509_PURPOSE_SMI
1840: 4d 45 5f 53 49 47 4e 2c 20 30 29 20 3e 20 30 29 ME_SIGN, 0) > 0)
1850: 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 53 {..purpose = "S
1860: 4d 49 4d 45 20 53 69 67 6e 69 6e 67 22 3b 0a 20 MIME Signing";.
1870: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35 } else if (X5
1880: 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 09_check_purpose
1890: 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 (cert, X509_PURP
18a0: 4f 53 45 5f 53 4d 49 4d 45 5f 45 4e 43 52 59 50 OSE_SMIME_ENCRYP
18b0: 54 2c 20 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 T, 0) > 0) {..pu
18c0: 72 70 6f 73 65 20 3d 20 22 53 4d 49 4d 45 20 45 rpose = "SMIME E
18d0: 6e 63 72 79 70 74 69 6f 6e 22 3b 0a 20 20 20 20 ncryption";.
18e0: 7d 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f } else if (X509_
18f0: 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 check_purpose(ce
1900: 72 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 rt, X509_PURPOSE
1910: 5f 43 52 4c 5f 53 49 47 4e 2c 20 30 29 20 3e 20 _CRL_SIGN, 0) >
1920: 30 29 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 0) {..purpose =
1930: 22 43 52 4c 20 53 69 67 6e 69 6e 67 22 3b 0a 20 "CRL Signing";.
1940: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 58 35 } else if (X5
1950: 30 39 5f 63 68 65 63 6b 5f 70 75 72 70 6f 73 65 09_check_purpose
1960: 28 63 65 72 74 2c 20 58 35 30 39 5f 50 55 52 50 (cert, X509_PURP
1970: 4f 53 45 5f 41 4e 59 2c 20 30 29 20 3e 20 30 29 OSE_ANY, 0) > 0)
1980: 20 7b 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 41 {..purpose = "A
1990: 6e 79 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ny";. } else
19a0: 69 66 20 28 58 35 30 39 5f 63 68 65 63 6b 5f 70 if (X509_check_p
19b0: 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 urpose(cert, X50
19c0: 39 5f 50 55 52 50 4f 53 45 5f 4f 43 53 50 5f 48 9_PURPOSE_OCSP_H
19d0: 45 4c 50 45 52 2c 20 30 29 20 3e 20 30 29 20 7b ELPER, 0) > 0) {
19e0: 0a 09 70 75 72 70 6f 73 65 20 3d 20 22 4f 43 53 ..purpose = "OCS
19f0: 50 20 48 65 6c 70 65 72 22 3b 0a 20 20 20 20 7d P Helper";. }
1a00: 20 65 6c 73 65 20 69 66 20 28 58 35 30 39 5f 63 else if (X509_c
1a10: 68 65 63 6b 5f 70 75 72 70 6f 73 65 28 63 65 72 heck_purpose(cer
1a20: 74 2c 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f t, X509_PURPOSE_
1a30: 54 49 4d 45 53 54 41 4d 50 5f 53 49 47 4e 2c 20 TIMESTAMP_SIGN,
1a40: 30 29 20 3e 20 30 29 20 7b 0a 09 70 75 72 70 6f 0) > 0) {..purpo
1a50: 73 65 20 3d 20 22 54 69 6d 65 73 74 61 6d 70 20 se = "Timestamp
1a60: 53 69 67 6e 69 6e 67 22 3b 0a 20 20 20 20 7d 20 Signing";. }
1a70: 65 6c 73 65 20 7b 0a 09 70 75 72 70 6f 73 65 20 else {..purpose
1a80: 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 = "";. }.
1a90: 72 65 74 75 72 6e 20 70 75 72 70 6f 73 65 3b 0a return purpose;.
1aa0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
1ab0: 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
1b00: 78 35 30 39 50 75 72 70 6f 73 65 73 20 2d 2d 0a x509Purposes --.
1b10: 20 2a 0a 20 2a 09 47 65 74 20 58 2e 35 30 39 20 *. *.Get X.509
1b20: 63 65 72 74 69 66 69 63 61 74 65 20 70 75 72 70 certificate purp
1b30: 6f 73 65 20 74 79 70 65 73 0a 20 2a 0a 20 2a 20 ose types. *. *
1b40: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 6c 20 Results:. *.Tcl
1b50: 6c 69 73 74 20 6f 66 20 65 61 63 68 20 70 75 72 list of each pur
1b60: 70 6f 73 65 20 61 6e 64 20 77 68 65 74 68 65 72 pose and whether
1b70: 20 69 74 20 69 73 20 43 41 20 6f 72 20 6e 6f 6e it is CA or non
1b80: 2d 43 41 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 -CA. *. * Side e
1b90: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a ffects:. *.None.
1ba0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
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 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a --. */.Tcl_Obj *
1c00: 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 65 73 Tls_x509Purposes
1c10: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
1c20: 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 29 erp, X509 *cert)
1c30: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
1c40: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f resultObj = Tcl_
1c50: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
1c60: 4c 4c 29 3b 0a 20 20 20 20 58 35 30 39 5f 50 55 LL);. X509_PU
1c70: 52 50 4f 53 45 20 2a 70 74 6d 70 3b 0a 0a 20 20 RPOSE *ptmp;..
1c80: 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 if (resultObj
1c90: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
1ca0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a rn NULL;. }..
1cb0: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d for (int i =
1cc0: 20 30 3b 20 69 20 3c 20 58 35 30 39 5f 50 55 52 0; i < X509_PUR
1cd0: 50 4f 53 45 5f 67 65 74 5f 63 6f 75 6e 74 28 29 POSE_get_count()
1ce0: 3b 20 69 2b 2b 29 20 7b 0a 09 70 74 6d 70 20 3d ; i++) {..ptmp =
1cf0: 20 58 35 30 39 5f 50 55 52 50 4f 53 45 5f 67 65 X509_PURPOSE_ge
1d00: 74 30 28 69 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 t0(i);..Tcl_Obj
1d10: 2a 74 6d 70 50 74 72 20 3d 20 54 63 6c 5f 4e 65 *tmpPtr = Tcl_Ne
1d20: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
1d30: 29 3b 0a 0a 09 66 6f 72 20 28 69 6e 74 20 6a 20 );...for (int j
1d40: 3d 20 30 3b 20 6a 20 3c 20 32 3b 20 6a 2b 2b 29 = 0; j < 2; j++)
1d50: 20 7b 0a 09 20 20 20 20 69 6e 74 20 69 64 72 65 {.. int idre
1d60: 74 20 3d 20 58 35 30 39 5f 63 68 65 63 6b 5f 70 t = X509_check_p
1d70: 75 72 70 6f 73 65 28 63 65 72 74 2c 20 58 35 30 urpose(cert, X50
1d80: 39 5f 50 55 52 50 4f 53 45 5f 67 65 74 5f 69 64 9_PURPOSE_get_id
1d90: 28 70 74 6d 70 29 2c 20 6a 29 3b 0a 09 20 20 20 (ptmp), j);..
1da0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
1db0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
1dc0: 2c 20 74 6d 70 50 74 72 2c 20 54 63 6c 5f 4e 65 , tmpPtr, Tcl_Ne
1dd0: 77 53 74 72 69 6e 67 4f 62 6a 28 6a 20 3f 20 22 wStringObj(j ? "
1de0: 43 41 22 20 3a 20 22 6e 6f 6e 43 41 22 2c 20 2d CA" : "nonCA", -
1df0: 31 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 1));.. Tcl_Li
1e00: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1e10: 6e 74 28 69 6e 74 65 72 70 2c 20 74 6d 70 50 74 nt(interp, tmpPt
1e20: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
1e30: 4f 62 6a 28 69 64 72 65 74 20 3d 3d 20 31 20 3f Obj(idret == 1 ?
1e40: 20 22 59 65 73 22 20 3a 20 22 4e 6f 22 2c 20 2d "Yes" : "No", -
1e50: 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 1));..}..LAPPEND
1e60: 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 _OBJ(interp, res
1e70: 75 6c 74 4f 62 6a 2c 20 58 35 30 39 5f 50 55 52 ultObj, X509_PUR
1e80: 50 4f 53 45 5f 67 65 74 30 5f 6e 61 6d 65 28 70 POSE_get0_name(p
1e90: 74 6d 70 29 2c 20 74 6d 70 50 74 72 29 3b 0a 20 tmp), tmpPtr);.
1ea0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
1eb0: 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a resultObj;.}../*
1ec0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
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: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 78 35 30 39 4e . *. * Tls_x509N
1f20: 61 6d 65 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 ames --. *. *.Ge
1f30: 74 20 61 20 6c 69 73 74 20 6f 66 20 53 75 62 6a t a list of Subj
1f40: 65 63 74 20 41 6c 74 65 72 6e 61 74 65 20 4e 61 ect Alternate Na
1f50: 6d 65 73 20 28 53 41 4e 29 20 6f 72 20 49 73 73 mes (SAN) or Iss
1f60: 75 65 72 20 41 6c 74 65 72 6e 61 74 65 20 4e 61 uer Alternate Na
1f70: 6d 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 mes. *. * Result
1f80: 73 3a 0a 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f s:. *.Tcl list o
1f90: 66 20 61 6c 74 65 72 6e 61 74 65 20 6e 61 6d 65 f alternate name
1fa0: 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 s. *. * Side eff
1fb0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ects:. *.None. *
1fc0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
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: 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c . */.Tcl_Obj *Tl
2020: 73 5f 78 35 30 39 4e 61 6d 65 73 28 54 63 6c 5f s_x509Names(Tcl_
2030: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
2040: 58 35 30 39 20 2a 63 65 72 74 2c 20 69 6e 74 20 X509 *cert, int
2050: 6e 69 64 2c 20 42 49 4f 20 2a 62 69 6f 29 20 7b nid, BIO *bio) {
2060: 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 47 45 . STACK_OF(GE
2070: 4e 45 52 41 4c 5f 4e 41 4d 45 29 20 2a 6e 61 6d NERAL_NAME) *nam
2080: 65 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 es;. Tcl_Obj
2090: 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c *resultObj = Tcl
20a0: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
20b0: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 53 69 ULL);. Tcl_Si
20c0: 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 63 68 61 72 ze len;. char
20d0: 20 62 75 66 66 65 72 5b 31 30 32 34 5d 3b 0a 0a buffer[1024];..
20e0: 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 if (resultOb
20f0: 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 j == NULL) {..re
2100: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
2110: 0a 0a 20 20 20 20 69 66 20 28 28 6e 61 6d 65 73 .. if ((names
2120: 20 3d 20 58 35 30 39 5f 67 65 74 5f 65 78 74 5f = X509_get_ext_
2130: 64 32 69 28 63 65 72 74 2c 20 6e 69 64 2c 20 4e d2i(cert, nid, N
2140: 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 4e ULL, NULL)) != N
2150: 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 ULL) {..for (int
2160: 20 69 3d 30 3b 20 69 20 3c 20 73 6b 5f 47 45 4e i=0; i < sk_GEN
2170: 45 52 41 4c 5f 4e 41 4d 45 5f 6e 75 6d 28 6e 61 ERAL_NAME_num(na
2180: 6d 65 73 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 mes); i++) {..
2190: 20 20 63 6f 6e 73 74 20 47 45 4e 45 52 41 4c 5f const GENERAL_
21a0: 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f NAME *name = sk_
21b0: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 76 61 6c GENERAL_NAME_val
21c0: 75 65 28 6e 61 6d 65 73 2c 20 69 29 3b 0a 0a 09 ue(names, i);...
21d0: 20 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f len = BIO_to
21e0: 5f 42 75 66 66 65 72 28 6e 61 6d 65 20 26 26 20 _Buffer(name &&
21f0: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 70 72 69 GENERAL_NAME_pri
2200: 6e 74 28 62 69 6f 2c 20 28 47 45 4e 45 52 41 4c nt(bio, (GENERAL
2210: 5f 4e 41 4d 45 20 2a 29 20 6e 61 6d 65 29 2c 20 _NAME *) name),
2220: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 31 30 32 bio, buffer, 102
2230: 34 29 3b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 4);.. LAPPEND
2240: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 _STR(interp, res
2250: 75 6c 74 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 62 75 ultObj, NULL, bu
2260: 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 09 7d 0a 09 ffer, len);..}..
2270: 73 6b 5f 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f sk_GENERAL_NAME_
2280: 70 6f 70 5f 66 72 65 65 28 6e 61 6d 65 73 2c 20 pop_free(names,
2290: 47 45 4e 45 52 41 4c 5f 4e 41 4d 45 5f 66 72 65 GENERAL_NAME_fre
22a0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 e);. }. re
22b0: 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a turn resultObj;.
22c0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
22d0: 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
2320: 78 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 20 x509ExtKeyUsage
2330: 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 61 20 6c --. *. *.Get a l
2340: 69 73 74 20 6f 66 20 45 78 74 65 6e 64 65 64 20 ist of Extended
2350: 4b 65 79 20 55 73 61 67 65 73 0a 20 2a 0a 20 2a Key Usages. *. *
2360: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 63 6c Returns:. *.Tcl
2370: 20 6c 69 73 74 20 6f 66 20 75 73 61 67 65 73 0a list of usages.
2380: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
2390: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
23a0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23d0: 2d 2d 2d 2d 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 0a 20 --------------.
23f0: 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f */.Tcl_Obj *Tls_
2400: 78 35 30 39 45 78 74 4b 65 79 55 73 61 67 65 28 x509ExtKeyUsage(
2410: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
2420: 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c 20 rp, X509 *cert,
2430: 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 73 29 uint32_t xflags)
2440: 20 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 {. uint32_t
2450: 75 73 61 67 65 20 3d 20 58 35 30 39 5f 67 65 74 usage = X509_get
2460: 5f 6b 65 79 5f 75 73 61 67 65 28 63 65 72 74 29 _key_usage(cert)
2470: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 ;. Tcl_Obj *r
2480: 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e esultObj = Tcl_N
2490: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
24a0: 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 L);.. if (res
24b0: 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 ultObj == NULL)
24c0: 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a {..return NULL;.
24d0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 }.. if ((
24e0: 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f xflags & EXFLAG_
24f0: 58 4b 55 53 41 47 45 29 20 26 26 20 75 73 61 67 XKUSAGE) && usag
2500: 65 20 3c 20 55 49 4e 54 33 32 5f 4d 41 58 29 20 e < UINT32_MAX)
2510: 7b 0a 09 75 73 61 67 65 20 3d 20 58 35 30 39 5f {..usage = X509_
2520: 67 65 74 5f 65 78 74 65 6e 64 65 64 5f 6b 65 79 get_extended_key
2530: 5f 75 73 61 67 65 28 63 65 72 74 29 3b 0a 0a 09 _usage(cert);...
2540: 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f if (usage & XKU_
2550: 53 53 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 SSL_SERVER) {..
2560: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2570: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2580: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 rp, resultObj, T
2590: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
25a0: 22 54 4c 53 20 57 65 62 20 53 65 72 76 65 72 20 "TLS Web Server
25b0: 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 22 2c Authentication",
25c0: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 -1));..}..if (u
25d0: 73 61 67 65 20 26 20 58 4b 55 5f 53 53 4c 5f 43 sage & XKU_SSL_C
25e0: 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 54 63 LIENT) {.. Tc
25f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2600: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 lement(interp, r
2610: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 esultObj, Tcl_Ne
2620: 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 4c 53 20 wStringObj("TLS
2630: 57 65 62 20 43 6c 69 65 6e 74 20 41 75 74 68 65 Web Client Authe
2640: 6e 74 69 63 61 74 69 6f 6e 22 2c 20 2d 31 29 29 ntication", -1))
2650: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 ;..}..if (usage
2660: 26 20 58 4b 55 5f 53 4d 49 4d 45 29 20 7b 0a 09 & XKU_SMIME) {..
2670: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2680: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2690: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
26a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
26b0: 28 22 45 2d 6d 61 69 6c 20 50 72 6f 74 65 63 74 ("E-mail Protect
26c0: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 ion", -1));..}..
26d0: 69 66 20 28 75 73 61 67 65 20 26 20 58 4b 55 5f if (usage & XKU_
26e0: 43 4f 44 45 5f 53 49 47 4e 29 20 7b 0a 09 20 20 CODE_SIGN) {..
26f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2700: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2710: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 p, resultObj, Tc
2720: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
2730: 43 6f 64 65 20 53 69 67 6e 69 6e 67 22 2c 20 2d Code Signing", -
2740: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 1));..}..if (usa
2750: 67 65 20 26 20 58 4b 55 5f 53 47 43 29 20 7b 0a ge & XKU_SGC) {.
2760: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2770: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2780: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
2790: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
27a0: 6a 28 22 53 47 43 22 2c 20 2d 31 29 29 3b 0a 09 j("SGC", -1));..
27b0: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 }..if (usage & X
27c0: 4b 55 5f 4f 43 53 50 5f 53 49 47 4e 29 20 7b 0a KU_OCSP_SIGN) {.
27d0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
27e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
27f0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
2800: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
2810: 6a 28 22 4f 43 53 50 20 53 69 67 6e 69 6e 67 22 j("OCSP Signing"
2820: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
2830: 75 73 61 67 65 20 26 20 58 4b 55 5f 54 49 4d 45 usage & XKU_TIME
2840: 53 54 41 4d 50 29 20 7b 0a 09 20 20 20 20 54 63 STAMP) {.. Tc
2850: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2860: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 lement(interp, r
2870: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 esultObj, Tcl_Ne
2880: 77 53 74 72 69 6e 67 4f 62 6a 28 22 54 69 6d 65 wStringObj("Time
2890: 20 53 74 61 6d 70 69 6e 67 22 2c 20 2d 31 29 29 Stamping", -1))
28a0: 3b 0a 09 7d 0a 09 69 66 20 28 75 73 61 67 65 20 ;..}..if (usage
28b0: 26 20 58 4b 55 5f 44 56 43 53 20 29 20 7b 0a 09 & XKU_DVCS ) {..
28c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
28d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
28e0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
28f0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2900: 28 22 44 56 43 53 22 2c 20 2d 31 29 29 3b 0a 09 ("DVCS", -1));..
2910: 7d 0a 09 69 66 20 28 75 73 61 67 65 20 26 20 58 }..if (usage & X
2920: 4b 55 5f 41 4e 59 45 4b 55 29 20 7b 0a 09 20 20 KU_ANYEKU) {..
2930: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2940: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2950: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 p, resultObj, Tc
2960: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
2970: 41 6e 79 20 45 78 74 65 6e 64 65 64 20 4b 65 79 Any Extended Key
2980: 20 55 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 09 Usage", -1));..
2990: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 }. } else {..
29a0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
29b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
29c0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
29d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
29e0: 28 22 75 6e 72 65 73 74 72 69 63 74 65 64 22 2c ("unrestricted",
29f0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 -1));. }.
2a00: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f 62 return resultOb
2a10: 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d j;.}../*. *-----
2a20: 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 --------. *. * T
2a70: 6c 73 5f 78 35 30 39 43 72 6c 44 70 20 2d 2d 0a ls_x509CrlDp --.
2a80: 20 2a 0a 20 2a 09 47 65 74 20 6c 69 73 74 20 6f *. *.Get list o
2a90: 66 20 43 52 4c 20 44 69 73 74 72 69 62 75 74 69 f CRL Distributi
2aa0: 6f 6e 20 50 6f 69 6e 74 73 0a 20 2a 0a 20 2a 20 on Points. *. *
2ab0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 63 6c 20 Returns:. *.Tcl
2ac0: 6c 69 73 74 20 6f 66 20 55 52 49 73 20 61 6e 64 list of URIs and
2ad0: 20 72 65 6c 61 74 69 76 65 2d 6e 61 6d 65 73 0a relative-names.
2ae0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
2af0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
2b00: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b20: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 --------------.
2b50: 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f */.Tcl_Obj *Tls_
2b60: 78 35 30 39 43 72 6c 44 70 28 54 63 6c 5f 49 6e x509CrlDp(Tcl_In
2b70: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 35 terp *interp, X5
2b80: 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 20 09 *cert) {.
2b90: 53 54 41 43 4b 5f 4f 46 28 44 49 53 54 5f 50 4f STACK_OF(DIST_PO
2ba0: 49 4e 54 29 20 2a 63 72 6c 3b 0a 20 20 20 20 54 INT) *crl;. T
2bb0: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 cl_Obj *resultOb
2bc0: 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f j = Tcl_NewListO
2bd0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 bj(0, NULL);..
2be0: 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 if (resultObj
2bf0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
2c00: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a rn NULL;. }..
2c10: 20 20 20 20 69 66 20 28 28 63 72 6c 20 3d 20 58 if ((crl = X
2c20: 35 30 39 5f 67 65 74 5f 65 78 74 5f 64 32 69 28 509_get_ext_d2i(
2c30: 63 65 72 74 2c 20 4e 49 44 5f 63 72 6c 5f 64 69 cert, NID_crl_di
2c40: 73 74 72 69 62 75 74 69 6f 6e 5f 70 6f 69 6e 74 stribution_point
2c50: 73 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 20 s, NULL, NULL))
2c60: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 != NULL) {..for
2c70: 28 69 6e 74 20 69 3d 30 3b 20 69 20 3c 20 73 6b (int i=0; i < sk
2c80: 5f 44 49 53 54 5f 50 4f 49 4e 54 5f 6e 75 6d 28 _DIST_POINT_num(
2c90: 63 72 6c 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 crl); i++) {..
2ca0: 20 20 44 49 53 54 5f 50 4f 49 4e 54 20 2a 64 70 DIST_POINT *dp
2cb0: 20 3d 20 73 6b 5f 44 49 53 54 5f 50 4f 49 4e 54 = sk_DIST_POINT
2cc0: 5f 76 61 6c 75 65 28 63 72 6c 2c 20 69 29 3b 0a _value(crl, i);.
2cd0: 09 20 20 20 20 44 49 53 54 5f 50 4f 49 4e 54 5f . DIST_POINT_
2ce0: 4e 41 4d 45 20 2a 64 69 73 74 70 6f 69 6e 74 20 NAME *distpoint
2cf0: 3d 20 64 70 2d 3e 64 69 73 74 70 6f 69 6e 74 3b = dp->distpoint;
2d00: 0a 0a 09 20 20 20 20 69 66 20 28 64 69 73 74 70 ... if (distp
2d10: 6f 69 6e 74 2d 3e 74 79 70 65 20 3d 3d 20 30 29 oint->type == 0)
2d20: 20 7b 0a 09 09 2f 2a 20 66 75 6c 6c 2d 6e 61 6d {.../* full-nam
2d30: 65 20 47 45 4e 45 52 41 4c 49 5a 45 44 4e 41 4d e GENERALIZEDNAM
2d40: 45 20 2a 2f 0a 09 09 66 6f 72 20 28 69 6e 74 20 E */...for (int
2d50: 6a 20 3d 20 30 3b 20 6a 20 3c 20 73 6b 5f 47 45 j = 0; j < sk_GE
2d60: 4e 45 52 41 4c 5f 4e 41 4d 45 5f 6e 75 6d 28 64 NERAL_NAME_num(d
2d70: 69 73 74 70 6f 69 6e 74 2d 3e 6e 61 6d 65 2e 66 istpoint->name.f
2d80: 75 6c 6c 6e 61 6d 65 29 3b 20 6a 2b 2b 29 20 7b ullname); j++) {
2d90: 0a 09 09 20 20 20 20 47 45 4e 45 52 41 4c 5f 4e ... GENERAL_N
2da0: 41 4d 45 20 2a 67 65 6e 20 3d 20 73 6b 5f 47 45 AME *gen = sk_GE
2db0: 4e 45 52 41 4c 5f 4e 41 4d 45 5f 76 61 6c 75 65 NERAL_NAME_value
2dc0: 28 64 69 73 74 70 6f 69 6e 74 2d 3e 6e 61 6d 65 (distpoint->name
2dd0: 2e 66 75 6c 6c 6e 61 6d 65 2c 20 6a 29 3b 0a 09 .fullname, j);..
2de0: 09 20 20 20 20 69 6e 74 20 74 79 70 65 3b 0a 09 . int type;..
2df0: 09 20 20 20 20 41 53 4e 31 5f 53 54 52 49 4e 47 . ASN1_STRING
2e00: 20 2a 75 72 69 20 3d 20 47 45 4e 45 52 41 4c 5f *uri = GENERAL_
2e10: 4e 41 4d 45 5f 67 65 74 30 5f 76 61 6c 75 65 28 NAME_get0_value(
2e20: 67 65 6e 2c 20 26 74 79 70 65 29 3b 0a 09 09 20 gen, &type);...
2e30: 20 20 20 69 66 20 28 74 79 70 65 20 3d 3d 20 47 if (type == G
2e40: 45 4e 5f 55 52 49 29 20 7b 0a 09 09 09 4c 41 50 EN_URI) {....LAP
2e50: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
2e60: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 28 63 68 61 resultObj, (cha
2e70: 72 20 2a 29 20 4e 55 4c 4c 2c 20 28 63 68 61 72 r *) NULL, (char
2e80: 20 2a 29 20 41 53 4e 31 5f 53 54 52 49 4e 47 5f *) ASN1_STRING_
2e90: 67 65 74 30 5f 64 61 74 61 28 75 72 69 29 2c 20 get0_data(uri),
2ea0: 28 54 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31 5f (Tcl_Size) ASN1_
2eb0: 53 54 52 49 4e 47 5f 6c 65 6e 67 74 68 28 75 72 STRING_length(ur
2ec0: 69 29 29 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d i));... }...}
2ed0: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
2ee0: 28 64 69 73 74 70 6f 69 6e 74 2d 3e 74 79 70 65 (distpoint->type
2ef0: 20 3d 3d 20 31 29 20 7b 0a 09 09 2f 2a 20 72 65 == 1) {.../* re
2f00: 6c 61 74 69 76 65 2d 6e 61 6d 65 20 58 35 30 39 lative-name X509
2f10: 4e 41 4d 45 20 2a 2f 0a 09 09 53 54 41 43 4b 5f NAME */...STACK_
2f20: 4f 46 28 58 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 OF(X509_NAME_ENT
2f30: 52 59 29 20 2a 73 6b 5f 72 65 6c 6e 61 6d 65 20 RY) *sk_relname
2f40: 3d 20 64 69 73 74 70 6f 69 6e 74 2d 3e 6e 61 6d = distpoint->nam
2f50: 65 2e 72 65 6c 61 74 69 76 65 6e 61 6d 65 3b 0a e.relativename;.
2f60: 09 09 66 6f 72 20 28 69 6e 74 20 6a 20 3d 20 30 ..for (int j = 0
2f70: 3b 20 6a 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 ; j < sk_X509_NA
2f80: 4d 45 5f 45 4e 54 52 59 5f 6e 75 6d 28 73 6b 5f ME_ENTRY_num(sk_
2f90: 72 65 6c 6e 61 6d 65 29 3b 20 6a 2b 2b 29 20 7b relname); j++) {
2fa0: 0a 09 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 ... X509_NAME
2fb0: 5f 45 4e 54 52 59 20 2a 65 20 3d 20 73 6b 5f 58 _ENTRY *e = sk_X
2fc0: 35 30 39 5f 4e 41 4d 45 5f 45 4e 54 52 59 5f 76 509_NAME_ENTRY_v
2fd0: 61 6c 75 65 28 73 6b 5f 72 65 6c 6e 61 6d 65 2c alue(sk_relname,
2fe0: 20 6a 29 3b 0a 09 09 20 20 20 20 41 53 4e 31 5f j);... ASN1_
2ff0: 53 54 52 49 4e 47 20 2a 64 20 3d 20 58 35 30 39 STRING *d = X509
3000: 5f 4e 41 4d 45 5f 45 4e 54 52 59 5f 67 65 74 5f _NAME_ENTRY_get_
3010: 64 61 74 61 28 65 29 3b 0a 09 09 20 20 20 20 4c data(e);... L
3020: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
3030: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 28 63 p, resultObj, (c
3040: 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 20 28 63 68 har *) NULL, (ch
3050: 61 72 20 2a 29 20 41 53 4e 31 5f 53 54 52 49 4e ar *) ASN1_STRIN
3060: 47 5f 64 61 74 61 28 64 29 2c 20 28 54 63 6c 5f G_data(d), (Tcl_
3070: 53 69 7a 65 29 20 41 53 4e 31 5f 53 54 52 49 4e Size) ASN1_STRIN
3080: 47 5f 6c 65 6e 67 74 68 28 64 29 29 3b 0a 09 09 G_length(d));...
3090: 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 43 52 4c }.. }..}..CRL
30a0: 5f 44 49 53 54 5f 50 4f 49 4e 54 53 5f 66 72 65 _DIST_POINTS_fre
30b0: 65 28 63 72 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 e(crl);. }.
30c0: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 4f return resultO
30d0: 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d bj;.}../*. *----
30e0: 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 ---------. *. *
3130: 54 6c 73 5f 78 35 30 39 4f 73 63 70 0a 20 2a 0a Tls_x509Oscp. *.
3140: 20 2a 09 47 65 74 20 6c 69 73 74 20 6f 66 20 4f *.Get list of O
3150: 6e 2d 6c 69 6e 65 20 43 65 72 74 69 66 69 63 61 n-line Certifica
3160: 74 65 20 53 74 61 74 75 73 20 50 72 6f 74 6f 63 te Status Protoc
3170: 6f 6c 20 28 4f 53 43 50 29 20 55 52 49 73 0a 20 ol (OSCP) URIs.
3180: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
3190: 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 55 52 49 .Tcl list of URI
31a0: 73 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 s. *. * Side eff
31b0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ects:. *.None. *
31c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
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: 0a 20 2a 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c . */.Tcl_Obj *Tl
3220: 73 5f 78 35 30 39 4f 73 63 70 28 54 63 6c 5f 49 s_x509Oscp(Tcl_I
3230: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 58 nterp *interp, X
3240: 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 20 20 509 *cert) {.
3250: 20 53 54 41 43 4b 5f 4f 46 28 4f 50 45 4e 53 53 STACK_OF(OPENSS
3260: 4c 5f 53 54 52 49 4e 47 29 20 2a 6f 63 73 70 3b L_STRING) *ocsp;
3270: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 . Tcl_Obj *re
3280: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 sultObj = Tcl_Ne
3290: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
32a0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 );.. if (resu
32b0: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b ltObj == NULL) {
32c0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
32d0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 6f }.. if ((o
32e0: 63 73 70 20 3d 20 58 35 30 39 5f 67 65 74 31 5f csp = X509_get1_
32f0: 6f 63 73 70 28 63 65 72 74 29 29 20 21 3d 20 4e ocsp(cert)) != N
3300: 55 4c 4c 29 20 7b 0a 09 66 6f 72 20 28 69 6e 74 ULL) {..for (int
3310: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 4f i = 0; i < sk_O
3320: 50 45 4e 53 53 4c 5f 53 54 52 49 4e 47 5f 6e 75 PENSSL_STRING_nu
3330: 6d 28 6f 63 73 70 29 3b 20 69 2b 2b 29 20 7b 0a m(ocsp); i++) {.
3340: 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
3350: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
3360: 62 6a 2c 20 4e 55 4c 4c 2c 20 73 6b 5f 4f 50 45 bj, NULL, sk_OPE
3370: 4e 53 53 4c 5f 53 54 52 49 4e 47 5f 76 61 6c 75 NSSL_STRING_valu
3380: 65 28 6f 63 73 70 2c 20 69 29 2c 20 2d 31 29 3b e(ocsp, i), -1);
3390: 0a 09 7d 0a 09 58 35 30 39 5f 65 6d 61 69 6c 5f ..}..X509_email_
33a0: 66 72 65 65 28 6f 63 73 70 29 3b 0a 20 20 20 20 free(ocsp);.
33b0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 }. return res
33c0: 75 6c 74 4f 62 6a 3b 0a 7d 0a 0a 2f 2a 0a 20 2a ultObj;.}../*. *
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
3420: 0a 20 2a 20 54 6c 73 5f 78 35 30 39 43 61 49 73 . * Tls_x509CaIs
3430: 73 75 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 47 suers --. *. *.G
3440: 65 74 20 6c 69 73 74 20 6f 66 20 43 65 72 74 69 et list of Certi
3450: 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 74 79 ficate Authority
3460: 20 28 43 41 29 20 49 73 73 75 65 72 20 55 52 49 (CA) Issuer URI
3470: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
3480: 0a 20 2a 09 54 63 6c 20 6c 69 73 74 20 6f 66 20 . *.Tcl list of
3490: 43 41 20 69 73 73 75 65 72 20 55 52 49 73 0a 20 CA issuer URIs.
34a0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
34b0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a -------------. *
3510: 2f 0a 54 63 6c 5f 4f 62 6a 20 2a 54 6c 73 5f 78 /.Tcl_Obj *Tls_x
3520: 35 30 39 43 61 49 73 73 75 65 72 73 28 54 63 6c 509CaIssuers(Tcl
3530: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
3540: 20 58 35 30 39 20 2a 63 65 72 74 29 20 7b 0a 20 X509 *cert) {.
3550: 20 20 20 53 54 41 43 4b 5f 4f 46 28 41 43 43 45 STACK_OF(ACCE
3560: 53 53 5f 44 45 53 43 52 49 50 54 49 4f 4e 29 20 SS_DESCRIPTION)
3570: 2a 61 64 73 3b 0a 20 20 20 20 41 43 43 45 53 53 *ads;. ACCESS
3580: 5f 44 45 53 43 52 49 50 54 49 4f 4e 20 2a 61 64 _DESCRIPTION *ad
3590: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 ;. Tcl_Obj *r
35a0: 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e esultObj = Tcl_N
35b0: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
35c0: 4c 29 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 L);. unsigned
35d0: 20 63 68 61 72 20 2a 62 75 66 3b 0a 0a 20 20 20 char *buf;..
35e0: 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d if (resultObj =
35f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
3600: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 n NULL;. }..
3610: 20 20 20 69 66 20 28 28 61 64 73 20 3d 20 58 35 if ((ads = X5
3620: 30 39 5f 67 65 74 5f 65 78 74 5f 64 32 69 28 63 09_get_ext_d2i(c
3630: 65 72 74 2c 20 4e 49 44 5f 69 6e 66 6f 5f 61 63 ert, NID_info_ac
3640: 63 65 73 73 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c cess, NULL, NULL
3650: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 66 )) != NULL) {..f
3660: 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 or (int i = 0; i
3670: 20 3c 20 73 6b 5f 41 43 43 45 53 53 5f 44 45 53 < sk_ACCESS_DES
3680: 43 52 49 50 54 49 4f 4e 5f 6e 75 6d 28 61 64 73 CRIPTION_num(ads
3690: 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 61 ); i++) {.. a
36a0: 64 20 3d 20 73 6b 5f 41 43 43 45 53 53 5f 44 45 d = sk_ACCESS_DE
36b0: 53 43 52 49 50 54 49 4f 4e 5f 76 61 6c 75 65 28 SCRIPTION_value(
36c0: 61 64 73 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 ads, i);.. if
36d0: 20 28 4f 42 4a 5f 6f 62 6a 32 6e 69 64 28 61 64 (OBJ_obj2nid(ad
36e0: 2d 3e 6d 65 74 68 6f 64 29 20 3d 3d 20 4e 49 44 ->method) == NID
36f0: 5f 61 64 5f 63 61 5f 69 73 73 75 65 72 73 20 26 _ad_ca_issuers &
3700: 26 20 61 64 2d 3e 6c 6f 63 61 74 69 6f 6e 29 20 & ad->location)
3710: 7b 0a 09 09 69 66 20 28 61 64 2d 3e 6c 6f 63 61 {...if (ad->loca
3720: 74 69 6f 6e 2d 3e 74 79 70 65 20 3d 3d 20 47 45 tion->type == GE
3730: 4e 5f 55 52 49 29 20 7b 0a 09 09 20 20 20 20 54 N_URI) {... T
3740: 63 6c 5f 53 69 7a 65 20 6c 65 6e 20 3d 20 28 54 cl_Size len = (T
3750: 63 6c 5f 53 69 7a 65 29 20 41 53 4e 31 5f 53 54 cl_Size) ASN1_ST
3760: 52 49 4e 47 5f 74 6f 5f 55 54 46 38 28 26 62 75 RING_to_UTF8(&bu
3770: 66 2c 20 61 64 2d 3e 6c 6f 63 61 74 69 6f 6e 2d f, ad->location-
3780: 3e 64 2e 75 6e 69 66 6f 72 6d 52 65 73 6f 75 72 >d.uniformResour
3790: 63 65 49 64 65 6e 74 69 66 69 65 72 29 3b 0a 09 ceIdentifier);..
37a0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
37b0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
37c0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
37d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
37e0: 6a 28 28 63 68 61 72 20 2a 29 20 62 75 66 2c 20 j((char *) buf,
37f0: 6c 65 6e 29 29 3b 0a 09 09 20 20 20 20 4f 50 45 len));... OPE
3800: 4e 53 53 4c 5f 66 72 65 65 28 62 75 66 29 3b 0a NSSL_free(buf);.
3810: 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d .. break;...}
3820: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 73 .. }..}../* s
3830: 6b 5f 41 43 43 45 53 53 5f 44 45 53 43 52 49 50 k_ACCESS_DESCRIP
3840: 54 49 4f 4e 5f 70 6f 70 5f 66 72 65 65 28 61 64 TION_pop_free(ad
3850: 73 2c 20 41 43 43 45 53 53 5f 44 45 53 43 52 49 s, ACCESS_DESCRI
3860: 50 54 49 4f 4e 5f 66 72 65 65 29 3b 20 2a 2f 0a PTION_free); */.
3870: 09 41 55 54 48 4f 52 49 54 59 5f 49 4e 46 4f 5f .AUTHORITY_INFO_
3880: 41 43 43 45 53 53 5f 66 72 65 65 28 61 64 73 29 ACCESS_free(ads)
3890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
38a0: 72 6e 20 72 65 73 75 6c 74 4f 62 6a 3b 0a 7d 0a rn resultObj;.}.
38b0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
38c0: 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 5f 4e ----. *. * Tls_N
3910: 65 77 58 35 30 39 4f 62 6a 20 2d 2d 0a 20 2a 0a ewX509Obj --. *.
3920: 20 2a 09 50 61 72 73 65 73 20 61 20 58 35 30 39 *.Parses a X509
3930: 20 63 65 72 74 69 66 69 63 61 74 65 20 61 6e 64 certificate and
3940: 20 72 65 74 75 72 6e 73 20 63 6f 6e 74 65 6e 74 returns content
3950: 73 20 61 73 20 61 20 6b 65 79 2d 76 61 6c 75 65 s as a key-value
3960: 20 54 63 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a Tcl list.. *. *
3970: 20 52 65 73 75 6c 74 3a 0a 20 2a 09 41 20 54 63 Result:. *.A Tc
3980: 6c 20 4c 69 73 74 20 77 69 74 68 20 74 68 65 20 l List with the
3990: 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 X509 certificate
39a0: 20 69 6e 66 6f 20 61 73 20 61 20 6b 65 79 2d 76 info as a key-v
39b0: 61 6c 75 65 20 6c 69 73 74 0a 20 2a 0a 20 2a 20 alue list. *. *
39c0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
39d0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d .None. *. *-----
39e0: 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 54 63 6c --------. */.Tcl
3a30: 5f 4f 62 6a 20 2a 54 6c 73 5f 4e 65 77 58 35 30 _Obj *Tls_NewX50
3a40: 39 4f 62 6a 28 54 63 6c 5f 49 6e 74 65 72 70 20 9Obj(Tcl_Interp
3a50: 2a 69 6e 74 65 72 70 2c 20 58 35 30 39 20 2a 63 *interp, X509 *c
3a60: 65 72 74 2c 20 69 6e 74 20 61 6c 6c 29 20 7b 0a ert, int all) {.
3a70: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 Tcl_Obj *res
3a80: 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 ultObj = Tcl_New
3a90: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
3aa0: 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 20 3d ;. BIO *bio =
3ab0: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d BIO_new(BIO_s_m
3ac0: 65 6d 28 29 29 3b 0a 20 20 20 20 69 6e 74 20 6d em());. int m
3ad0: 64 6e 69 64 2c 20 70 6b 6e 69 64 2c 20 62 69 74 dnid, pknid, bit
3ae0: 73 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 s;. Tcl_Size
3af0: 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 len;. unsigne
3b00: 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 20 20 20 20 d int ulen;.
3b10: 75 69 6e 74 33 32 5f 74 20 78 66 6c 61 67 73 3b uint32_t xflags;
3b20: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f . unsigned lo
3b30: 6e 67 20 66 6c 61 67 73 20 3d 20 58 4e 5f 46 4c ng flags = XN_FL
3b40: 41 47 5f 52 46 43 32 32 35 33 20 7c 20 41 53 4e AG_RFC2253 | ASN
3b50: 31 5f 53 54 52 46 4c 47 53 5f 55 54 46 38 5f 43 1_STRFLGS_UTF8_C
3b60: 4f 4e 56 45 52 54 3b 0a 20 20 20 20 66 6c 61 67 ONVERT;. flag
3b70: 73 20 26 3d 20 7e 41 53 4e 31 5f 53 54 52 46 4c s &= ~ASN1_STRFL
3b80: 47 53 5f 45 53 43 5f 4d 53 42 3b 0a 0a 20 20 20 GS_ESC_MSB;..
3b90: 20 63 68 61 72 20 2a 62 75 66 66 65 72 20 3d 20 char *buffer =
3ba0: 63 6b 61 6c 6c 6f 63 28 42 55 46 53 49 5a 20 3e ckalloc(BUFSIZ >
3bb0: 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 EVP_MAX_MD_SIZE
3bc0: 20 3f 20 42 55 46 53 49 5a 20 3a 20 45 56 50 5f ? BUFSIZ : EVP_
3bd0: 4d 41 58 5f 4d 44 5f 53 49 5a 45 29 3b 0a 0a 20 MAX_MD_SIZE);..
3be0: 20 20 20 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 printf("Calle
3bf0: 64 5c 6e 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 d\n");.. if (
3c00: 69 6e 74 65 72 70 20 3d 3d 20 4e 55 4c 4c 20 7c interp == NULL |
3c10: 7c 20 63 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c | cert == NULL |
3c20: 7c 20 62 69 6f 20 3d 3d 20 4e 55 4c 4c 20 7c 7c | bio == NULL ||
3c30: 20 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 resultObj == NU
3c40: 4c 4c 20 7c 7c 20 62 75 66 66 65 72 20 3d 3d 20 LL || buffer ==
3c50: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 63 NULL) {..Tcl_Dec
3c60: 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 rRefCount(result
3c70: 4f 62 6a 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28 Obj);..BIO_free(
3c80: 62 69 6f 29 3b 0a 09 69 66 20 28 62 75 66 66 65 bio);..if (buffe
3c90: 72 20 21 3d 20 4e 55 4c 4c 29 20 63 6b 66 72 65 r != NULL) ckfre
3ca0: 65 28 62 75 66 66 65 72 29 3b 0a 09 72 65 74 75 e(buffer);..retu
3cb0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a rn NULL;. }..
3cc0: 20 20 20 20 2f 2a 20 53 69 67 6e 61 74 75 72 65 /* Signature
3cd0: 20 61 6c 67 6f 72 69 74 68 6d 20 61 6e 64 20 76 algorithm and v
3ce0: 61 6c 75 65 20 2d 20 52 46 43 20 35 32 38 30 20 alue - RFC 5280
3cf0: 73 65 63 74 69 6f 6e 20 34 2e 31 2e 31 2e 32 20 section 4.1.1.2
3d00: 61 6e 64 20 34 2e 31 2e 31 2e 33 20 2a 2f 0a 20 and 4.1.1.3 */.
3d10: 20 20 20 2f 2a 20 73 69 67 6e 61 74 75 72 65 41 /* signatureA
3d20: 6c 67 6f 72 69 74 68 6d 20 69 73 20 74 68 65 20 lgorithm is the
3d30: 69 64 20 6f 66 20 74 68 65 20 63 72 79 70 74 6f id of the crypto
3d40: 67 72 61 70 68 69 63 20 61 6c 67 6f 72 69 74 68 graphic algorith
3d50: 6d 20 75 73 65 64 20 62 79 20 74 68 65 0a 09 43 m used by the..C
3d60: 41 20 74 6f 20 73 69 67 6e 20 74 68 69 73 20 63 A to sign this c
3d70: 65 72 74 2e 20 73 69 67 6e 61 74 75 72 65 56 61 ert. signatureVa
3d80: 6c 75 65 20 69 73 20 74 68 65 20 64 69 67 69 74 lue is the digit
3d90: 61 6c 20 73 69 67 6e 61 74 75 72 65 20 63 6f 6d al signature com
3da0: 70 75 74 65 64 0a 09 75 70 6f 6e 20 74 68 65 20 puted..upon the
3db0: 41 53 4e 2e 31 20 44 45 52 20 65 6e 63 6f 64 65 ASN.1 DER encode
3dc0: 64 20 74 62 73 43 65 72 74 69 66 69 63 61 74 65 d tbsCertificate
3dd0: 2e 20 2a 2f 0a 20 20 20 20 7b 0a 09 63 6f 6e 73 . */. {..cons
3de0: 74 20 58 35 30 39 5f 41 4c 47 4f 52 20 2a 73 69 t X509_ALGOR *si
3df0: 67 5f 61 6c 67 3b 0a 09 63 6f 6e 73 74 20 41 53 g_alg;..const AS
3e00: 4e 31 5f 42 49 54 5f 53 54 52 49 4e 47 20 2a 73 N1_BIT_STRING *s
3e10: 69 67 3b 0a 09 69 6e 74 20 73 69 67 5f 6e 69 64 ig;..int sig_nid
3e20: 3b 0a 0a 09 58 35 30 39 5f 67 65 74 30 5f 73 69 ;...X509_get0_si
3e30: 67 6e 61 74 75 72 65 28 26 73 69 67 2c 20 26 73 gnature(&sig, &s
3e40: 69 67 5f 61 6c 67 2c 20 63 65 72 74 29 3b 0a 09 ig_alg, cert);..
3e50: 2f 2a 20 73 69 67 5f 6e 69 64 20 3d 20 58 35 30 /* sig_nid = X50
3e60: 39 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 9_get_signature_
3e70: 6e 69 64 28 63 65 72 74 29 20 2a 2f 0a 09 73 69 nid(cert) */..si
3e80: 67 5f 6e 69 64 20 3d 20 4f 42 4a 5f 6f 62 6a 32 g_nid = OBJ_obj2
3e90: 6e 69 64 28 73 69 67 5f 61 6c 67 2d 3e 61 6c 67 nid(sig_alg->alg
3ea0: 6f 72 69 74 68 6d 29 3b 0a 09 4c 41 50 50 45 4e orithm);..LAPPEN
3eb0: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 D_STR(interp, re
3ec0: 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74 sultObj, "signat
3ed0: 75 72 65 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f ureAlgorithm", O
3ee0: 42 4a 5f 6e 69 64 32 6c 6e 28 73 69 67 5f 6e 69 BJ_nid2ln(sig_ni
3ef0: 64 29 2c 20 2d 31 29 3b 0a 09 69 66 20 28 73 69 d), -1);..if (si
3f00: 67 5f 6e 69 64 20 21 3d 20 4e 49 44 5f 75 6e 64 g_nid != NID_und
3f10: 65 66 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 ef) {.. LAPPE
3f20: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 ND_OBJ(interp, r
3f30: 65 73 75 6c 74 4f 62 6a 2c 20 22 73 69 67 6e 61 esultObj, "signa
3f40: 74 75 72 65 56 61 6c 75 65 22 2c 20 53 74 72 69 tureValue", Stri
3f50: 6e 67 5f 74 6f 5f 48 65 78 28 73 69 67 2d 3e 64 ng_to_Hex(sig->d
3f60: 61 74 61 2c 20 73 69 67 2d 3e 6c 65 6e 67 74 68 ata, sig->length
3f70: 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 ));..} else {..
3f80: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
3f90: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
3fa0: 2c 20 22 73 69 67 6e 61 74 75 72 65 56 61 6c 75 , "signatureValu
3fb0: 65 22 2c 20 22 22 2c 20 30 29 3b 0a 09 7d 0a 20 e", "", 0);..}.
3fc0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 }.. /* Ver
3fd0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 63 6f sion of the enco
3fe0: 64 65 64 20 63 65 72 74 69 66 69 63 61 74 65 20 ded certificate
3ff0: 2d 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 - RFC 5280 secti
4000: 6f 6e 20 34 2e 31 2e 32 2e 31 20 2a 2f 0a 20 20 on 4.1.2.1 */.
4010: 20 20 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 LAPPEND_LONG(i
4020: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
4030: 2c 20 22 76 65 72 73 69 6f 6e 22 2c 20 58 35 30 , "version", X50
4040: 39 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 9_get_version(ce
4050: 72 74 29 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 rt)+1);.. /*
4060: 55 6e 69 71 75 65 20 6e 75 6d 62 65 72 20 61 73 Unique number as
4070: 73 69 67 6e 65 64 20 62 79 20 43 41 20 74 6f 20 signed by CA to
4080: 63 65 72 74 69 66 69 63 61 74 65 20 2d 20 52 46 certificate - RF
4090: 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 C 5280 section 4
40a0: 2e 31 2e 32 2e 32 20 2a 2f 0a 20 20 20 20 6c 65 .1.2.2 */. le
40b0: 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 n = BIO_to_Buffe
40c0: 72 28 69 32 61 5f 41 53 4e 31 5f 49 4e 54 45 47 r(i2a_ASN1_INTEG
40d0: 45 52 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 74 ER(bio, X509_get
40e0: 30 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 0_serialNumber(c
40f0: 65 72 74 29 29 2c 20 62 69 6f 2c 20 62 75 66 66 ert)), bio, buff
4100: 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 20 20 20 er, BUFSIZ);.
4110: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
4120: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
4130: 22 73 65 72 69 61 6c 4e 75 6d 62 65 72 22 2c 20 "serialNumber",
4140: 62 75 66 66 65 72 2c 20 6c 65 6e 29 3b 0a 0a 20 buffer, len);..
4150: 20 20 20 2f 2a 20 53 69 67 6e 61 74 75 72 65 20 /* Signature
4160: 61 6c 67 6f 72 69 74 68 6d 20 75 73 65 64 20 62 algorithm used b
4170: 79 20 74 68 65 20 43 41 20 74 6f 20 73 69 67 6e y the CA to sign
4180: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
4190: 2e 20 4d 75 73 74 20 6d 61 74 63 68 0a 09 73 69 . Must match..si
41a0: 67 6e 61 74 75 72 65 41 6c 67 6f 72 69 74 68 6d gnatureAlgorithm
41b0: 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 . RFC 5280 secti
41c0: 6f 6e 20 34 2e 31 2e 32 2e 33 20 2a 2f 0a 20 20 on 4.1.2.3 */.
41d0: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
41e0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
41f0: 20 22 73 69 67 6e 61 74 75 72 65 22 2c 20 4f 42 "signature", OB
4200: 4a 5f 6e 69 64 32 6c 6e 28 58 35 30 39 5f 67 65 J_nid2ln(X509_ge
4210: 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 t_signature_nid(
4220: 63 65 72 74 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 cert)), -1);..
4230: 20 20 2f 2a 20 49 73 73 75 65 72 20 69 64 65 6e /* Issuer iden
4240: 74 69 66 69 65 73 20 74 68 65 20 65 6e 74 69 74 tifies the entit
4250: 79 20 74 68 61 74 20 73 69 67 6e 65 64 20 61 6e y that signed an
4260: 64 20 69 73 73 75 65 64 20 74 68 65 20 63 65 72 d issued the cer
4270: 74 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 t. RFC 5280 sect
4280: 69 6f 6e 20 34 2e 31 2e 32 2e 34 20 2a 2f 0a 20 ion 4.1.2.4 */.
4290: 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f len = BIO_to_
42a0: 42 75 66 66 65 72 28 58 35 30 39 5f 4e 41 4d 45 Buffer(X509_NAME
42b0: 5f 70 72 69 6e 74 5f 65 78 28 62 69 6f 2c 20 58 _print_ex(bio, X
42c0: 35 30 39 5f 67 65 74 5f 69 73 73 75 65 72 5f 6e 509_get_issuer_n
42d0: 61 6d 65 28 63 65 72 74 29 2c 20 30 2c 20 66 6c ame(cert), 0, fl
42e0: 61 67 73 29 2c 20 62 69 6f 2c 20 62 75 66 66 65 ags), bio, buffe
42f0: 72 2c 20 42 55 46 53 49 5a 29 3b 0a 20 20 20 20 r, BUFSIZ);.
4300: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
4310: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
4320: 69 73 73 75 65 72 22 2c 20 62 75 66 66 65 72 2c issuer", buffer,
4330: 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 len);.. /* C
4340: 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 ertificate valid
4350: 69 74 79 20 70 65 72 69 6f 64 20 69 73 20 74 68 ity period is th
4360: 65 20 69 6e 74 65 72 76 61 6c 20 74 68 65 20 43 e interval the C
4370: 41 20 77 61 72 72 61 6e 74 73 20 74 68 61 74 20 A warrants that
4380: 69 74 20 77 69 6c 6c 0a 09 6d 61 69 6e 74 61 69 it will..maintai
4390: 6e 20 69 6e 66 6f 20 6f 6e 20 74 68 65 20 73 74 n info on the st
43a0: 61 74 75 73 20 6f 66 20 74 68 65 20 63 65 72 74 atus of the cert
43b0: 69 66 69 63 61 74 65 2e 20 52 46 43 20 35 32 38 ificate. RFC 528
43c0: 30 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 0 section 4.1.2.
43d0: 35 20 2a 2f 0a 20 20 20 20 2f 2a 20 47 65 74 20 5 */. /* Get
43e0: 56 61 6c 69 64 69 74 79 20 2d 20 4e 6f 74 20 42 Validity - Not B
43f0: 65 66 6f 72 65 20 2a 2f 0a 20 20 20 20 6c 65 6e efore */. len
4400: 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 72 = BIO_to_Buffer
4410: 28 41 53 4e 31 5f 54 49 4d 45 5f 70 72 69 6e 74 (ASN1_TIME_print
4420: 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 74 30 5f (bio, X509_get0_
4430: 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 29 notBefore(cert))
4440: 2c 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 , bio, buffer, B
4450: 55 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 UFSIZ);. LAPP
4460: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
4470: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6e 6f 74 42 resultObj, "notB
4480: 65 66 6f 72 65 22 2c 20 62 75 66 66 65 72 2c 20 efore", buffer,
4490: 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 len);.. /* Ge
44a0: 74 20 56 61 6c 69 64 69 74 79 20 2d 20 4e 6f 74 t Validity - Not
44b0: 20 41 66 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65 After */. le
44c0: 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 75 66 66 65 n = BIO_to_Buffe
44d0: 72 28 41 53 4e 31 5f 54 49 4d 45 5f 70 72 69 6e r(ASN1_TIME_prin
44e0: 74 28 62 69 6f 2c 20 58 35 30 39 5f 67 65 74 30 t(bio, X509_get0
44f0: 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 29 _notAfter(cert))
4500: 2c 20 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 , bio, buffer, B
4510: 55 46 53 49 5a 29 3b 0a 20 20 20 20 4c 41 50 50 UFSIZ);. LAPP
4520: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
4530: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6e 6f 74 41 resultObj, "notA
4540: 66 74 65 72 22 2c 20 62 75 66 66 65 72 2c 20 6c fter", buffer, l
4550: 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62 en);.. /* Sub
4560: 6a 65 63 74 20 69 64 65 6e 74 69 66 69 65 73 20 ject identifies
4570: 74 68 65 20 65 6e 74 69 74 79 20 61 73 73 6f 63 the entity assoc
4580: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 70 iated with the p
4590: 75 62 6c 69 63 20 6b 65 79 20 73 74 6f 72 65 64 ublic key stored
45a0: 20 69 6e 0a 09 74 68 65 20 73 75 62 6a 65 63 74 in..the subject
45b0: 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 65 6c public key fiel
45c0: 64 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 d. RFC 5280 sect
45d0: 69 6f 6e 20 34 2e 31 2e 32 2e 36 20 2a 2f 0a 20 ion 4.1.2.6 */.
45e0: 20 20 20 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f len = BIO_to_
45f0: 42 75 66 66 65 72 28 58 35 30 39 5f 4e 41 4d 45 Buffer(X509_NAME
4600: 5f 70 72 69 6e 74 5f 65 78 28 62 69 6f 2c 20 58 _print_ex(bio, X
4610: 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 509_get_subject_
4620: 6e 61 6d 65 28 63 65 72 74 29 2c 20 30 2c 20 66 name(cert), 0, f
4630: 6c 61 67 73 29 2c 20 62 69 6f 2c 20 62 75 66 66 lags), bio, buff
4640: 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 20 20 20 er, BUFSIZ);.
4650: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
4660: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
4670: 22 73 75 62 6a 65 63 74 22 2c 20 62 75 66 66 65 "subject", buffe
4680: 72 2c 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a r, len);.. /*
4690: 20 53 48 41 31 20 44 69 67 65 73 74 20 28 46 69 SHA1 Digest (Fi
46a0: 6e 67 65 72 70 72 69 6e 74 29 20 6f 66 20 63 65 ngerprint) of ce
46b0: 72 74 20 2d 20 44 45 52 20 72 65 70 72 65 73 65 rt - DER represe
46c0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 ntation */. i
46d0: 66 20 28 58 35 30 39 5f 64 69 67 65 73 74 28 63 f (X509_digest(c
46e0: 65 72 74 2c 20 45 56 50 5f 73 68 61 31 28 29 2c ert, EVP_sha1(),
46f0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 (unsigned char
4700: 2a 29 62 75 66 66 65 72 2c 20 26 75 6c 65 6e 29 *)buffer, &ulen)
4710: 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a ) {..LAPPEND_OBJ
4720: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
4730: 62 6a 2c 20 22 73 68 61 31 5f 68 61 73 68 22 2c bj, "sha1_hash",
4740: 20 53 74 72 69 6e 67 5f 74 6f 5f 48 65 78 28 28 String_to_Hex((
4750: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
4760: 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20 75 6c buffer, (int) ul
4770: 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 en));. }..
4780: 20 2f 2a 20 53 48 41 32 35 36 20 44 69 67 65 73 /* SHA256 Diges
4790: 74 20 28 46 69 6e 67 65 72 70 72 69 6e 74 29 20 t (Fingerprint)
47a0: 6f 66 20 63 65 72 74 20 2d 20 44 45 52 20 72 65 of cert - DER re
47b0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a presentation */.
47c0: 20 20 20 20 69 66 20 28 58 35 30 39 5f 64 69 67 if (X509_dig
47d0: 65 73 74 28 63 65 72 74 2c 20 45 56 50 5f 73 68 est(cert, EVP_sh
47e0: 61 32 35 36 28 29 2c 20 28 75 6e 73 69 67 6e 65 a256(), (unsigne
47f0: 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 72 2c d char *)buffer,
4800: 20 26 75 6c 65 6e 29 29 20 7b 0a 09 4c 41 50 50 &ulen)) {..LAPP
4810: 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 END_OBJ(interp,
4820: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 68 61 32 resultObj, "sha2
4830: 35 36 5f 68 61 73 68 22 2c 20 53 74 72 69 6e 67 56_hash", String
4840: 5f 74 6f 5f 48 65 78 28 28 75 6e 73 69 67 6e 65 _to_Hex((unsigne
4850: 64 20 63 68 61 72 20 2a 29 62 75 66 66 65 72 2c d char *)buffer,
4860: 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 20 (int) ulen));.
4870: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 75 62 }.. /* Sub
4880: 6a 65 63 74 20 50 75 62 6c 69 63 20 4b 65 79 20 ject Public Key
4890: 49 6e 66 6f 20 73 70 65 63 69 66 69 65 73 20 74 Info specifies t
48a0: 68 65 20 70 75 62 6c 69 63 20 6b 65 79 20 61 6e he public key an
48b0: 64 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 d identifies the
48c0: 0a 09 61 6c 67 6f 72 69 74 68 6d 20 77 69 74 68 ..algorithm with
48d0: 20 77 68 69 63 68 20 74 68 65 20 6b 65 79 20 69 which the key i
48e0: 73 20 75 73 65 64 2e 20 52 46 43 20 35 32 38 30 s used. RFC 5280
48f0: 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 37 section 4.1.2.7
4900: 20 2a 2f 0a 20 20 20 20 69 66 20 28 58 35 30 39 */. if (X509
4910: 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 69 _get_signature_i
4920: 6e 66 6f 28 63 65 72 74 2c 20 26 6d 64 6e 69 64 nfo(cert, &mdnid
4930: 2c 20 26 70 6b 6e 69 64 2c 20 26 62 69 74 73 2c , &pknid, &bits,
4940: 20 26 78 66 6c 61 67 73 29 29 20 7b 0a 09 41 53 &xflags)) {..AS
4950: 4e 31 5f 42 49 54 5f 53 54 52 49 4e 47 20 2a 6b N1_BIT_STRING *k
4960: 65 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e ey;..unsigned in
4970: 74 20 6e 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 t n;...LAPPEND_S
4980: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c TR(interp, resul
4990: 74 4f 62 6a 2c 20 22 73 69 67 6e 69 6e 67 44 69 tObj, "signingDi
49a0: 67 65 73 74 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c gest", OBJ_nid2l
49b0: 6e 28 6d 64 6e 69 64 29 2c 20 2d 31 29 3b 0a 09 n(mdnid), -1);..
49c0: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
49d0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 rp, resultObj, "
49e0: 70 75 62 6c 69 63 4b 65 79 41 6c 67 6f 72 69 74 publicKeyAlgorit
49f0: 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 hm", OBJ_nid2ln(
4a00: 70 6b 6e 69 64 29 2c 20 2d 31 29 3b 0a 09 4c 41 pknid), -1);..LA
4a10: 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
4a20: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 62 69 , resultObj, "bi
4a30: 74 73 22 2c 20 62 69 74 73 29 3b 20 2f 2a 20 45 ts", bits); /* E
4a40: 66 66 65 63 74 69 76 65 20 73 65 63 75 72 69 74 ffective securit
4a50: 79 20 62 69 74 73 20 2a 2f 0a 0a 09 6b 65 79 20 y bits */...key
4a60: 3d 20 58 35 30 39 5f 67 65 74 30 5f 70 75 62 6b = X509_get0_pubk
4a70: 65 79 5f 62 69 74 73 74 72 28 63 65 72 74 29 3b ey_bitstr(cert);
4a80: 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e ..LAPPEND_OBJ(in
4a90: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
4aa0: 20 22 70 75 62 6c 69 63 4b 65 79 22 2c 20 53 74 "publicKey", St
4ab0: 72 69 6e 67 5f 74 6f 5f 48 65 78 28 6b 65 79 2d ring_to_Hex(key-
4ac0: 3e 64 61 74 61 2c 20 6b 65 79 2d 3e 6c 65 6e 67 >data, key->leng
4ad0: 74 68 29 29 3b 0a 0a 09 69 66 20 28 58 35 30 39 th));...if (X509
4ae0: 5f 70 75 62 6b 65 79 5f 64 69 67 65 73 74 28 63 _pubkey_digest(c
4af0: 65 72 74 2c 20 45 56 50 5f 67 65 74 5f 64 69 67 ert, EVP_get_dig
4b00: 65 73 74 62 79 6e 69 64 28 70 6b 6e 69 64 29 2c estbynid(pknid),
4b10: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 (unsigned char
4b20: 2a 29 62 75 66 66 65 72 2c 20 26 6e 29 29 20 7b *)buffer, &n)) {
4b30: 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 .. LAPPEND_OB
4b40: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 J(interp, result
4b50: 4f 62 6a 2c 20 22 70 75 62 6c 69 63 4b 65 79 48 Obj, "publicKeyH
4b60: 61 73 68 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f ash", String_to_
4b70: 48 65 78 28 28 75 6e 73 69 67 6e 65 64 20 63 68 Hex((unsigned ch
4b80: 61 72 20 2a 29 62 75 66 66 65 72 2c 20 28 69 6e ar *)buffer, (in
4b90: 74 29 20 6e 29 29 3b 0a 09 7d 20 65 6c 73 65 20 t) n));..} else
4ba0: 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 {.. LAPPEND_S
4bb0: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c TR(interp, resul
4bc0: 74 4f 62 6a 2c 20 22 70 75 62 6c 69 63 4b 65 79 tObj, "publicKey
4bd0: 48 61 73 68 22 2c 20 22 22 2c 20 30 29 3b 0a 09 Hash", "", 0);..
4be0: 7d 0a 0a 09 2f 2a 20 64 69 67 65 73 74 20 6f 66 }.../* digest of
4bf0: 20 74 68 65 20 44 45 52 20 72 65 70 72 65 73 65 the DER represe
4c00: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 ntation of the c
4c10: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 69 ertificate */..i
4c20: 66 20 28 58 35 30 39 5f 64 69 67 65 73 74 28 63 f (X509_digest(c
4c30: 65 72 74 2c 20 45 56 50 5f 67 65 74 5f 64 69 67 ert, EVP_get_dig
4c40: 65 73 74 62 79 6e 69 64 28 6d 64 6e 69 64 29 2c estbynid(mdnid),
4c50: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 (unsigned char
4c60: 2a 29 62 75 66 66 65 72 2c 20 26 6e 29 29 20 7b *)buffer, &n)) {
4c70: 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 .. LAPPEND_OB
4c80: 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 J(interp, result
4c90: 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75 72 65 48 Obj, "signatureH
4ca0: 61 73 68 22 2c 20 53 74 72 69 6e 67 5f 74 6f 5f ash", String_to_
4cb0: 48 65 78 28 28 75 6e 73 69 67 6e 65 64 20 63 68 Hex((unsigned ch
4cc0: 61 72 20 2a 29 62 75 66 66 65 72 2c 20 28 69 6e ar *)buffer, (in
4cd0: 74 29 20 6e 29 29 3b 0a 09 7d 20 65 6c 73 65 20 t) n));..} else
4ce0: 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 {.. LAPPEND_S
4cf0: 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c TR(interp, resul
4d00: 74 4f 62 6a 2c 20 22 73 69 67 6e 61 74 75 72 65 tObj, "signature
4d10: 48 61 73 68 22 2c 20 22 22 2c 20 30 29 3b 0a 09 Hash", "", 0);..
4d20: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
4d30: 43 65 72 74 69 66 69 63 61 74 65 20 50 75 72 70 Certificate Purp
4d40: 6f 73 65 2e 20 43 61 6c 6c 20 62 65 66 6f 72 65 ose. Call before
4d50: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 65 78 checking for ex
4d60: 74 65 6e 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 tensions. */.
4d70: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
4d80: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 erp, resultObj,
4d90: 22 70 75 72 70 6f 73 65 22 2c 20 54 6c 73 5f 78 "purpose", Tls_x
4da0: 35 30 39 50 75 72 70 6f 73 65 28 63 65 72 74 29 509Purpose(cert)
4db0: 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 , -1);. LAPPE
4dc0: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 ND_OBJ(interp, r
4dd0: 65 73 75 6c 74 4f 62 6a 2c 20 22 63 65 72 74 69 esultObj, "certi
4de0: 66 69 63 61 74 65 50 75 72 70 6f 73 65 22 2c 20 ficatePurpose",
4df0: 54 6c 73 5f 78 35 30 39 50 75 72 70 6f 73 65 73 Tls_x509Purposes
4e00: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b (interp, cert));
4e10: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 65 78 74 .. /* Get ext
4e20: 65 6e 73 69 6f 6e 73 20 66 6c 61 67 73 20 2a 2f ensions flags */
4e30: 0a 20 20 20 20 78 66 6c 61 67 73 20 3d 20 58 35 . xflags = X5
4e40: 30 39 5f 67 65 74 5f 65 78 74 65 6e 73 69 6f 6e 09_get_extension
4e50: 5f 66 6c 61 67 73 28 63 65 72 74 29 3b 0a 20 20 _flags(cert);.
4e60: 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e LAPPEND_INT(in
4e70: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
4e80: 20 22 65 78 74 46 6c 61 67 73 22 2c 20 78 66 6c "extFlags", xfl
4e90: 61 67 73 29 3b 0a 0a 09 2f 2a 20 43 68 65 63 6b ags);.../* Check
4ea0: 20 69 66 20 63 65 72 74 20 77 61 73 20 69 73 73 if cert was iss
4eb0: 75 65 64 20 62 79 20 43 41 20 63 65 72 74 20 69 ued by CA cert i
4ec0: 73 73 75 65 72 20 6f 72 20 73 65 6c 66 20 73 69 ssuer or self si
4ed0: 67 6e 65 64 20 2a 2f 0a 20 20 20 20 4c 41 50 50 gned */. LAPP
4ee0: 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
4ef0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 65 6c resultObj, "sel
4f00: 66 49 73 73 75 65 64 22 2c 20 78 66 6c 61 67 73 fIssued", xflags
4f10: 20 26 20 45 58 46 4c 41 47 5f 53 49 29 3b 0a 20 & EXFLAG_SI);.
4f20: 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 LAPPEND_BOOL(
4f30: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
4f40: 6a 2c 20 22 73 65 6c 66 53 69 67 6e 65 64 22 2c j, "selfSigned",
4f50: 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 xflags & EXFLAG
4f60: 5f 53 53 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e _SS);. LAPPEN
4f70: 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 D_BOOL(interp, r
4f80: 65 73 75 6c 74 4f 62 6a 2c 20 22 69 73 50 72 6f esultObj, "isPro
4f90: 78 79 43 65 72 74 22 2c 20 78 66 6c 61 67 73 20 xyCert", xflags
4fa0: 26 20 45 58 46 4c 41 47 5f 50 52 4f 58 59 29 3b & EXFLAG_PROXY);
4fb0: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 42 4f 4f . LAPPEND_BOO
4fc0: 4c 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 L(interp, result
4fd0: 4f 62 6a 2c 20 22 65 78 74 49 6e 76 61 6c 69 64 Obj, "extInvalid
4fe0: 22 2c 20 78 66 6c 61 67 73 20 26 20 45 58 46 4c ", xflags & EXFL
4ff0: 41 47 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 20 AG_INVALID);.
5000: 20 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e LAPPEND_BOOL(in
5010: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
5020: 20 22 69 73 43 41 43 65 72 74 22 2c 20 58 35 30 "isCACert", X50
5030: 39 5f 63 68 65 63 6b 5f 63 61 28 63 65 72 74 29 9_check_ca(cert)
5040: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 55 );.. /* The U
5050: 6e 69 71 75 65 20 49 64 73 20 61 72 65 20 75 73 nique Ids are us
5060: 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 ed to handle the
5070: 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20 possibility of
5080: 72 65 75 73 65 20 6f 66 20 73 75 62 6a 65 63 74 reuse of subject
5090: 0a 09 61 6e 64 2f 6f 72 20 69 73 73 75 65 72 20 ..and/or issuer
50a0: 6e 61 6d 65 73 20 6f 76 65 72 20 74 69 6d 65 2e names over time.
50b0: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f RFC 5280 sectio
50c0: 6e 20 34 2e 31 2e 32 2e 38 20 2a 2f 0a 20 20 20 n 4.1.2.8 */.
50d0: 20 7b 0a 09 63 6f 6e 73 74 20 41 53 4e 31 5f 42 {..const ASN1_B
50e0: 49 54 5f 53 54 52 49 4e 47 20 2a 69 75 69 64 2c IT_STRING *iuid,
50f0: 20 2a 73 75 69 64 3b 0a 20 20 20 20 20 20 20 20 *suid;.
5100: 58 35 30 39 5f 67 65 74 30 5f 75 69 64 73 28 63 X509_get0_uids(c
5110: 65 72 74 2c 20 26 69 75 69 64 2c 20 26 73 75 69 ert, &iuid, &sui
5120: 64 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 d);...Tcl_ListOb
5130: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
5140: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
5150: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
5160: 62 6a 28 22 69 73 73 75 65 72 55 6e 69 71 75 65 bj("issuerUnique
5170: 49 64 22 2c 20 2d 31 29 29 3b 0a 09 69 66 20 28 Id", -1));..if (
5180: 69 75 69 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a iuid != NULL) {.
5190: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
51a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
51b0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
51c0: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 Tcl_NewByteArra
51d0: 79 4f 62 6a 28 28 63 6f 6e 73 74 20 75 6e 73 69 yObj((const unsi
51e0: 67 6e 65 64 20 63 68 61 72 20 2a 29 69 75 69 64 gned char *)iuid
51f0: 2d 3e 64 61 74 61 2c 20 28 54 63 6c 5f 53 69 7a ->data, (Tcl_Siz
5200: 65 29 20 69 75 69 64 2d 3e 6c 65 6e 67 74 68 29 e) iuid->length)
5210: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 );..} else {..
5220: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
5230: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
5240: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 54 63 p, resultObj, Tc
5250: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
5260: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 0a 09 54 63 ", -1));..}...Tc
5270: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
5280: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 lement(interp, r
5290: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 esultObj, Tcl_Ne
52a0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 75 62 6a wStringObj("subj
52b0: 65 63 74 55 6e 69 71 75 65 49 64 22 2c 20 2d 31 ectUniqueId", -1
52c0: 29 29 3b 0a 09 69 66 20 28 73 75 69 64 20 21 3d ));..if (suid !=
52d0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 NULL) {.. Tc
52e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
52f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 lement(interp, r
5300: 65 73 75 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 esultObj, Tcl_Ne
5310: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 63 wByteArrayObj((c
5320: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
5330: 61 72 20 2a 29 73 75 69 64 2d 3e 64 61 74 61 2c ar *)suid->data,
5340: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 75 69 64 (Tcl_Size) suid
5350: 2d 3e 6c 65 6e 67 74 68 29 29 3b 0a 09 7d 20 65 ->length));..} e
5360: 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c lse {.. Tcl_L
5370: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5380: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 ent(interp, resu
5390: 6c 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 ltObj, Tcl_NewSt
53a0: 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 ringObj("", -1))
53b0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
53c0: 2f 2a 20 58 35 30 39 20 76 33 20 45 78 74 65 6e /* X509 v3 Exten
53d0: 73 69 6f 6e 73 20 2d 20 52 46 43 20 35 32 38 30 sions - RFC 5280
53e0: 20 73 65 63 74 69 6f 6e 20 34 2e 31 2e 32 2e 39 section 4.1.2.9
53f0: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f */. LAPPEND_
5400: 49 4e 54 28 69 6e 74 65 72 70 2c 20 72 65 73 75 INT(interp, resu
5410: 6c 74 4f 62 6a 2c 20 22 65 78 74 43 6f 75 6e 74 ltObj, "extCount
5420: 22 2c 20 58 35 30 39 5f 67 65 74 5f 65 78 74 5f ", X509_get_ext_
5430: 63 6f 75 6e 74 28 63 65 72 74 29 29 3b 0a 20 20 count(cert));.
5440: 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e LAPPEND_OBJ(in
5450: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
5460: 20 22 65 78 74 65 6e 73 69 6f 6e 73 22 2c 20 54 "extensions", T
5470: 6c 73 5f 78 35 30 39 45 78 74 65 6e 73 69 6f 6e ls_x509Extension
5480: 73 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 s(interp, cert))
5490: 3b 0a 0a 20 20 20 20 2f 2a 20 41 75 74 68 6f 72 ;.. /* Author
54a0: 69 74 79 20 4b 65 79 20 49 64 65 6e 74 69 66 69 ity Key Identifi
54b0: 65 72 20 28 41 4b 49 29 20 69 73 20 74 68 65 20 er (AKI) is the
54c0: 53 75 62 6a 65 63 74 20 4b 65 79 20 49 64 65 6e Subject Key Iden
54d0: 74 69 66 69 65 72 20 28 53 4b 49 29 20 6f 66 0a tifier (SKI) of.
54e0: 09 69 74 73 20 73 69 67 6e 65 72 20 28 74 68 65 .its signer (the
54f0: 20 43 41 29 2e 20 52 46 43 20 35 32 38 30 20 73 CA). RFC 5280 s
5500: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 2c 20 ection 4.2.1.1,
5510: 4e 49 44 5f 61 75 74 68 6f 72 69 74 79 5f 6b 65 NID_authority_ke
5520: 79 5f 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a y_identifier */.
5530: 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 LAPPEND_OBJ(
5540: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
5550: 6a 2c 20 22 61 75 74 68 6f 72 69 74 79 4b 65 79 j, "authorityKey
5560: 49 64 65 6e 74 69 66 69 65 72 22 2c 0a 09 54 6c Identifier",..Tl
5570: 73 5f 78 35 30 39 49 64 65 6e 74 69 66 69 65 72 s_x509Identifier
5580: 28 58 35 30 39 5f 67 65 74 30 5f 61 75 74 68 6f (X509_get0_autho
5590: 72 69 74 79 5f 6b 65 79 5f 69 64 28 63 65 72 74 rity_key_id(cert
55a0: 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62 )));.. /* Sub
55b0: 6a 65 63 74 20 4b 65 79 20 49 64 65 6e 74 69 66 ject Key Identif
55c0: 69 65 72 20 28 53 4b 49 29 20 69 73 20 75 73 65 ier (SKI) is use
55d0: 64 20 74 6f 20 69 64 65 6e 74 69 66 79 20 63 65 d to identify ce
55e0: 72 74 69 66 69 63 61 74 65 73 20 74 68 61 74 20 rtificates that
55f0: 63 6f 6e 74 61 69 6e 0a 09 61 20 70 61 72 74 69 contain..a parti
5600: 63 75 6c 61 72 20 70 75 62 6c 69 63 20 6b 65 79 cular public key
5610: 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 . RFC 5280 secti
5620: 6f 6e 20 34 2e 32 2e 31 2e 32 2c 20 4e 49 44 5f on 4.2.1.2, NID_
5630: 73 75 62 6a 65 63 74 5f 6b 65 79 5f 69 64 65 6e subject_key_iden
5640: 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 4c 41 tifier */. LA
5650: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 PPEND_OBJ(interp
5660: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 75 , resultObj, "su
5670: 62 6a 65 63 74 4b 65 79 49 64 65 6e 74 69 66 69 bjectKeyIdentifi
5680: 65 72 22 2c 0a 09 54 6c 73 5f 78 35 30 39 49 64 er",..Tls_x509Id
5690: 65 6e 74 69 66 69 65 72 28 58 35 30 39 5f 67 65 entifier(X509_ge
56a0: 74 30 5f 73 75 62 6a 65 63 74 5f 6b 65 79 5f 69 t0_subject_key_i
56b0: 64 28 63 65 72 74 29 29 29 3b 0a 0a 20 20 20 20 d(cert)));..
56c0: 2f 2a 20 4b 65 79 20 75 73 61 67 65 20 65 78 74 /* Key usage ext
56d0: 65 6e 73 69 6f 6e 20 64 65 66 69 6e 65 73 20 74 ension defines t
56e0: 68 65 20 70 75 72 70 6f 73 65 20 28 65 2e 67 2e he purpose (e.g.
56f0: 2c 20 65 6e 63 69 70 68 65 72 6d 65 6e 74 2c 20 , encipherment,
5700: 73 69 67 6e 61 74 75 72 65 2c 20 63 65 72 74 69 signature, certi
5710: 66 69 63 61 74 65 0a 09 73 69 67 6e 69 6e 67 29 ficate..signing)
5720: 20 6f 66 20 74 68 65 20 6b 65 79 20 69 6e 20 74 of the key in t
5730: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 2e 20 he certificate.
5740: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e RFC 5280 section
5750: 20 34 2e 32 2e 31 2e 33 2c 20 4e 49 44 5f 6b 65 4.2.1.3, NID_ke
5760: 79 5f 75 73 61 67 65 20 2a 2f 0a 20 20 20 20 4c y_usage */. L
5770: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 APPEND_OBJ(inter
5780: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6b p, resultObj, "k
5790: 65 79 55 73 61 67 65 22 2c 20 54 6c 73 5f 78 35 eyUsage", Tls_x5
57a0: 30 39 4b 65 79 55 73 61 67 65 28 69 6e 74 65 72 09KeyUsage(inter
57b0: 70 2c 20 63 65 72 74 2c 20 78 66 6c 61 67 73 29 p, cert, xflags)
57c0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 69 );.. /* Certi
57d0: 66 69 63 61 74 65 20 50 6f 6c 69 63 69 65 73 20 ficate Policies
57e0: 2d 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 - indicates the
57f0: 69 73 73 75 69 6e 67 20 43 41 20 63 6f 6e 73 69 issuing CA consi
5800: 64 65 72 73 20 69 74 73 20 69 73 73 75 65 72 44 ders its issuerD
5810: 6f 6d 61 69 6e 50 6f 6c 69 63 79 0a 09 65 71 75 omainPolicy..equ
5820: 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 73 ivalent to the s
5830: 75 62 6a 65 63 74 20 43 41 27 73 20 73 75 62 6a ubject CA's subj
5840: 65 63 74 44 6f 6d 61 69 6e 50 6f 6c 69 63 79 2e ectDomainPolicy.
5850: 20 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f RFC 5280 sectio
5860: 6e 20 34 2e 32 2e 31 2e 34 2c 20 4e 49 44 5f 63 n 4.2.1.4, NID_c
5870: 65 72 74 69 66 69 63 61 74 65 5f 70 6f 6c 69 63 ertificate_polic
5880: 69 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 78 ies */. if (x
5890: 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 49 flags & EXFLAG_I
58a0: 4e 56 41 4c 49 44 5f 50 4f 4c 49 43 59 29 20 7b NVALID_POLICY) {
58b0: 0a 09 2f 2a 20 52 65 6a 65 63 74 20 63 65 72 74 ../* Reject cert
58c0: 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f */. }.. /
58d0: 2a 20 50 6f 6c 69 63 79 20 4d 61 70 70 69 6e 67 * Policy Mapping
58e0: 73 20 2d 20 52 46 43 20 35 32 38 30 20 73 65 63 s - RFC 5280 sec
58f0: 74 69 6f 6e 20 34 2e 32 2e 31 2e 35 2c 20 4e 49 tion 4.2.1.5, NI
5900: 44 5f 70 6f 6c 69 63 79 5f 6d 61 70 70 69 6e 67 D_policy_mapping
5910: 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 75 62 s */.. /* Sub
5920: 6a 65 63 74 20 41 6c 74 65 72 6e 61 74 69 76 65 ject Alternative
5930: 20 4e 61 6d 65 20 28 53 41 4e 29 20 63 6f 6e 74 Name (SAN) cont
5940: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 ains additional
5950: 55 52 4c 73 2c 20 44 4e 53 20 6e 61 6d 65 73 2c URLs, DNS names,
5960: 20 6f 72 20 49 50 0a 09 61 64 64 72 65 73 73 65 or IP..addresse
5970: 73 20 62 6f 75 6e 64 20 74 6f 20 63 65 72 74 69 s bound to certi
5980: 66 69 63 61 74 65 2e 20 52 46 43 20 35 32 38 30 ficate. RFC 5280
5990: 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 36 section 4.2.1.6
59a0: 2c 20 4e 49 44 5f 73 75 62 6a 65 63 74 5f 61 6c , NID_subject_al
59b0: 74 5f 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 t_name */. LA
59c0: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 PPEND_OBJ(interp
59d0: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 73 75 , resultObj, "su
59e0: 62 6a 65 63 74 41 6c 74 4e 61 6d 65 22 2c 20 54 bjectAltName", T
59f0: 6c 73 5f 78 35 30 39 4e 61 6d 65 73 28 69 6e 74 ls_x509Names(int
5a00: 65 72 70 2c 20 63 65 72 74 2c 20 4e 49 44 5f 73 erp, cert, NID_s
5a10: 75 62 6a 65 63 74 5f 61 6c 74 5f 6e 61 6d 65 2c ubject_alt_name,
5a20: 20 62 69 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 bio));.. /*
5a30: 49 73 73 75 65 72 20 41 6c 74 65 72 6e 61 74 69 Issuer Alternati
5a40: 76 65 20 4e 61 6d 65 20 69 73 20 75 73 65 64 20 ve Name is used
5a50: 74 6f 20 61 73 73 6f 63 69 61 74 65 20 49 6e 74 to associate Int
5a60: 65 72 6e 65 74 20 73 74 79 6c 65 20 69 64 65 6e ernet style iden
5a70: 74 69 74 69 65 73 0a 09 77 69 74 68 20 74 68 65 tities..with the
5a80: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73 certificate iss
5a90: 75 65 72 2e 20 52 46 43 20 35 32 38 30 20 73 65 uer. RFC 5280 se
5aa0: 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 37 2c 20 4e ction 4.2.1.7, N
5ab0: 49 44 5f 69 73 73 75 65 72 5f 61 6c 74 5f 6e 61 ID_issuer_alt_na
5ac0: 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e me */. LAPPEN
5ad0: 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 D_OBJ(interp, re
5ae0: 73 75 6c 74 4f 62 6a 2c 20 22 69 73 73 75 65 72 sultObj, "issuer
5af0: 41 6c 74 4e 61 6d 65 22 2c 20 54 6c 73 5f 78 35 AltName", Tls_x5
5b00: 30 39 4e 61 6d 65 73 28 69 6e 74 65 72 70 2c 20 09Names(interp,
5b10: 63 65 72 74 2c 20 4e 49 44 5f 69 73 73 75 65 72 cert, NID_issuer
5b20: 5f 61 6c 74 5f 6e 61 6d 65 2c 20 62 69 6f 29 29 _alt_name, bio))
5b30: 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 ;.. /* Subjec
5b40: 74 20 44 69 72 65 63 74 6f 72 79 20 41 74 74 72 t Directory Attr
5b50: 69 62 75 74 65 73 20 70 72 6f 76 69 64 65 73 20 ibutes provides
5b60: 69 64 65 6e 74 69 66 69 63 61 74 69 6f 6e 20 61 identification a
5b70: 74 74 72 69 62 75 74 65 73 20 28 65 2e 67 2e 2c ttributes (e.g.,
5b80: 20 6e 61 74 69 6f 6e 61 6c 69 74 79 29 0a 09 6f nationality)..o
5b90: 66 20 74 68 65 20 73 75 62 6a 65 63 74 2e 20 52 f the subject. R
5ba0: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 FC 5280 section
5bb0: 34 2e 32 2e 31 2e 38 20 28 73 75 62 6a 65 63 74 4.2.1.8 (subject
5bc0: 44 69 72 65 63 74 6f 72 79 41 74 74 72 69 62 75 DirectoryAttribu
5bd0: 74 65 73 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 tes) */.. /*
5be0: 42 61 73 69 63 20 43 6f 6e 73 74 72 61 69 6e 74 Basic Constraint
5bf0: 73 20 69 64 65 6e 74 69 66 69 65 73 20 77 68 65 s identifies whe
5c00: 74 68 65 72 20 74 68 65 20 73 75 62 6a 65 63 74 ther the subject
5c10: 20 6f 66 20 74 68 65 20 63 65 72 74 20 69 73 20 of the cert is
5c20: 61 20 43 41 20 61 6e 64 0a 09 74 68 65 20 6d 61 a CA and..the ma
5c30: 78 20 64 65 70 74 68 20 6f 66 20 76 61 6c 69 64 x depth of valid
5c40: 20 63 65 72 74 20 70 61 74 68 73 20 66 6f 72 20 cert paths for
5c50: 74 68 69 73 20 63 65 72 74 2e 20 52 46 43 20 35 this cert. RFC 5
5c60: 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 32 2e 280 section 4.2.
5c70: 31 2e 39 2c 20 4e 49 44 5f 62 61 73 69 63 5f 63 1.9, NID_basic_c
5c80: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 onstraints */.
5c90: 20 20 69 66 20 28 21 28 78 66 6c 61 67 73 20 26 if (!(xflags &
5ca0: 20 45 58 46 4c 41 47 5f 50 52 4f 58 59 29 29 20 EXFLAG_PROXY))
5cb0: 7b 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 {..LAPPEND_LONG(
5cc0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
5cd0: 6a 2c 20 22 70 61 74 68 4c 65 6e 22 2c 20 58 35 j, "pathLen", X5
5ce0: 30 39 5f 67 65 74 5f 70 61 74 68 6c 65 6e 28 63 09_get_pathlen(c
5cf0: 65 72 74 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 ert));. } els
5d00: 65 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e e {..LAPPEND_LON
5d10: 47 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 G(interp, result
5d20: 4f 62 6a 2c 20 22 70 61 74 68 4c 65 6e 22 2c 20 Obj, "pathLen",
5d30: 58 35 30 39 5f 67 65 74 5f 70 72 6f 78 79 5f 70 X509_get_proxy_p
5d40: 61 74 68 6c 65 6e 28 63 65 72 74 29 29 3b 0a 20 athlen(cert));.
5d50: 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 }. LAPPEND
5d60: 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 72 65 _BOOL(interp, re
5d70: 73 75 6c 74 4f 62 6a 2c 20 22 62 61 73 69 63 43 sultObj, "basicC
5d80: 6f 6e 73 74 72 61 69 6e 74 73 43 41 22 2c 20 78 onstraintsCA", x
5d90: 66 6c 61 67 73 20 26 20 45 58 46 4c 41 47 5f 43 flags & EXFLAG_C
5da0: 41 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 A);.. /* Name
5db0: 20 43 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20 Constraints is
5dc0: 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 43 41 20 only used in CA
5dd0: 63 65 72 74 73 20 74 6f 20 69 6e 64 69 63 61 74 certs to indicat
5de0: 65 20 74 68 65 20 6e 61 6d 65 20 73 70 61 63 65 e the name space
5df0: 20 66 6f 72 0a 09 61 6c 6c 20 73 75 62 6a 65 63 for..all subjec
5e00: 74 20 6e 61 6d 65 73 20 69 6e 20 73 75 62 73 65 t names in subse
5e10: 71 75 65 6e 74 20 63 65 72 74 69 66 69 63 61 74 quent certificat
5e20: 65 73 20 69 6e 20 61 20 63 65 72 74 69 66 69 63 es in a certific
5e30: 61 74 69 6f 6e 20 70 61 74 68 0a 09 4d 55 53 54 ation path..MUST
5e40: 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 52 46 43 be located. RFC
5e50: 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 34 2e 5280 section 4.
5e60: 32 2e 31 2e 31 30 2c 20 4e 49 44 5f 6e 61 6d 65 2.1.10, NID_name
5e70: 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a _constraints */.
5e80: 0a 20 20 20 20 2f 2a 20 50 6f 6c 69 63 79 20 43 . /* Policy C
5e90: 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20 6f 6e onstraints is on
5ea0: 6c 79 20 75 73 65 64 20 69 6e 20 43 41 20 63 65 ly used in CA ce
5eb0: 72 74 73 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 rts to limit the
5ec0: 20 6c 65 6e 67 74 68 20 6f 66 20 61 0a 09 63 65 length of a..ce
5ed0: 72 74 20 63 68 61 69 6e 20 66 6f 72 20 74 68 61 rt chain for tha
5ee0: 74 20 43 41 2e 20 52 46 43 20 35 32 38 30 20 73 t CA. RFC 5280 s
5ef0: 65 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 31 2c ection 4.2.1.11,
5f00: 20 4e 49 44 5f 70 6f 6c 69 63 79 5f 63 6f 6e 73 NID_policy_cons
5f10: 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 traints */..
5f20: 2f 2a 20 45 78 74 65 6e 64 65 64 20 4b 65 79 20 /* Extended Key
5f30: 55 73 61 67 65 20 69 6e 64 69 63 61 74 65 73 20 Usage indicates
5f40: 74 68 65 20 70 75 72 70 6f 73 65 73 20 74 68 65 the purposes the
5f50: 20 63 65 72 74 69 66 69 65 64 20 70 75 62 6c 69 certified publi
5f60: 63 20 6b 65 79 20 6d 61 79 20 62 65 0a 09 75 73 c key may be..us
5f70: 65 64 2c 20 62 65 79 6f 6e 64 20 74 68 65 20 62 ed, beyond the b
5f80: 61 73 69 63 20 70 75 72 70 6f 73 65 73 2e 20 52 asic purposes. R
5f90: 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e 20 FC 5280 section
5fa0: 34 2e 32 2e 31 2e 31 32 2c 20 4e 49 44 5f 65 78 4.2.1.12, NID_ex
5fb0: 74 5f 6b 65 79 5f 75 73 61 67 65 20 2a 2f 0a 20 t_key_usage */.
5fc0: 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 LAPPEND_OBJ(i
5fd0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
5fe0: 2c 20 22 65 78 74 65 6e 64 65 64 4b 65 79 55 73 , "extendedKeyUs
5ff0: 61 67 65 22 2c 20 54 6c 73 5f 78 35 30 39 45 78 age", Tls_x509Ex
6000: 74 4b 65 79 55 73 61 67 65 28 69 6e 74 65 72 70 tKeyUsage(interp
6010: 2c 20 63 65 72 74 2c 20 78 66 6c 61 67 73 29 29 , cert, xflags))
6020: 3b 0a 0a 20 20 20 20 2f 2a 20 43 52 4c 20 44 69 ;.. /* CRL Di
6030: 73 74 72 69 62 75 74 69 6f 6e 20 50 6f 69 6e 74 stribution Point
6040: 73 20 69 64 65 6e 74 69 66 69 65 73 20 77 68 65 s identifies whe
6050: 72 65 20 43 52 4c 20 69 6e 66 6f 72 6d 61 74 69 re CRL informati
6060: 6f 6e 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e on can be obtain
6070: 65 64 2e 0a 09 52 46 43 20 35 32 38 30 20 73 65 ed...RFC 5280 se
6080: 63 74 69 6f 6e 20 34 2e 32 2e 31 2e 31 33 2a 2f ction 4.2.1.13*/
6090: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a . LAPPEND_OBJ
60a0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
60b0: 62 6a 2c 20 22 63 72 6c 44 69 73 74 72 69 62 75 bj, "crlDistribu
60c0: 74 69 6f 6e 50 6f 69 6e 74 73 22 2c 20 54 6c 73 tionPoints", Tls
60d0: 5f 78 35 30 39 43 72 6c 44 70 28 69 6e 74 65 72 _x509CrlDp(inter
60e0: 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 p, cert));..
60f0: 2f 2a 20 46 72 65 73 68 65 73 74 20 43 52 4c 20 /* Freshest CRL
6100: 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 20 20 20 extension */.
6110: 20 69 66 20 28 78 66 6c 61 67 73 20 26 20 45 58 if (xflags & EX
6120: 46 4c 41 47 5f 46 52 45 53 48 45 53 54 29 20 7b FLAG_FRESHEST) {
6130: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 . }.. /* A
6140: 75 74 68 6f 72 69 74 79 20 49 6e 66 6f 72 6d 61 uthority Informa
6150: 74 69 6f 6e 20 41 63 63 65 73 73 20 69 6e 64 69 tion Access indi
6160: 63 61 74 65 73 20 68 6f 77 20 74 6f 20 61 63 63 cates how to acc
6170: 65 73 73 20 69 6e 66 6f 20 61 6e 64 20 73 65 72 ess info and ser
6180: 76 69 63 65 73 0a 09 66 6f 72 20 74 68 65 20 63 vices..for the c
6190: 65 72 74 69 66 69 63 61 74 65 20 69 73 73 75 65 ertificate issue
61a0: 72 2e 20 52 46 43 20 35 32 38 30 20 73 65 63 74 r. RFC 5280 sect
61b0: 69 6f 6e 20 34 2e 32 2e 32 2e 31 2c 20 4e 49 44 ion 4.2.2.1, NID
61c0: 5f 69 6e 66 6f 5f 61 63 63 65 73 73 20 2a 2f 0a _info_access */.
61d0: 0a 20 20 20 20 2f 2a 20 4f 6e 2d 6c 69 6e 65 20 . /* On-line
61e0: 43 65 72 74 69 66 69 63 61 74 65 20 53 74 61 74 Certificate Stat
61f0: 75 73 20 50 72 6f 74 6f 63 6f 6c 20 28 4f 53 43 us Protocol (OSC
6200: 50 29 20 52 65 73 70 6f 6e 64 65 72 73 20 55 52 P) Responders UR
6210: 4c 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 L */. LAPPEND
6220: 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 65 73 _OBJ(interp, res
6230: 75 6c 74 4f 62 6a 2c 20 22 6f 63 73 70 52 65 73 ultObj, "ocspRes
6240: 70 6f 6e 64 65 72 73 22 2c 20 54 6c 73 5f 78 35 ponders", Tls_x5
6250: 30 39 4f 73 63 70 28 69 6e 74 65 72 70 2c 20 63 09Oscp(interp, c
6260: 65 72 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 ert));.. /* C
6270: 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f ertificate Autho
6280: 72 69 74 79 20 28 43 41 29 20 49 73 73 75 65 72 rity (CA) Issuer
6290: 73 20 55 52 4c 20 2a 2f 0a 20 20 20 20 4c 41 50 s URL */. LAP
62a0: 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c PEND_OBJ(interp,
62b0: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 63 61 49 resultObj, "caI
62c0: 73 73 75 65 72 73 22 2c 20 54 6c 73 5f 78 35 30 ssuers", Tls_x50
62d0: 39 43 61 49 73 73 75 65 72 73 28 69 6e 74 65 72 9CaIssuers(inter
62e0: 70 2c 20 63 65 72 74 29 29 3b 0a 0a 20 20 20 20 p, cert));..
62f0: 2f 2a 20 53 75 62 6a 65 63 74 20 49 6e 66 6f 72 /* Subject Infor
6300: 6d 61 74 69 6f 6e 20 41 63 63 65 73 73 20 2d 20 mation Access -
6310: 52 46 43 20 35 32 38 30 20 73 65 63 74 69 6f 6e RFC 5280 section
6320: 20 34 2e 32 2e 32 2e 32 2c 20 4e 49 44 5f 73 69 4.2.2.2, NID_si
6330: 6e 66 6f 5f 61 63 63 65 73 73 20 2a 2f 0a 0a 20 nfo_access */..
6340: 20 20 20 2f 2a 20 43 65 72 74 69 66 69 63 61 74 /* Certificat
6350: 65 20 41 6c 69 61 73 2e 20 49 66 20 75 73 65 73 e Alias. If uses
6360: 20 61 20 50 4b 43 53 23 31 32 20 73 74 72 75 63 a PKCS#12 struc
6370: 74 75 72 65 2c 20 61 6c 69 61 73 20 77 69 6c 6c ture, alias will
6380: 20 72 65 66 6c 65 63 74 20 74 68 65 0a 09 66 72 reflect the..fr
6390: 69 65 6e 64 6c 79 4e 61 6d 65 20 61 74 74 72 69 iendlyName attri
63a0: 62 75 74 65 20 28 52 46 43 20 32 39 38 35 29 2e bute (RFC 2985).
63b0: 20 2a 2f 0a 20 20 20 20 7b 0a 09 69 6e 74 20 69 */. {..int i
63c0: 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 len = 0;.
63d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
63e0: 73 74 72 69 6e 67 20 3d 20 58 35 30 39 5f 61 6c string = X509_al
63f0: 69 61 73 5f 67 65 74 30 28 63 65 72 74 2c 20 26 ias_get0(cert, &
6400: 69 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f ilen);..LAPPEND_
6410: 53 54 52 28 69 6e 74 65 72 70 2c 20 72 65 73 75 STR(interp, resu
6420: 6c 74 4f 62 6a 2c 20 22 61 6c 69 61 73 22 2c 20 ltObj, "alias",
6430: 28 63 68 61 72 20 2a 29 20 73 74 72 69 6e 67 2c (char *) string,
6440: 20 28 54 63 6c 5f 53 69 7a 65 29 20 69 6c 65 6e (Tcl_Size) ilen
6450: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e );. strin
6460: 67 20 3d 20 58 35 30 39 5f 6b 65 79 69 64 5f 67 g = X509_keyid_g
6470: 65 74 30 28 63 65 72 74 2c 20 26 69 6c 65 6e 29 et0(cert, &ilen)
6480: 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
6490: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
64a0: 2c 20 22 6b 65 79 49 64 22 2c 20 28 63 68 61 72 , "keyId", (char
64b0: 20 2a 29 20 73 74 72 69 6e 67 2c 20 28 54 63 6c *) string, (Tcl
64c0: 5f 53 69 7a 65 29 20 69 6c 65 6e 29 3b 0a 20 20 _Size) ilen);.
64d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 65 72 74 }.. /* Cert
64e0: 69 66 69 63 61 74 65 20 61 6e 64 20 64 75 6d 70 ificate and dump
64f0: 20 61 6c 6c 20 64 61 74 61 20 2a 2f 0a 20 20 20 all data */.
6500: 20 69 66 20 28 61 6c 6c 29 20 7b 0a 09 54 63 6c if (all) {..Tcl
6510: 5f 4f 62 6a 20 2a 61 6c 6c 4f 62 6a 20 3d 20 54 _Obj *allObj = T
6520: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f cl_NewByteArrayO
6530: 62 6a 28 4e 55 4c 4c 2c 20 30 29 3b 0a 09 54 63 bj(NULL, 0);..Tc
6540: 6c 5f 4f 62 6a 20 2a 63 65 72 74 4f 62 6a 20 3d l_Obj *certObj =
6550: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 Tcl_NewByteArra
6560: 79 4f 62 6a 28 4e 55 4c 4c 2c 20 30 29 3b 0a 09 yObj(NULL, 0);..
6570: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 unsigned char *a
6580: 6c 6c 53 74 72 2c 20 2a 63 65 72 74 53 74 72 3b llStr, *certStr;
6590: 0a 0a 09 69 66 20 28 61 6c 6c 4f 62 6a 20 3d 3d ...if (allObj ==
65a0: 20 4e 55 4c 4c 20 7c 7c 20 63 65 72 74 4f 62 6a NULL || certObj
65b0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 == NULL) {..
65c0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
65d0: 74 28 61 6c 6c 4f 62 6a 29 3b 0a 09 20 20 20 20 t(allObj);..
65e0: 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 BIO_free(bio);..
65f0: 20 20 20 20 63 6b 66 72 65 65 28 62 75 66 66 65 ckfree(buffe
6600: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
6610: 72 65 73 75 6c 74 4f 62 6a 3b 0a 09 7d 0a 0a 09 resultObj;..}...
6620: 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61 /* Get certifica
6630: 74 65 20 2a 2f 0a 09 63 65 72 74 53 74 72 20 3d te */..certStr =
6640: 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 Tcl_SetByteArra
6650: 79 4c 65 6e 67 74 68 28 63 65 72 74 4f 62 6a 2c yLength(certObj,
6660: 20 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 29 3b CERT_STR_SIZE);
6670: 0a 09 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f 5f 42 ..len = BIO_to_B
6680: 75 66 66 65 72 28 50 45 4d 5f 77 72 69 74 65 5f uffer(PEM_write_
6690: 62 69 6f 5f 58 35 30 39 28 62 69 6f 2c 20 63 65 bio_X509(bio, ce
66a0: 72 74 29 2c 20 62 69 6f 2c 20 63 65 72 74 53 74 rt), bio, certSt
66b0: 72 2c 20 43 45 52 54 5f 53 54 52 5f 53 49 5a 45 r, CERT_STR_SIZE
66c0: 29 3b 0a 09 54 63 6c 5f 53 65 74 42 79 74 65 41 );..Tcl_SetByteA
66d0: 72 72 61 79 4c 65 6e 67 74 68 28 63 65 72 74 4f rrayLength(certO
66e0: 62 6a 2c 20 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 bj, len);..LAPPE
66f0: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 72 ND_OBJ(interp, r
6700: 65 73 75 6c 74 4f 62 6a 2c 20 22 63 65 72 74 69 esultObj, "certi
6710: 66 69 63 61 74 65 22 2c 20 63 65 72 74 4f 62 6a ficate", certObj
6720: 29 0a 0a 09 2f 2a 20 47 65 74 20 61 6c 6c 20 69 ).../* Get all i
6730: 6e 66 6f 20 6f 6e 20 63 65 72 74 69 66 69 63 61 nfo on certifica
6740: 74 65 20 2a 2f 0a 09 61 6c 6c 53 74 72 20 3d 20 te */..allStr =
6750: 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 Tcl_SetByteArray
6760: 4c 65 6e 67 74 68 28 61 6c 6c 4f 62 6a 2c 20 43 Length(allObj, C
6770: 45 52 54 5f 53 54 52 5f 53 49 5a 45 20 2a 20 32 ERT_STR_SIZE * 2
6780: 29 3b 0a 09 6c 65 6e 20 3d 20 42 49 4f 5f 74 6f );..len = BIO_to
6790: 5f 42 75 66 66 65 72 28 58 35 30 39 5f 70 72 69 _Buffer(X509_pri
67a0: 6e 74 5f 65 78 28 62 69 6f 2c 20 63 65 72 74 2c nt_ex(bio, cert,
67b0: 20 66 6c 61 67 73 2c 20 30 29 2c 20 62 69 6f 2c flags, 0), bio,
67c0: 20 61 6c 6c 53 74 72 2c 20 43 45 52 54 5f 53 54 allStr, CERT_ST
67d0: 52 5f 53 49 5a 45 20 2a 20 32 29 3b 0a 09 54 63 R_SIZE * 2);..Tc
67e0: 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65 l_SetByteArrayLe
67f0: 6e 67 74 68 28 61 6c 6c 4f 62 6a 2c 20 6c 65 6e ngth(allObj, len
6800: 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 );..LAPPEND_OBJ(
6810: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
6820: 6a 2c 20 22 61 6c 6c 22 2c 20 61 6c 6c 4f 62 6a j, "all", allObj
6830: 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 42 49 4f ). }.. BIO
6840: 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20 20 _free(bio);.
6850: 63 6b 66 72 65 65 28 62 75 66 66 65 72 29 3b 0a ckfree(buffer);.
6860: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c return resul
6870: 74 4f 62 6a 3b 0a 7d 0a tObj;.}.