0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61 (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69 some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68 ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32 pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72 ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79 poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53 right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29 *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61 2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 ka SSL) Channel
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64 - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63 on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50 uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68 st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65 based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70 rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64 * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61 dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64 .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74 ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 full fileevent
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 Also work done
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68 ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 e impetus to do
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64 cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 pts.h".#include
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0390: 63 72 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 crypto.h>.#inclu
03a0: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e de <openssl/ssl.
03b0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 h>.#include <ope
03c0: 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 23 69 6e 63 nssl/evp.h>.#inc
03d0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 62 lude <openssl/ob
03e0: 6a 65 63 74 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 jects.h>.#includ
03f0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 72 73 61 2e 68 e <openssl/rsa.h
0400: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e >.#include <open
0410: 73 73 6c 2f 73 61 66 65 73 74 61 63 6b 2e 68 3e ssl/safestack.h>
0420: 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 65 6e 53 53 4c ../* Min OpenSSL
0430: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 23 69 66 20 version */.#if
0440: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
0450: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 NUMBER < 0x10101
0460: 30 30 30 4c 0a 23 65 72 72 6f 72 20 22 4f 6e 6c 000L.#error "Onl
0470: 79 20 4f 70 65 6e 53 53 4c 20 76 31 2e 31 2e 31 y OpenSSL v1.1.1
0480: 20 6f 72 20 6c 61 74 65 72 20 69 73 20 73 75 70 or later is sup
0490: 70 6f 72 74 65 64 22 0a 23 65 6e 64 69 66 0a 0a ported".#endif..
04a0: 2f 2a 0a 20 2a 20 45 78 74 65 72 6e 61 6c 20 66 /*. * External f
04b0: 75 6e 63 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 2f 2a unctions. */../*
04c0: 0a 20 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c . * Forward decl
04d0: 61 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 23 64 arations. */..#d
04e0: 65 66 69 6e 65 20 46 32 4e 28 6b 65 79 2c 20 64 efine F2N(key, d
04f0: 73 70 29 20 5c 0a 09 28 28 28 6b 65 79 29 20 3d sp) \..(((key) =
0500: 3d 20 4e 55 4c 4c 29 20 3f 20 28 63 68 61 72 20 = NULL) ? (char
0510: 2a 29 20 4e 55 4c 4c 20 3a 20 5c 0a 09 09 54 63 *) NULL : \...Tc
0520: 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e l_TranslateFileN
0530: 61 6d 65 28 69 6e 74 65 72 70 2c 20 28 6b 65 79 ame(interp, (key
0540: 29 2c 20 28 64 73 70 29 29 29 0a 23 64 65 66 69 ), (dsp))).#defi
0550: 6e 65 20 52 45 41 53 4f 4e 28 29 09 45 52 52 5f ne REASON().ERR_
0560: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 reason_error_str
0570: 69 6e 67 28 45 52 52 5f 67 65 74 5f 65 72 72 6f ing(ERR_get_erro
0580: 72 28 29 29 0a 0a 73 74 61 74 69 63 20 53 53 4c r())..static SSL
0590: 5f 43 54 58 20 2a 43 54 58 5f 49 6e 69 74 28 53 _CTX *CTX_Init(S
05a0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 tate *statePtr,
05b0: 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e int isServer, in
05c0: 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b t proto, char *k
05d0: 65 79 2c 0a 09 09 63 68 61 72 20 2a 63 65 72 74 ey,...char *cert
05e0: 66 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 file, unsigned c
05f0: 68 61 72 20 2a 6b 65 79 5f 61 73 6e 31 2c 20 75 har *key_asn1, u
0600: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 nsigned char *ce
0610: 72 74 5f 61 73 6e 31 2c 0a 09 09 69 6e 74 20 6b rt_asn1,...int k
0620: 65 79 5f 61 73 6e 31 5f 6c 65 6e 2c 20 69 6e 74 ey_asn1_len, int
0630: 20 63 65 72 74 5f 61 73 6e 31 5f 6c 65 6e 2c 20 cert_asn1_len,
0640: 63 68 61 72 20 2a 43 41 64 69 72 2c 20 63 68 61 char *CAdir, cha
0650: 72 20 2a 43 41 66 69 6c 65 2c 0a 09 09 63 68 61 r *CAfile,...cha
0660: 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 r *ciphers, char
0670: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 *ciphersuites,
0680: 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 int level, char
0690: 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a 73 74 61 *DHparams);..sta
06a0: 74 69 63 20 69 6e 74 09 54 6c 73 4c 69 62 49 6e tic int.TlsLibIn
06b0: 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c it(int uninitial
06c0: 69 7a 65 29 3b 0a 0a 23 64 65 66 69 6e 65 20 54 ize);..#define T
06d0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 09 09 30 LS_PROTO_SSL2..0
06e0: 78 30 31 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f x01.#define TLS_
06f0: 50 52 4f 54 4f 5f 53 53 4c 33 09 09 30 78 30 32 PROTO_SSL3..0x02
0700: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f .#define TLS_PRO
0710: 54 4f 5f 54 4c 53 31 09 09 30 78 30 34 0a 23 64 TO_TLS1..0x04.#d
0720: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f efine TLS_PROTO_
0730: 54 4c 53 31 5f 31 09 30 78 30 38 0a 23 64 65 66 TLS1_1.0x08.#def
0740: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ine TLS_PROTO_TL
0750: 53 31 5f 32 09 30 78 31 30 0a 23 64 65 66 69 6e S1_2.0x10.#defin
0760: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
0770: 5f 33 09 30 78 32 30 0a 23 64 65 66 69 6e 65 20 _3.0x20.#define
0780: 45 4e 41 42 4c 45 44 28 66 6c 61 67 2c 20 6d 61 ENABLED(flag, ma
0790: 73 6b 29 09 28 28 28 66 6c 61 67 29 20 26 20 28 sk).(((flag) & (
07a0: 6d 61 73 6b 29 29 20 3d 3d 20 28 6d 61 73 6b 29 mask)) == (mask)
07b0: 29 0a 0a 23 64 65 66 69 6e 65 20 53 53 4c 4b 45 )..#define SSLKE
07c0: 59 4c 4f 47 46 49 4c 45 09 09 22 53 53 4c 4b 45 YLOGFILE.."SSLKE
07d0: 59 4c 4f 47 46 49 4c 45 22 0a 0a 2f 2a 0a 20 2a YLOGFILE"../*. *
07e0: 20 53 74 61 74 69 63 20 64 61 74 61 20 73 74 72 Static data str
07f0: 75 63 74 75 72 65 73 0a 20 2a 2f 0a 0a 23 69 66 uctures. */..#if
0800: 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ndef OPENSSL_NO_
0810: 44 48 0a 23 69 6e 63 6c 75 64 65 20 22 64 68 5f DH.#include "dh_
0820: 70 61 72 61 6d 73 2e 68 22 0a 23 65 6e 64 69 66 params.h".#endif
0830: 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 2d 53 ../*. * Thread-S
0840: 61 66 65 20 54 4c 53 20 43 6f 64 65 0a 20 2a 2f afe TLS Code. */
0850: 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f 54 48 52 ..#ifdef TCL_THR
0860: 45 41 44 53 0a 23 64 65 66 69 6e 65 20 4f 50 45 EADS.#define OPE
0870: 4e 53 53 4c 5f 54 48 52 45 41 44 5f 44 45 46 49 NSSL_THREAD_DEFI
0880: 4e 45 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 NES.#include <op
0890: 65 6e 73 73 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e enssl/opensslcon
08a0: 66 2e 68 3e 0a 0a 23 69 66 64 65 66 20 4f 50 45 f.h>..#ifdef OPE
08b0: 4e 53 53 4c 5f 54 48 52 45 41 44 53 0a 23 69 6e NSSL_THREADS.#in
08c0: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 clude <openssl/c
08d0: 72 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 rypto.h>.#includ
08e0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e 68 e <openssl/ssl.h
08f0: 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 65 >../*. * Threade
0900: 64 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 71 75 d operation requ
0910: 69 72 65 73 20 6c 6f 63 6b 69 6e 67 20 63 61 6c ires locking cal
0920: 6c 62 61 63 6b 73 0a 20 2a 20 42 61 73 65 64 20 lbacks. * Based
0930: 66 72 6f 6d 20 2f 63 72 79 70 74 6f 2f 63 72 79 from /crypto/cry
0940: 70 74 6c 69 62 2e 63 20 6f 66 20 4f 70 65 6e 53 ptlib.c of OpenS
0950: 53 4c 20 61 6e 64 20 4e 53 4f 70 65 6e 53 53 4c SL and NSOpenSSL
0960: 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 .. */..static Tc
0970: 6c 5f 4d 75 74 65 78 20 2a 6c 6f 63 6b 73 20 3d l_Mutex *locks =
0980: 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 69 6e NULL;.static in
0990: 74 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 t locksCount = 0
09a0: 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 ;.static Tcl_Mut
09b0: 65 78 20 69 6e 69 74 5f 6d 78 3b 0a 23 65 6e 64 ex init_mx;.#end
09c0: 69 66 20 2f 2a 20 4f 50 45 4e 53 53 4c 5f 54 48 if /* OPENSSL_TH
09d0: 52 45 41 44 53 20 2a 2f 0a 23 65 6e 64 69 66 20 READS */.#endif
09e0: 2f 2a 20 54 43 4c 5f 54 48 52 45 41 44 53 20 2a /* TCL_THREADS *
09f0: 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /..../**********
0a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 **********/./* C
0a10: 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 20 20 20 allbacks
0a20: 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./************
0a30: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a ********/../*. *
0a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a80: 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 76 61 6c 20 43 ---. *. * Eval C
0a90: 61 6c 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e 64 20 allback Command
0aa0: 2d 2d 0a 20 2a 0a 20 2a 09 45 76 61 6c 20 63 61 --. *. *.Eval ca
0ab0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 61 llback command a
0ac0: 6e 64 20 63 61 74 63 68 20 61 6e 79 20 65 72 72 nd catch any err
0ad0: 6f 72 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ors. *. * Result
0ae0: 73 3a 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d 61 6e s:. *.0 = Comman
0af0: 64 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 20 d returned fail
0b00: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64 or eval returned
0b10: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 09 31 20 TCL_ERROR. *.1
0b20: 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e = Command return
0b30: 65 64 20 73 75 63 63 65 73 73 20 6f 72 20 65 76 ed success or ev
0b40: 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c 5f al returned TCL_
0b50: 4f 4b 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 OK. *. * Side ef
0b60: 66 65 63 74 73 3a 0a 20 2a 09 45 76 61 6c 75 61 fects:. *.Evalua
0b70: 74 65 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d tes callback com
0b80: 6d 61 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d mand. *. *------
0b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
0bd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 45 76 61 /.static int.Eva
0be0: 6c 43 61 6c 6c 62 61 63 6b 28 54 63 6c 5f 49 6e lCallback(Tcl_In
0bf0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 53 74 terp *interp, St
0c00: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 54 ate *statePtr, T
0c10: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 29 20 cl_Obj *cmdPtr)
0c20: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 {. int code,
0c30: 6f 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 54 63 6c ok = 0;.. Tcl
0c40: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
0c50: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a tData) interp);.
0c60: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
0c70: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 ((ClientData) st
0c80: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a atePtr);.. /*
0c90: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 77 Eval callback w
0ca0: 69 74 68 20 73 75 63 63 65 73 73 20 66 6f 72 20 ith success for
0cb0: 6f 6b 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c ok or return val
0cc0: 75 65 20 31 2c 20 66 61 69 6c 20 66 6f 72 20 65 ue 1, fail for e
0cd0: 72 72 6f 72 20 6f 72 20 72 65 74 75 72 6e 20 76 rror or return v
0ce0: 61 6c 75 65 20 30 20 2a 2f 0a 20 20 20 20 54 63 alue 0 */. Tc
0cf0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e l_ResetResult(in
0d00: 74 65 72 70 29 3b 0a 20 20 20 20 63 6f 64 65 20 terp);. code
0d10: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 = Tcl_EvalObjEx(
0d20: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
0d30: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
0d40: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d ;. if (code =
0d50: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 = TCL_OK) {../*
0d60: 43 68 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72 Check result for
0d70: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f return value */
0d80: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c ..Tcl_Obj *resul
0d90: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 t = Tcl_GetObjRe
0da0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 sult(interp);..i
0db0: 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c f (result == NUL
0dc0: 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 L || Tcl_GetIntF
0dd0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72 romObj(interp, r
0de0: 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54 esult, &ok) != T
0df0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b CL_OK) {.. ok
0e00: 20 3d 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 = 1;..}. } e
0e10: 6c 73 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 lse {../* Error
0e20: 2d 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 - reject the cer
0e30: 74 69 66 69 63 61 74 65 20 2a 2f 0a 23 69 66 20 tificate */.#if
0e40: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 (TCL_MAJOR_VERSI
0e50: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c ON == 8) && (TCL
0e60: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c _MINOR_VERSION <
0e70: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 6)..Tcl_Backgro
0e80: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 undError(interp)
0e90: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 ;.#else..Tcl_Bac
0ea0: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e kgroundException
0eb0: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a (interp, code);.
0ec0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
0ed0: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 Tcl_Release((C
0ee0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
0ef0: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 Ptr);. Tcl_Re
0f00: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 lease((ClientDat
0f10: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 a) interp);.
0f20: 72 65 74 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f return ok;.}.../
0f30: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e -------. *. * In
0f80: 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a foCallback --. *
0f90: 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c . *.Monitors SSL
0fa0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 connection proc
0fb0: 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ess. *. * Result
0fc0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
0fd0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
0fe0: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
0ff0: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
1000: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1040: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
1050: 63 20 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 c void.InfoCallb
1060: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 ack(const SSL *s
1070: 73 6c 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 sl, int where, i
1080: 6e 74 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74 nt ret) {. St
1090: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
10a0: 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f (State*)SSL_get_
10b0: 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 app_data((SSL *)
10c0: 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e ssl);. Tcl_In
10d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
10e0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
10f0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d . Tcl_Obj *cm
1100: 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a dPtr;. char *
1110: 6d 61 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e major; char *min
1120: 6f 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 or;.. dprintf
1130: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
1140: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
1150: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f allback == (Tcl_
1160: 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 Obj*)NULL)..retu
1170: 72 6e 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 rn;.. if (whe
1180: 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 re & SSL_CB_HAND
1190: 53 48 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 SHAKE_START) {..
11a0: 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 major = "handsha
11b0: 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 ke";..minor = "s
11c0: 74 61 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 tart";. } els
11d0: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 e if (where & SS
11e0: 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 L_CB_HANDSHAKE_D
11f0: 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 ONE) {..major =
1200: 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 "handshake";..mi
1210: 6e 6f 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 nor = "done";.
1220: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 } else {..if (
1230: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 where & SSL_CB_A
1240: 4c 45 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 LERT)..major = "
1250: 61 6c 65 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 alert";..else if
1260: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 (where & SSL_ST
1270: 5f 43 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 _CONNECT).major
1280: 3d 20 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c = "connect";..el
1290: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
12a0: 53 4c 5f 53 54 5f 41 43 43 45 50 54 29 09 09 6d SL_ST_ACCEPT)..m
12b0: 61 6a 6f 72 20 3d 20 22 61 63 63 65 70 74 22 3b ajor = "accept";
12c0: 0a 09 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 ..else.....major
12d0: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 = "unknown";...
12e0: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
12f0: 43 42 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 CB_READ)..minor
1300: 3d 20 22 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 = "read";..else
1310: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
1320: 43 42 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 CB_WRITE)..minor
1330: 20 3d 20 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 = "write";..els
1340: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 e if (where & SS
1350: 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f L_CB_LOOP)..mino
1360: 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 r = "loop";..els
1370: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 e if (where & SS
1380: 4c 5f 43 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f L_CB_EXIT)..mino
1390: 72 20 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 r = "exit";..els
13a0: 65 09 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 e.....minor = "u
13b0: 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a nknown";. }..
13c0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f /* Create co
13d0: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f mmand to eval */
13e0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 . cmdPtr = Tc
13f0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 l_DuplicateObj(s
1400: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
1410: 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 k);. Tcl_List
1420: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1430: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
1440: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1450: 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a j("info", -1));.
1460: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
1470: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
1480: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
1490: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
14a0: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
14b0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
14c0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
14d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
14e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
14f0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
1500: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72 wStringObj(major
1510: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
1520: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1530: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1540: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
1550: 6e 67 4f 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 ngObj(minor, -1)
1560: 29 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 );.. if (wher
1570: 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 e & SSL_CB_ALERT
1580: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ) {..Tcl_ListObj
1590: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
15a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
15b0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
15c0: 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65 Obj(SSL_alert_de
15d0: 73 63 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 sc_string_long(r
15e0: 65 74 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f et), -1));..Tcl_
15f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1600: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1610: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
1620: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 wStringObj(SSL_a
1630: 6c 65 72 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 lert_type_string
1640: 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 _long(ret), -1))
1650: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
1660: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1670: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1680: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
1690: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 l_NewStringObj(S
16a0: 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f SL_state_string_
16b0: 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b long(ssl), -1));
16c0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
16d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
16e0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
16f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 ewStringObj("inf
1700: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a o", -1));. }.
1710: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
1720: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
1730: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
1740: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
1750: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 EvalCallback(
1760: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
1770: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 , cmdPtr);. T
1780: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
1790: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a cmdPtr);.}.../*.
17a0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
17b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17e0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 -----. *. * Mess
17f0: 61 67 65 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 ageCallback --.
1800: 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 *. *.Monitors SS
1810: 4c 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 L protocol messa
1820: 67 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ges. *. * Result
1830: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
1840: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
1850: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
1860: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
1870: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
1880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64 ------. */.#ifnd
18c0: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ef OPENSSL_NO_SS
18d0: 4c 5f 54 52 41 43 45 0a 73 74 61 74 69 63 20 76 L_TRACE.static v
18e0: 6f 69 64 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62 oid.MessageCallb
18f0: 61 63 6b 28 69 6e 74 20 77 72 69 74 65 5f 70 2c ack(int write_p,
1900: 20 69 6e 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e int version, in
1910: 74 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 t content_type,
1920: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 75 66 2c const void *buf,
1930: 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c size_t len, SSL
1940: 20 2a 73 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67 *ssl, void *arg
1950: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
1960: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
1970: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 *)arg;. Tcl_I
1980: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
1990: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
19a0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
19b0: 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 mdPtr;. char
19c0: 2a 76 65 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20 *ver, *type;.
19d0: 20 42 49 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63 BIO *bio;. c
19e0: 68 61 72 20 62 75 66 66 65 72 5b 31 35 30 30 30 har buffer[15000
19f0: 5d 3b 0a 20 20 20 20 62 75 66 66 65 72 5b 30 5d ];. buffer[0]
1a00: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e = 0;.. dprin
1a10: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
1a20: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
1a30: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 >callback == (Tc
1a40: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 l_Obj*)NULL)..re
1a50: 74 75 72 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63 turn;.. switc
1a60: 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66 h(version) {.#if
1a70: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
1a80: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
1a90: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 0000L && !define
1aa0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 d(NO_SSL2) && !d
1ab0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
1ac0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 O_SSL2). case
1ad0: 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 SSL2_VERSION:..
1ae0: 76 65 72 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09 ver = "SSLv2";..
1af0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
1b00: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 f !defined(NO_SS
1b10: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
1b20: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
1b30: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 56 . case SSL3_V
1b40: 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 ERSION:..ver = "
1b50: 53 53 4c 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a SSLv3";..break;.
1b60: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 #endif. case
1b70: 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 TLS1_VERSION:..v
1b80: 65 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 er = "TLSv1";..b
1b90: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 reak;. case T
1ba0: 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 LS1_1_VERSION:..
1bb0: 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b ver = "TLSv1.1";
1bc0: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ..break;. cas
1bd0: 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e e TLS1_2_VERSION
1be0: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e :..ver = "TLSv1.
1bf0: 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 2";..break;.
1c00: 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 case TLS1_3_VERS
1c10: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 ION:..ver = "TLS
1c20: 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 v1.3";..break;.
1c30: 20 20 20 63 61 73 65 20 30 3a 0a 09 76 65 72 20 case 0:..ver
1c40: 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65 61 6b = "none";..break
1c50: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 ;. default:..
1c60: 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b ver = "unknown";
1c70: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a ..break;. }..
1c80: 20 20 20 20 73 77 69 74 63 68 20 28 63 6f 6e 74 switch (cont
1c90: 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20 20 20 ent_type) {.
1ca0: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 45 41 case SSL3_RT_HEA
1cb0: 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 DER:..type = "He
1cc0: 61 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 ader";..break;.
1cd0: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f case SSL3_RT_
1ce0: 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f 54 59 INNER_CONTENT_TY
1cf0: 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 49 6e 6e PE:..type = "Inn
1d00: 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 70 65 22 er Content Type"
1d10: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ;..break;. ca
1d20: 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41 4e 47 se SSL3_RT_CHANG
1d30: 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a 0a 09 E_CIPHER_SPEC:..
1d40: 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65 20 43 type = "Change C
1d50: 69 70 68 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a ipher";..break;.
1d60: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 case SSL3_RT
1d70: 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d 20 _ALERT:..type =
1d80: 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 61 6b 3b "Alert";..break;
1d90: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 . case SSL3_R
1da0: 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79 T_HANDSHAKE:..ty
1db0: 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b 65 22 pe = "Handshake"
1dc0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ;..break;. ca
1dd0: 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49 se SSL3_RT_APPLI
1de0: 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 CATION_DATA:..ty
1df0: 70 65 20 3d 20 22 41 70 70 20 44 61 74 61 22 3b pe = "App Data";
1e00: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ..break;. cas
1e10: 65 20 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 54 e DTLS1_RT_HEART
1e20: 42 45 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 48 BEAT:..type = "H
1e30: 65 61 72 74 62 65 61 74 22 3b 0a 09 62 72 65 61 eartbeat";..brea
1e40: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a k;. default:.
1e50: 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e .type = "unknown
1e60: 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a ";. }.. /*
1e70: 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65 20 74 Needs compile t
1e80: 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62 ime option "enab
1e90: 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a le-ssl-trace". *
1ea0: 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f 20 3d /. if ((bio =
1eb0: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d BIO_new(BIO_s_m
1ec0: 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 em())) != NULL)
1ed0: 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 {..int n;..SSL_t
1ee0: 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20 76 65 race(write_p, ve
1ef0: 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 rsion, content_t
1f00: 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73 ype, buf, len, s
1f10: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69 6f 29 sl, (void *)bio)
1f20: 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 ;..n = BIO_read(
1f30: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 6d 69 6e bio, buffer, min
1f40: 28 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f (BIO_pending(bio
1f50: 29 2c 20 31 34 39 39 39 29 29 3b 0a 09 6e 20 3d ), 14999));..n =
1f60: 20 28 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a (n<0) ? 0 : n;.
1f70: 09 62 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a .buffer[n] = 0;.
1f80: 09 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 .(void)BIO_flush
1f90: 28 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 (bio);..BIO_free
1fa0: 28 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 (bio);. }..
1fb0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
1fc0: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
1fd0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
1fe0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
1ff0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
2000: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2010: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2020: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
2030: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
2040: 6d 65 73 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a message", -1));.
2050: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2060: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2070: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
2080: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
2090: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
20a0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
20b0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
20c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
20d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
20e0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
20f0: 77 53 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 65 wStringObj(write
2100: 5f 70 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 52 _p ? "Sent" : "R
2110: 65 63 65 69 76 65 64 22 2c 20 2d 31 29 29 3b 0a eceived", -1));.
2120: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2130: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2140: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
2150: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 65 _NewStringObj(ve
2160: 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c r, -1));. Tcl
2170: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
2180: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
2190: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
21a0: 69 6e 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 29 ingObj(type, -1)
21b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
21c0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
21d0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
21e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
21f0: 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 0a (buffer, -1));..
2200: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
2210: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
2220: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
2230: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
2240: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 EvalCallback(i
2250: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
2260: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 cmdPtr);. Tc
2270: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
2280: 6d 64 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 mdPtr);.}.#endif
2290: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
22e0: 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b * VerifyCallback
22f0: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f --. *. *.Monito
2300: 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 rs SSL certifica
2310: 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 te validation pr
2320: 6f 63 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63 ocess. Used to c
2330: 6f 6e 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65 ontrol the. *.be
2340: 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20 havior when the
2350: 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20 SSL_VERIFY_PEER
2360: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 flag is set. Thi
2370: 73 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77 s is called. *.w
2380: 68 65 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 henever a certif
2390: 69 63 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 icate is inspect
23a0: 65 64 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e ed or decided in
23b0: 76 61 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 6f valid. Called fo
23c0: 72 0a 20 2a 09 65 61 63 68 20 63 65 72 74 69 66 r. *.each certif
23d0: 69 63 61 74 65 20 69 6e 20 74 68 65 20 63 65 72 icate in the cer
23e0: 74 20 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43 t chain.. *. * C
23f0: 68 65 63 6b 73 3a 0a 20 2a 09 63 65 72 74 69 66 hecks:. *.certif
2400: 69 63 61 74 65 20 63 68 61 69 6e 20 69 73 20 63 icate chain is c
2410: 68 65 63 6b 65 64 20 73 74 61 72 74 69 6e 67 20 hecked starting
2420: 77 69 74 68 20 74 68 65 20 64 65 65 70 65 73 74 with the deepest
2430: 20 6e 65 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 nesting level.
2440: 2a 09 20 20 28 74 68 65 20 72 6f 6f 74 20 43 41 *. (the root CA
2450: 20 63 65 72 74 69 66 69 63 61 74 65 29 20 61 6e certificate) an
2460: 64 20 77 6f 72 6b 65 64 20 75 70 77 61 72 64 20 d worked upward
2470: 74 6f 20 74 68 65 20 70 65 65 72 27 73 20 63 65 to the peer's ce
2480: 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c rtificate.. *.Al
2490: 6c 20 73 69 67 6e 61 74 75 72 65 73 20 61 72 65 l signatures are
24a0: 20 76 61 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 valid, current
24b0: 74 69 6d 65 20 69 73 20 77 69 74 68 69 6e 20 66 time is within f
24c0: 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 76 61 irst and last va
24d0: 6c 69 64 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 lidity time.. *.
24e0: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 63 Check that the c
24f0: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 73 ertificate is is
2500: 73 75 65 64 20 62 79 20 74 68 65 20 69 73 73 75 sued by the issu
2510: 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20 69 er certificate i
2520: 73 73 75 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 ssuer.. *.Check
2530: 74 68 65 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 the revocation s
2540: 74 61 74 75 73 20 66 6f 72 20 65 61 63 68 20 63 tatus for each c
2550: 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 ertificate.. *.C
2560: 68 65 63 6b 20 74 68 65 20 76 61 6c 69 64 69 74 heck the validit
2570: 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 43 y of the given C
2580: 52 4c 20 61 6e 64 20 74 68 65 20 63 65 72 74 20 RL and the cert
2590: 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 revocation statu
25a0: 73 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 s.. *.Check the
25b0: 70 6f 6c 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 policies of all
25c0: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 73 the certificates
25d0: 0a 20 2a 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 . *. * Args. *.p
25e0: 72 65 76 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 reverify_ok indi
25f0: 63 61 74 65 73 20 77 68 65 74 68 65 72 20 74 68 cates whether th
2600: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 76 65 e certificate ve
2610: 72 69 66 69 63 61 74 69 6f 6e 20 70 61 73 73 65 rification passe
2620: 64 20 28 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 d (1) or not (0)
2630: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
2640: 20 2a 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f *.A callback bo
2650: 75 6e 64 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 und to the socke
2660: 74 20 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 t may return one
2670: 20 6f 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 of:. *. 0...
2680: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 - the certificat
2690: 65 20 69 73 20 64 65 65 6d 65 64 20 69 6e 76 61 e is deemed inva
26a0: 6c 69 64 2c 20 73 65 6e 64 20 76 65 72 69 66 69 lid, send verifi
26b0: 63 61 74 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 cation. *.... f
26c0: 61 69 6c 75 72 65 20 61 6c 65 72 74 20 74 6f 20 ailure alert to
26d0: 70 65 65 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e peer, and termin
26e0: 61 74 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 ate handshake..
26f0: 2a 09 20 20 20 20 31 09 09 09 2d 20 74 68 65 20 *. 1...- the
2700: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64 certificate is d
2710: 65 65 6d 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e eemed valid, con
2720: 74 69 6e 75 65 20 77 69 74 68 20 68 61 6e 64 73 tinue with hands
2730: 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 hake.. *. emp
2740: 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 ty string.- no c
2750: 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 hange to certifi
2760: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a cate validation.
2770: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
2780: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 ts:. *.The err f
2790: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 ield of the curr
27a0: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 ently operative
27b0: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 State is set. *.
27c0: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 to a string de
27d0: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c scribing the SSL
27e0: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 negotiation fai
27f0: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 lure reason. *.
2800: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2840: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
2850: 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 int.VerifyCallba
2860: 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f ck(int ok, X509_
2870: 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 20 STORE_CTX *ctx)
2880: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 {. Tcl_Obj *c
2890: 6d 64 50 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 mdPtr;. SSL
28a0: 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 *ssl..= (SSL*)X
28b0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 509_STORE_CTX_ge
28c0: 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20 53 t_ex_data(ctx, S
28d0: 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f 58 SL_get_ex_data_X
28e0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64 509_STORE_CTX_id
28f0: 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20 20 x());. X509
2900: 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53 54 *cert..= X509_ST
2910: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 72 ORE_CTX_get_curr
2920: 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a 20 ent_cert(ctx);.
2930: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
2940: 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53 4c tr.= (State*)SSL
2950: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73 73 _get_app_data(ss
2960: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 l);. Tcl_Inte
2970: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
2980: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
2990: 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20 int depth..=
29a0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 X509_STORE_CTX_g
29b0: 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63 et_error_depth(c
29c0: 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 tx);. int err
29d0: 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 ..= X509_STORE_C
29e0: 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78 TX_get_error(ctx
29f0: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 );.. dprintf(
2a00: 22 56 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b "Verify: %d", ok
2a10: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
2a20: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 ePtr->vcmd == (T
2a30: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
2a40: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 .if (statePtr->v
2a50: 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 flags & SSL_VERI
2a60: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
2a70: 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 ER_CERT) {..
2a80: 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c return ok;..} el
2a90: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e se {.. return
2aa0: 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 1;..}. } els
2ab0: 65 20 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55 e if (cert == NU
2ac0: 4c 4c 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c LL || ssl == NUL
2ad0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a L) {..return 0;.
2ae0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
2af0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
2b00: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 eval */. cmdP
2b10: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
2b20: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
2b30: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c vcmd);. Tcl_L
2b40: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2b50: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2b60: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
2b70: 67 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d gObj("verify", -
2b80: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
2b90: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2ba0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
2bb0: 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 ,..Tcl_NewString
2bc0: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e Obj(Tcl_GetChann
2bd0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
2be0: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 >self), -1));.
2bf0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2c00: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2c10: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2c20: 65 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 ewIntObj(depth))
2c30: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
2c40: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2c50: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
2c60: 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e ls_NewX509Obj(in
2c70: 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 terp, cert));.
2c80: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2c90: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2ca0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2cb0: 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 ewIntObj(ok));.
2cc0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2cd0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2ce0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c rp, cmdPtr,..Tcl
2cf0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 _NewStringObj((c
2d00: 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 har*)X509_verify
2d10: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 _cert_error_stri
2d20: 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a ng(err), -1));..
2d30: 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 /* Prevent I
2d40: 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 /O while callbac
2d50: 6b 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 k is in progress
2d60: 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 */. /* state
2d70: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c Ptr->flags |= TL
2d80: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 S_TCL_CALLBACK;
2d90: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 */.. /* Eval
2da0: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
2db0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 */. Tcl_Incr
2dc0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
2dd0: 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 ;. ok = EvalC
2de0: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
2df0: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
2e00: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 );. Tcl_DecrR
2e10: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
2e20: 0a 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 .. /* statePt
2e30: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c r->flags &= ~(TL
2e40: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b S_TCL_CALLBACK);
2e50: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 6f */. return(o
2e60: 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c k);./* By defaul
2e70: 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 t, leave verific
2e80: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e ation unchanged.
2e90: 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d */.}.../*. *---
2ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ee0: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 . *. * Tls_Error
2ef0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 --. *. *.Calls
2f00: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 callback with li
2f10: 73 74 20 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a st of errors.. *
2f20: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
2f30: 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 :. *.The err fie
2f40: 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e ld of the curren
2f50: 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 tly operative St
2f60: 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 ate is set. *.
2f70: 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 to a string desc
2f80: 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e ribing the SSL n
2f90: 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 egotiation failu
2fa0: 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d re reason. *. *-
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ff0: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f --. */.void.Tls_
3000: 45 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 Error(State *sta
3010: 74 65 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 tePtr, char *msg
3020: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 ) {. Tcl_Inte
3030: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
3040: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
3050: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
3060: 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 tr, *listPtr;.
3070: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 unsigned long
3080: 65 72 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 err;. statePt
3090: 72 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 r->err = msg;..
30a0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
30b0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
30c0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
30d0: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e k == (Tcl_Obj*)N
30e0: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 ULL)..return;..
30f0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
3100: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a mand to eval */.
3110: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
3120: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
3130: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
3140: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
3150: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3160: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
3170: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
3180: 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a ("error", -1));.
3190: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
31a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
31b0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
31c0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
31d0: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
31e0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
31f0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
3200: 20 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c if (msg != NULL
3210: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ) {..Tcl_ListObj
3220: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
3230: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
3240: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
3250: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d sg, -1));.. }
3260: 20 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d else if ((msg =
3270: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
3280: 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a omObj(Tcl_GetObj
3290: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 Result(interp),
32a0: 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 NULL)) != NULL)
32b0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
32c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
32d0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
32e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 NewStringObj(msg
32f0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 , -1));.. } e
3300: 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d lse {..listPtr =
3310: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
3320: 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 0, NULL);..while
3330: 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67 65 74 ((err = ERR_get
3340: 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30 29 20 _error()) != 0)
3350: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
3360: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3370: 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c interp, listPtr,
3380: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3390: 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 j(ERR_reason_err
33a0: 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 or_string(err),
33b0: 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 -1));..}..Tcl_Li
33c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
33d0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
33e0: 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 r, listPtr);.
33f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 }.. /* Eval
3400: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
3410: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 */. Tcl_Incr
3420: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
3430: 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 ;. EvalCallba
3440: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 ck(interp, state
3450: 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 Ptr, cmdPtr);.
3460: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
3470: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a nt(cmdPtr);.}...
3480: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
3490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b --------. *. * K
34d0: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d eyLogCallback --
34e0: 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72 65 63 . *. *.Write rec
34f0: 65 69 76 65 64 20 6b 65 79 20 64 61 74 61 20 74 eived key data t
3500: 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 o log file.. *.
3510: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
3520: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *.none. *. *---
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3570: 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 . */.void KeyLog
3580: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
3590: 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 SL *ssl, const c
35a0: 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 har *line) {.
35b0: 20 63 68 61 72 20 2a 73 74 72 20 3d 20 67 65 74 char *str = get
35c0: 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c env(SSLKEYLOGFIL
35d0: 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 E);. FILE *fd
35e0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
35f0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
3600: 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 f (str) {..fd =
3610: 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b fopen(str, "a");
3620: 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25 ..fprintf(fd, "%
3630: 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c s\n",line);..fcl
3640: 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d ose(fd);. }.}
3650: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
36a0: 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 * Password Callb
36b0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c ack --. *. *.Cal
36c0: 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 77 led when a passw
36d0: 6f 72 64 20 66 6f 72 20 61 20 70 72 69 76 61 74 ord for a privat
36e0: 65 20 6b 65 79 20 6c 6f 61 64 69 6e 67 2f 73 74 e key loading/st
36f0: 6f 72 69 6e 67 20 61 20 50 45 4d 0a 20 2a 09 63 oring a PEM. *.c
3700: 65 72 74 69 66 69 63 61 74 65 20 77 69 74 68 20 ertificate with
3710: 65 6e 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c encryption. Eval
3720: 73 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 s callback scrip
3730: 74 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a t and returns. *
3740: 09 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 .the result as t
3750: 68 65 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 he password stri
3760: 6e 67 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a ng in buf.. *. *
3770: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
3780: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
3790: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 ects:. *.Calls c
37a0: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 allback (if defi
37b0: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ned). *. * Retur
37c0: 6e 73 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 ns:. *.Password
37d0: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 size in bytes or
37e0: 20 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 -1 for an error
37f0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
3800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
3840: 74 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f tatic int.Passwo
3850: 72 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 rdCallback(char
3860: 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 *buf, int size,
3870: 69 6e 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 int rwflag, void
3880: 20 2a 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 *udata) {. S
3890: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d tate *statePtr.=
38a0: 20 28 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 (State *) udata
38b0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ;. Tcl_Interp
38c0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
38d0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
38e0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
38f0: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a ;. int code;.
3900: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
3910: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 lled");.. /*
3920: 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 If no callback,
3930: 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c 6c use default call
3940: 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 back */. if (
3950: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
3960: 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 rd == NULL) {..i
3970: 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e f (Tcl_EvalEx(in
3980: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 terp, "tls::pass
3990: 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 word", -1, TCL_E
39a0: 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 VAL_GLOBAL) == T
39b0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 CL_OK) {.. ch
39c0: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 ar *ret = (char
39d0: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 *) Tcl_GetString
39e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
39f0: 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 . strncpy(buf
3a00: 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 , ret, (size_t)
3a10: 73 69 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 75 size);.. retu
3a20: 72 6e 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 rn (int)strlen(r
3a30: 65 74 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 et);..} else {..
3a40: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 return -1;..
3a50: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
3a60: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
3a70: 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d o eval */. cm
3a80: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
3a90: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
3aa0: 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20 20 20 ->password);.
3ab0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
3ac0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3ad0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
3ae0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61 73 73 wStringObj("pass
3af0: 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 word", -1));.
3b00: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
3b10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3b20: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
3b30: 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67 29 29 wIntObj(rwflag))
3b40: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3b50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3b60: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3b70: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a cl_NewIntObj(siz
3b80: 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 e));.. Tcl_Pr
3b90: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
3ba0: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 ta) interp);.
3bb0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 Tcl_Preserve((C
3bc0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
3bd0: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 Ptr);.. /* Ev
3be0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
3bf0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
3c00: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
3c10: 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 tr);. code =
3c20: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e Tcl_EvalObjEx(in
3c30: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 terp, cmdPtr, TC
3c40: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a L_EVAL_GLOBAL);.
3c50: 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 if (code !=
3c60: 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 TCL_OK) {.#if (T
3c70: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e CL_MAJOR_VERSION
3c80: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d == 8) && (TCL_M
3c90: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 INOR_VERSION < 6
3ca0: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e )..Tcl_Backgroun
3cb0: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a dError(interp);.
3cc0: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 #else..Tcl_Backg
3cd0: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 roundException(i
3ce0: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 nterp, code);.#e
3cf0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 ndif. }. T
3d00: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
3d10: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 cmdPtr);.. Tc
3d20: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
3d30: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
3d40: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 75 63 ;.. /* If suc
3d50: 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20 62 61 cessful, pass ba
3d60: 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 ck password stri
3d70: 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74 65 20 ng and truncate
3d80: 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 if too long */.
3d90: 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 if (code == T
3da0: 43 4c 5f 4f 4b 29 20 7b 0a 09 69 6e 74 20 6c 65 CL_OK) {..int le
3db0: 6e 3b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 n;..char *ret =
3dc0: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
3dd0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 StringFromObj(Tc
3de0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
3df0: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 nterp), &len);..
3e00: 69 66 20 28 6c 65 6e 20 3e 20 73 69 7a 65 2d 31 if (len > size-1
3e10: 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 73 ) {.. len = s
3e20: 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 ize-1;..}..strnc
3e30: 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 py(buf, ret, (si
3e40: 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 ze_t) len);..buf
3e50: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 [len] = '\0';..T
3e60: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
3e70: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
3e80: 0a 09 72 65 74 75 72 6e 28 6c 65 6e 29 3b 0a 20 ..return(len);.
3e90: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c }. Tcl_Rel
3ea0: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 ease((ClientData
3eb0: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 ) interp);. r
3ec0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a eturn -1;.}.../*
3ed0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
3ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f10: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 ------. *. * Ses
3f20: 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f sion Callback fo
3f30: 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a r Clients --. *.
3f40: 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 *.Called when a
3f50: 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 69 73 20 new session is
3f60: 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 61 63 added to the cac
3f70: 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 he. In TLS 1.3.
3f80: 2a 09 74 68 69 73 20 6d 61 79 20 62 65 20 72 65 *.this may be re
3f90: 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 ceived multiple
3fa0: 74 69 6d 65 73 20 61 66 74 65 72 20 74 68 65 20 times after the
3fb0: 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 handshake. For.
3fc0: 2a 09 65 61 72 6c 69 65 72 20 76 65 72 73 69 6f *.earlier versio
3fd0: 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 ns, this will be
3fe0: 20 72 65 63 65 69 76 65 64 20 64 75 72 69 6e 67 received during
3ff0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a the handshake..
4000: 20 2a 09 54 68 69 73 20 69 73 20 74 68 65 20 70 *.This is the p
4010: 72 65 66 65 72 72 65 64 20 77 61 79 20 74 6f 20 referred way to
4020: 6f 62 74 61 69 6e 20 61 20 72 65 73 75 6d 61 62 obtain a resumab
4030: 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 le session.. *.
4040: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
4050: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
4060: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 fects:. *.Calls
4070: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 callback (if def
4080: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 ined). *. * Retu
4090: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d rn codes:. *.0 =
40a0: 20 65 72 72 6f 72 20 77 68 65 72 65 20 73 65 73 error where ses
40b0: 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d sion will be imm
40c0: 65 64 69 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 ediately removed
40d0: 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e from the intern
40e0: 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d al cache.. *.1 =
40f0: 20 73 75 63 63 65 73 73 20 77 68 65 72 65 20 61 success where a
4100: 70 70 20 72 65 74 61 69 6e 73 20 73 65 73 73 69 pp retains sessi
4110: 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 on in session ca
4120: 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 che, and must ca
4130: 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 ll SSL_SESSION_f
4140: 72 65 65 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e ree() when done.
4150: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
41a0: 61 74 69 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e atic int.Session
41b0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
41c0: 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 SL *ssl, SSL_SES
41d0: 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b SION *session) {
41e0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
41f0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 ePtr = (State*)S
4200: 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 SL_get_app_data(
4210: 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 (SSL *)ssl);.
4220: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
4230: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e erp.= statePtr->
4240: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f interp;. Tcl_
4250: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 Obj *cmdPtr;.
4260: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
4270: 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 char *ticket;.
4280: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
4290: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 char *session_i
42a0: 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 d;. size_t le
42b0: 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 n2;. unsigned
42c0: 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 int ulen;..
42d0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
42e0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
42f0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
4300: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
4310: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
4320: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 TLSEXT_ERR_OK;.
4330: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 } else if (ss
4340: 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 l == NULL) {..re
4350: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
4360: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
4370: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
4380: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
4390: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 */. cmdPtr =
43a0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
43b0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
43c0: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 ack);. Tcl_Li
43d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
43e0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
43f0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
4400: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d Obj("session", -
4410: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
4420: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4430: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
4440: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
4450: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
4460: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
4470: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
4480: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f ;.. /* Sessio
4490: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 n id */. sess
44a0: 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 ion_id = SSL_SES
44b0: 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 SION_get_id(sess
44c0: 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 ion, &ulen);.
44d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
44e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
44f0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
4500: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 wByteArrayObj(se
4510: 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 ssion_id, (int)
4520: 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 ulen));.. /*
4530: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a Session ticket *
4540: 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f /. SSL_SESSIO
4550: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 N_get0_ticket(se
4560: 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 ssion, &ticket,
4570: 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f &len2);. Tcl_
4580: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
4590: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
45a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 Ptr, Tcl_NewByte
45b0: 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c ArrayObj(ticket,
45c0: 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a (int) len2));..
45d0: 20 20 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 /* Lifetime
45e0: 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f - number of seco
45f0: 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c nds */. Tcl_L
4600: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
4610: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
4620: 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 tr,..Tcl_NewLong
4630: 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 Obj((long) SSL_S
4640: 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 ESSION_get_ticke
4650: 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 t_lifetime_hint(
4660: 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 session)));..
4670: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 /* Eval callbac
4680: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 k command */.
4690: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
46a0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 t(cmdPtr);. E
46b0: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 valCallback(inte
46c0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d rp, statePtr, cm
46d0: 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 dPtr);. Tcl_D
46e0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ecrRefCount(cmdP
46f0: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
4700: 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 0;.}.../*. *----
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4750: 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 *. * ALPN Callb
4760: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 ack for Servers
4770: 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b and NPN Callback
4780: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a for Clients --.
4790: 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70 72 *. *.Perform pr
47a0: 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 otocol (http/1.1
47b0: 2c 20 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 , h2, h3, etc.)
47c0: 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74 68 selection for th
47d0: 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f e. *.incoming co
47e0: 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 nnection. Called
47f0: 20 61 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64 after Hello and
4800: 20 73 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b server callback
4810: 73 2e 0a 20 2a 09 57 68 65 72 65 20 27 6f 75 74 s.. *.Where 'out
4820: 27 20 69 73 20 73 65 6c 65 63 74 65 64 20 70 72 ' is selected pr
4830: 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20 otocol and 'in'
4840: 69 73 20 74 68 65 20 70 65 65 72 20 61 64 76 65 is the peer adve
4850: 72 74 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a rtised list.. *.
4860: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
4870: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
4880: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
4890: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
48a0: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 fined). *. * Ret
48b0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
48c0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a L_TLSEXT_ERR_OK:
48d0: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 ALPN protocol s
48e0: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e elected. The con
48f0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
4900: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s.. *.SSL_TLSEXT
4910: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
4920: 3a 20 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f : There was no o
4930: 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74 verlap between t
4940: 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20 he client's. *.
4950: 20 20 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 supplied list
4960: 20 61 6e 64 20 74 68 65 20 73 65 72 76 65 72 20 and the server
4970: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 configuration. T
4980: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 he connection wi
4990: 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20 ll be aborted..
49a0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
49b0: 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f _NOACK: ALPN pro
49c0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 tocol not select
49d0: 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73 ed, e.g., becaus
49e0: 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20 e no ALPN. *.
49f0: 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63 protocols are c
4a00: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 onfigured for th
4a10: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 is connection. T
4a20: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
4a30: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d ntinues.. *. *--
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a80: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
4a90: 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f .ALPNCallback(co
4aa0: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f nst SSL *ssl, co
4ab0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
4ac0: 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 r **out, unsigne
4ad0: 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a d char *outlen,.
4ae0: 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 .const unsigned
4af0: 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e char *in, unsign
4b00: 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f ed int inlen, vo
4b10: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
4b20: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
4b30: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 (State*)arg;.
4b40: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
4b50: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
4b60: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
4b70: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
4b80: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b int code, res;
4b90: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
4ba0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
4bb0: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (ssl == NULL ||
4bc0: 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a arg == NULL) {.
4bd0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
4be0: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
4bf0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 }.. /* Sele
4c00: 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 ct protocol */.
4c10: 20 20 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 if (SSL_selec
4c20: 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74 t_next_proto(out
4c30: 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 , outlen, stateP
4c40: 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 tr->protos, stat
4c50: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e ePtr->protos_len
4c60: 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d ,..in, inlen) ==
4c70: 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 OPENSSL_NPN_NEG
4c80: 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d OTIATED) {../* M
4c90: 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 atch found */..r
4ca0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
4cb0: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c ERR_OK;. } el
4cc0: 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c se {../* OPENSSL
4cd0: 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 _NPN_NO_OVERLAP
4ce0: 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f = No overlap, so
4cf0: 20 75 73 65 20 66 69 72 73 74 20 69 74 65 6d 20 use first item
4d00: 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 from client prot
4d10: 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 ocol list */..re
4d20: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
4d30: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
4d40: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
4d50: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f r->vcmd == (Tcl_
4d60: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 Obj*)NULL) {..re
4d70: 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a turn res;. }.
4d80: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
4d90: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a ommand to eval *
4da0: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
4db0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
4dc0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
4dd0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4de0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4df0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
4e00: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
4e10: 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 alpn", -1));.
4e20: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4e30: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4e40: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
4e50: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
4e60: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
4e70: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
4e80: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 f), -1));. Tc
4e90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
4ea0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
4eb0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
4ec0: 72 69 6e 67 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 ringObj(*out, -1
4ed0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
4ee0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
4ef0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
4f00: 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f Tcl_NewBooleanO
4f10: 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c bj(res == SSL_TL
4f20: 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a SEXT_ERR_OK));..
4f30: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
4f40: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
4f50: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
4f60: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
4f70: 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 if ((code = Ev
4f80: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 alCallback(inter
4f90: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 p, statePtr, cmd
4fa0: 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 Ptr)) > 1) {..re
4fb0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
4fc0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 RR_NOACK;. }
4fd0: 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d else if (code ==
4fe0: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 1) {..res = SSL
4ff0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a _TLSEXT_ERR_OK;.
5000: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 } else {..re
5010: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
5020: 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a RR_ALERT_FATAL;.
5030: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 }. Tcl_De
5040: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
5050: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 r);. return r
5060: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d es;.}.../*. *---
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50b0: 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 73 65 . *. * Advertise
50c0: 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 Protocols Callb
50d0: 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 72 6f ack for Next Pro
50e0: 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f tocol Negotiatio
50f0: 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 n (NPN) in Serve
5100: 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 rHello --. *. *.
5110: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 54 4c called when a TL
5120: 53 20 73 65 72 76 65 72 20 6e 65 65 64 73 20 61 S server needs a
5130: 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f 72 74 list of support
5140: 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 ed protocols for
5150: 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f Next. *.Protoco
5160: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 l Negotiation..
5170: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
5180: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
5190: 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 effects:. *. *
51a0: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a Return codes:. *
51b0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
51c0: 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c OK: NPN protocol
51d0: 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 selected. The c
51e0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
51f0: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 ues.. *.SSL_TLSE
5200: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 XT_ERR_NOACK: NP
5210: 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 N protocol not s
5220: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e elected. The con
5230: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
5240: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d s.. *. *--------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
5290: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 #ifdef USE_NPN.s
52a0: 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c tatic int.NPNCal
52b0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 lback(const SSL
52c0: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 *ssl, const unsi
52d0: 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c gned char **out,
52e0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f unsigned int *o
52f0: 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 utlen, void *arg
5300: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
5310: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
5320: 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 *)arg;.. dpri
5330: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
5340: 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e if (ssl == N
5350: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 ULL || arg == NU
5360: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
5370: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
5380: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f CK;. }.. /
5390: 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 * Set protocols
53a0: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 list */. if (
53b0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
53c0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 != NULL) {..*ou
53d0: 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 t = statePtr->pr
53e0: 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d otos;..*outlen =
53f0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f statePtr->proto
5400: 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 s_len;. } els
5410: 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c e {..*out = NULL
5420: 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a ;..*outlen = 0;.
5430: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
5440: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
5450: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 }. return S
5460: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
5470: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a ;.}.#endif.../*.
5480: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54c0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 -----. *. * SNI
54d0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 Callback for Ser
54e0: 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 vers --. *. *.Pe
54f0: 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 69 64 rform server-sid
5500: 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 e SNI hostname s
5510: 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 20 72 election after r
5520: 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65 78 74 eceiving SNI ext
5530: 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 ension. *.in Cli
5540: 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 ent Hello. Calle
5550: 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 d after hello ca
5560: 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66 6f 72 llback but befor
5570: 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e e ALPN callback.
5580: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
5590: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
55a0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
55b0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
55c0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
55d0: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 Return codes:.
55e0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
55f0: 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d _OK: SNI hostnam
5600: 65 20 69 73 20 61 63 63 65 70 74 65 64 2e 20 54 e is accepted. T
5610: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
5620: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f ntinues.. *.SSL_
5630: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 TLSEXT_ERR_ALERT
5640: 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 _FATAL: SNI host
5650: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 name is not acce
5660: 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 pted. The connec
5670: 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 tion. *. is a
5680: 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c 74 20 borted. Default
5690: 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53 53 4c for alert is SSL
56a0: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 _AD_UNRECOGNIZED
56b0: 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c _NAME.. *.SSL_TL
56c0: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 SEXT_ERR_ALERT_W
56d0: 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 ARNING: SNI host
56e0: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 name is not acce
56f0: 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c pted, warning al
5700: 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 ert. *. sent
5710: 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 (not supported i
5720: 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 n TLSv1.3). The
5730: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
5740: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 nues.. *.SSL_TLS
5750: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 EXT_ERR_NOACK: S
5760: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e NI hostname is n
5770: 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e 64 20 ot accepted and
5780: 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 not acknowledged
5790: 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 ,. *. e.g. if
57a0: 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 65 SNI has not bee
57b0: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 n configured. Th
57c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
57d0: 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d tinues.. *. *---
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5820: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
5830: 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 SNICallback(cons
5840: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 t SSL *ssl, int
5850: 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 *alert, void *ar
5860: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a g) {. State *
5870: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
5880: 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f e*)arg;. Tcl_
5890: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d Interp *interp.=
58a0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
58b0: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a p;. Tcl_Obj *
58c0: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 cmdPtr;. int
58d0: 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 code, res;. c
58e0: 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 20 har *servername
58f0: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 = NULL;.. dpr
5900: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
5910: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 . if (ssl ==
5920: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e NULL || arg == N
5930: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
5940: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
5950: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ACK;. }..
5960: 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f /* Only works fo
5970: 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20 65 61 r TLS 1.2 and ea
5980: 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73 65 72 rlier */. ser
5990: 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 vername = SSL_ge
59a0: 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c t_servername(ssl
59b0: 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 , TLSEXT_NAMETYP
59c0: 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 E_host_name);.
59d0: 20 20 69 66 20 28 21 73 65 72 76 65 72 6e 61 6d if (!servernam
59e0: 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b e || servername[
59f0: 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 72 0] == '\0') {..r
5a00: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
5a10: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
5a20: 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }.. if (state
5a30: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 Ptr->vcmd == (Tc
5a40: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
5a50: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
5a60: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a T_ERR_OK;. }.
5a70: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
5a80: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a ommand to eval *
5a90: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
5aa0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
5ab0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
5ac0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
5ad0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
5ae0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
5af0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
5b00: 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 sni", -1));.
5b10: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
5b20: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
5b30: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
5b40: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 l_NewStringObj(T
5b50: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
5b60: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
5b70: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ), -1));. Tcl
5b80: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
5b90: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
5ba0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
5bb0: 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d ingObj(servernam
5bc0: 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f e , -1));.. /
5bd0: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
5be0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
5bf0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
5c00: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 cmdPtr);. if
5c10: 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c ((code = EvalCal
5c20: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
5c30: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 atePtr, cmdPtr))
5c40: 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 > 1) {..res = S
5c50: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
5c60: 45 52 54 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 ERT_WARNING;..*a
5c70: 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e lert = SSL_AD_UN
5c80: 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b RECOGNIZED_NAME;
5c90: 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 /* Not supporte
5ca0: 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a d by TLS 1.3 */.
5cb0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
5cc0: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 ode == 1) {..res
5cd0: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 = SSL_TLSEXT_ER
5ce0: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 R_OK;. } else
5cf0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
5d00: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 SEXT_ERR_ALERT_F
5d10: 41 54 41 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 ATAL;..*alert =
5d20: 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 SSL_AD_UNRECOGNI
5d30: 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 ZED_NAME; /* Not
5d40: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c supported by TL
5d50: 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 S 1.3 */. }.
5d60: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
5d70: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
5d80: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c return res;.}..
5d90: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
5da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
5de0: 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 ClientHello Hand
5df0: 73 68 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 shake Callback f
5e00: 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a or Servers --. *
5e10: 0a 20 2a 09 55 73 65 64 20 62 79 20 73 65 72 76 . *.Used by serv
5e20: 65 72 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 er to examine th
5e30: 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e e server name in
5e40: 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 dication (SNI) e
5e50: 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 xtension. *.prov
5e60: 69 64 65 64 20 62 79 20 74 68 65 20 63 6c 69 65 ided by the clie
5e70: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 nt in order to s
5e80: 65 6c 65 63 74 20 61 6e 20 61 70 70 72 6f 70 72 elect an appropr
5e90: 69 61 74 65 20 63 65 72 74 69 66 69 63 61 74 65 iate certificate
5ea0: 20 74 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 to. *.present,
5eb0: 61 6e 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 and make other c
5ec0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 64 6a onfiguration adj
5ed0: 75 73 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e ustments relevan
5ee0: 74 20 74 6f 20 74 68 61 74 20 73 65 72 76 65 72 t to that server
5ef0: 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 . *.name and its
5f00: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 configuration.
5f10: 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20 73 77 This includes sw
5f20: 61 70 70 69 6e 67 20 6f 75 74 20 74 68 65 20 61 apping out the a
5f30: 73 73 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 4c ssociated. *.SSL
5f40: 5f 43 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f _CTX pointer, mo
5f50: 64 69 66 79 69 6e 67 20 74 68 65 20 73 65 72 76 difying the serv
5f60: 65 72 27 73 20 6c 69 73 74 20 6f 66 20 70 65 72 er's list of per
5f70: 6d 69 74 74 65 64 20 54 4c 53 20 76 65 72 73 69 mitted TLS versi
5f80: 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 ons,. *.changing
5f90: 20 74 68 65 20 73 65 72 76 65 72 27 73 20 63 69 the server's ci
5fa0: 70 68 65 72 20 6c 69 73 74 20 69 6e 20 72 65 73 pher list in res
5fb0: 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 63 6c 69 ponse to the cli
5fc0: 65 6e 74 27 73 20 63 69 70 68 65 72 20 6c 69 73 ent's cipher lis
5fd0: 74 2c 20 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 t, etc.. *.Calle
5fe0: 64 20 62 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 d before SNI and
5ff0: 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e ALPN callbacks.
6000: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
6010: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
6020: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
6030: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
6040: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
6050: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 Return codes:.
6060: 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c *.SSL_CLIENT_HEL
6070: 4c 4f 5f 52 45 54 52 59 3a 20 73 75 73 70 65 6e LO_RETRY: suspen
6080: 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c d the handshake,
6090: 20 61 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 and the handsha
60a0: 6b 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c ke function will
60b0: 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 return immediat
60c0: 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e ely. *.SSL_CLIEN
60d0: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 T_HELLO_ERROR: f
60e0: 61 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 ailure, terminat
60f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 e connection. Se
6100: 74 20 61 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 t alert to error
6110: 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c code.. *.SSL_CL
6120: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 IENT_HELLO_SUCCE
6130: 53 53 3a 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 SS: success. *.
6140: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
6150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6180: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
6190: 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 int.HelloCallbac
61a0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
61b0: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f , int *alert, vo
61c0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
61d0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
61e0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 (State*)arg;.
61f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
6200: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
6210: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
6220: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
6230: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b int code, res;
6240: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
6250: 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 *servername;.
6260: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
6270: 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a char *p;. siz
6280: 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 e_t len, remaini
6290: 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 ng;.. dprintf
62a0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
62b0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
62c0: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a cmd == (Tcl_Obj*
62d0: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
62e0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
62f0: 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d O_SUCCESS;. }
6300: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d else if (ssl ==
6310: 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55 (const SSL *)NU
6320: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f LL || arg == (vo
6330: 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 id *)NULL) {..re
6340: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
6350: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
6360: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e }.. /* Get n
6370: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 ames */. if (
6380: 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c !SSL_client_hell
6390: 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 o_get0_ext(ssl,
63a0: 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 TLSEXT_TYPE_serv
63b0: 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 er_name, &p, &re
63c0: 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 maining) || rema
63d0: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a ining <= 2) {..*
63e0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 alert = SSL_R_SS
63f0: 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 LV3_ALERT_ILLEGA
6400: 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 L_PARAMETER;..re
6410: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
6420: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
6430: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 }.. /* Extra
6440: 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 ct the length of
6450: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 the supplied li
6460: 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a st of names. */.
6470: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b len = (*(p++
6480: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e ) << 8);. len
6490: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 += *(p++);.
64a0: 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 if (len + 2 != r
64b0: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c emaining) {..*al
64c0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 ert = SSL_R_SSLV
64d0: 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 3_ALERT_ILLEGAL_
64e0: 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 PARAMETER;..retu
64f0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
6500: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d LLO_ERROR;. }
6510: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d . remaining =
6520: 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 len;.. /* Th
6530: 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 e list in practi
6540: 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 ce only has a si
6550: 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f ngle element, so
6560: 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 we only conside
6570: 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e r the first one.
6580: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 */. if (rema
6590: 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 ining == 0 || *p
65a0: 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d ++ != TLSEXT_NAM
65b0: 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 ETYPE_host_name)
65c0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
65d0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
65e0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 NTERNAL_ERROR;..
65f0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
6600: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
6610: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
6620: 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f ng--;.. /* No
6630: 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 w we can finally
6640: 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 pull out the by
6650: 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 te array with th
6660: 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d e actual hostnam
6670: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 e. */. if (re
6680: 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a maining <= 2) {.
6690: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f .*alert = SSL_R_
66a0: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 TLSV1_ALERT_INTE
66b0: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 RNAL_ERROR;..ret
66c0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
66d0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
66e0: 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 }. len = (*(p
66f0: 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c ++) << 8);. l
6700: 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 en += *(p++);.
6710: 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 if (len + 2 >
6720: 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 remaining) {..*a
6730: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 lert = SSL_R_TLS
6740: 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 V1_ALERT_INTERNA
6750: 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e L_ERROR;..return
6760: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
6770: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 O_ERROR;. }.
6780: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c remaining = l
6790: 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 en;. serverna
67a0: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 me = (const char
67b0: 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 *)p;.. /* Cr
67c0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
67d0: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 eval */. cmdP
67e0: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
67f0: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
6800: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c vcmd);. Tcl_L
6810: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
6820: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
6830: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
6840: 67 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 gObj("hello", -1
6850: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
6860: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
6870: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
6880: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
6890: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 ingObj(Tcl_GetCh
68a0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
68b0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b tr->self), -1));
68c0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
68d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
68e0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
68f0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 l_NewStringObj(s
6900: 65 72 76 65 72 6e 61 6d 65 2c 20 28 69 6e 74 29 ervername, (int)
6910: 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 len));.. /*
6920: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
6930: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
6940: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
6950: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 dPtr);. if ((
6960: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 code = EvalCallb
6970: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ack(interp, stat
6980: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e ePtr, cmdPtr)) >
6990: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 1) {..res = SSL
69a0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 _CLIENT_HELLO_RE
69b0: 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 TRY;..*alert = S
69c0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 SL_R_TLSV1_ALERT
69d0: 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b _USER_CANCELLED;
69e0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
69f0: 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 code == 1) {..re
6a00: 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 s = SSL_CLIENT_H
6a10: 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 ELLO_SUCCESS;.
6a20: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 } else {..res
6a30: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c = SSL_CLIENT_HEL
6a40: 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 LO_ERROR;..*aler
6a50: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f t = SSL_R_TLSV1_
6a60: 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 ALERT_INTERNAL_E
6a70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
6a80: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
6a90: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 (cmdPtr);. re
6aa0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a turn res;.}.../*
6ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6ac0: 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 ***/./* Commands
6ad0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a */./***
6ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6af0: 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d */../*. *-------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
6b40: 20 2a 20 48 61 73 68 20 43 61 6c 63 20 2d 2d 0a * Hash Calc --.
6b50: 20 2a 0a 20 2a 09 43 61 6c 63 75 6c 61 74 65 20 *. *.Calculate
6b60: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f message digest o
6b70: 66 20 64 61 74 61 20 75 73 69 6e 67 20 74 79 70 f data using typ
6b80: 65 20 68 61 73 68 20 61 6c 67 6f 72 69 74 68 6d e hash algorithm
6b90: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
6ba0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
6bb0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
6bc0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
6bd0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c20: 0a 20 2a 2f 0a 69 6e 74 0a 48 61 73 68 43 61 6c . */.int.HashCal
6c30: 63 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e c(Tcl_Interp *in
6c40: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
6c50: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
6c60: 62 6a 76 5b 5d 2c 20 63 6f 6e 73 74 20 45 56 50 bjv[], const EVP
6c70: 5f 4d 44 20 2a 74 79 70 65 29 20 7b 0a 20 20 20 _MD *type) {.
6c80: 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 20 char *data;.
6c90: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 75 6e int len;. un
6ca0: 73 69 67 6e 65 64 20 69 6e 74 20 6d 64 6c 65 6e signed int mdlen
6cb0: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 ;. unsigned c
6cc0: 68 61 72 20 6d 64 62 75 66 5b 45 56 50 5f 4d 41 har mdbuf[EVP_MA
6cd0: 58 5f 4d 44 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 X_MD_SIZE];.
6ce0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 68 61 unsigned char ha
6cf0: 73 68 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 shbuf[EVP_MAX_MD
6d00: 5f 53 49 5a 45 2a 32 2b 31 5d 3b 0a 20 20 20 20 _SIZE*2+1];.
6d10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 65 78 20 const char *hex
6d20: 3d 20 22 30 31 32 33 34 35 36 37 38 39 41 42 43 = "0123456789ABC
6d30: 44 45 46 22 3b 0a 0a 20 20 20 20 69 66 20 28 6f DEF";.. if (o
6d40: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
6d50: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
6d60: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
6d70: 64 61 74 61 22 29 3b 0a 09 72 65 74 75 72 6e 20 data");..return
6d80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
6d90: 0a 0a 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c .. data = Tcl
6da0: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f _GetByteArrayFro
6db0: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 6c mObj(objv[1], &l
6dc0: 65 6e 29 3b 0a 20 20 20 20 69 66 20 28 64 61 74 en);. if (dat
6dd0: 61 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 a == NULL) {..re
6de0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6df0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 }.. /* Ca
6e00: 6c 63 20 68 61 73 68 2c 20 63 6f 6e 76 65 72 74 lc hash, convert
6e10: 20 74 6f 20 68 65 78 20 73 74 72 69 6e 67 2c 20 to hex string,
6e20: 61 6e 64 20 77 72 69 74 65 20 74 6f 20 72 65 73 and write to res
6e30: 75 6c 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 45 ult */. if (E
6e40: 56 50 5f 44 69 67 65 73 74 28 64 61 74 61 2c 20 VP_Digest(data,
6e50: 28 73 69 7a 65 5f 74 29 20 6c 65 6e 2c 20 6d 64 (size_t) len, md
6e60: 62 75 66 2c 20 26 6d 64 6c 65 6e 2c 20 74 79 70 buf, &mdlen, typ
6e70: 65 2c 20 4e 55 4c 4c 29 29 20 7b 0a 09 75 6e 73 e, NULL)) {..uns
6e80: 69 67 6e 65 64 20 63 68 61 72 20 2a 6d 70 74 72 igned char *mptr
6e90: 20 3d 20 6d 64 62 75 66 3b 0a 09 75 6e 73 69 67 = mdbuf;..unsig
6ea0: 6e 65 64 20 63 68 61 72 20 2a 68 70 74 72 20 3d ned char *hptr =
6eb0: 20 26 68 61 73 68 62 75 66 5b 30 5d 3b 0a 0a 09 &hashbuf[0];...
6ec0: 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e for (unsigned in
6ed0: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 6c t i = 0; i < mdl
6ee0: 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 en; i++) {..
6ef0: 2a 68 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 2a *hptr++ = hex[(*
6f00: 6d 70 74 72 3e 3e 34 29 26 30 78 46 5d 3b 0a 09 mptr>>4)&0xF];..
6f10: 20 20 20 20 2a 68 70 74 72 2b 2b 20 3d 20 68 65 *hptr++ = he
6f20: 78 5b 28 2a 6d 70 74 72 2b 2b 29 26 30 78 46 5d x[(*mptr++)&0xF]
6f30: 3b 0a 09 7d 0a 09 2a 68 70 74 72 20 3d 20 30 3b ;..}..*hptr = 0;
6f40: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
6f50: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
6f60: 65 77 53 74 72 69 6e 67 4f 62 6a 28 68 61 73 68 ewStringObj(hash
6f70: 62 75 66 2c 20 6d 64 6c 65 6e 2a 32 29 29 3b 0a buf, mdlen*2));.
6f80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 } else {..Tc
6f90: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
6fa0: 72 70 2c 20 22 48 61 73 68 20 63 61 6c 63 75 6c rp, "Hash calcul
6fb0: 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 4e 55 ation error", NU
6fc0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
6fd0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
6fe0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
6ff0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
7000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
7040: 20 2a 20 48 61 73 68 20 43 6f 6d 6d 61 6e 64 73 * Hash Commands
7050: 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e --. *. *.Return
7060: 20 74 68 65 20 64 69 67 65 73 74 20 61 73 20 61 the digest as a
7070: 20 68 65 78 20 73 74 72 69 6e 67 20 66 6f 72 20 hex string for
7080: 64 61 74 61 20 75 73 69 6e 67 20 74 79 70 65 20 data using type
7090: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 2e 0a message digest..
70a0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
70b0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
70c0: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
70d0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
70e0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
70f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
7130: 2a 2f 0a 44 69 67 65 73 74 43 6d 64 28 43 6c 69 */.DigestCmd(Cli
7140: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
7150: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
7160: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
7170: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
7180: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 69 objv[]) {. i
7190: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 nt len;. cons
71a0: 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 t char *name;.
71b0: 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a const EVP_MD *
71c0: 74 79 70 65 3b 0a 0a 20 20 20 20 69 66 20 28 6f type;.. if (o
71d0: 62 6a 63 20 21 3d 20 33 29 20 7b 0a 09 54 63 6c bjc != 3) {..Tcl
71e0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
71f0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
7200: 74 79 70 65 20 64 61 74 61 22 29 3b 0a 09 72 65 type data");..re
7210: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7220: 20 20 20 20 7d 0a 0a 20 20 20 20 6e 61 6d 65 20 }.. name
7230: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
7240: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 26 romObj(objv[1],&
7250: 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28 6e 61 len);. if (na
7260: 6d 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 28 74 me == NULL || (t
7270: 79 70 65 20 3d 20 45 56 50 5f 67 65 74 5f 64 69 ype = EVP_get_di
7280: 67 65 73 74 62 79 6e 61 6d 65 28 6e 61 6d 65 29 gestbyname(name)
7290: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 ) == NULL) {..Tc
72a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
72b0: 6e 74 65 72 70 2c 20 22 49 6e 76 61 6c 69 64 20 nterp, "Invalid
72c0: 64 69 67 65 73 74 20 74 79 70 65 20 5c 22 22 2c digest type \"",
72d0: 20 6e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 4c name, "\"", NUL
72e0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
72f0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
7300: 20 6f 62 6a 63 2d 2d 3b 0a 20 20 20 20 6f 62 6a objc--;. obj
7310: 76 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 v++;. return
7320: 48 61 73 68 43 61 6c 63 28 69 6e 74 65 72 70 2c HashCalc(interp,
7330: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 74 79 70 objc, objv, typ
7340: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 43 6f 6d e);.}../*. * Com
7350: 6d 61 6e 64 20 74 6f 20 43 61 6c 63 75 6c 61 74 mand to Calculat
7360: 65 20 4d 44 34 20 4d 65 73 73 61 67 65 20 44 69 e MD4 Message Di
7370: 67 65 73 74 0a 20 2a 2f 0a 69 6e 74 0a 44 69 67 gest. */.int.Dig
7380: 65 73 74 4d 44 34 43 6d 64 28 43 6c 69 65 6e 74 estMD4Cmd(Client
7390: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
73a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
73b0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
73c0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
73d0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 jv[]) {. retu
73e0: 72 6e 20 48 61 73 68 43 61 6c 63 28 69 6e 74 65 rn HashCalc(inte
73f0: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 rp, objc, objv,
7400: 45 56 50 5f 6d 64 34 28 29 29 3b 0a 7d 0a 0a 2f EVP_md4());.}../
7410: 2a 0a 20 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 20 *. * Command to
7420: 43 61 6c 63 75 6c 61 74 65 20 4d 44 35 20 4d 65 Calculate MD5 Me
7430: 73 73 61 67 65 20 44 69 67 65 73 74 0a 20 2a 2f ssage Digest. */
7440: 0a 69 6e 74 0a 44 69 67 65 73 74 4d 44 35 43 6d .int.DigestMD5Cm
7450: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
7460: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
7470: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
7480: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
7490: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
74a0: 20 20 20 20 72 65 74 75 72 6e 20 48 61 73 68 43 return HashC
74b0: 61 6c 63 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 alc(interp, objc
74c0: 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 35 28 , objv, EVP_md5(
74d0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 43 6f 6d ));.}../*. * Com
74e0: 6d 61 6e 64 20 74 6f 20 43 61 6c 63 75 6c 61 74 mand to Calculat
74f0: 65 20 53 48 41 2d 31 20 48 61 73 68 0a 20 2a 2f e SHA-1 Hash. */
7500: 0a 69 6e 74 0a 44 69 67 65 73 74 53 48 41 31 43 .int.DigestSHA1C
7510: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
7520: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
7530: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
7540: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
7550: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
7560: 0a 20 20 20 20 72 65 74 75 72 6e 20 48 61 73 68 . return Hash
7570: 43 61 6c 63 28 69 6e 74 65 72 70 2c 20 6f 62 6a Calc(interp, obj
7580: 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 73 68 61 c, objv, EVP_sha
7590: 31 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 43 1());.}../*. * C
75a0: 6f 6d 6d 61 6e 64 20 74 6f 20 43 61 6c 63 75 6c ommand to Calcul
75b0: 61 74 65 20 53 48 41 32 20 53 48 41 2d 32 35 36 ate SHA2 SHA-256
75c0: 20 48 61 73 68 0a 20 2a 2f 0a 69 6e 74 0a 44 69 Hash. */.int.Di
75d0: 67 65 73 74 53 48 41 32 35 36 43 6d 64 28 43 6c gestSHA256Cmd(Cl
75e0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
75f0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
7600: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
7610: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
7620: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
7630: 72 65 74 75 72 6e 20 48 61 73 68 43 61 6c 63 28 return HashCalc(
7640: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 interp, objc, ob
7650: 6a 76 2c 20 45 56 50 5f 73 68 61 32 35 36 28 29 jv, EVP_sha256()
7660: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d );.}../*. *-----
7670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
76b0: 2a 0a 20 2a 20 48 61 73 68 20 4c 69 73 74 20 43 *. * Hash List C
76c0: 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ommand --. *. *.
76d0: 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 Return a list of
76e0: 20 61 6c 6c 20 76 61 6c 69 64 20 68 61 73 68 20 all valid hash
76f0: 61 6c 67 6f 72 69 74 68 6d 73 20 6f 72 20 6d 65 algorithms or me
7700: 73 73 61 67 65 20 64 69 67 65 73 74 73 2e 0a 20 ssage digests..
7710: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
7720: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
7730: 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a result list.. *.
7740: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
7750: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
7760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
77a0: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4c 69 73 74 --. */.void List
77b0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 4f Callback(const O
77c0: 42 4a 5f 4e 41 4d 45 20 2a 6f 62 6a 2c 20 76 6f BJ_NAME *obj, vo
77d0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 54 id *arg) {. T
77e0: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d cl_Obj *objPtr =
77f0: 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 20 61 72 67 (Tcl_Obj *) arg
7800: 3b 0a 20 20 20 20 69 66 20 28 31 20 7c 7c 20 21 ;. if (1 || !
7810: 6f 62 6a 2d 3e 61 6c 69 61 73 29 20 7b 0a 09 54 obj->alias) {..T
7820: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
7830: 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 6f 62 Element(NULL, ob
7840: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
7850: 69 6e 67 4f 62 6a 28 6f 62 6a 2d 3e 6e 61 6d 65 ingObj(obj->name
7860: 2c 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a ,-1));. }.}..
7870: 69 6e 74 0a 44 69 67 65 73 74 4c 69 73 74 43 6d int.DigestListCm
7880: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
7890: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
78a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
78b0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
78c0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
78d0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
78e0: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
78f0: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a tObj(0, NULL);..
7900: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
7910: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
7920: 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 0100000L. Ope
7930: 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 64 69 67 nSSL_add_all_dig
7940: 65 73 74 73 28 29 3b 20 2f 2a 20 4d 61 6b 65 20 ests(); /* Make
7950: 73 75 72 65 20 74 68 65 79 27 72 65 20 6c 6f 61 sure they're loa
7960: 64 65 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 ded */.#endif..
7970: 20 20 20 4f 42 4a 5f 4e 41 4d 45 5f 64 6f 5f 61 OBJ_NAME_do_a
7980: 6c 6c 28 4f 42 4a 5f 4e 41 4d 45 5f 54 59 50 45 ll(OBJ_NAME_TYPE
7990: 5f 4d 44 5f 4d 45 54 48 2c 20 4c 69 73 74 43 61 _MD_METH, ListCa
79a0: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 llback, (void *)
79b0: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 54 63 objPtr);. Tc
79c0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e l_ResetResult(in
79d0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 terp);. Tcl_S
79e0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
79f0: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 rp, objPtr);..
7a00: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
7a10: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
7a20: 6c 69 65 6e 74 44 61 74 61 3b 0a 09 6f 62 6a 63 lientData;..objc
7a30: 20 3d 20 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d = objc;..objv =
7a40: 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a objv;.}.../*. *
7a50: 20 56 61 6c 69 64 20 53 53 4c 20 61 6e 64 20 54 Valid SSL and T
7a60: 4c 53 20 50 72 6f 74 6f 63 6f 6c 20 56 65 72 73 LS Protocol Vers
7a70: 69 6f 6e 73 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ions. */.static
7a80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 const char *prot
7a90: 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 ocols[] = {.."ss
7aa0: 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c l2", "ssl3", "tl
7ab0: 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 s1", "tls1.1", "
7ac0: 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 tls1.2", "tls1.3
7ad0: 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 ", NULL.};.enum
7ae0: 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 protocol {. T
7af0: 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c LS_SSL2, TLS_SSL
7b00: 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 3, TLS_TLS1, TLS
7b10: 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 _TLS1_1, TLS_TLS
7b20: 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 1_2, TLS_TLS1_3,
7b30: 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 2f 2a TLS_NONE.};../*
7b40: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
7b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b80: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 ------. *. * Cip
7b90: 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 hersObjCmd -- li
7ba0: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 st available cip
7bb0: 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 hers. *. *.This
7bc0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
7bd0: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
7be0: 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 the "tls::cipher
7bf0: 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f s" command. *.to
7c00: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 list available
7c10: 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 ciphers, based u
7c20: 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c pon protocol sel
7c30: 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 ected.. *. * Res
7c40: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
7c50: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c ard Tcl result l
7c60: 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ist.. *. * Side
7c70: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 effects:. *.cons
7c80: 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 tructs and destr
7c90: 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 oys SSL context
7ca0: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d (CTX). *. *-----
7cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
7cf0: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 */..static int.C
7d00: 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 43 6c 69 iphersObjCmd(Cli
7d10: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
7d20: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
7d30: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
7d40: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
7d50: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
7d60: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d cl_Obj *objPtr =
7d70: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 NULL;. SSL_C
7d80: 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a TX *ctx = NULL;.
7d90: 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e SSL *ssl = N
7da0: 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f ULL;. STACK_O
7db0: 46 28 53 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 F(SSL_CIPHER) *s
7dc0: 6b 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 2c k;. char *cp,
7dd0: 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 buf[BUFSIZ];.
7de0: 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 int index, ver
7df0: 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 bose = 0, use_su
7e00: 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 pported = 0;.
7e10: 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f const SSL_METHO
7e20: 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 D *method;..
7e30: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
7e40: 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a );.. if ((obj
7e50: 63 20 3c 20 31 29 20 7c 7c 20 28 6f 62 6a 63 20 c < 1) || (objc
7e60: 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f > 4)) {..Tcl_Wro
7e70: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
7e80: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 70 72 6f , 1, objv, "?pro
7e90: 74 6f 63 6f 6c 3f 20 3f 76 65 72 62 6f 73 65 3f tocol? ?verbose?
7ea0: 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a ?supported?");.
7eb0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
7ec0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
7ed0: 28 6f 62 6a 63 20 3d 3d 20 31 29 20 7b 0a 09 2f (objc == 1) {../
7ee0: 2a 20 4c 69 73 74 20 61 6c 6c 20 63 69 70 68 65 * List all ciphe
7ef0: 72 73 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a rs */..Tcl_Obj *
7f00: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
7f10: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
7f20: 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 ;..#if OPENSSL_V
7f30: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
7f40: 30 78 31 30 31 30 30 30 30 30 4c 0a 09 4f 70 65 0x10100000L..Ope
7f50: 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 63 69 70 nSSL_add_all_cip
7f60: 68 65 72 73 28 29 3b 20 2f 2a 20 4d 61 6b 65 20 hers(); /* Make
7f70: 73 75 72 65 20 74 68 65 79 27 72 65 20 6c 6f 61 sure they're loa
7f80: 64 65 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 09 ded */.#endif...
7f90: 4f 42 4a 5f 4e 41 4d 45 5f 64 6f 5f 61 6c 6c 28 OBJ_NAME_do_all(
7fa0: 4f 42 4a 5f 4e 41 4d 45 5f 54 59 50 45 5f 43 49 OBJ_NAME_TYPE_CI
7fb0: 50 48 45 52 5f 4d 45 54 48 2c 20 4c 69 73 74 43 PHER_METH, ListC
7fc0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a allback, (void *
7fd0: 29 20 6f 62 6a 50 74 72 29 3b 0a 09 54 63 6c 5f ) objPtr);..Tcl_
7fe0: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 ResetResult(inte
7ff0: 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a rp);..Tcl_SetObj
8000: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
8010: 62 6a 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 bjPtr);..return
8020: 54 43 4c 5f 4f 4b 3b 0a 0a 20 20 20 20 7d 20 65 TCL_OK;.. } e
8030: 6c 73 65 20 69 66 20 28 54 63 6c 5f 47 65 74 49 lse if (Tcl_GetI
8040: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 ndexFromObj(inte
8050: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f rp, objv[1], pro
8060: 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f tocols, "protoco
8070: 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 l", 0, &index) !
8080: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 = TCL_OK) {..ret
8090: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
80a0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 }. if ((ob
80b0: 6a 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 jc > 2) && Tcl_G
80c0: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a etBooleanFromObj
80d0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d (interp, objv[2]
80e0: 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 , &verbose) != T
80f0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
8100: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
8110: 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 }. if ((objc
8120: 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 > 3) && Tcl_GetB
8130: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e ooleanFromObj(in
8140: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 terp, objv[3], &
8150: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 use_supported) !
8160: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 = TCL_OK) {..ret
8170: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
8180: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c }.. ERR_cl
8190: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 ear_error();..
81a0: 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 switch ((enum
81b0: 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 protocol)index)
81c0: 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 {..case TLS_SSL2
81d0: 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 :.#if OPENSSL_VE
81e0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 RSION_NUMBER >=
81f0: 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 0x10100000L || d
8200: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
8210: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
8220: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 SL_NO_SSL2)..
8230: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
8240: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
8250: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
8260: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
8270: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
8280: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
8290: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 RROR;.#else..
82a0: 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 5f method = SSLv2_
82b0: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b method(); break;
82c0: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c .#endif..case TL
82d0: 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 S_SSL3:.#if defi
82e0: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 ned(NO_SSL3) ||
82f0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
8300: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 NO_SSL3) || defi
8310: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
8320: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 SL3_METHOD)..
8330: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
8340: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
8350: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
8360: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
8370: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
8380: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
8390: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 RROR;.#else..
83a0: 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f method = SSLv3_
83b0: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b method(); break;
83c0: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c .#endif..case TL
83d0: 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 S_TLS1:.#if defi
83e0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 ned(NO_TLS1) ||
83f0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
8400: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 NO_TLS1) || defi
8410: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
8420: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 LS1_METHOD)..
8430: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
8440: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
8450: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
8460: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
8470: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
8480: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
8490: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 RROR;.#else..
84a0: 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f method = TLSv1_
84b0: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b method(); break;
84c0: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c .#endif..case TL
84d0: 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 S_TLS1_1:.#if de
84e0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
84f0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
8500: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c SSL_NO_TLS1_1) |
8510: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
8520: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 L_NO_TLS1_1_METH
8530: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 OD).. Tcl_App
8540: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
8550: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
8560: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
8570: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
8580: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
8590: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
85a0: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 lse.. method
85b0: 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 = TLSv1_1_method
85c0: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 (); break;.#endi
85d0: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 f..case TLS_TLS1
85e0: 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 _2:.#if defined(
85f0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 NO_TLS1_2) || de
8600: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8610: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
8620: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
8630: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 LS1_2_METHOD)..
8640: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
8650: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
8660: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
8670: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
8680: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
8690: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
86a0: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 _ERROR;.#else..
86b0: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 method = TLSv
86c0: 31 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 1_2_method(); br
86d0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 eak;.#endif..cas
86e0: 65 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 e TLS_TLS1_3:.#i
86f0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
8700: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_3) || defined(
8710: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
8720: 33 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 3).. Tcl_Appe
8730: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
8740: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 protocols[index
8750: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e ], ": protocol n
8760: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
8770: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ULL);.. retur
8780: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c n TCL_ERROR;.#el
8790: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d se.. method =
87a0: 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 TLS_method();..
87b0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
87c0: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f min_proto_versio
87d0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
87e0: 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c RSION);.. SSL
87f0: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f _CTX_set_max_pro
8800: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 to_version(ctx,
8810: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b TLS1_3_VERSION);
8820: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e .. break;.#en
8830: 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 dif..default:..
8840: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f method = TLS_
8850: 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 62 method();.. b
8860: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 reak;. }..
8870: 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e ctx = SSL_CTX_n
8880: 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 ew(method);.
8890: 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 if (ctx == NULL)
88a0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
88b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 sult(interp, REA
88c0: 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 SON(), NULL);..r
88d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
88e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 . }.. ssl
88f0: 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a = SSL_new(ctx);.
8900: 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e if (ssl == N
8910: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ULL) {..Tcl_Appe
8920: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
8930: 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 REASON(), NULL)
8940: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ;..SSL_CTX_free(
8950: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ctx);..return TC
8960: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
8970: 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 /* Use list
8980: 61 6e 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 and order as wou
8990: 6c 64 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 ld be sent in a
89a0: 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 ClientHello or a
89b0: 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 ll available cip
89c0: 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 hers */. if (
89d0: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b use_supported) {
89e0: 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f ..sk = SSL_get1_
89f0: 73 75 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 supported_cipher
8a00: 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c s(ssl);. } el
8a10: 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 se {..sk = SSL_g
8a20: 65 74 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b et_ciphers(ssl);
8a30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
8a40: 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 sk != NULL) {..i
8a50: 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 f (!verbose) {..
8a60: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
8a70: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
8a80: 55 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 ULL);.. for (
8a90: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 int i = 0; i < s
8aa0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d k_SSL_CIPHER_num
8ab0: 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 (sk); i++) {...c
8ac0: 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 onst SSL_CIPHER
8ad0: 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 *c = sk_SSL_CIPH
8ae0: 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b ER_value(sk, i);
8af0: 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c ...if (c == NULL
8b00: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f ) continue;..../
8b10: 2a 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 * cipher name or
8b20: 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 (NONE) */...cp
8b30: 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 = SSL_CIPHER_get
8b40: 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 _name(c);...if (
8b50: 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 cp == NULL) brea
8b60: 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a k;...Tcl_ListObj
8b70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
8b80: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
8b90: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 l_NewStringObj(c
8ba0: 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a p, -1));.. }.
8bb0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
8bc0: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
8bd0: 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b StringObj("",0);
8be0: 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 .. for (int i
8bf0: 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c = 0; i < sk_SSL
8c00: 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b _CIPHER_num(sk);
8c10: 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 i++) {...const
8c20: 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 SSL_CIPHER *c =
8c30: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 sk_SSL_CIPHER_va
8c40: 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 lue(sk, i);...if
8c50: 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e (c == NULL) con
8c60: 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 tinue;..../* tex
8c70: 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e tual description
8c80: 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a of the cipher *
8c90: 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48 /...if (SSL_CIPH
8ca0: 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 ER_description(c
8cb0: 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 , buf, sizeof(bu
8cc0: 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 f)) != NULL) {..
8cd0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 . Tcl_AppendT
8ce0: 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66 oObj(objPtr, buf
8cf0: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 74 72 , (Tcl_Size) str
8d00: 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d 20 65 len(buf));...} e
8d10: 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f lse {... Tcl_
8d20: 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 AppendToObj(objP
8d30: 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c tr, "UNKNOWN\n",
8d40: 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 8);...}.. }.
8d50: 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 70 70 .}..if (use_supp
8d60: 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20 73 6b orted) {.. sk
8d70: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 65 65 _SSL_CIPHER_free
8d80: 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 (sk);..}. }.
8d90: 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 6c 29 SSL_free(ssl)
8da0: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 ;. SSL_CTX_fr
8db0: 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 63 ee(ctx);.. Tc
8dc0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e l_ResetResult(in
8dd0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 terp);. Tcl_S
8de0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
8df0: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
8e00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
8e10: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
8e20: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
8e30: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
8e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e70: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f ------. *. * Pro
8e80: 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 tocolsObjCmd --
8e90: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 list available p
8ea0: 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 rotocols. *. *.T
8eb0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
8ec0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 invoked to proc
8ed0: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 ess the "tls::pr
8ee0: 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 otocols" command
8ef0: 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 . *.to list avai
8f00: 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e lable protocols.
8f10: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
8f20: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
8f30: 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 l result list..
8f40: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
8f50: 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.none. *. *
8f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fa0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
8fb0: 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 nt.ProtocolsObjC
8fc0: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
8fd0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
8fe0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
8ff0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
9000: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
9010: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
9020: 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e jPtr;.. dprin
9030: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
9040: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 if (objc != 1
9050: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
9060: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
9070: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 objv, "");..ret
9080: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
9090: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c }.. ERR_cl
90a0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 ear_error();..
90b0: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
90c0: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
90d0: 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c L);..#if OPENSSL
90e0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
90f0: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 < 0x10100000L &&
9100: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
9110: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
9120: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a PENSSL_NO_SSL2).
9130: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
9140: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
9150: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
9160: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
9170: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 otocols[TLS_SSL2
9180: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
9190: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
91a0: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
91b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
91c0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
91d0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d PENSSL_NO_SSL3_M
91e0: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c ETHOD). Tcl_L
91f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
9200: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
9210: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
9220: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
9230: 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a LS_SSL3], -1));.
9240: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
9250: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 ned(NO_TLS1) &&
9260: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
9270: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 _NO_TLS1) && !de
9280: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
9290: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 _TLS1_METHOD).
92a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
92b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
92c0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
92d0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
92e0: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c ocols[TLS_TLS1],
92f0: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 -1));.#endif.#i
9300: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
9310: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
9320: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
9330: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_1) && !defined
9340: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
9350: 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 _1_METHOD). T
9360: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
9370: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
9380: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
9390: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
93a0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 ls[TLS_TLS1_1],
93b0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 -1));.#endif.#if
93c0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
93d0: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
93e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
93f0: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _2) && !defined(
9400: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
9410: 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 2_METHOD). Tc
9420: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
9430: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
9440: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
9450: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
9460: 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d s[TLS_TLS1_2], -
9470: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 1));.#endif.#if
9480: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
9490: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
94a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
94b0: 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 3). Tcl_ListO
94c0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
94d0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
94e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
94f0: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 (protocols[TLS_T
9500: 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 LS1_3], -1));.#e
9510: 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 ndif.. Tcl_Se
9520: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
9530: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
9540: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
9550: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
9560: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a entData;.}.../*.
9570: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
9580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95b0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 -----. *. * Vers
95c0: 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 ionObjCmd -- ret
95d0: 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 urn version stri
95e0: 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e ng from OpenSSL.
95f0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
9600: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
9610: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
9620: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
9630: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
9640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
9680: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 */.static int.V
9690: 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 ersionObjCmd(Cli
96a0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
96b0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
96c0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
96d0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
96e0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
96f0: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a cl_Obj *objPtr;.
9700: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
9710: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a lled");.. obj
9720: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 Ptr = Tcl_NewStr
9730: 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 ingObj(OPENSSL_V
9740: 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 ERSION_TEXT, -1)
9750: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a ;. Tcl_SetObj
9760: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
9770: 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 bjPtr);.. ret
9780: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
9790: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
97a0: 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 Data;..objc = ob
97b0: 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 jc;..objv = objv
97c0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
97d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
97e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
97f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
9810: 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 *. * HandshakeOb
9820: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
9830: 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 is command is us
9840: 65 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 ed to verify whe
9850: 74 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 ther the handsha
9860: 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 ke is complete.
9870: 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 *.or not.. *. *
9880: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
9890: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
98a0: 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 t. 1 means hands
98b0: 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 hake complete, 0
98c0: 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a means pending..
98d0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
98e0: 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 ts:. *.May force
98f0: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e SSL negotiation
9900: 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a to take place..
9910: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
9920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9950: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
9960: 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b tic int Handshak
9970: 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 eObjCmd(ClientDa
9980: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
9990: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
99a0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
99b0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
99c0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 []) {. Tcl_Ch
99d0: 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 annel chan;
99e0: 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 /* The channe
99f0: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 l to set a mode
9a00: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 on. */. State
9a10: 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 *statePtr;
9a20: 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 /* client sta
9a30: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 te for ssl socke
9a40: 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 t */. const c
9a50: 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 har *errStr = NU
9a60: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 LL;. int ret
9a70: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 = 1;. int err
9a80: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e = 0;.. dprin
9a90: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
9aa0: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 if (objc != 2
9ab0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
9ac0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
9ad0: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 objv, "channel"
9ae0: 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 );..return(TCL_E
9af0: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 RROR);. }..
9b00: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
9b10: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d r();.. chan =
9b20: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
9b30: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
9b40: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
9b50: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c v[1], NULL), NUL
9b60: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e L);. if (chan
9b70: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
9b80: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
9b90: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
9ba0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
9bb0: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
9bc0: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
9bd0: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
9be0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
9bf0: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 Channel(chan);.
9c00: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
9c10: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
9c20: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
9c30: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
9c40: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
9c50: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
9c60: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
9c70: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 elName(chan),..
9c80: 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c "\": not a TL
9c90: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c S channel", NULL
9ca0: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 );..Tcl_SetError
9cb0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
9cc0: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c S", "HANDSHAKE",
9cd0: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
9ce0: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
9cf0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 NULL);..return(T
9d00: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
9d10: 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 . statePtr =
9d20: 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 (State *)Tcl_Get
9d30: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
9d40: 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 ata(chan);..
9d50: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 dprintf("Calling
9d60: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e Tls_WaitForConn
9d70: 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d ect");. ret =
9d80: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e Tls_WaitForConn
9d90: 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 ect(statePtr, &e
9da0: 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 rr, 1);. dpri
9db0: 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 ntf("Tls_WaitFor
9dc0: 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 Connect returned
9dd0: 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 : %i", ret);..
9de0: 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 if (ret < 0 &&
9df0: 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 ((statePtr->fla
9e00: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 gs & TLS_TCL_ASY
9e10: 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 NC) && (err == E
9e20: 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 AGAIN))) {..dpri
9e30: 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 ntf("Async set a
9e40: 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 nd err = EAGAIN"
9e50: 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 );..ret = 0;.
9e60: 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 } else if (ret
9e70: 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 < 0) {..long res
9e80: 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 73 ult;..errStr = s
9e90: 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 tatePtr->err;..T
9ea0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 cl_ResetResult(i
9eb0: 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 nterp);..Tcl_Set
9ec0: 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 Errno(err);...if
9ed0: 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 (!errStr || (*e
9ee0: 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 rrStr == 0)) {..
9ef0: 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c errStr = Tcl
9f00: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 _PosixError(inte
9f10: 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 rp);..}...Tcl_Ap
9f20: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
9f30: 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 p, "handshake fa
9f40: 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c iled: ", errStr,
9f50: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
9f60: 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d 20 ..if ((result =
9f70: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 SSL_get_verify_r
9f80: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e esult(statePtr->
9f90: 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 5f ssl)) != X509_V_
9fa0: 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 OK) {.. Tcl_A
9fb0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
9fc0: 72 70 2c 20 22 20 64 75 65 20 74 6f 3a 20 22 2c rp, " due to: ",
9fd0: 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 X509_verify_cer
9fe0: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72 t_error_string(r
9ff0: 65 73 75 6c 74 29 2c 20 28 63 68 61 72 20 2a 29 esult), (char *)
a000: 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f NULL);..}..Tcl_
a010: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
a020: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e erp, "TLS", "HAN
a030: 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c 45 44 DSHAKE", "FAILED
a040: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
a050: 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65 74 );..dprintf("Ret
a060: 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52 urning TCL_ERROR
a070: 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 20 with handshake
a080: 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 72 failed: %s", err
a090: 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 Str);..return(TC
a0a0: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 20 L_ERROR);. }
a0b0: 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72 20 else {..if (err
a0c0: 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 != 0) {.. dpr
a0d0: 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 intf("Got an err
a0e0: 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c 65 or with a comple
a0f0: 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 65 ted handshake: e
a100: 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a rr = %i", err);.
a110: 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 20 .}..ret = 1;.
a120: 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 }.. dprintf(
a130: 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f "Returning TCL_O
a140: 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 25 69 K with data \"%i
a150: 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 54 \"", ret);. T
a160: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
a170: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 interp, Tcl_NewI
a180: 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20 ntObj(ret));.
a190: 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b return(TCL_OK);
a1a0: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
a1b0: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a lientData;.}../*
a1c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
a1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a200: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 ------. *. * Imp
a210: 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a ortObjCmd --. *.
a220: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
a230: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 e is invoked to
a240: 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c process the "ssl
a250: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 " command. *. *.
a260: 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 The ssl command
a270: 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20 pushes SSL over
a280: 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 a (newly connect
a290: 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 ed) tcp socket.
a2a0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
a2b0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
a2c0: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
a2d0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d de effects:. *.M
a2e0: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 ay modify the be
a2f0: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 havior of an IO
a300: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d channel.. *. *--
a310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a350: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
a360: 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c .ImportObjCmd(Cl
a370: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
a380: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
a390: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
a3a0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
a3b0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
a3c0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
a3d0: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 ;../* The channe
a3e0: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 l to set a mode
a3f0: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 on. */. State
a400: 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 *statePtr;../*
a410: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 client state for
a420: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 ssl socket */.
a430: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 SSL_CTX *ctx.
a440: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
a450: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 Tcl_Obj *scr
a460: 69 70 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ipt. = NU
a470: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 LL;. Tcl_Obj
a480: 2a 70 61 73 73 77 6f 72 64 09 20 20 20 20 20 20 *password.
a490: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 = NULL;. Tc
a4a0: 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09 20 20 20 20 l_Obj *vcmd.
a4b0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
a4c0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 Tcl_DString uppe
a4d0: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
a4e0: 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 ion, upperChanne
a4f0: 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 lBlocking, upper
a500: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c ChannelEncoding,
a510: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 upperChannelEOF
a520: 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 Char;. int id
a530: 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 x, len;. int
a540: 66 6c 61 67 73 09 09 20 20 20 20 20 20 20 20 3d flags.. =
a550: 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 TLS_TCL_INIT;.
a560: 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 09 20 int server..
a570: 20 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 69 = 0;./* i
a580: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 s connection inc
a590: 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e oming or outgoin
a5a0: 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a g? */. char *
a5b0: 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 keyfile.
a5c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
a5d0: 20 2a 63 65 72 74 66 69 6c 65 09 20 20 20 20 20 *certfile.
a5e0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 = NULL;. u
a5f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 nsigned char *ke
a600: 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 y .= NULL;.
a610: 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 20 20 20 20 int key_len
a620: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b = 0;
a630: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
a640: 61 72 20 2a 63 65 72 74 20 20 20 20 20 20 20 20 ar *cert
a650: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 = NULL;. int
a660: 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 20 20 cert_len
a670: 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 = 0;.
a680: 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 09 char *ciphers.
a690: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
a6a0: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 char *cipher
a6b0: 73 75 69 74 65 73 09 20 20 20 20 20 20 20 20 3d suites. =
a6c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
a6d0: 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 *CAfile.
a6e0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
a6f0: 20 2a 43 41 64 69 72 09 09 20 20 20 20 20 20 20 *CAdir..
a700: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
a710: 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20 20 20 r *DHparams.
a720: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
a730: 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 20 20 char *model..
a740: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
a750: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
a760: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c e. = NULL
a770: 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f ;./* hostname fo
a780: 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e r Server Name In
a790: 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 dication */.
a7a0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
a7b0: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 20 har *session_id
a7c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
a7d0: 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c Obj *alpn..= NUL
a7e0: 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 L;. int ssl2
a7f0: 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 = 0, ssl3 = 0;.
a800: 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c int tls1 = 1,
a810: 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 tls1_1 = 1, tls
a820: 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 1_2 = 1, tls1_3
a830: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f = 1;. int pro
a840: 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 to = 0, level =
a850: 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 -1;. int veri
a860: 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 fy = 0, require
a870: 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 = 0, request = 1
a880: 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 , post_handshake
a890: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e = 0;.. dprin
a8a0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 tf("Called");..#
a8b0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
a8c0: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f S1) || defined(O
a8d0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a PENSSL_NO_TLS1).
a8e0: 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 tls1 = 0;.#e
a8f0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
a900: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 (NO_TLS1_1) || d
a910: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
a920: 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c O_TLS1_1). tl
a930: 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 s1_1 = 0;.#endif
a940: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
a950: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e TLS1_2) || defin
a960: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
a970: 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 S1_2). tls1_2
a980: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 0;.#endif.#if
a990: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
a9a0: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _3) || defined(O
a9b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
a9c0: 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 ). tls1_3 = 0
a9d0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 ;.#endif.. if
a9e0: 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 (objc < 2) {..T
a9f0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
aa00: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
aa10: 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f "channel ?optio
aa20: 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 ns?");..return T
aa30: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
aa40: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
aa50: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 rror();.. cha
aa60: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
aa70: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 el(interp, Tcl_G
aa80: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
aa90: 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 objv[1], NULL),
aaa0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
aab0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
aac0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
aad0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
aae0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
aaf0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
ab00: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
ab10: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
ab20: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
ab30: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
ab40: 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d .. for (idx =
ab50: 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 2; idx < objc;
ab60: 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a idx++) {..char *
ab70: 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 opt = Tcl_GetStr
ab80: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
ab90: 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 idx], NULL);...i
aba0: 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 f (opt[0] != '-'
abb0: 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 ).. break;...
abc0: 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 OPTOBJ("-alpn",
abd0: 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 alpn);..OPTSTR("
abe0: 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72 29 3b -cadir", CAdir);
abf0: 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c ..OPTSTR("-cafil
ac00: 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 e", CAfile);..OP
ac10: 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 TBYTE("-cert", c
ac20: 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a ert, cert_len);.
ac30: 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66 69 .OPTSTR("-certfi
ac40: 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a le", certfile);.
ac50: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 .OPTSTR("-cipher
ac60: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 ", ciphers);..OP
ac70: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c TSTR("-ciphers",
ac80: 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 ciphers);..OPTS
ac90: 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 74 65 TR("-ciphersuite
aca0: 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 s", ciphersuites
acb0: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d );..OPTOBJ("-com
acc0: 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a mand", script);.
acd0: 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72 61 .OPTSTR("-dhpara
ace0: 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a ms", DHparams);.
acf0: 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c .OPTBYTE("-key",
ad00: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a key, key_len);.
ad10: 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c .OPTSTR("-keyfil
ad20: 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f e", keyfile);..O
ad30: 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 PTSTR("-model",
ad40: 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 model);..OPTOBJ(
ad50: 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73 "-password", pas
ad60: 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c sword);..OPTBOOL
ad70: 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b ("-post_handshak
ad80: 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 e", post_handsha
ad90: 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d ke);..OPTBOOL("-
ada0: 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 65 73 request", reques
adb0: 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 t);..OPTBOOL("-r
adc0: 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 72 65 equire", require
add0: 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 );..OPTINT("-sec
ade0: 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 6c 65 76 uritylevel", lev
adf0: 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d el);..OPTBOOL("-
ae00: 73 65 72 76 65 72 22 2c 20 73 65 72 76 65 72 29 server", server)
ae10: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 72 76 ;..OPTSTR("-serv
ae20: 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 6e ername", servern
ae30: 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ame);..OPTSTR("-
ae40: 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 session_id", ses
ae50: 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f sion_id);..OPTBO
ae60: 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 OL("-ssl2", ssl2
ae70: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 );..OPTBOOL("-ss
ae80: 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 l3", ssl3);..OPT
ae90: 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c BOOL("-tls1", tl
aea0: 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d s1);..OPTBOOL("-
aeb0: 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 tls1.1", tls1_1)
aec0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
aed0: 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 1.2", tls1_2);..
aee0: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 OPTBOOL("-tls1.3
aef0: 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 ", tls1_3);..OPT
af00: 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 65 63 6f OBJ("-validateco
af10: 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 mmand", vcmd);..
af20: 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 OPTOBJ("-vcmd",
af30: 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 vcmd);...OPTBAD(
af40: 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e "option", "-alpn
af50: 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c , -cadir, -cafil
af60: 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 e, -cert, -certf
af70: 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 ile, -cipher, -c
af80: 69 70 68 65 72 73 75 69 74 65 73 2c 20 2d 63 6f iphersuites, -co
af90: 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 mmand, -dhparams
afa0: 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 , -key, -keyfile
afb0: 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 , -model, -passw
afc0: 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 ord, -post_hands
afd0: 68 61 6b 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 hake, -request,
afe0: 2d 72 65 71 75 69 72 65 2c 20 2d 73 65 63 75 72 -require, -secur
aff0: 69 74 79 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 itylevel, -serve
b000: 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 r, -servername,
b010: 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 -session_id, -ss
b020: 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 l2, -ssl3, -tls1
b030: 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 , -tls1.1, -tls1
b040: 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 .2, -tls1.3, or
b050: 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 -validatecommand
b060: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c ");...return TCL
b070: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
b080: 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09 09 if (request)..
b090: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 verify |= SSL_VE
b0a0: 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 RIFY_CLIENT_ONCE
b0b0: 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 | SSL_VERIFY_PE
b0c0: 45 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 ER;. if (requ
b0d0: 65 73 74 20 26 26 20 72 65 71 75 69 72 65 29 09 est && require).
b0e0: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 verify |= SSL_VE
b0f0: 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f RIFY_FAIL_IF_NO_
b100: 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 PEER_CERT;. i
b110: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f f (request && po
b120: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65 st_handshake).ve
b130: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 rify |= SSL_VERI
b140: 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b FY_POST_HANDSHAK
b150: 45 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 E;. if (verif
b160: 79 20 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20 y == 0)..verify
b170: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e = SSL_VERIFY_NON
b180: 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d E;.. proto |=
b190: 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f (ssl2 ? TLS_PRO
b1a0: 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 TO_SSL2 : 0);.
b1b0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 proto |= (ssl3
b1c0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c ? TLS_PROTO_SSL
b1d0: 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 3 : 0);. prot
b1e0: 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 o |= (tls1 ? TLS
b1f0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 _PROTO_TLS1 : 0)
b200: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
b210: 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f tls1_1 ? TLS_PRO
b220: 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a TO_TLS1_1 : 0);.
b230: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
b240: 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f s1_2 ? TLS_PROTO
b250: 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 _TLS1_2 : 0);.
b260: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
b270: 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 _3 ? TLS_PROTO_T
b280: 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 LS1_3 : 0);..
b290: 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c /* reset to NUL
b2a0: 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e L if blank strin
b2b0: 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 g provided */.
b2c0: 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a if (cert && !*
b2d0: 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63 cert).. c
b2e0: 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ert. = NU
b2f0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 LL;. if (key
b300: 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 && !*key)..
b310: 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d key. =
b320: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
b330: 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 ertfile && !*cer
b340: 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 tfile) c
b350: 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a ertfile.= NULL;.
b360: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 if (keyfile
b370: 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b && !*keyfile)..k
b380: 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d eyfile. =
b390: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
b3a0: 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 iphers && !*ciph
b3b0: 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70 ers). cip
b3c0: 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e hers. = N
b3d0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 ULL;. if (cip
b3e0: 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 hersuites && !*c
b3f0: 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70 iphersuites) cip
b400: 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e hersuites = N
b410: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 ULL;. if (CAf
b420: 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 ile && !*CAfile)
b430: 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 . CAfile.
b440: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
b450: 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26 26 if (CAdir &&
b460: 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 20 20 !*CAdir).
b470: 20 20 43 41 64 69 72 09 20 20 20 20 20 20 20 20 CAdir.
b480: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
b490: 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 DHparams && !*DH
b4a0: 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 params).
b4b0: 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 DHparams
b4c0: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 = NULL;.. /*
b4d0: 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f new SSL state */
b4e0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d . statePtr..=
b4f0: 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c (State *) ckall
b500: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 oc((unsigned) si
b510: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 zeof(State));.
b520: 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 memset(statePt
b530: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 r, 0, sizeof(Sta
b540: 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 te));.. state
b550: 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 Ptr->flags.= fla
b560: 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 gs;. statePtr
b570: 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 ->interp.= inter
b580: 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d p;. statePtr-
b590: 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 >vflags.= verify
b5a0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
b5b0: 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f err.= "";.. /
b5c0: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 * allocate scrip
b5d0: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 t */. if (scr
b5e0: 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 ipt) {..(void) T
b5f0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
b600: 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e Obj(script, &len
b610: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
b620: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 statePtr->ca
b630: 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b llback = script;
b640: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
b650: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
b660: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 >callback);..}.
b670: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c }.. /* all
b680: 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a ocate password *
b690: 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f /. if (passwo
b6a0: 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 rd) {..(void) Tc
b6b0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
b6c0: 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 bj(password, &le
b6d0: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
b6e0: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 . statePtr->p
b6f0: 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f assword = passwo
b700: 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 rd;.. Tcl_Inc
b710: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
b720: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 tr->password);..
b730: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
b740: 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74 allocate validat
b750: 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 e command */.
b760: 20 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 if (vcmd) {..(v
b770: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 oid) Tcl_GetStri
b780: 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 ngFromObj(vcmd,
b790: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 &len);..if (len)
b7a0: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 {.. statePtr
b7b0: 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 ->vcmd = vcmd;..
b7c0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
b7d0: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 ount(statePtr->v
b7e0: 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a cmd);..}. }..
b7f0: 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d if (model !=
b800: 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f NULL) {..int mo
b810: 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 de;../* Get the
b820: 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 "model" context
b830: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 */..chan = Tcl_G
b840: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
b850: 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b , model, &mode);
b860: 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 ..if (chan == (T
b870: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
b880: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 ) {.. Tls_Fre
b890: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
b8a0: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
b8b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
b8c0: 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 ../*.. * Make su
b8d0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
b8e0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
b8f0: 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 nnel.. */..chan
b900: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
b910: 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 nel(chan);..if (
b920: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
b930: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f pe(chan) != Tls_
b940: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b ChannelType()) {
b950: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
b960: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
b970: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
b980: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
b990: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
b9a0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
b9b0: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 nel", NULL);..
b9c0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
b9d0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
b9e0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 , "IMPORT", "CHA
b9f0: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 NNEL", "INVALID"
ba00: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
ba10: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
ba20: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
ba30: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
ba40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 TCL_ERROR;..}..c
ba50: 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54 tx = ((State *)T
ba60: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
ba70: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29 tanceData(chan))
ba80: 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 ->ctx;. } els
ba90: 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20 e {..if ((ctx =
baa0: 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74 CTX_Init(statePt
bab0: 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f r, server, proto
bac0: 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66 , keyfile, certf
bad0: 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 ile, key, cert,
bae0: 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 63 65 key_len,.. ce
baf0: 72 74 5f 6c 65 6e 2c 20 43 41 64 69 72 2c 20 43 rt_len, CAdir, C
bb00: 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 Afile, ciphers,
bb10: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65 ciphersuites, le
bb20: 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20 vel, DHparams))
bb30: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 == NULL) {..
bb40: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
bb50: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
bb60: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
bb70: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 OR;..}. }..
bb80: 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 statePtr->ctx
bb90: 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 = ctx;.. /*.
bba0: 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f * We need to
bbb0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 make sure that
bbc0: 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b the channel work
bbd0: 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 s in binary (for
bbe0: 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 the. * encr
bbf0: 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 yption not to ge
bc00: 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 t goofed up)..
bc10: 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e * We only wan
bc20: 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 t to adjust the
bc30: 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65 buffering in pre
bc40: 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 -v2 channels, wh
bc50: 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20 ere. * each
bc60: 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 channel in the s
bc70: 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 tack maintained
bc80: 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e its own buffers.
bc90: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c . */. Tcl
bca0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 _DStringInit(&up
bcb0: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
bcc0: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f ation);. Tcl_
bcd0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 DStringInit(&upp
bce0: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
bcf0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 g);. Tcl_DStr
bd00: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
bd10: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 annelEOFChar);.
bd20: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
bd30: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
bd40: 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 Encoding);. T
bd50: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
bd60: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
bd70: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 , "-eofchar", &u
bd80: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
bd90: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 ar);. Tcl_Get
bda0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
bdb0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e terp, chan, "-en
bdc0: 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 coding", &upperC
bdd0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b hannelEncoding);
bde0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
bdf0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
be00: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c , chan, "-transl
be10: 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 ation", &upperCh
be20: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
be30: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
be40: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
be50: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 rp, chan, "-bloc
be60: 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 king", &upperCha
be70: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 nnelBlocking);.
be80: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
be90: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
bea0: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 chan, "-translat
beb0: 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b ion", "binary");
bec0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
bed0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
bee0: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 , chan, "-blocki
bef0: 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 ng", "true");.
bf00: 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 dprintf("Consu
bf10: 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c ming Tcl channel
bf20: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 %s", Tcl_GetCha
bf30: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b nnelName(chan));
bf40: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 . statePtr->s
bf50: 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 elf = Tcl_StackC
bf60: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
bf70: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
bf80: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 , (ClientData) s
bf90: 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f 52 45 tatePtr, (TCL_RE
bfa0: 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 ADABLE | TCL_WRI
bfb0: 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 TABLE), chan);.
bfc0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65 61 dprintf("Crea
bfd0: 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 ted channel name
bfe0: 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 d %s", Tcl_GetCh
bff0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
c000: 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 tr->self));.
c010: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 if (statePtr->se
c020: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e lf == (Tcl_Chann
c030: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a el) NULL) {../*.
c040: 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 . * No use of Tc
c050: 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 l_EventuallyFree
c060: 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 because no poss
c070: 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 76 ible Tcl_Preserv
c080: 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 e... */..Tls_Fre
c090: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
c0a0: 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 Ptr);..return TC
c0b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
c0c0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
c0d0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
c0e0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c statePtr->self,
c0f0: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c "-translation",
c100: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 Tcl_DStringValu
c110: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 e(&upperChannelT
c120: 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 ranslation));.
c130: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
c140: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 Option(interp, s
c150: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 tatePtr->self, "
c160: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f -encoding", Tcl_
c170: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 DStringValue(&up
c180: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
c190: 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ng));. Tcl_Se
c1a0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
c1b0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
c1c0: 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 >self, "-eofchar
c1d0: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 ", Tcl_DStringVa
c1e0: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 lue(&upperChanne
c1f0: 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20 lEOFChar));.
c200: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
c210: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 tion(interp, sta
c220: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 tePtr->self, "-b
c230: 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 locking", Tcl_DS
c240: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 tringValue(&uppe
c250: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
c260: 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 ));.. /*.
c270: 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a * SSL Initializ
c280: 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 ation. */.
c290: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 statePtr->ssl
c2a0: 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 = SSL_new(stateP
c2b0: 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 tr->ctx);. if
c2c0: 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73 6c (!statePtr->ssl
c2d0: 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 ) {../* SSL libr
c2e0: 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 ary error */..Tc
c2f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
c300: 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 nterp, "couldn't
c310: 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73 construct ssl s
c320: 65 73 73 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f ession: ", REASO
c330: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
c340: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
c350: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
c360: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
c370: 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 T", "INIT", "FAI
c380: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
c390: 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 ULL);..Tls_Free(
c3a0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
c3b0: 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f r);..return TCL_
c3c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
c3d0: 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 20 73 65 /* Set host se
c3e0: 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 rver name */.
c3f0: 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d 65 29 if (servername)
c400: 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74 68 65 20 {../* Sets the
c410: 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 server name indi
c420: 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 cation (SNI) in
c430: 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 ClientHello exte
c440: 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 nsion */../* Per
c450: 20 52 46 43 20 36 30 36 36 2c 20 68 6f 73 74 6e RFC 6066, hostn
c460: 61 6d 65 20 69 73 20 61 20 41 53 43 49 49 20 65 ame is a ASCII e
c470: 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 74 ncoded string, t
c480: 68 6f 75 67 68 20 52 46 43 20 34 33 36 36 20 73 hough RFC 4366 s
c490: 61 79 73 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 ays UTF-8. */..i
c4a0: 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 f (!SSL_set_tlse
c4b0: 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 xt_host_name(sta
c4c0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 tePtr->ssl, serv
c4d0: 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69 ername) && requi
c4e0: 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 re) {.. Tcl_A
c4f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
c500: 72 70 2c 20 22 73 65 74 74 69 6e 67 20 54 4c 53 rp, "setting TLS
c510: 20 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 65 6e host name exten
c520: 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20 28 63 sion failed", (c
c530: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
c540: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
c550: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
c560: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e ", "IMPORT", "SN
c570: 49 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 I", "FAILED", (c
c580: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
c590: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
c5a0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
c5b0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
c5c0: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 ERROR;..}.../* S
c5d0: 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 et hostname for
c5e0: 70 65 65 72 20 63 65 72 74 69 66 69 63 61 74 65 peer certificate
c5f0: 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 69 66 69 hostname verifi
c600: 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 cation in client
c610: 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75 73 65 s... Don't use
c620: 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 SSL_set1_host s
c630: 69 6e 63 65 20 69 74 20 68 61 73 20 6c 69 6d 69 ince it has limi
c640: 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 tations. */..if
c650: 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 (!SSL_add1_host(
c660: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 statePtr->ssl, s
c670: 65 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 ervername)) {..
c680: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
c690: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74 ult(interp, "set
c6a0: 74 69 6e 67 20 44 4e 53 20 68 6f 73 74 20 6e 61 ting DNS host na
c6b0: 6d 65 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 me failed", (cha
c6c0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
c6d0: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 Tcl_SetErrorCod
c6e0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
c6f0: 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54 "IMPORT", "HOST
c700: 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 2c NAME", "FAILED",
c710: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
c720: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
c730: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
c740: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
c750: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 CL_ERROR;..}.
c760: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d }.. /* Resum
c770: 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a e session id */.
c780: 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f if (session_
c790: 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 id && strlen(ses
c7a0: 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f sion_id) <= SSL_
c7b0: 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 MAX_SID_CTX_LENG
c7c0: 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 TH) {../* SSL_se
c7d0: 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 t_session() */..
c7e0: 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e if (!SSL_SESSION
c7f0: 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 _set1_id_context
c800: 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e (SSL_get_session
c810: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c (statePtr->ssl),
c820: 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e session_id, (un
c830: 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c signed int) strl
c840: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 en(session_id)))
c850: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
c860: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
c870: 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e "Resume session
c880: 20 69 64 20 22 2c 20 73 65 73 73 69 6f 6e 5f 69 id ", session_i
c890: 64 2c 20 22 20 66 61 69 6c 65 64 22 2c 20 28 63 d, " failed", (c
c8a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
c8b0: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
c8c0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
c8d0: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 ", "IMPORT", "SE
c8e0: 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 SSION", "FAILED"
c8f0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
c900: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
c910: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
c920: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
c930: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
c940: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 }.. /* Enab
c950: 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c le Application-L
c960: 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 ayer Protocol Ne
c970: 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 gotiation. Examp
c980: 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f 31 2e les are: http/1.
c990: 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 0,..http/1.1, h2
c9a0: 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c , h3, ftp, imap,
c9b0: 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 pop3, xmpp-clie
c9c0: 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 2c nt, xmpp-server,
c9d0: 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 63 2e mqtt, irc, etc.
c9e0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 6e */. if (alpn
c9f0: 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 ) {../* Convert
ca00: 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 a TCL list into
ca10: 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 a protocol-list
ca20: 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a in wire-format *
ca30: 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 /..unsigned char
ca40: 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 *protos, *p;..u
ca50: 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 nsigned int prot
ca60: 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 6e 74 os_len = 0;..int
ca70: 20 69 2c 20 6c 65 6e 2c 20 63 6e 74 3b 0a 09 54 i, len, cnt;..T
ca80: 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a cl_Obj **list;..
ca90: 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a .if (Tcl_ListObj
caa0: 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 GetElements(inte
cab0: 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 rp, alpn, &cnt,
cac0: 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b &list) != TCL_OK
cad0: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 ) {.. Tls_Fre
cae0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
caf0: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
cb00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
cb10: 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 ../* Determine t
cb20: 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 he memory requir
cb30: 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f ed for the proto
cb40: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 col-list */..for
cb50: 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 (i = 0; i < cnt
cb60: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 ; i++) {.. Tc
cb70: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
cb80: 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e bj(list[i], &len
cb90: 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 );.. if (len
cba0: 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 > 255) {...Tcl_A
cbb0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
cbc0: 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63 rp, "ALPN protoc
cbd0: 6f 6c 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f 6e 67 ol name too long
cbe0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
cbf0: 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72 6f );...Tcl_SetErro
cc00: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
cc10: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 LS", "IMPORT", "
cc20: 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c ALPN", "FAILED",
cc30: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
cc40: 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 ...Tls_Free((cha
cc50: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
cc60: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
cc70: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 OR;.. }..
cc80: 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 protos_len += 1
cc90: 2b 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 + len;..}.../* B
cca0: 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 uild the complet
ccb0: 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 e protocol-list
ccc0: 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 */..protos = cka
ccd0: 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 lloc(protos_len)
cce0: 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c ;../* protocol-l
ccf0: 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 ists consist of
cd00: 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 8-bit length-pre
cd10: 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 69 fixed, byte stri
cd20: 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d ngs */..for (i =
cd30: 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 0, p = protos;
cd40: 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a i < cnt; i++) {.
cd50: 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d . char *str =
cd60: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
cd70: 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 omObj(list[i], &
cd80: 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 len);.. *p++
cd90: 3d 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 = len;.. memc
cda0: 70 79 28 70 2c 20 73 74 72 2c 20 6c 65 6e 29 3b py(p, str, len);
cdb0: 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a .. p += len;.
cdc0: 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f .}.../* SSL_set_
cdd0: 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 alpn_protos make
cde0: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 s a copy of the
cdf0: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f protocol-list */
ce00: 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 ../* Note: This
ce10: 66 75 6e 63 74 69 6f 6e 73 20 72 65 76 65 72 73 functions revers
ce20: 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 es the return va
ce30: 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a lue convention *
ce40: 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 /..if (SSL_set_a
ce50: 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 lpn_protos(state
ce60: 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 Ptr->ssl, protos
ce70: 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b , protos_len)) {
ce80: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
ce90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
cea0: 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 41 4c failed to set AL
ceb0: 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 PN protocols", (
cec0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
ced0: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 Tcl_SetError
cee0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
cef0: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 S", "IMPORT", "A
cf00: 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 LPN", "FAILED",
cf10: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
cf20: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
cf30: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
cf40: 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72 ;.. ckfree(pr
cf50: 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75 otos);.. retu
cf60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
cf70: 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 .../* Store prot
cf80: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 ocols list */..s
cf90: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
cfa0: 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 = protos;..state
cfb0: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 Ptr->protos_len
cfc0: 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 = protos_len;.
cfd0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 } else {..stat
cfe0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e ePtr->protos = N
cff0: 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e ULL;..statePtr->
d000: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a protos_len = 0;.
d010: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
d020: 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 * SSL Callbac
d030: 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 ks. */. S
d040: 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 SL_set_app_data(
d050: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 statePtr->ssl, (
d060: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
d070: 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 ;./* point back
d080: 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c to us */. SSL
d090: 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74 _set_verify(stat
d0a0: 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 ePtr->ssl, verif
d0b0: 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 y, VerifyCallbac
d0c0: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f k);. SSL_set_
d0d0: 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 info_callback(st
d0e0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 atePtr->ssl, Inf
d0f0: 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 oCallback);..
d100: 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 /* Callback for
d110: 20 6f 62 73 65 72 76 69 6e 67 20 70 72 6f 74 6f observing proto
d120: 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a col messages */.
d130: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f #ifndef OPENSSL_
d140: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20 20 20 NO_SSL_TRACE.
d150: 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 /* void SSL_CTX
d160: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 _set_msg_callbac
d170: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e k_arg(statePtr->
d180: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ctx, (void *)sta
d190: 74 65 50 74 72 29 3b 0a 20 20 20 20 76 6f 69 64 tePtr);. void
d1a0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 SSL_CTX_set_msg
d1b0: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 _callback(stateP
d1c0: 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61 67 65 tr->ctx, Message
d1d0: 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 Callback); */.
d1e0: 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 SSL_set_msg_ca
d1f0: 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 llback_arg(state
d200: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 Ptr->ssl, (void
d210: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 *)statePtr);.
d220: 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c SSL_set_msg_cal
d230: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e lback(statePtr->
d240: 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c ssl, MessageCall
d250: 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 back);.#endif..
d260: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c /* Create Tcl
d270: 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e _Channel BIO Han
d280: 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 dler */. stat
d290: 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 ePtr->p_bio.= BI
d2a0: 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50 O_new_tcl(stateP
d2b0: 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 tr, BIO_NOCLOSE)
d2c0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
d2d0: 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 bio.= BIO_new(BI
d2e0: 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 O_f_ssl());..
d2f0: 20 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 if (server) {..
d300: 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62 61 /* Server callba
d310: 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f cks */..SSL_CTX_
d320: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 set_tlsext_serve
d330: 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 65 50 rname_arg(stateP
d340: 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a tr->ctx, (void *
d350: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c )statePtr);..SSL
d360: 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f _CTX_set_tlsext_
d370: 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 servername_callb
d380: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ack(statePtr->ct
d390: 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b x, SNICallback);
d3a0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c ..SSL_CTX_set_cl
d3b0: 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 ient_hello_cb(st
d3c0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c atePtr->ctx, Hel
d3d0: 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 loCallback, (voi
d3e0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 d *)statePtr);..
d3f0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 if (statePtr->pr
d400: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a otos != NULL) {.
d410: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
d420: 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 _alpn_select_cb(
d430: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 statePtr->ctx, A
d440: 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f LPNCallback, (vo
d450: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
d460: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 #ifdef USE_NPN..
d470: 20 20 20 20 69 66 20 28 74 6c 73 31 5f 32 20 3d if (tls1_2 =
d480: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d = 0 && tls1_3 ==
d490: 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 0) {...SSL_CTX_
d4a0: 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f set_next_protos_
d4b0: 61 64 76 65 72 74 69 73 65 64 5f 63 62 28 73 74 advertised_cb(st
d4c0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e atePtr->ctx, NPN
d4d0: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 Callback, (void
d4e0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 *)statePtr);..
d4f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 }.#endif..}...
d500: 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65 72 /* Enable server
d510: 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72 65 to send cert re
d520: 71 75 65 73 74 20 61 66 74 65 72 20 68 61 6e 64 quest after hand
d530: 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f shake (TLS 1.3 o
d540: 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 nly) */../* A wr
d550: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75 ite operation mu
d560: 73 74 20 74 61 6b 65 20 70 6c 61 63 65 20 66 6f st take place fo
d570: 72 20 74 68 65 20 43 65 72 74 69 66 69 63 61 74 r the Certificat
d580: 65 20 52 65 71 75 65 73 74 20 74 6f 20 62 65 0a e Request to be.
d590: 09 20 20 20 73 65 6e 74 20 74 6f 20 74 68 65 20 . sent to the
d5a0: 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 61 6e client, this can
d5b0: 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20 53 53 be done with SS
d5c0: 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29 L_do_handshake()
d5d0: 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 . */..if (reques
d5e0: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 t && post_handsh
d5f0: 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 29 20 7b ake && tls1_3) {
d600: 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66 79 .. SSL_verify
d610: 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e _client_post_han
d620: 64 73 68 61 6b 65 28 73 74 61 74 65 50 74 72 2d dshake(statePtr-
d630: 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 >ssl);..}.../* s
d640: 65 74 20 61 75 74 6f 6d 61 74 69 63 20 63 75 72 et automatic cur
d650: 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a ve selection */.
d660: 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 5f 61 75 .SSL_set_ecdh_au
d670: 74 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c to(statePtr->ssl
d680: 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 74 20 73 , 1);.../* Set s
d690: 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 erver mode */..s
d6a0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c tatePtr->flags |
d6b0: 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 = TLS_TCL_SERVER
d6c0: 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 ;..SSL_set_accep
d6d0: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 t_state(statePtr
d6e0: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c ->ssl);. } el
d6f0: 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 se {../* Client
d700: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66 callbacks */.#if
d710: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20 def USE_NPN..if
d720: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
d730: 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73 s != NULL && tls
d740: 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 1_2 == 0 && tls1
d750: 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 _3 == 0) {..
d760: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 SSL_CTX_set_next
d770: 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62 _proto_select_cb
d780: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
d790: 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 ALPNCallback, (v
d7a0: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
d7b0: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 ..}.#endif.../*
d7c0: 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67 20 Session caching
d7d0: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f */..SSL_CTX_set_
d7e0: 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f session_cache_mo
d7f0: 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 de(statePtr->ctx
d800: 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 , SSL_SESS_CACHE
d810: 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45 _CLIENT | SSL_SE
d820: 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 SS_CACHE_NO_INTE
d830: 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53 RNAL_STORE);..SS
d840: 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e L_CTX_sess_set_n
d850: 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e ew_cb(statePtr->
d860: 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c ctx, SessionCall
d870: 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 back);.../* Enab
d880: 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61 6b le post handshak
d890: 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e e Authentication
d8a0: 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 extension. TLS
d8b0: 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 1.3 only, not ht
d8c0: 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65 tp/2. */..if (re
d8d0: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 quest && post_ha
d8e0: 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 ndshake) {..
d8f0: 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e SSL_set_post_han
d900: 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61 74 dshake_auth(stat
d910: 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 ePtr->ssl, 1);..
d920: 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e }.../* Set clien
d930: 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 t mode */..SSL_s
d940: 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65 et_connect_state
d950: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
d960: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73 . }. SSL_s
d970: 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d et_bio(statePtr-
d980: 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e >ssl, statePtr->
d990: 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d p_bio, statePtr-
d9a0: 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f >p_bio);. BIO
d9b0: 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74 _set_ssl(statePt
d9c0: 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72 r->bio, statePtr
d9d0: 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f ->ssl, BIO_NOCLO
d9e0: 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 SE);.. /*.
d9f0: 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 * End of SSL I
da00: 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 nit. */.
da10: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
da20: 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 ng %s", Tcl_GetC
da30: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
da40: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 Ptr->self));.
da50: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 Tcl_SetResult(i
da60: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20 nterp, (char *)
da70: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
da80: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
da90: 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 f), TCL_VOLATILE
daa0: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
dab0: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 CL_OK;..clientDa
dac0: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
dad0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
dae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
daf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
db00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
db10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
db20: 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 . * UnimportObjC
db30: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 md --. *. *.This
db40: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e procedure is in
db50: 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 voked to remove
db60: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
db70: 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 nel filter.. *.
db80: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
db90: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
dba0: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
dbb0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 effects:. *.May
dbc0: 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 modify the behav
dbd0: 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 ior of an IO cha
dbe0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nnel.. *. *-----
dbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
dc30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e */.static int.Un
dc40: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 importObjCmd(Cli
dc50: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
dc60: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
dc70: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
dc80: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
dc90: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
dca0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
dcb0: 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c ../* The channel
dcc0: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f to set a mode o
dcd0: 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e n. */.. dprin
dce0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
dcf0: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 if (objc != 2
dd00: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
dd10: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
dd20: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 objv, "channel"
dd30: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
dd40: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
dd50: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
dd60: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
dd70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a cl_GetString(obj
dd80: 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 v[1]), NULL);.
dd90: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 if (chan == (T
dda0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
ddb0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
ddc0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
ddd0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 /* Make sure t
dde0: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
ddf0: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
de00: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 */. chan = T
de10: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
de20: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 (chan);.. if
de30: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
de40: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 ype(chan) != Tls
de50: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 _ChannelType())
de60: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
de70: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
de80: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
de90: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
dea0: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e (chan),..."\": n
deb0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
dec0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 ", NULL);.. T
ded0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
dee0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
def0: 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e UNIMPORT", "CHAN
df00: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c NEL", "INVALID",
df10: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
df20: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
df30: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
df40: 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 f (Tcl_UnstackCh
df50: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 annel(interp, ch
df60: 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 an) == TCL_ERROR
df70: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
df80: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
df90: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
dfa0: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
dfb0: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
dfc0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
dfd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dfe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e000: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 -------. *. * CT
e010: 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 X_Init -- constr
e020: 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e uct a SSL_CTX in
e030: 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 stance. *. * Res
e040: 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 ults:. *.A valid
e050: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 SSL_CTX instanc
e060: 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a e or NULL.. *. *
e070: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
e080: 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c *.constructs SSL
e090: 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 context (CTX).
e0a0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
e0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e0e0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
e0f0: 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 ic SSL_CTX *.CTX
e100: 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 _Init(State *sta
e110: 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 tePtr, int isSer
e120: 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 ver, int proto,
e130: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 char *keyfile, c
e140: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 har *certfile,.
e150: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
e160: 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 *key, unsigned
e170: 63 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74 20 char *cert, int
e180: 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 key_len, int cer
e190: 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 t_len, char *CAd
e1a0: 69 72 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41 ir,. char *CA
e1b0: 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70 68 file, char *ciph
e1c0: 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70 68 65 ers, char *ciphe
e1d0: 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 rsuites, int lev
e1e0: 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 72 61 el, char *DHpara
e1f0: 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e ms) {. Tcl_In
e200: 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 terp *interp = s
e210: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
e220: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 . SSL_CTX *ct
e230: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 x = NULL;. Tc
e240: 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 l_DString ds;.
e250: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 Tcl_DString ds
e260: 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 1;. int off =
e270: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 0;. int load
e280: 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 _private_key;.
e290: 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 const SSL_METH
e2a0: 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 OD *method;..
e2b0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
e2c0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 ");.. if (!pr
e2d0: 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 oto) {..Tcl_Appe
e2e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
e2f0: 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f "no valid proto
e300: 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 4e col selected", N
e310: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
e320: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f LL;. }.. /
e330: 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e * create SSL con
e340: 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e text */.#if OPEN
e350: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
e360: 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 ER >= 0x10100000
e370: 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f L || defined(NO_
e380: 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL2) || defined
e390: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
e3a0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
e3b0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
e3c0: 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c TO_SSL2)) {..Tcl
e3d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
e3e0: 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 terp, "SSL2 prot
e3f0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
e400: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ed", NULL);..ret
e410: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
e420: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
e430: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 ed(NO_SSL3) || d
e440: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e450: 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 O_SSL3). if (
e460: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
e470: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 LS_PROTO_SSL3))
e480: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
e490: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c ult(interp, "SSL
e4a0: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 3 protocol not s
e4b0: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
e4c0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
e4d0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
e4e0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
e4f0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
e500: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 NSSL_NO_TLS1).
e510: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
e520: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
e530: 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 LS1)) {..Tcl_App
e540: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
e550: 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f , "TLS 1.0 proto
e560: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
e570: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 d", NULL);..retu
e580: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
e590: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
e5a0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 d(NO_TLS1_1) ||
e5b0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
e5c0: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 NO_TLS1_1). i
e5d0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
e5e0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
e5f0: 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 _1)) {..Tcl_Appe
e600: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
e610: 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 "TLS 1.1 protoc
e620: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
e630: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
e640: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
e650: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
e660: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 (NO_TLS1_2) || d
e670: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e680: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 O_TLS1_2). if
e690: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
e6a0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
e6b0: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 2)) {..Tcl_Appen
e6c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
e6d0: 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f "TLS 1.2 protoco
e6e0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
e6f0: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
e700: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
e710: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
e720: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
e730: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e740: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 _TLS1_3). if
e750: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
e760: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
e770: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
e780: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
e790: 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c TLS 1.3 protocol
e7a0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
e7b0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
e7c0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
e7d0: 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f if. if (proto
e7e0: 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65 == 0) {../* Use
e7f0: 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 full range */..
e800: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f SSL_CTX_set_min_
e810: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
e820: 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f x, 0);..SSL_CTX_
e830: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 set_max_proto_ve
e840: 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20 rsion(ctx, 0);.
e850: 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 }.. switch
e860: 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f (proto) {.#if O
e870: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
e880: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
e890: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 00L && !defined(
e8a0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 NO_SSL2) && !def
e8b0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
e8c0: 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 54 SSL2). case T
e8d0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 LS_PROTO_SSL2:..
e8e0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
e8f0: 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 65 72 r ? SSLv2_server
e900: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 _method() : SSLv
e910: 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 2_client_method(
e920: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
e930: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
e940: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
e950: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
e960: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
e970: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
e980: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 _METHOD). cas
e990: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 e TLS_PROTO_SSL3
e9a0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 :..method = isSe
e9b0: 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 65 72 rver ? SSLv3_ser
e9c0: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 ver_method() : S
e9d0: 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 SLv3_client_meth
e9e0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
e9f0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
ea00: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 d(NO_TLS1) && !d
ea10: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
ea20: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 O_TLS1) && !defi
ea30: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
ea40: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 LS1_METHOD).
ea50: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
ea60: 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 LS1:..method = i
ea70: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f sServer ? TLSv1_
ea80: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 server_method()
ea90: 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d : TLSv1_client_m
eaa0: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b ethod();..break;
eab0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
eac0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
ead0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
eae0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 SSL_NO_TLS1_1) &
eaf0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
eb00: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 SL_NO_TLS1_1_MET
eb10: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c HOD). case TL
eb20: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a S_PROTO_TLS1_1:.
eb30: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
eb40: 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72 er ? TLSv1_1_ser
eb50: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 ver_method() : T
eb60: 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 LSv1_1_client_me
eb70: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a thod();..break;.
eb80: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
eb90: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 ned(NO_TLS1_2) &
eba0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
ebb0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 SL_NO_TLS1_2) &&
ebc0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
ebd0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 L_NO_TLS1_2_METH
ebe0: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 OD). case TLS
ebf0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 _PROTO_TLS1_2:..
ec00: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
ec10: 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72 76 r ? TLSv1_2_serv
ec20: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c er_method() : TL
ec30: 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 Sv1_2_client_met
ec40: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 hod();..break;.#
ec50: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
ec60: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 ed(NO_TLS1_3) &&
ec70: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
ec80: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 L_NO_TLS1_3).
ec90: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
eca0: 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 TLS1_3:../* Use
ecb0: 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65 74 68 the generic meth
ecc0: 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e od and constrain
ecd0: 74 20 72 61 6e 67 65 20 61 66 74 65 72 20 63 6f t range after co
ece0: 6e 74 65 78 74 20 69 73 20 63 72 65 61 74 65 64 ntext is created
ecf0: 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 */..method = is
ed00: 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 Server ? TLS_ser
ed10: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 ver_method() : T
ed20: 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 LS_client_method
ed30: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
ed40: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a if. default:.
ed50: 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 69 ./* Negotiate hi
ed60: 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20 ghest available
ed70: 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 SSL/TLS version
ed80: 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 */..method = isS
ed90: 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 erver ? TLS_serv
eda0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c er_method() : TL
edb0: 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 S_client_method(
edc0: 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 );.#if OPENSSL_V
edd0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
ede0: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 0x10100000L && !
edf0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
ee00: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
ee10: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f NSSL_NO_SSL2)..o
ee20: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
ee30: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
ee40: 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 53 SSL2) ? 0 : SS
ee50: 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a L_OP_NO_SSLv2);.
ee60: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
ee70: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 ned(NO_SSL3) &&
ee80: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
ee90: 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c _NO_SSL3)..off |
eea0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
eeb0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 , TLS_PROTO_SSL3
eec0: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 ) ? 0 : SSL_OP
eed0: 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 _NO_SSLv3);.#end
eee0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
eef0: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 NO_TLS1) && !def
ef00: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
ef10: 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 TLS1)..off |= (E
ef20: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
ef30: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 S_PROTO_TLS1)
ef40: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
ef50: 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 TLSv1);.#endif.#
ef60: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
ef70: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
ef80: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
ef90: 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 S1_1)..off |= (E
efa0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
efb0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 S_PROTO_TLS1_1)
efc0: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
efd0: 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 TLSv1_1);.#endif
efe0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
eff0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
f000: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
f010: 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 TLS1_2)..off |=
f020: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
f030: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 TLS_PROTO_TLS1_2
f040: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ) ? 0 : SSL_OP_N
f050: 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 O_TLSv1_2);.#end
f060: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
f070: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 NO_TLS1_3) && !d
f080: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
f090: 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c O_TLS1_3)..off |
f0a0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
f0b0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
f0c0: 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 _3) ? 0 : SSL_OP
f0d0: 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 _NO_TLSv1_3);.#e
f0e0: 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 ndif..break;.
f0f0: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 }.. ERR_clea
f100: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 r_error();..
f110: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
f120: 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 w(method);. i
f130: 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75 f (!ctx) {..retu
f140: 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a rn(NULL);. }.
f150: 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 28 . if (getenv(
f160: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 SSLKEYLOGFILE))
f170: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b {..SSL_CTX_set_k
f180: 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 eylog_callback(c
f190: 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 tx, KeyLogCallba
f1a0: 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 ck);. }..#if
f1b0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
f1c0: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
f1d0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
f1e0: 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 3). if (proto
f1f0: 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c == TLS_PROTO_TL
f200: 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 S1_3) {..SSL_CTX
f210: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 _set_min_proto_v
f220: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
f230: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 _3_VERSION);..SS
f240: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 L_CTX_set_max_pr
f250: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c oto_version(ctx,
f260: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 TLS1_3_VERSION)
f270: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a ;. }.#endif..
f280: 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 /* Force cip
f290: 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 her selection or
f2a0: 64 65 72 20 62 79 20 73 65 72 76 65 72 20 2a 2f der by server */
f2b0: 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 72 76 . if (!isServ
f2c0: 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 er) {..SSL_CTX_s
f2d0: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
f2e0: 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 SSL_OP_CIPHER_SE
f2f0: 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29 RVER_PREFERENCE)
f300: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 ;. }..#if OPE
f310: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
f320: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 BER < 0x10100000
f330: 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64 L. OpenSSL_ad
f340: 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 d_all_algorithms
f350: 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69 70 68 (); /* Load ciph
f360: 65 72 73 20 61 6e 64 20 64 69 67 65 73 74 73 20 ers and digests
f370: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 */.#endif.. S
f380: 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 SL_CTX_set_app_d
f390: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 ata(ctx, (void*)
f3a0: 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 interp);./* reme
f3b0: 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 72 mber the interpr
f3c0: 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f eter */. SSL_
f3d0: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 CTX_set_options(
f3e0: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 ctx, SSL_OP_ALL)
f3f0: 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 ;./* all SSL bug
f400: 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a workarounds */.
f410: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
f420: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c options(ctx, SSL
f430: 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 49 _OP_NO_COMPRESSI
f440: 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 62 6c 65 20 ON);./* disable
f450: 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76 65 6e compression even
f460: 20 69 66 20 73 75 70 70 6f 72 74 65 64 20 2a 2f if supported */
f470: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
f480: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 _options(ctx, of
f490: 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20 f);../* disable
f4a0: 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e protocol version
f4b0: 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c s */.#if OPENSSL
f4c0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
f4d0: 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20 < 0x10101000L.
f4e0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f SSL_CTX_set_mo
f4f0: 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 de(ctx, SSL_MODE
f500: 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a _AUTO_RETRY);./*
f510: 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64 handle new hand
f520: 73 68 61 6b 65 73 20 69 6e 20 62 61 63 6b 67 72 shakes in backgr
f530: 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64 65 66 61 ound. On by defa
f540: 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 ult in OpenSSL 1
f550: 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a .1.1. */.#endif.
f560: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 SSL_CTX_sess
f570: 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 _set_cache_size(
f580: 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 ctx, 128);..
f590: 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66 69 /* Set user defi
f5a0: 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69 70 ned ciphers, cip
f5b0: 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20 her suites, and
f5c0: 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a security level *
f5d0: 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 /. if ((ciphe
f5e0: 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 rs != NULL) && !
f5f0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 SSL_CTX_set_ciph
f600: 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70 er_list(ctx, cip
f610: 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 hers)) {..Tcl_Ap
f620: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
f630: 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73 20 p, "Set ciphers
f640: 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 failed: No valid
f650: 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 ciphers", (char
f660: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f *) NULL);..SSL_
f670: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
f680: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
f690: 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 }. if ((ciph
f6a0: 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c ersuites != NULL
f6b0: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 ) && !SSL_CTX_se
f6c0: 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 63 t_ciphersuites(c
f6d0: 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 tx, ciphersuites
f6e0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
f6f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
f700: 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74 65 Set cipher suite
f710: 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c s failed: No val
f720: 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 id ciphers", (ch
f730: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 ar *) NULL);..SS
f740: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
f750: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
f760: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 }.. /* Set
f770: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 security level
f780: 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c */. if (level
f790: 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c > -1 && level <
f7a0: 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 6) {../* SSL_se
f7b0: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c t_security_level
f7c0: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 */..SSL_CTX_set
f7d0: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 _security_level(
f7e0: 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 ctx, level);.
f7f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 }.. /* set s
f800: 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f ome callbacks */
f810: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
f820: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f _default_passwd_
f830: 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 cb(ctx, Password
f840: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 Callback);. S
f850: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 SL_CTX_set_defau
f860: 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 lt_passwd_cb_use
f870: 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 rdata(ctx, (void
f880: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 *)statePtr);..
f890: 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 /* read a Dif
f8a0: 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 fie-Hellman para
f8b0: 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 meters file, or
f8c0: 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e use the built-in
f8d0: 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f one */.#ifdef O
f8e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 PENSSL_NO_DH.
f8f0: 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d if (DHparams !=
f900: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 NULL) {..Tcl_Ap
f910: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
f920: 70 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 p, "DH parameter
f930: 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 support not ava
f940: 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a ilable", (char *
f950: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 ) NULL);..SSL_CT
f960: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
f970: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
f980: 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 .#else. {..DH
f990: 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72 * dh;..if (DHpar
f9a0: 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ams != NULL) {..
f9b0: 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 BIO *bio;..
f9c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
f9d0: 69 74 28 26 64 73 29 3b 0a 09 20 20 20 20 62 69 it(&ds);.. bi
f9e0: 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 o = BIO_new_file
f9f0: 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 (F2N(DHparams, &
fa00: 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 ds), "r");..
fa10: 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 if (!bio) {...Tc
fa20: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
fa30: 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 s);...Tcl_Append
fa40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
fa50: 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 Could not find D
fa60: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c H parameters fil
fa70: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c e", (char *) NUL
fa80: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
fa90: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
faa0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a n NULL;.. }..
fab0: 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 . dh = PEM_re
fac0: 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 ad_bio_DHparams(
fad0: 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c bio, NULL, NULL,
fae0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f NULL);.. BIO
faf0: 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 _free(bio);..
fb00: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
fb10: 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 (&ds);.. if (
fb20: 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 !dh) {...Tcl_App
fb30: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
fb40: 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 , "Could not rea
fb50: 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 d DH parameters
fb60: 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 from file", (cha
fb70: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
fb80: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
fb90: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ...return NULL;.
fba0: 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b . }..} else {
fbb0: 0a 09 20 20 20 20 64 68 20 3d 20 67 65 74 5f 64 .. dh = get_d
fbc0: 68 50 61 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 hParams();..}..S
fbd0: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 SL_CTX_set_tmp_d
fbe0: 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f h(ctx, dh);..DH_
fbf0: 66 72 65 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a free(dh);. }.
fc00: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 #endif.. /* s
fc10: 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 et our certifica
fc20: 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 te */. load_p
fc30: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a rivate_key = 0;.
fc40: 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 if (certfile
fc50: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 != NULL) {..loa
fc60: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 d_private_key =
fc70: 31 3b 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 1;...Tcl_DString
fc80: 49 6e 69 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 Init(&ds);...if
fc90: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 (SSL_CTX_use_cer
fca0: 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 tificate_file(ct
fcb0: 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c x, F2N(certfile,
fcc0: 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 &ds), SSL_FILET
fcd0: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b YPE_PEM) <= 0) {
fce0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
fcf0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 gFree(&ds);..
fd00: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
fd10: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
fd20: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 e to set certifi
fd30: 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 cate file ", cer
fd40: 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 tfile, ": ",....
fd50: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 REASON(), (
fd60: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
fd70: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 SSL_CTX_free
fd80: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 (ctx);.. retu
fd90: 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 rn NULL;..}.
fda0: 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 } else if (cert
fdb0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 != NULL) {..load
fdc0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 _private_key = 1
fdd0: 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 ;..if (SSL_CTX_u
fde0: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 se_certificate_A
fdf0: 53 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 SN1(ctx, cert_le
fe00: 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b n, cert) <= 0) {
fe10: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
fe20: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 gFree(&ds);..
fe30: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
fe40: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
fe50: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 e to set certifi
fe60: 63 61 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 cate: ",....
fe70: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
fe80: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
fe90: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
fea0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
feb0: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c ULL;..}. } el
fec0: 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d se {..certfile =
fed0: 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 (char*)X509_get
fee0: 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 _default_cert_fi
fef0: 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f le();...if (SSL_
ff00: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
ff10: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 ate_file(ctx, ce
ff20: 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 rtfile, SSL_FILE
ff30: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 TYPE_PEM) <= 0)
ff40: 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c {.#if 0.. Tcl
ff50: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
ff60: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 );.. Tcl_Appe
ff70: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
ff80: 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 "unable to use
ff90: 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 default certific
ffa0: 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 ate file ", cert
ffb0: 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 file, ": ",....
ffc0: 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 REASON(), (c
ffd0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
ffe0: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 SSL_CTX_free(
fff0: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ctx);.. retur
10000 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 n NULL;.#endif..
10010 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
10020 73 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 set our private
10030 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c key */. if (l
10040 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 oad_private_key)
10050 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 {..if (keyfile
10060 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d == NULL && key =
10070 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b = NULL) {.. k
10080 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c eyfile = certfil
10090 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 e;..}...if (keyf
100a0 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ile != NULL) {..
100b0 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 /* get the p
100c0 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 rivate key assoc
100d0 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 iated with this
100e0 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 certificate */..
100f0 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 if (keyfile
10100 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 == NULL) {...key
10110 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b file = certfile;
10120 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 .. }... if
10130 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 (SSL_CTX_use_Pr
10140 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 ivateKey_file(ct
10150 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 x, F2N(keyfile,
10160 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 &ds), SSL_FILETY
10170 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a PE_PEM) <= 0) {.
10180 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
10190 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 e(&ds);.../* flu
101a0 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 sh the passphras
101b0 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 e which might be
101c0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 left in the res
101d0 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 ult */...Tcl_Set
101e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e Result(interp, N
101f0 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 ULL, TCL_STATIC)
10200 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 ;...Tcl_AppendRe
10210 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e sult(interp, "un
10220 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c able to set publ
10230 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b ic key file ", k
10240 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 eyfile, " ",....
10250 20 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 REASON(
10260 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
10270 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 );...SSL_CTX_fre
10280 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e e(ctx);...return
10290 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 NULL;.. }..
102a0 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
102b0 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 ee(&ds);...} els
102c0 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c e if (key != NUL
102d0 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 L) {.. if (SS
102e0 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 L_CTX_use_Privat
102f0 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b eKey_ASN1(EVP_PK
10300 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 EY_RSA, ctx, key
10310 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 ,key_len) <= 0)
10320 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 {...Tcl_DStringF
10330 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 ree(&ds);.../* f
10340 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 lush the passphr
10350 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 ase which might
10360 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 be left in the r
10370 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 esult */...Tcl_S
10380 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
10390 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 NULL, TCL_STATI
103a0 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 C);...Tcl_Append
103b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
103c0 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 unable to set pu
103d0 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 52 45 41 blic key: ", REA
103e0 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
103f0 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
10400 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 _free(ctx);...re
10410 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
10420 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 }..}../* Now we
10430 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 know that a key
10440 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 and cert have be
10450 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 en set against..
10460 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 * the SSL conte
10470 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f xt */..if (!SSL_
10480 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 CTX_check_privat
10490 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 e_key(ctx)) {..
104a0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
104b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 ult(interp, "pri
104c0 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f vate key does no
104d0 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 t match the cert
104e0 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b ificate public k
104f0 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 ey",.... (ch
10500 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
10510 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
10520 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tx);.. return
10530 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a NULL;..}. }.
10540 0a 20 20 20 20 2f 2a 20 53 65 74 20 76 65 72 69 . /* Set veri
10550 66 69 63 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a fication CAs */.
10560 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
10570 6e 69 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63 nit(&ds);. Tc
10580 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 l_DStringInit(&d
10590 73 31 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 72 s1);. /* Ther
105a0 65 20 69 73 20 6f 6e 65 20 64 65 66 61 75 6c 74 e is one default
105b0 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 6e 65 20 directory, one
105c0 64 65 66 61 75 6c 74 20 66 69 6c 65 2c 20 61 6e default file, an
105d0 64 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 73 74 d one default st
105e0 6f 72 65 2e 0a 09 54 68 65 20 64 65 66 61 75 6c ore...The defaul
105f0 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65 t CA certificate
10600 73 20 64 69 72 65 63 74 6f 72 79 20 28 61 6e 64 s directory (and
10610 20 64 65 66 61 75 6c 74 20 73 74 6f 72 65 29 20 default store)
10620 69 73 20 69 6e 20 74 68 65 20 4f 70 65 6e 53 53 is in the OpenSS
10630 4c 0a 09 63 65 72 74 73 20 64 69 72 65 63 74 6f L..certs directo
10640 72 79 2e 20 49 74 20 63 61 6e 20 62 65 20 6f 76 ry. It can be ov
10650 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 erridden by the
10660 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 SSL_CERT_DIR env
10670 20 76 61 72 2e 20 54 68 65 0a 09 64 65 66 61 75 var. The..defau
10680 6c 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74 lt CA certificat
10690 65 73 20 66 69 6c 65 20 69 73 20 63 61 6c 6c 65 es file is calle
106a0 64 20 63 65 72 74 2e 70 65 6d 20 69 6e 20 74 68 d cert.pem in th
106b0 65 20 64 65 66 61 75 6c 74 20 4f 70 65 6e 53 53 e default OpenSS
106c0 4c 0a 09 64 69 72 65 63 74 6f 72 79 2e 20 49 74 L..directory. It
106d0 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 can be overridd
106e0 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 en by the SSL_CE
106f0 52 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e RT_FILE env var.
10700 20 2a 2f 0a 09 2f 2a 20 69 6e 74 20 53 53 4c 5f */../* int SSL_
10710 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
10720 76 65 72 69 66 79 5f 64 69 72 28 53 53 4c 5f 43 verify_dir(SSL_C
10730 54 58 20 2a 63 74 78 29 20 61 6e 64 20 69 6e 74 TX *ctx) and int
10740 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 SSL_CTX_set_def
10750 61 75 6c 74 5f 76 65 72 69 66 79 5f 66 69 6c 65 ault_verify_file
10760 28 53 53 4c 5f 43 54 58 20 2a 63 74 78 29 20 2a (SSL_CTX *ctx) *
10770 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 /. if (!SSL_C
10780 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c TX_load_verify_l
10790 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 ocations(ctx, F2
107a0 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 N(CAfile, &ds),
107b0 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31 29 F2N(CAdir, &ds1)
107c0 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73 ) ||..!SSL_CTX_s
107d0 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 et_default_verif
107e0 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a y_paths(ctx)) {.
107f0 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 69 #if 0..Tcl_DStri
10800 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 54 63 ngFree(&ds);..Tc
10810 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
10820 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 s1);../* Don't c
10830 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20 69 66 urrently care if
10840 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09 this fails */..
10850 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
10860 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 65 (interp, "SSL de
10870 66 61 75 6c 74 20 76 65 72 69 66 79 20 70 61 74 fault verify pat
10880 68 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c hs: ", REASON(),
10890 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
108a0 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
108b0 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c tx);..return NUL
108c0 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a L;.#endif. }.
108d0 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f . /* https://
108e0 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f sourceforge.net/
108f0 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a p/tls/bugs/57/ *
10900 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 /. /* XXX:TOD
10910 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 O: Let the user
10920 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 supply values he
10930 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f re instead of so
10940 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 mething that exi
10950 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 sts on the files
10960 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 ystem */. if
10970 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 (CAfile != NULL)
10980 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 {..STACK_OF(X50
10990 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 9_NAME) *certNam
109a0 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c es = SSL_load_cl
109b0 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e ient_CA_file(F2N
109c0 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a (CAfile, &ds));.
109d0 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 .if (certNames !
109e0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 = NULL) {.. S
109f0 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e SL_CTX_set_clien
10a00 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 t_CA_list(ctx, c
10a10 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 ertNames);..}.
10a20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
10a30 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 ringFree(&ds);.
10a40 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
10a50 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65 ee(&ds1);. re
10a60 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a turn ctx;.}.../*
10a70 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
10a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ab0 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 ------. *. * Sta
10ac0 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 tusObjCmd -- ret
10ad0 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 urn certificate
10ae0 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 for connected pe
10af0 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 er.. *. * Result
10b00 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
10b10 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
10b20 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
10b30 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
10b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b80 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
10b90 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 t.StatusObjCmd(C
10ba0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
10bb0 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
10bc0 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
10bd0 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
10be0 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
10bf0 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
10c00 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 ;. X509 *peer
10c10 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f ;. Tcl_Obj *o
10c20 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 bjPtr;. Tcl_C
10c30 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 hannel chan;.
10c40 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 char *channelNa
10c50 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 me, *ciphers;.
10c60 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 int mode;.
10c70 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
10c80 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 har *proto;.
10c90 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e unsigned int len
10ca0 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 ;. int nid, r
10cb0 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 es;.. dprintf
10cc0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
10cd0 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c if (objc < 2 ||
10ce0 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 objc > 3 || (ob
10cf0 6a 63 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63 jc == 3 && !strc
10d00 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 mp(Tcl_GetString
10d10 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 (objv[1]), "-loc
10d20 61 6c 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 al"))) {..Tcl_Wr
10d30 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
10d40 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c p, 1, objv, "?-l
10d50 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b ocal? channel");
10d60 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
10d70 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
10d80 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 * Get channel Id
10d90 20 2a 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e */. channelN
10da0 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 ame = Tcl_GetStr
10db0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
10dc0 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31 20 3a (objc == 2 ? 1 :
10dd0 20 32 29 5d 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 2)], NULL);.
10de0 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
10df0 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 hannel(interp, c
10e00 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 hannelName, &mod
10e10 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e e);. if (chan
10e20 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
10e30 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
10e40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
10e50 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 }.. /* Make
10e60 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
10e70 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
10e80 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
10e90 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
10ea0 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 hannel(chan);.
10eb0 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 if (Tcl_GetCha
10ec0 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 nnelType(chan) !
10ed0 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 = Tls_ChannelTyp
10ee0 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 e()) {..Tcl_Appe
10ef0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
10f00 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
10f10 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
10f20 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 lName(chan),..."
10f30 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
10f40 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 annel", NULL);..
10f50 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
10f60 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
10f70 22 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e "STATUS", "CHANN
10f80 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 EL", "INVALID",
10f90 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
10fa0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
10fb0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 R;. }. sta
10fc0 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
10fd0 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c ) Tcl_GetChannel
10fe0 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 InstanceData(cha
10ff0 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 n);.. /* Get
11000 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 certificate for
11010 70 65 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a peer or self */.
11020 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 if (objc ==
11030 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 2) {..peer = SSL
11040 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 _get_peer_certif
11050 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e icate(statePtr->
11060 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ssl);. } else
11070 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 {..peer = SSL_g
11080 65 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 et_certificate(s
11090 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
110a0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 }. /* Get
110b0 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 X509 certificate
110c0 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 info */. if
110d0 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 (peer) {..objPtr
110e0 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 = Tls_NewX509Ob
110f0 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b j(interp, peer);
11100 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 ..if (objc == 2)
11110 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 72 65 {.. X509_fre
11120 65 28 70 65 65 72 29 3b 0a 09 20 20 20 20 70 65 e(peer);.. pe
11130 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 er = NULL;..}.
11140 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 } else {..objP
11150 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 tr = Tcl_NewList
11160 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 Obj(0, NULL);.
11170 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 }.. /* Peer
11180 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 name */. LAP
11190 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
111a0 20 6f 62 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 objPtr, "peerna
111b0 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 me", SSL_get0_pe
111c0 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d ername(statePtr-
111d0 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 >ssl), -1);.
111e0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
111f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 rp, objPtr, "sbi
11200 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 ts", SSL_get_cip
11210 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 74 her_bits(statePt
11220 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a r->ssl, NULL));.
11230 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 28 . ciphers = (
11240 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 char*)SSL_get_ci
11250 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 pher(statePtr->s
11260 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 sl);. LAPPEND
11270 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11280 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 63 Ptr, "cipher", c
11290 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 iphers, -1);..
112a0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 /* Verify the
112b0 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 X509 certificate
112c0 20 70 72 65 73 65 6e 74 65 64 20 62 79 20 74 68 presented by th
112d0 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 e peer */. LA
112e0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
112f0 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 , objPtr, "verif
11300 79 52 65 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f yResult",..X509_
11310 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f verify_cert_erro
11320 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 r_string(SSL_get
11330 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 _verify_result(s
11340 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 tatePtr->ssl)),
11350 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 -1);.. /* Ver
11360 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 ify mode */.
11370 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 mode = SSL_get_v
11380 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 erify_mode(state
11390 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 Ptr->ssl);. i
113a0 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 f (mode && SSL_V
113b0 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c ERIFY_NONE) {..L
113c0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
113d0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 p, objPtr, "veri
113e0 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c fyMode", "none",
113f0 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 -1);. } else
11400 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 {..Tcl_Obj *lis
11410 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 tObjPtr = Tcl_Ne
11420 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
11430 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 );..if (mode &&
11440 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 29 SSL_VERIFY_PEER)
11450 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
11460 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
11470 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a (interp, listObj
11480 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
11490 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 ngObj("peer", -1
114a0 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 ));..}..if (mode
114b0 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 && SSL_VERIFY_F
114c0 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 AIL_IF_NO_PEER_C
114d0 45 52 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f ERT) {.. Tcl_
114e0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
114f0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
11500 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 tObjPtr, Tcl_New
11510 53 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 StringObj("fail
11520 69 66 20 6e 6f 20 70 65 65 72 20 63 65 72 74 22 if no peer cert"
11530 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
11540 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
11550 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 FY_CLIENT_ONCE)
11560 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
11570 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
11580 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 interp, listObjP
11590 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
115a0 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 gObj("client onc
115b0 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 e", -1));..}..if
115c0 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 (mode && SSL_VE
115d0 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 RIFY_POST_HANDSH
115e0 41 4b 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f AKE) {.. Tcl_
115f0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
11600 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
11610 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 tObjPtr, Tcl_New
11620 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 StringObj("post
11630 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 handshake", -1))
11640 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 ;..}..LAPPEND_OB
11650 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 J(interp, objPtr
11660 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 , "verifyMode",
11670 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 listObjPtr).
11680 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 }.. /* Verify
11690 20 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 mode depth */.
116a0 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 LAPPEND_INT(i
116b0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
116c0 76 65 72 69 66 79 44 65 70 74 68 22 2c 20 53 53 verifyDepth", SS
116d0 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65 70 L_get_verify_dep
116e0 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c th(statePtr->ssl
116f0 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f ));.. /* Repo
11700 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 rt the selected
11710 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 protocol as a re
11720 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f sult of the nego
11730 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 tiation */. S
11740 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c SL_get0_alpn_sel
11750 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e ected(statePtr->
11760 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 ssl, &proto, &le
11770 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f n);. LAPPEND_
11780 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11790 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 tr, "alpn", (cha
117a0 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 r *)proto, (int)
117b0 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 len);. LAPPE
117c0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
117d0 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c bjPtr, "protocol
117e0 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 ", SSL_get_versi
117f0 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c on(statePtr->ssl
11800 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 ), -1);.. /*
11810 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 Valid for non-RS
11820 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 20 A signature and
11830 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69 TLS 1.3 */. i
11840 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a f (objc == 2) {.
11850 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 .res = SSL_get_p
11860 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 eer_signature_ni
11870 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c d(statePtr->ssl,
11880 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c &nid);. } el
11890 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f se {..res = SSL_
118a0 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 get_signature_ni
118b0 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c d(statePtr->ssl,
118c0 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 &nid);. }.
118d0 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 if (!res) {nid
118e0 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 = 0;}. LAPPE
118f0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11900 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 bjPtr, "signatur
11910 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c eHashAlgorithm",
11920 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 OBJ_nid2ln(nid)
11930 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 69 66 20 28 , -1);.. if (
11940 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 objc == 2) {..re
11950 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 s = SSL_get_peer
11960 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f _signature_type_
11970 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
11980 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 l, &nid);. }
11990 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 else {..res = SS
119a0 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f L_get_signature_
119b0 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 type_nid(statePt
119c0 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 r->ssl, &nid);.
119d0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 }. if (!re
119e0 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 s) {nid = 0;}.
119f0 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
11a00 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
11a10 69 67 6e 61 74 75 72 65 54 79 70 65 22 2c 20 4f ignatureType", O
11a20 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 BJ_nid2ln(nid),
11a30 2d 31 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 -1);.. Tcl_Se
11a40 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
11a50 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
11a60 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
11a70 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
11a80 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a entData;.}.../*.
11a90 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
11aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ad0 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e -----. *. * Conn
11ae0 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 ectionInfoObjCmd
11af0 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 -- return conne
11b00 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 ction info from
11b10 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 OpenSSL.. *. * R
11b20 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 esults:. *.A lis
11b30 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 t of connection
11b40 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d info. *. *-----
11b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
11b90 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 */..static int C
11ba0 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a onnectionInfoObj
11bb0 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
11bc0 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
11bd0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
11be0 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
11bf0 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
11c00 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
11c10 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 l chan;../* The
11c20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
11c30 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 mode on */.
11c40 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
11c50 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 ../* client stat
11c60 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 e for ssl socket
11c70 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
11c80 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 *objPtr, *listPt
11c90 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c r;. const SSL
11ca0 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 *ssl;. const
11cb0 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 SSL_CIPHER *cip
11cc0 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 her;. const S
11cd0 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 SL_SESSION *sess
11ce0 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 ion;. const E
11cf0 56 50 5f 4d 44 20 2a 6d 64 3b 0a 0a 20 20 20 20 VP_MD *md;..
11d00 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b if (objc != 2) {
11d10 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
11d20 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
11d30 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a jv, "channel");.
11d40 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f .return(TCL_ERRO
11d50 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 R);. }.. c
11d60 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
11d70 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c nnel(interp, Tcl
11d80 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
11d90 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 j(objv[1], NULL)
11da0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 , NULL);. if
11db0 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
11dc0 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
11dd0 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
11de0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
11df0 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
11e00 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
11e10 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a most channel */.
11e20 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
11e30 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
11e40 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f n);. if (Tcl_
11e50 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
11e60 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e han) != Tls_Chan
11e70 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 nelType()) {..Tc
11e80 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
11e90 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
11ea0 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
11eb0 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
11ec0 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 ),.. "\": not
11ed0 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c a TLS channel",
11ee0 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 NULL);..Tcl_Set
11ef0 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
11f00 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 , "TLS", "CONNEC
11f10 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 TION", "CHANNEL"
11f20 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 , "INVALID", (ch
11f30 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
11f40 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
11f50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 . }.. objP
11f60 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 tr = Tcl_NewList
11f70 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 Obj(0, NULL);..
11f80 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e /* Connection
11f90 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 info */. sta
11fa0 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
11fb0 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 )Tcl_GetChannelI
11fc0 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e nstanceData(chan
11fd0 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61 );. ssl = sta
11fe0 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 tePtr->ssl;.
11ff0 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 if (ssl != NULL)
12000 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f {../* connectio
12010 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 n state */..LAPP
12020 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
12030 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 65 22 2c objPtr, "state",
12040 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e SSL_state_strin
12050 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 g_long(ssl), -1)
12060 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 ;.../* Get SNI r
12070 65 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20 equested server
12080 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 name */..LAPPEND
12090 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
120a0 50 74 72 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 Ptr, "servername
120b0 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 ", SSL_get_serve
120c0 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 rname(ssl, TLSEX
120d0 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f T_NAMETYPE_host_
120e0 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a name), -1);.../*
120f0 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f Get protocol */
12100 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
12110 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 terp, objPtr, "p
12120 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 rotocol", SSL_ge
12130 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 t_version(ssl),
12140 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f -1);.../* Renego
12150 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 tiation allowed
12160 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c */..LAPPEND_BOOL
12170 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12180 20 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f "renegotiation_
12190 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65 allowed", SSL_ge
121a0 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 t_secure_renegot
121b0 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73 iation_support(s
121c0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 sl));.../* Get s
121d0 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f ecurity level */
121e0 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
121f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
12200 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 53 ecuritylevel", S
12210 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f SL_get_security_
12220 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f level(ssl));.../
12230 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a * Session info *
12240 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
12250 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12260 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 "session_reused"
12270 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 , SSL_session_re
12280 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a used(ssl));.../*
12290 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 Is server info
122a0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c */..LAPPEND_BOOL
122b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
122c0 20 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53 "is_server", SS
122d0 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 L_is_server(ssl)
122e0 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 );.../* Is DTLS
122f0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c */..LAPPEND_BOOL
12300 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12310 20 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f "is_dtls", SSL_
12320 69 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20 is_dtls(ssl));.
12330 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 }.. /* Cip
12340 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 her info */.
12350 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 cipher = SSL_get
12360 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 _current_cipher(
12370 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 ssl);. if (ci
12380 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a pher != NULL) {.
12390 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a .char buf[BUFSIZ
123a0 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 ] = {0};..int bi
123b0 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 ts, alg_bits;...
123c0 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a /* Cipher name *
123d0 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
123e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
123f0 63 69 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 cipher", SSL_CIP
12400 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 HER_get_name(cip
12410 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 her), -1);.../*
12420 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 RFC name of ciph
12430 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 er */..LAPPEND_S
12440 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
12450 72 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d r, "standard_nam
12460 65 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 e", SSL_CIPHER_s
12470 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 tandard_name(cip
12480 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 her), -1);.../*
12490 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 OpenSSL name of
124a0 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 cipher */..LAPPE
124b0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
124c0 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f bjPtr, "openssl_
124d0 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 name", OPENSSL_c
124e0 69 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 ipher_name(SSL_C
124f0 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e IPHER_standard_n
12500 61 6d 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31 ame(cipher)), -1
12510 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f );.../* number o
12520 66 20 73 65 63 72 65 74 20 62 69 74 73 20 75 73 f secret bits us
12530 65 64 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f ed for cipher */
12540 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 ..bits = SSL_CIP
12550 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 HER_get_bits(cip
12560 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b her, &alg_bits);
12570 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
12580 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
12590 65 63 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74 ecret_bits", bit
125a0 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 s);..LAPPEND_INT
125b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
125c0 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 "algorithm_bits
125d0 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f ", alg_bits);../
125e0 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 * alg_bits is ac
125f0 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 tual key secret
12600 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 bits. If use bit
12610 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c s and secret (al
12620 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 gorithm) bits di
12630 66 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 ffer,.. the re
12640 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 st of the bits a
12650 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 re fixed, i.e. f
12660 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 or limited expor
12670 74 20 63 69 70 68 65 72 73 20 28 62 69 74 73 20 t ciphers (bits
12680 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e < 56) */.../* In
12690 64 69 63 61 74 65 73 20 77 68 69 63 68 20 53 53 dicates which SS
126a0 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 L/TLS protocol v
126b0 65 72 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66 ersion first def
126c0 69 6e 65 64 20 74 68 65 20 63 69 70 68 65 72 20 ined the cipher
126d0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
126e0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
126f0 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 "min_version", S
12700 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 SL_CIPHER_get_ve
12710 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d rsion(cipher), -
12720 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 1);.../* Cipher
12730 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f NID */..LAPPEND_
12740 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12750 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22 2c tr, "cipherNID",
12760 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 (char *)OBJ_nid
12770 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 2ln(SSL_CIPHER_g
12780 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 69 et_cipher_nid(ci
12790 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 pher)), -1);..LA
127a0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
127b0 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 73 , objPtr, "diges
127c0 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f tNID", (char *)O
127d0 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 BJ_nid2ln(SSL_CI
127e0 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74 5f PHER_get_digest_
127f0 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 nid(cipher)), -1
12800 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
12810 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12820 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44 22 "keyExchangeNID"
12830 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 , (char *)OBJ_ni
12840 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f d2ln(SSL_CIPHER_
12850 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 get_kx_nid(ciphe
12860 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 r)), -1);..LAPPE
12870 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
12880 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74 69 bjPtr, "authenti
12890 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 cationNID", (cha
128a0 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 r *)OBJ_nid2ln(S
128b0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 75 SL_CIPHER_get_au
128c0 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c th_nid(cipher)),
128d0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 -1);.../* messa
128e0 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f ge authenticatio
128f0 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72 20 n code - Cipher
12900 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47 43 is AEAD (e.g. GC
12910 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50 6f M or ChaCha20/Po
12920 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a ly1305) or not *
12930 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 /../* Authentica
12940 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 ted Encryption w
12950 69 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 64 ith associated d
12960 61 74 61 20 28 41 45 41 44 29 20 63 68 65 63 6b ata (AEAD) check
12970 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f */..LAPPEND_BOO
12980 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 L(interp, objPtr
12990 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65 61 , "cipher_is_aea
129a0 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 d", SSL_CIPHER_i
129b0 73 5f 61 65 61 64 28 63 69 70 68 65 72 29 29 3b s_aead(cipher));
129c0 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65 .../* Digest use
129d0 64 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c d during the SSL
129e0 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77 /TLS handshake w
129f0 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69 hen using the ci
12a00 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 pher. */..md = S
12a10 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61 SL_CIPHER_get_ha
12a20 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63 ndshake_digest(c
12a30 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 ipher);..LAPPEND
12a40 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12a50 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f Ptr, "handshake_
12a60 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a digest", (char *
12a70 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 )EVP_MD_name(md)
12a80 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 , -1);.../* Get
12a90 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 OpenSSL-specific
12aa0 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 ID, not IANA ID
12ab0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 */..LAPPEND_INT
12ac0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12ad0 20 22 63 69 70 68 65 72 5f 69 64 22 2c 20 28 69 "cipher_id", (i
12ae0 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 nt) SSL_CIPHER_g
12af0 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a et_id(cipher));.
12b00 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 ../* Two-byte ID
12b10 20 75 73 65 64 20 69 6e 20 74 68 65 20 54 4c 53 used in the TLS
12b20 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 protocol of the
12b30 20 67 69 76 65 6e 20 63 69 70 68 65 72 20 2a 2f given cipher */
12b40 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
12b50 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 terp, objPtr, "p
12b60 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e rotocol_id", (in
12b70 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 t) SSL_CIPHER_ge
12b80 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 t_protocol_id(ci
12b90 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 pher));.../* Tex
12ba0 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e tual description
12bb0 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a of the cipher *
12bc0 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 /..if (SSL_CIPHE
12bd0 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69 R_description(ci
12be0 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f pher, buf, sizeo
12bf0 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 f(buf)) != NULL)
12c00 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f {.. LAPPEND_
12c10 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12c20 74 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e tr, "description
12c30 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a ", buf, -1);..}.
12c40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
12c50 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 ssion info */.
12c60 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f session = SSL_
12c70 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 get_session(ssl)
12c80 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f ;. if (sessio
12c90 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f n != NULL) {..co
12ca0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
12cb0 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 r *ticket;..size
12cc0 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e _t len2;..unsign
12cd0 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f ed int ulen;..co
12ce0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
12cf0 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a r *session_id, *
12d00 70 72 6f 74 6f 3b 0a 09 63 68 61 72 20 62 75 66 proto;..char buf
12d10 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 fer[SSL_MAX_MAST
12d20 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a ER_KEY_LENGTH];.
12d30 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 ../* Report the
12d40 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f selected protoco
12d50 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 l as a result of
12d60 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 the ALPN negoti
12d70 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 ation */..SSL_SE
12d80 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f SSION_get0_alpn_
12d90 73 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e selected(session
12da0 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 , &proto, &len2)
12db0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
12dc0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12dd0 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 alpn", (char *)
12de0 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e proto, (int) len
12df0 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 2);.../* Report
12e00 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f the selected pro
12e10 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c tocol as a resul
12e20 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 t of the NPN neg
12e30 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 otiation */.#ifd
12e40 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f ef USE_NPN..SSL_
12e50 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f get0_next_proto_
12e60 6e 65 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 negotiated(ssl,
12e70 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a &proto, &ulen);.
12e80 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
12e90 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 erp, objPtr, "np
12ea0 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f n", (char *) pro
12eb0 74 6f 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 3b to, (int) ulen);
12ec0 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 .#endif.../* Res
12ed0 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a umable session *
12ee0 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
12ef0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12f00 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c "resumable", SSL
12f10 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 _SESSION_is_resu
12f20 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b mable(session));
12f30 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 .../* Session st
12f40 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 art time (second
12f50 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a s since epoch) *
12f60 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 /..LAPPEND_LONG(
12f70 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12f80 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 "start_time", SS
12f90 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
12fa0 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 me(session));...
12fb0 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 /* Timeout value
12fc0 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 - SSL_CTX_get_t
12fd0 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e imeout (in secon
12fe0 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ds) */..LAPPEND_
12ff0 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a LONG(interp, obj
13000 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 Ptr, "timeout",
13010 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
13020 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 timeout(session)
13030 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
13040 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 id - TLSv1.2 and
13050 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 below only */..
13060 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c session_id = SSL
13070 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 _SESSION_get_id(
13080 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b session, &ulen);
13090 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 ..LAPPEND_BARRAY
130a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
130b0 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 "session_id", s
130c0 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 ession_id, (int)
130d0 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 ulen);.../* Ses
130e0 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a sion context */.
130f0 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 .session_id = SS
13100 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 L_SESSION_get0_i
13110 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f d_context(sessio
13120 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 n, &ulen);..LAPP
13130 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 END_BARRAY(inter
13140 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 p, objPtr, "sess
13150 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 ion_context", se
13160 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 ssion_id, (int)
13170 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 ulen);.../* Sess
13180 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 ion ticket - cli
13190 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c ent only */..SSL
131a0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 _SESSION_get0_ti
131b0 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 cket(session, &t
131c0 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 icket, &len2);..
131d0 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 LAPPEND_BARRAY(i
131e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
131f0 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c session_ticket",
13200 20 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c ticket, (int) l
13210 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 en2);.../* Sessi
13220 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 on ticket lifeti
13230 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f me hint (in seco
13240 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 nds) */..LAPPEND
13250 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 _LONG(interp, ob
13260 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 jPtr, "lifetime"
13270 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 , SSL_SESSION_ge
13280 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d t_ticket_lifetim
13290 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 e_hint(session))
132a0 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 ;.../* Ticket ap
132b0 70 20 64 61 74 61 20 2a 2f 0a 09 53 53 4c 5f 53 p data */..SSL_S
132c0 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b ESSION_get0_tick
132d0 65 74 5f 61 70 70 64 61 74 61 28 73 65 73 73 69 et_appdata(sessi
132e0 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 on, &ticket, &le
132f0 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 n2);..LAPPEND_BA
13300 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a RRAY(interp, obj
13310 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 70 Ptr, "ticket_app
13320 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c 20 _data", ticket,
13330 28 69 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f (int) len2);.../
13340 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65 79 * Get master key
13350 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f */..len2 = SSL_
13360 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 SESSION_get_mast
13370 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 er_key(session,
13380 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f buffer, SSL_MAX_
13390 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 MASTER_KEY_LENGT
133a0 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 H);..LAPPEND_BAR
133b0 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 RAY(interp, objP
133c0 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79 22 tr, "master_key"
133d0 2c 20 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20 , buffer, (int)
133e0 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 len2);.../* Comp
133f0 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 ression id */..u
13400 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 20 3d nsigned int id =
13410 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
13420 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 65 73 _compress_id(ses
13430 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f sion);..LAPPEND_
13440 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
13450 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e tr, "compression
13460 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 3f 20 _id", id == 1 ?
13470 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 22 2c "zlib" : "none",
13480 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 -1);. }..
13490 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 /* Compression
134a0 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 info */. if (
134b0 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 ssl != NULL) {.#
134c0 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 ifdef HAVE_SSL_C
134d0 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 OMPRESSION..cons
134e0 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 t COMP_METHOD *c
134f0 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d omp, *expn;..com
13500 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 p = SSL_get_curr
13510 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 ent_compression(
13520 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 ssl);..expn = SS
13530 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 L_get_current_ex
13540 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 pansion(ssl);...
13550 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
13560 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d rp, objPtr, "com
13570 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 pression", comp
13580 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e ? SSL_COMP_get_n
13590 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e ame(comp) : "non
135a0 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e e", -1);..LAPPEN
135b0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
135c0 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e jPtr, "expansion
135d0 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f ", expn ? SSL_CO
135e0 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e MP_get_name(expn
135f0 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b ) : "none", -1);
13600 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f .#else..LAPPEND_
13610 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
13620 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e tr, "compression
13630 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a ", "none", -1);.
13640 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
13650 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 erp, objPtr, "ex
13660 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 pansion", "none"
13670 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 , -1);.#endif.
13680 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 }.. /* Serv
13690 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b er info */. {
136a0 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 53 ..long mode = SS
136b0 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f L_CTX_get_sessio
136c0 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 n_cache_mode(sta
136d0 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68 tePtr->ctx);..ch
136e0 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 6d ar *msg;...if (m
136f0 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 ode & SSL_SESS_C
13700 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20 ACHE_OFF) {..
13710 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d msg = "off";..}
13720 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 else if (mode &
13730 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f SSL_SESS_CACHE_
13740 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d CLIENT) {.. m
13750 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09 sg = "client";..
13760 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 } else if (mode
13770 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
13780 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 _SERVER) {..
13790 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22 3b 0a msg = "server";.
137a0 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 .} else if (mode
137b0 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
137c0 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d E_BOTH) {.. m
137d0 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20 sg = "both";..}
137e0 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 67 20 else {.. msg
137f0 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a = "unknown";..}.
13800 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
13810 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
13820 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 ssion_cache_mode
13830 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 ", msg, -1);.
13840 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69 }.. /* CA Li
13850 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20 st */. /* IF
13860 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20 73 61 not a server, sa
13870 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30 5f 70 me as SSL_get0_p
13880 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20 eer_CA_list. If
13890 73 65 72 76 65 72 20 73 61 6d 65 20 61 73 20 53 server same as S
138a0 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e SL_CTX_get_clien
138b0 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 t_CA_list */.
138c0 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e listPtr = Tcl_N
138d0 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
138e0 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 L);. STACK_OF
138f0 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f (X509_NAME) *ca_
13900 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28 28 63 list;. if ((c
13910 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65 74 a_list = SSL_get
13920 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 _client_CA_list(
13930 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b ssl)) != NULL) {
13940 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b 42 55 ..char buffer[BU
13950 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 FSIZ];..for (int
13960 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 i = 0; i < sk_X
13970 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 509_NAME_num(ca_
13980 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 list); i++) {..
13990 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 X509_NAME *na
139a0 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d me = sk_X509_NAM
139b0 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c E_value(ca_list,
139c0 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 i);.. if (na
139d0 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d me) {...X509_NAM
139e0 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 E_oneline(name,
139f0 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b buffer, BUFSIZ);
13a00 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ...Tcl_ListObjAp
13a10 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
13a20 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c rp, listPtr, Tcl
13a30 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 _NewStringObj(bu
13a40 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 ffer, -1));..
13a50 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 }..}. }.
13a60 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 LAPPEND_OBJ(inte
13a70 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c rp, objPtr, "caL
13a80 69 73 74 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a ist", listPtr);.
13a90 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 LAPPEND_INT(
13aa0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
13ab0 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73 "caListCount", s
13ac0 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 k_X509_NAME_num(
13ad0 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20 20 20 ca_list));..
13ae0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
13af0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
13b00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
13b10 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 _OK;..clientData
13b20 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d = clientData;.}
13b30 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
13b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
13b80 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 * MiscObjCmd --
13b90 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a misc commands. *
13ba0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
13bb0 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
13bc0 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
13bd0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
13be0 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
13bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
13c30 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 .static int.Misc
13c40 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
13c50 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
13c60 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
13c70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
13c80 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
13c90 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 ]) {. static
13ca0 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d const char *comm
13cb0 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 ands [] = { "req
13cc0 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c ", "strreq", NUL
13cd0 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f L };. enum co
13ce0 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 mmand { C_REQ, C
13cf0 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 _STRREQ, C_DUMMY
13d00 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d 64 2c };. int cmd,
13d10 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 isStr;. char
13d20 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a buffer[16384];.
13d30 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
13d40 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
13d50 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 (objc < 2) {..Tc
13d60 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
13d70 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
13d80 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 "subcommand ?arg
13d90 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 s?");..return TC
13da0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
13db0 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e if (Tcl_GetIn
13dc0 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
13dd0 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d p, objv[1], comm
13de0 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c ands, "command",
13df0 20 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 0, &cmd) != TCL
13e00 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
13e10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
13e20 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
13e30 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 rror();.. isS
13e40 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 tr = (cmd == C_S
13e50 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 TRREQ);. swit
13e60 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e ch ((enum comman
13e70 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 d) cmd) {..case
13e80 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 C_REQ:..case C_S
13e90 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 TRREQ: {.. EV
13ea0 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c P_PKEY *pkey=NUL
13eb0 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 L;.. X509 *ce
13ec0 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 rt=NULL;.. X5
13ed0 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 09_NAME *name=NU
13ee0 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a LL;.. Tcl_Obj
13ef0 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 69 **listv;.. i
13f00 6e 74 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 20 nt listc,i;...
13f10 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b BIO *out=NULL;
13f20 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 ... char *k_C
13f30 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f ="",*k_ST="",*k_
13f40 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f L="",*k_O="",*k_
13f50 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a OU="",*k_CN="",*
13f60 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 k_Email="";..
13f70 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 char *keyout,*p
13f80 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 emout,*str;..
13f90 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 int keysize,ser
13fa0 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a ial=0,days=365;.
13fb0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
13fc0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
13fd0 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 30000000L.. B
13fe0 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c IGNUM *bne = NUL
13ff0 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 L;.. RSA *rsa
14000 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 = NULL;.#else..
14010 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 EVP_PKEY_CTX
14020 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 *ctx = NULL;.#e
14030 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 ndif... if ((
14040 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 objc<5) || (objc
14050 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f >6)) {...Tcl_Wro
14060 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
14070 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 , 2, objv, "keys
14080 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 ize keyfile cert
14090 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 file ?info?");..
140a0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
140b0 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 R;.. }...
140c0 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 if (Tcl_GetIntFr
140d0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
140e0 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 jv[2], &keysize)
140f0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 != TCL_OK) {...
14100 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
14110 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 ;.. }.. ke
14120 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 yout=Tcl_GetStri
14130 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 ng(objv[3]);..
14140 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 pemout=Tcl_Get
14150 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b String(objv[4]);
14160 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72 29 .. if (isStr)
14170 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 {...Tcl_SetVar(
14180 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 interp,keyout,""
14190 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 ,0);...Tcl_SetVa
141a0 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c r(interp,pemout,
141b0 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 "",0);.. }...
141c0 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 if (objc>=6)
141d0 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 {...if (Tcl_Lis
141e0 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 tObjGetElements(
141f0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c interp, objv[5],
14200 0a 09 09 09 26 6c 69 73 74 63 2c 20 26 6c 69 73 ....&listc, &lis
14210 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b tv) != TCL_OK) {
14220 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
14230 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 L_ERROR;...}....
14240 69 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d if ((listc%2) !=
14250 20 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 0) {... Tcl_
14260 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
14270 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 ,"Information li
14280 73 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 st must have eve
14290 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 n number of argu
142a0 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 ments",NULL);...
142b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
142c0 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 RROR;...}...for
142d0 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 (i=0; i<listc; i
142e0 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 +=2) {... str
142f0 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
14300 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 istv[i]);...
14310 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
14320 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 days")==0) {....
14330 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 if (Tcl_GetIntFr
14340 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 omObj(interp,lis
14350 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d tv[i+1],&days)!=
14360 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 TCL_OK).... r
14370 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
14380 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
14390 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 (strcmp(str,"se
143a0 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 rial")==0) {....
143b0 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 if (Tcl_GetIntFr
143c0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 omObj(interp,lis
143d0 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 tv[i+1],&serial)
143e0 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 !=TCL_OK)....
143f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
14400 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 R;... } else
14410 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
14420 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 C")==0) {....k_C
14430 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
14440 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
14450 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
14460 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 cmp(str,"ST")==0
14470 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f ) {....k_ST=Tcl_
14480 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
14490 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
144a0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
144b0 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 tr,"L")==0) {...
144c0 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 .k_L=Tcl_GetStri
144d0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
144e0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
144f0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 (strcmp(str,"O")
14500 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 ==0) {....k_O=Tc
14510 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
14520 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
14530 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
14540 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b (str,"OU")==0) {
14550 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 ....k_OU=Tcl_Get
14560 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
14570 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
14580 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
14590 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b "CN")==0) {....k
145a0 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e _CN=Tcl_GetStrin
145b0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
145c0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
145d0 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 strcmp(str,"Emai
145e0 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 l")==0) {....k_E
145f0 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 mail=Tcl_GetStri
14600 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
14610 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 .. } else {..
14620 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 ..Tcl_SetResult(
14630 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 interp,"Unknown
14640 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 parameter",NULL)
14650 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f ;....return TCL_
14660 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 ERROR;... }..
14670 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f .}.. }..#if O
14680 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
14690 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
146a0 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 00L.. bne = B
146b0 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 N_new();.. rs
146c0 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 a = RSA_new();..
146d0 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 pkey = EVP_P
146e0 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 KEY_new();..
146f0 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 if (bne == NULL
14700 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c || rsa == NULL |
14710 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c | pkey == NULL |
14720 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 | !BN_set_word(b
14730 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 ne,RSA_F4) ||...
14740 21 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 !RSA_generate_ke
14750 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a y_ex(rsa, keysiz
14760 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c e, bne, NULL) ||
14770 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 !EVP_PKEY_assig
14780 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 n_RSA(pkey, rsa)
14790 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 ) {...EVP_PKEY_f
147a0 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 ree(pkey);.../*
147b0 52 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 RSA_free(rsa); f
147c0 72 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 reed by EVP_PKEY
147d0 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 _free */...BN_fr
147e0 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 ee(bne);.#else..
147f0 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 pkey = EVP_R
14800 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 SA_gen((unsigned
14810 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a int) keysize);.
14820 09 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 . ctx = EVP_P
14830 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 KEY_CTX_new(pkey
14840 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 ,NULL);.. if
14850 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (pkey == NULL ||
14860 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 ctx == NULL ||
14870 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e !EVP_PKEY_keygen
14880 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 _init(ctx) ||...
14890 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 !EVP_PKEY_CTX_se
148a0 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 t_rsa_keygen_bit
148b0 73 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 s(ctx, keysize)
148c0 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 || !EVP_PKEY_key
148d0 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 gen(ctx, &pkey))
148e0 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 {...EVP_PKEY_fr
148f0 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f ee(pkey);...EVP_
14900 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 PKEY_CTX_free(ct
14910 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c x);.#endif...Tcl
14920 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
14930 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 p,"Error generat
14940 69 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 ing private key"
14950 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e ,NULL);...return
14960 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 TCL_ERROR;..
14970 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 } else {...if (
14980 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f isStr) {... o
14990 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
149a0 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 _mem());... P
149b0 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 EM_write_bio_Pri
149c0 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 vateKey(out,pkey
149d0 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c ,NULL,NULL,0,NUL
149e0 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 L,NULL);... i
149f0 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 =BIO_read(out,bu
14a00 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 ffer,sizeof(buff
14a10 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d er)-1);... i=
14a20 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 (i<0) ? 0 : i;..
14a30 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 . buffer[i]='
14a40 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 \0';... Tcl_S
14a50 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 etVar(interp,key
14a60 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 out,buffer,0);..
14a70 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f . BIO_flush(o
14a80 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 ut);... BIO_f
14a90 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c ree(out);...} el
14aa0 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 se {... out=B
14ab0 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c IO_new(BIO_s_fil
14ac0 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f e());... BIO_
14ad0 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f write_filename(o
14ae0 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 ut,keyout);...
14af0 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f PEM_write_bio_
14b00 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 PrivateKey(out,p
14b10 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c key,NULL,NULL,0,
14b20 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 NULL,NULL);...
14b30 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 /* PEM_write_b
14b40 69 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 io_RSAPrivateKey
14b50 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c (out, rsa, NULL,
14b60 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 NULL, 0, NULL,
14b70 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 NULL); */...
14b80 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 BIO_free_all(out
14b90 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 );.. .}....if ((
14ba0 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 cert=X509_new())
14bb0 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 ==NULL) {...
14bc0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
14bd0 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 terp,"Error gene
14be0 72 61 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 rating certifica
14bf0 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c te request",NULL
14c00 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 );... EVP_PKE
14c10 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 Y_free(pkey);.#i
14c20 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
14c30 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
14c40 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 00000L... BN_
14c50 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 free(bne);.#endi
14c60 66 0a 09 09 20 20 20 20 72 65 74 75 72 6e 28 54 f... return(T
14c70 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a CL_ERROR);...}..
14c80 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 ..X509_set_versi
14c90 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 on(cert,2);...AS
14ca0 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 N1_INTEGER_set(X
14cb0 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 509_get_serialNu
14cc0 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 mber(cert),seria
14cd0 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d l);...X509_gmtim
14ce0 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f e_adj(X509_getm_
14cf0 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c notBefore(cert),
14d00 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 0);...X509_gmtim
14d10 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f e_adj(X509_getm_
14d20 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 notAfter(cert),(
14d30 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 long)60*60*24*da
14d40 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f ys);...X509_set_
14d50 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 pubkey(cert,pkey
14d60 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f );....name=X509_
14d70 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 get_subject_name
14d80 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f (cert);....X509_
14d90 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
14da0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 y_txt(name,"C",
14db0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
14dc0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
14dd0 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d ar *) k_C, -1, -
14de0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
14df0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
14e00 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d txt(name,"ST", M
14e10 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
14e20 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
14e30 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d r *) k_ST, -1, -
14e40 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
14e50 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
14e60 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 txt(name,"L", MB
14e70 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
14e80 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
14e90 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c *) k_L, -1, -1,
14ea0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
14eb0 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
14ec0 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 t(name,"O", MBST
14ed0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
14ee0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
14ef0 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 ) k_O, -1, -1, 0
14f00 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
14f10 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
14f20 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 name,"OU", MBSTR
14f30 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
14f40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
14f50 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 k_OU, -1, -1, 0
14f60 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
14f70 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
14f80 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 name,"CN", MBSTR
14f90 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
14fa0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
14fb0 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 k_CN, -1, -1, 0
14fc0 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
14fd0 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
14fe0 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 name,"Email", MB
14ff0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
15000 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
15010 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c *) k_Email, -1,
15020 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 -1, 0);....X509
15030 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d _set_subject_nam
15040 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 e(cert,name);...
15050 09 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 .if (!X509_sign(
15060 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 cert,pkey,EVP_sh
15070 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 a256())) {...
15080 20 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 X509_free(cert)
15090 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 ;... EVP_PKEY
150a0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 _free(pkey);.#if
150b0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
150c0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
150d0 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 0000L... BN_f
150e0 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 ree(bne);.#endif
150f0 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 ... Tcl_SetRe
15100 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 sult(interp,"Err
15110 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 or signing certi
15120 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 ficate",NULL);..
15130 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
15140 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 ERROR;...}....if
15150 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 (isStr) {...
15160 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f out=BIO_new(BIO
15170 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 _s_mem());...
15180 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 PEM_write_bio_X
15190 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 509(out,cert);..
151a0 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 . i=BIO_read(
151b0 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f out,buffer,sizeo
151c0 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 f(buffer)-1);...
151d0 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 i=(i<0) ? 0
151e0 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 : i;... buffe
151f0 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 r[i]='\0';...
15200 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 Tcl_SetVar(inte
15210 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 rp,pemout,buffer
15220 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 ,0);... BIO_f
15230 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 lush(out);...
15240 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a BIO_free(out);.
15250 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 ..} else {...
15260 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f out=BIO_new(BIO
15270 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 _s_file());...
15280 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 BIO_write_file
15290 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 name(out,pemout)
152a0 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 ;... PEM_writ
152b0 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 e_bio_X509(out,c
152c0 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f ert);... BIO_
152d0 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 free_all(out);..
152e0 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 .}....X509_free(
152f0 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 cert);...EVP_PKE
15300 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 Y_free(pkey);.#i
15310 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
15320 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
15330 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 00000L...BN_free
15340 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 (bne);.#endif..
15350 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a }..}..break;.
15360 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 default:..br
15370 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 eak;. }. r
15380 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
15390 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
153a0 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a ntData;.}.../***
153b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
153c0 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 */./* Init
153d0 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a */./*****
153e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
153f0 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
15400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
15440 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a Tls_Free --. *.
15450 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
15460 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e e cleans up when
15470 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
15480 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 sed channel. *.i
15490 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 s closed and its
154a0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 reference count
154b0 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 falls below 1.
154c0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
154d0 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .none. *. * Side
154e0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 effects:. *.Fre
154f0 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 es all the state
15500 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
15510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15540 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
15550 69 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 id.Tls_Free(char
15560 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 *blockPtr) {.
15570 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
15580 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f r = (State *)blo
15590 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 ckPtr;.. dpri
155a0 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
155b0 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 Tls_Clean(st
155c0 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 atePtr);. ckf
155d0 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d ree(blockPtr);.}
155e0 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
155f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
15630 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 * Tls_Clean --.
15640 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
15650 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 ure cleans up wh
15660 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 en a SSL socket
15670 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a based channel. *
15680 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 .is closed and i
15690 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 ts reference cou
156a0 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 nt falls below 1
156b0 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 . This should.
156c0 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 *.be called sync
156d0 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 hronously by the
156e0 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 CloseProc, not
156f0 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 in the. *.Eventu
15700 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 allyFree callbac
15710 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 k.. *. * Results
15720 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.none. *. *
15730 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
15740 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 .Frees all the s
15750 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d tate. *. *------
15760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
157a0 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e /.void Tls_Clean
157b0 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 (State *statePtr
157c0 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ) {. dprintf(
157d0 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
157e0 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 /*. * we're
157f0 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 assuming here th
15800 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d at we're single-
15810 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f threaded. */
15820 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
15830 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c r->timer != (Tcl
15840 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c _TimerToken) NUL
15850 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 L) {..Tcl_Delete
15860 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 TimerHandler(sta
15870 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 tePtr->timer);..
15880 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
15890 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 = NULL;. }..
158a0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
158b0 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 >protos) {..ckfr
158c0 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f ee(statePtr->pro
158d0 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d tos);..statePtr-
158e0 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a >protos = NULL;.
158f0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
15900 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 atePtr->bio) {..
15910 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c /* This will cal
15920 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 l SSL_shutdown.
15930 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 Bug 1414045 */..
15940 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 dprintf("BIO_fre
15950 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 e_all(%p)", stat
15960 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f ePtr->bio);..BIO
15970 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 _free_all(stateP
15980 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 tr->bio);..state
15990 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b Ptr->bio = NULL;
159a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
159b0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a tatePtr->ssl) {.
159c0 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 .dprintf("SSL_fr
159d0 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 ee(%p)", statePt
159e0 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 r->ssl);..SSL_fr
159f0 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ee(statePtr->ssl
15a00 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 );..statePtr->ss
15a10 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a l = NULL;. }.
15a20 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
15a30 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 ->ctx) {..SSL_CT
15a40 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d X_free(statePtr-
15a50 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 >ctx);..statePtr
15a60 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ->ctx = NULL;.
15a70 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
15a80 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 ePtr->callback)
15a90 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f {..Tcl_DecrRefCo
15aa0 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 unt(statePtr->ca
15ab0 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 llback);..stateP
15ac0 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e tr->callback = N
15ad0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
15ae0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 f (statePtr->pas
15af0 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 sword) {..Tcl_De
15b00 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
15b10 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a Ptr->password);.
15b20 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 .statePtr->passw
15b30 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ord = NULL;.
15b40 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
15b50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c tr->vcmd) {..Tcl
15b60 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _DecrRefCount(st
15b70 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 atePtr->vcmd);..
15b80 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
15b90 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
15ba0 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 dprintf("Retur
15bb0 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ning");.}.../*.
15bc0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
15bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c00 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 ----. *. * Tls_I
15c10 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 nit --. *. *.Thi
15c20 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 s is a package i
15c30 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 nitialization pr
15c40 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 ocedure, which i
15c50 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 s called. *.by T
15c60 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 cl when this pac
15c70 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 kage is to be ad
15c80 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 ded to an interp
15c90 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 reter.. *. * Res
15ca0 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 ults: Ssl confi
15cb0 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 gured and loaded
15cc0 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
15cd0 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 cts:. *. create
15ce0 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c the ssl command,
15cf0 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 initialize ssl
15d00 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d context. *. *---
15d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d50 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 . */.DLLEXPORT i
15d60 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f nt Tls_Init(Tcl_
15d70 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 Interp *interp)
15d80 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 {. const char
15d90 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 tlsTclInitScrip
15da0 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 t[] = {.#include
15db0 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 "tls.tcl.h"..0x
15dc0 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64 00. };.. d
15dd0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
15de0 3b 0a 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 ;..#if TCL_MAJOR
15df0 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23 69 66 _VERSION > 8.#if
15e00 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 def USE_TCL_STUB
15e10 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e S. if (Tcl_In
15e20 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 itStubs(interp,
15e30 22 39 2e 30 22 2c 20 30 29 20 3d 3d 20 4e 55 4c "9.0", 0) == NUL
15e40 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
15e50 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 _ERROR;. }.#e
15e60 6e 64 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c ndif. if (Tcl
15e70 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 _PkgRequire(inte
15e80 72 70 2c 20 22 54 63 6c 22 2c 20 22 39 2e 30 2d rp, "Tcl", "9.0-
15e90 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b ", 0) == NULL) {
15ea0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
15eb0 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a OR;. }.#else.
15ec0 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 #ifdef USE_TCL_S
15ed0 54 55 42 53 0a 20 20 20 20 69 66 20 28 54 63 6c TUBS. if (Tcl
15ee0 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 _InitStubs(inter
15ef0 70 2c 20 22 38 2e 35 22 2c 20 30 29 20 3d 3d 20 p, "8.5", 0) ==
15f00 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
15f10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
15f20 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 .#endif. if (
15f30 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 Tcl_PkgRequire(i
15f40 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 22 38 nterp, "Tcl", "8
15f50 2e 35 2d 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c .5-", 0) == NULL
15f60 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
15f70 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e ERROR;. }.#en
15f80 64 69 66 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 dif.. if (Tls
15f90 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 LibInit(0) != TC
15fa0 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 L_OK) {..Tcl_App
15fb0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
15fc0 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 , "could not ini
15fd0 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 tialize SSL libr
15fe0 61 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ary", NULL);..re
15ff0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
16000 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 }.. Tcl_C
16010 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
16020 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f interp, "tls::co
16030 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 nnection", Conne
16040 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c ctionInfoObjCmd,
16050 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
16060 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
16070 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
16080 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
16090 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
160a0 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c tls::handshake",
160b0 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 HandshakeObjCmd
160c0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
160d0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
160e0 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
160f0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
16100 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
16110 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 "tls::import", I
16120 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c mportObjCmd, (Cl
16130 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
16140 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
16150 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
16160 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
16170 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
16180 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 :misc", MiscObjC
16190 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
161a0 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
161b0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
161c0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
161d0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
161e0 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 , "tls::unimport
161f0 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d ", UnimportObjCm
16200 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
16210 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
16220 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
16230 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
16240 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
16250 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 "tls::status",
16260 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 StatusObjCmd, (C
16270 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
16280 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
16290 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 *) NULL);..
162a0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
162b0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
162c0 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 s::ciphers", Cip
162d0 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 hersObjCmd, (Cli
162e0 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
162f0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
16300 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
16310 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
16320 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
16330 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 protocols", Prot
16340 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c ocolsObjCmd, (Cl
16350 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
16360 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
16370 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
16380 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
16390 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
163a0 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 :version", Versi
163b0 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e onObjCmd, (Clien
163c0 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
163d0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
163e0 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
163f0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
16400 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 64 (interp, "tls::d
16410 69 67 65 73 74 22 2c 20 44 69 67 65 73 74 43 6d igest", DigestCm
16420 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
16430 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
16440 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
16450 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
16460 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
16470 20 22 74 6c 73 3a 3a 64 69 67 65 73 74 73 22 2c "tls::digests",
16480 20 44 69 67 65 73 74 4c 69 73 74 43 6d 64 2c 20 DigestListCmd,
16490 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
164a0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
164b0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
164c0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
164d0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
164e0 6c 73 3a 3a 6d 64 34 22 2c 20 44 69 67 65 73 74 ls::md4", Digest
164f0 4d 44 34 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 MD4Cmd, (ClientD
16500 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
16510 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
16520 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
16530 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
16540 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 35 22 terp, "tls::md5"
16550 2c 20 44 69 67 65 73 74 4d 44 35 43 6d 64 2c 20 , DigestMD5Cmd,
16560 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
16570 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
16580 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
16590 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
165a0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
165b0 6c 73 3a 3a 73 68 61 31 22 2c 20 44 69 67 65 73 ls::sha1", Diges
165c0 74 53 48 41 31 43 6d 64 2c 20 28 43 6c 69 65 6e tSHA1Cmd, (Clien
165d0 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
165e0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
165f0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
16600 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
16610 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68 interp, "tls::sh
16620 61 32 35 36 22 2c 20 44 69 67 65 73 74 53 48 41 a256", DigestSHA
16630 32 35 36 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 256Cmd, (ClientD
16640 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
16650 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
16660 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e LL);.. if (in
16670 74 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 terp) {..Tcl_Eva
16680 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c l(interp, tlsTcl
16690 49 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20 20 InitScript);.
166a0 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }.. return T
166b0 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e cl_PkgProvide(in
166c0 74 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 terp, PACKAGE_NA
166d0 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 ME, PACKAGE_VERS
166e0 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d ION);.}../*. *--
166f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16720 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f ----*. *. *.Tls_
16730 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 SafeInit --. *.
16740 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
16750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16770 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 --*. *.Standard
16780 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 procedure requir
16790 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a ed by 'load'.. *
167a0 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 .Initializes thi
167b0 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 s extension for
167c0 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 a safe interpret
167d0 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d er.. *.---------
167e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
167f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16800 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 -------*. *. *.S
16810 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
16820 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 .As of 'Tls_Init
16830 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a '. *. *.Result:.
16840 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 *..A standard T
16850 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 cl error code..
16860 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
16870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a ----------*. */.
168a0 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c DLLEXPORT int Tl
168b0 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 s_SafeInit(Tcl_I
168c0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b nterp *interp) {
168d0 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
168e0 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 lled");. retu
168f0 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 rn(Tls_Init(inte
16900 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d rp));.}../*. *--
16910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16940 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c ----*. *. *.TlsL
16950 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 ibInit --. *. *.
16960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16990 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 *. *.Initializes
169a0 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 SSL library onc
169b0 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f e per applicatio
169c0 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d n. *.-----------
169d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
169e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
169f0 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 -----*. *. *.Sid
16a00 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 e effects:. *..i
16a10 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c nitializes SSL l
16a20 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 ibrary. *. *.Res
16a30 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a ult:. *..none. *
16a40 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
16a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 ---------*. */.s
16a80 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 tatic int TlsLib
16a90 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 Init(int uniniti
16aa0 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 alize) {. sta
16ab0 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 tic int initiali
16ac0 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 zed = 0;. int
16ad0 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b status = TCL_OK
16ae0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ;.#if defined(OP
16af0 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
16b00 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
16b10 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f READS). size_
16b20 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e t num_locks;.#en
16b30 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 dif.. if (uni
16b40 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 nitialize) {..if
16b50 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 (!initialized)
16b60 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 {.. dprintf("
16b70 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 Asked to uniniti
16b80 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 alize, but we ar
16b90 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 e not initialize
16ba0 64 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 d");... retur
16bb0 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 n(TCL_OK);..}...
16bc0 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 dprintf("Asked t
16bd0 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 o uninitialize")
16be0 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
16bf0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
16c00 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
16c10 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 HREADS)..Tcl_Mut
16c20 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 exLock(&init_mx)
16c30 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b ;...if (locks) {
16c40 0a 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 .. free(locks
16c50 29 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 );.. locks =
16c60 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 NULL;.. locks
16c70 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 Count = 0;..}.#e
16c80 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 ndif..initialize
16c90 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 d = 0;..#if defi
16ca0 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 ned(OPENSSL_THRE
16cb0 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 ADS) && defined(
16cc0 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 TCL_THREADS)..Tc
16cd0 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 l_MutexUnlock(&i
16ce0 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a nit_mx);.#endif.
16cf0 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 ..return(TCL_OK)
16d00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
16d10 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a (initialized) {.
16d20 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 .dprintf("Called
16d30 2c 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 , but using cach
16d40 65 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 ed value");..ret
16d50 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20 urn(status);.
16d60 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 }.. dprintf(
16d70 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 "Called");..#if
16d80 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
16d90 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
16da0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
16db0 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f . Tcl_MutexLo
16dc0 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 ck(&init_mx);.#e
16dd0 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c ndif. initial
16de0 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 ized = 1;..#if d
16df0 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
16e00 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
16e10 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
16e20 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 num_locks =
16e30 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 1;. locksCoun
16e40 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f t = (int) num_lo
16e50 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d cks;. locks =
16e60 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a malloc(sizeof(*
16e70 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 locks) * num_loc
16e80 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 ks);. memset(
16e90 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 locks, 0, sizeof
16ea0 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c (*locks) * num_l
16eb0 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 ocks);.#endif..
16ec0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 /* Initialize
16ed0 20 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 BOTH libcrypto
16ee0 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 and libssl. */.
16ef0 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f OPENSSL_init_
16f00 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 ssl(OPENSSL_INIT
16f10 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 _LOAD_SSL_STRING
16f20 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 S | OPENSSL_INIT
16f30 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 _LOAD_CRYPTO_STR
16f40 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f INGS..| OPENSSL_
16f50 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 INIT_ADD_ALL_CIP
16f60 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 HERS | OPENSSL_I
16f70 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 NIT_ADD_ALL_DIGE
16f80 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 STS, NULL);..
16f90 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c BIO_new_tcl(NUL
16fa0 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 L, 0);..#if 0.
16fb0 20 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a /*. * XXX:
16fc0 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 TODO: Remove thi
16fd0 73 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 s code and repla
16fe0 63 65 20 69 74 20 77 69 74 68 20 61 20 63 68 65 ce it with a che
16ff0 63 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e ck. * for en
17000 6f 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 ough entropy and
17010 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 do not try to c
17020 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 reate our own.
17030 20 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e * terrible en
17040 74 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 tropy. */.
17050 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 /*. * Seed
17060 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 the random numb
17070 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 er generator in
17080 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c the SSL library,
17090 0a 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 . * using th
170a0 65 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 e do/while const
170b0 72 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 ruct because of
170c0 74 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 the bug note in
170d0 74 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 the. * OpenS
170e0 53 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f SL FAQ at http:/
170f0 2f 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 /www.openssl.org
17100 2f 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d /support/faq.htm
17110 6c 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 l#USER1. *.
17120 20 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f * The crux o
17130 66 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 f the problem is
17140 20 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 that Solaris 7
17150 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a does not have a.
17160 20 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 * /dev/rand
17170 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 om or /dev/urand
17180 6f 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 om device so it
17190 63 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e cannot gather en
171a0 6f 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 ough. * entr
171b0 6f 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e opy from the RAN
171c0 44 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c D_seed() when TL
171d0 53 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e S initializes an
171e0 64 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a d refuses. *
171f0 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 to go further.
17200 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 Earlier versions
17210 20 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 of OpenSSL carr
17220 69 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 ied on regardles
17230 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 s.. */. s
17240 72 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 rand((unsigned i
17250 6e 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 nt) time((time_t
17260 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 *) NULL));.
17270 64 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 do {..for (i = 0
17280 3b 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b ; i < 16; i++) {
17290 0a 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 .. rnd_seed[i
172a0 5d 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 ] = 1 + (char) (
172b0 32 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 255.0 * rand()/(
172c0 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a RAND_MAX+1.0));.
172d0 09 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e .}..RAND_seed(rn
172e0 64 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 d_seed, sizeof(r
172f0 6e 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d nd_seed));. }
17300 20 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 while (RAND_sta
17310 74 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e tus() != 1);.#en
17320 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 dif..#if defined
17330 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
17340 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
17350 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d _THREADS)..Tcl_M
17360 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 utexUnlock(&init
17370 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 _mx);.#endif...r
17380 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d eturn(status);.}
17390 0a .