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 20 52 65 74 75 72 6e 20 68 61 73 68 20 -- Return hash
7060: 76 61 6c 75 65 20 66 6f 72 20 64 69 67 65 73 74 value for digest
7070: 20 61 73 20 68 65 78 20 73 74 72 69 6e 67 0a 20 as hex string.
7080: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
7090: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
70a0: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
70b0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
70c0: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
70d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
70e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a -------------. *
7110: 2f 0a 48 61 73 68 43 6d 64 28 43 6c 69 65 6e 74 /.HashCmd(Client
7120: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
7130: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
7140: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
7150: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
7160: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 69 6e 74 20 jv[]) {. int
7170: 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 len;. const c
7180: 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 20 20 63 har *name;. c
7190: 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 74 79 70 onst EVP_MD *typ
71a0: 65 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 e;.. if (objc
71b0: 20 21 3d 20 33 29 20 7b 0a 09 54 63 6c 5f 57 72 != 3) {..Tcl_Wr
71c0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
71d0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 74 79 70 p, 1, objv, "typ
71e0: 65 20 64 61 74 61 22 29 3b 0a 09 72 65 74 75 72 e data");..retur
71f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
7200: 20 7d 0a 0a 20 20 20 20 6e 61 6d 65 20 3d 20 54 }.. name = T
7210: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
7220: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 26 6c 65 6e Obj(objv[1],&len
7230: 29 3b 0a 20 20 20 20 69 66 20 28 6e 61 6d 65 20 );. if (name
7240: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 28 74 79 70 65 == NULL || (type
7250: 20 3d 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73 = EVP_get_diges
7260: 74 62 79 6e 61 6d 65 28 6e 61 6d 65 29 29 20 3d tbyname(name)) =
7270: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 = NULL) {..Tcl_A
7280: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
7290: 72 70 2c 20 22 49 6e 76 61 6c 69 64 20 64 69 67 rp, "Invalid dig
72a0: 65 73 74 20 74 79 70 65 20 5c 22 22 2c 20 6e 61 est type \"", na
72b0: 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b me, "\"", NULL);
72c0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
72d0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 62 OR;. }. ob
72e0: 6a 63 2d 2d 3b 0a 20 20 20 20 6f 62 6a 76 2b 2b jc--;. objv++
72f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 48 61 73 ;. return Has
7300: 68 43 61 6c 63 28 69 6e 74 65 72 70 2c 20 6f 62 hCalc(interp, ob
7310: 6a 63 2c 20 6f 62 6a 76 2c 20 74 79 70 65 29 3b jc, objv, type);
7320: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 43 6f 6d 6d 61 6e .}../*. * Comman
7330: 64 20 74 6f 20 43 61 6c 63 75 6c 61 74 65 20 4d d to Calculate M
7340: 44 34 20 48 61 73 68 0a 20 2a 2f 0a 69 6e 74 0a D4 Hash. */.int.
7350: 48 61 73 68 4d 44 34 43 6d 64 28 43 6c 69 65 6e HashMD4Cmd(Clien
7360: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
7370: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
7380: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
7390: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
73a0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 bjv[]) {. ret
73b0: 75 72 6e 20 48 61 73 68 43 61 6c 63 28 69 6e 74 urn HashCalc(int
73c0: 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c erp, objc, objv,
73d0: 20 45 56 50 5f 6d 64 34 28 29 29 3b 0a 7d 0a 0a EVP_md4());.}..
73e0: 2f 2a 0a 20 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f /*. * Command to
73f0: 20 43 61 6c 63 75 6c 61 74 65 20 4d 44 35 20 48 Calculate MD5 H
7400: 61 73 68 0a 20 2a 2f 0a 69 6e 74 0a 48 61 73 68 ash. */.int.Hash
7410: 4d 44 35 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 MD5Cmd(ClientDat
7420: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
7430: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
7440: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
7450: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
7460: 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 ]) {. return
7470: 48 61 73 68 43 61 6c 63 28 69 6e 74 65 72 70 2c HashCalc(interp,
7480: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 objc, objv, EVP
7490: 5f 6d 64 35 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 _md5());.}../*.
74a0: 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 20 43 61 6c * Command to Cal
74b0: 63 75 6c 61 74 65 20 53 48 41 2d 31 20 48 61 73 culate SHA-1 Has
74c0: 68 0a 20 2a 2f 0a 69 6e 74 0a 48 61 73 68 53 48 h. */.int.HashSH
74d0: 41 31 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 A1Cmd(ClientData
74e0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
74f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
7500: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
7510: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
7520: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 48 ) {. return H
7530: 61 73 68 43 61 6c 63 28 69 6e 74 65 72 70 2c 20 ashCalc(interp,
7540: 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f objc, objv, EVP_
7550: 73 68 61 31 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 sha1());.}../*.
7560: 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 20 43 61 6c * Command to Cal
7570: 63 75 6c 61 74 65 20 53 48 41 2d 32 35 36 20 48 culate SHA-256 H
7580: 61 73 68 0a 20 2a 2f 0a 69 6e 74 0a 48 61 73 68 ash. */.int.Hash
7590: 53 48 41 32 35 36 43 6d 64 28 43 6c 69 65 6e 74 SHA256Cmd(Client
75a0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
75b0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
75c0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
75d0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
75e0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 jv[]) {. retu
75f0: 72 6e 20 48 61 73 68 43 61 6c 63 28 69 6e 74 65 rn HashCalc(inte
7600: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 rp, objc, objv,
7610: 45 56 50 5f 73 68 61 32 35 36 28 29 29 3b 0a 7d EVP_sha256());.}
7620: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
7630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
7670: 20 48 61 73 68 20 4c 69 73 74 20 43 6f 6d 6d 61 Hash List Comma
7680: 6e 64 20 2d 2d 20 52 65 74 75 72 6e 20 6c 69 73 nd -- Return lis
7690: 74 20 6f 66 20 68 61 73 68 20 6d 65 73 73 61 67 t of hash messag
76a0: 65 20 64 69 67 65 73 74 73 0a 20 2a 0a 20 2a 20 e digests. *. *
76b0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
76c0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
76d0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
76e0: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a fects:. *.None..
76f0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
7700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7730: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f --------. */..vo
7740: 69 64 20 48 61 73 68 4c 69 73 74 43 61 6c 6c 62 id HashListCallb
7750: 61 63 6b 28 63 6f 6e 73 74 20 4f 42 4a 5f 4e 41 ack(const OBJ_NA
7760: 4d 45 20 2a 6f 62 6a 2c 20 76 6f 69 64 20 2a 61 ME *obj, void *a
7770: 72 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 rg) {. Tcl_Ob
7780: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 28 54 63 6c j *objPtr = (Tcl
7790: 5f 4f 62 6a 20 2a 29 20 61 72 67 3b 0a 09 54 63 _Obj *) arg;..Tc
77a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
77b0: 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 6f 62 6a lement(NULL, obj
77c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
77d0: 6e 67 4f 62 6a 28 6f 62 6a 2d 3e 6e 61 6d 65 2c ngObj(obj->name,
77e0: 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 2f 2a 0a -1));. }../*.
77f0: 20 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 20 6c 69 * Command to li
7800: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 48 61 73 st available Has
7810: 68 20 76 61 6c 75 65 73 0a 20 2a 2f 0a 69 6e 74 h values. */.int
7820: 0a 48 61 73 68 4c 69 73 74 43 6d 64 28 43 6c 69 .HashListCmd(Cli
7830: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
7840: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
7850: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
7860: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
7870: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
7880: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d cl_Obj *objPtr =
7890: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
78a0: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 0, NULL);..#if O
78b0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
78c0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
78d0: 30 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 00L. OpenSSL_
78e0: 61 64 64 5f 61 6c 6c 5f 64 69 67 65 73 74 73 28 add_all_digests(
78f0: 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 ); /* Make sure
7900: 74 68 65 79 27 72 65 20 6c 6f 61 64 65 64 20 2a they're loaded *
7910: 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 4f 42 /.#endif.. OB
7920: 4a 5f 4e 41 4d 45 5f 64 6f 5f 61 6c 6c 28 4f 42 J_NAME_do_all(OB
7930: 4a 5f 4e 41 4d 45 5f 54 59 50 45 5f 4d 44 5f 4d J_NAME_TYPE_MD_M
7940: 45 54 48 2c 20 4c 69 73 74 43 61 6c 6c 62 61 63 ETH, ListCallbac
7950: 6b 2c 20 28 76 6f 69 64 20 2a 29 20 6f 62 6a 50 k, (void *) objP
7960: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 73 tr);. Tcl_Res
7970: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 etResult(interp)
7980: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a ;. Tcl_SetObj
7990: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
79a0: 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 bjPtr);.. ret
79b0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
79c0: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
79d0: 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 Data;..objc = ob
79e0: 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 jc;..objv = objv
79f0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 56 61 6c 69 ;.}.../*. * Vali
7a00: 64 20 53 53 4c 20 61 6e 64 20 54 4c 53 20 50 72 d SSL and TLS Pr
7a10: 6f 74 6f 63 6f 6c 20 56 65 72 73 69 6f 6e 73 0a otocol Versions.
7a20: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 */.static const
7a30: 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 char *protocols
7a40: 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 [] = {.."ssl2",
7a50: 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 "ssl3", "tls1",
7a60: 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e "tls1.1", "tls1.
7a70: 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 2", "tls1.3", NU
7a80: 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f LL.};.enum proto
7a90: 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 col {. TLS_SS
7aa0: 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c L2, TLS_SSL3, TL
7ab0: 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 S_TLS1, TLS_TLS1
7ac0: 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 _1, TLS_TLS1_2,
7ad0: 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f TLS_TLS1_3, TLS_
7ae0: 4e 4f 4e 45 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d NONE.};../*. *--
7af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b30: 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f -. *. * CiphersO
7b40: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 bjCmd -- list av
7b50: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a ailable ciphers.
7b60: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
7b70: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
7b80: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
7b90: 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f tls::ciphers" co
7ba0: 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 mmand. *.to list
7bb0: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 available ciphe
7bc0: 72 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70 rs, based upon p
7bd0: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
7be0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
7bf0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
7c00: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a cl result list..
7c10: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
7c20: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 ts:. *.construct
7c30: 73 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53 s and destroys S
7c40: 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 SL context (CTX)
7c50: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
7c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
7ca0: 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 tatic int.Cipher
7cb0: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 sObjCmd(ClientDa
7cc0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
7cd0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
7ce0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
7cf0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
7d00: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []) {. Tcl_Ob
7d10: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c j *objPtr = NULL
7d20: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 ;. SSL_CTX *c
7d30: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 tx = NULL;. S
7d40: 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a SL *ssl = NULL;.
7d50: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c STACK_OF(SSL
7d60: 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 _CIPHER) *sk;.
7d70: 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 5b char *cp, buf[
7d80: 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 BUFSIZ];. int
7d90: 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20 index, verbose
7da0: 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 = 0, use_support
7db0: 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 ed = 0;. cons
7dc0: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 t SSL_METHOD *me
7dd0: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e thod;.. dprin
7de0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
7df0: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 31 if ((objc < 1
7e00: 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 ) || (objc > 4))
7e10: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
7e20: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
7e30: 6f 62 6a 76 2c 20 22 3f 70 72 6f 74 6f 63 6f 6c objv, "?protocol
7e40: 3f 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 ? ?verbose? ?sup
7e50: 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 ported?");..retu
7e60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7e70: 20 20 7d 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 }. if (objc
7e80: 20 3d 3d 20 31 29 20 7b 0a 09 2f 2a 20 4c 69 73 == 1) {../* Lis
7e90: 74 20 61 6c 6c 20 63 69 70 68 65 72 73 20 2a 2f t all ciphers */
7ea0: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 ..Tcl_Obj *objPt
7eb0: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
7ec0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 bj(0, NULL);..#i
7ed0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
7ee0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
7ef0: 30 30 30 30 30 4c 0a 09 4f 70 65 6e 53 53 4c 5f 00000L..OpenSSL_
7f00: 61 64 64 5f 61 6c 6c 5f 63 69 70 68 65 72 73 28 add_all_ciphers(
7f10: 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 ); /* Make sure
7f20: 74 68 65 79 27 72 65 20 6c 6f 61 64 65 64 20 2a they're loaded *
7f30: 2f 0a 23 65 6e 64 69 66 0a 0a 09 4f 42 4a 5f 4e /.#endif...OBJ_N
7f40: 41 4d 45 5f 64 6f 5f 61 6c 6c 28 4f 42 4a 5f 4e AME_do_all(OBJ_N
7f50: 41 4d 45 5f 54 59 50 45 5f 43 49 50 48 45 52 5f AME_TYPE_CIPHER_
7f60: 4d 45 54 48 2c 20 4c 69 73 74 43 61 6c 6c 62 61 METH, ListCallba
7f70: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 20 6f 62 6a ck, (void *) obj
7f80: 50 74 72 29 3b 0a 09 54 63 6c 5f 52 65 73 65 74 Ptr);..Tcl_Reset
7f90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
7fa0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
7fb0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
7fc0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f );..return TCL_O
7fd0: 4b 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 K;.. } else i
7fe0: 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 f (Tcl_GetIndexF
7ff0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
8000: 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c bjv[1], protocol
8010: 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 s, "protocol", 0
8020: 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c , &index) != TCL
8030: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
8040: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
8050: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 if ((objc >
8060: 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 2) && Tcl_GetBoo
8070: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 leanFromObj(inte
8080: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 rp, objv[2], &ve
8090: 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b rbose) != TCL_OK
80a0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
80b0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
80c0: 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20 if ((objc > 3)
80d0: 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 && Tcl_GetBoolea
80e0: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c nFromObj(interp,
80f0: 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 objv[3], &use_s
8100: 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c upported) != TCL
8110: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
8120: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
8130: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
8140: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69 rror();.. swi
8150: 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f tch ((enum proto
8160: 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 col)index) {..ca
8170: 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 se TLS_SSL2:.#if
8180: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
8190: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 _NUMBER >= 0x101
81a0: 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 00000L || define
81b0: 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 d(NO_SSL2) || de
81c0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
81d0: 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f _SSL2).. Tcl_
81e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
81f0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
8200: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
8210: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
8220: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 ", NULL);.. r
8230: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8240: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
8250: 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f od = SSLv2_metho
8260: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 d(); break;.#end
8270: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c if..case TLS_SSL
8280: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 3:.#if defined(N
8290: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e O_SSL3) || defin
82a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
82b0: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f L3) || defined(O
82c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d PENSSL_NO_SSL3_M
82d0: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f ETHOD).. Tcl_
82e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
82f0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
8300: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
8310: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
8320: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 ", NULL);.. r
8330: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8340: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
8350: 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f od = SSLv3_metho
8360: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 d(); break;.#end
8370: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 if..case TLS_TLS
8380: 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 1:.#if defined(N
8390: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e O_TLS1) || defin
83a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
83b0: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f S1) || defined(O
83c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d PENSSL_NO_TLS1_M
83d0: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f ETHOD).. Tcl_
83e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
83f0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
8400: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
8410: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
8420: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 ", NULL);.. r
8430: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8440: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
8450: 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f od = TLSv1_metho
8460: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 d(); break;.#end
8470: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 if..case TLS_TLS
8480: 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 1_1:.#if defined
8490: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 (NO_TLS1_1) || d
84a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
84b0: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 O_TLS1_1) || def
84c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
84d0: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 TLS1_1_METHOD)..
84e0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
84f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
8500: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
8510: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
8520: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
8530: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
8540: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
8550: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 method = TLS
8560: 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 v1_1_method(); b
8570: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 reak;.#endif..ca
8580: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 se TLS_TLS1_2:.#
8590: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
85a0: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_2) || defined
85b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
85c0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _2) || defined(O
85d0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
85e0: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 _METHOD).. Tc
85f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
8600: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
8610: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
8620: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
8630: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
8640: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
8650: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 R;.#else.. me
8660: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d thod = TLSv1_2_m
8670: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a ethod(); break;.
8680: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 #endif..case TLS
8690: 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 _TLS1_3:.#if def
86a0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
86b0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
86c0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 SL_NO_TLS1_3)..
86d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
86e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
86f0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
8700: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
8710: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
8720: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
8730: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 _ERROR;.#else..
8740: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f method = TLS_
8750: 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 53 method();.. S
8760: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 SL_CTX_set_min_p
8770: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
8780: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
8790: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
87a0: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 set_max_proto_ve
87b0: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f rsion(ctx, TLS1_
87c0: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 3_VERSION);..
87d0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
87e0: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 6d 65 default:.. me
87f0: 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f thod = TLS_metho
8800: 64 28 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b d();.. break;
8810: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 . }.. ctx
8820: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 = SSL_CTX_new(me
8830: 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 63 thod);. if (c
8840: 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 tx == NULL) {..T
8850: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8860: 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 interp, REASON()
8870: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
8880: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
8890: 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c }.. ssl = SSL
88a0: 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 _new(ctx);. i
88b0: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 f (ssl == NULL)
88c0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
88d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 ult(interp, REAS
88e0: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53 ON(), NULL);..SS
88f0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
8900: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
8910: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
8920: 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f * Use list and o
8930: 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 rder as would be
8940: 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e sent in a Clien
8950: 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 tHello or all av
8960: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 ailable ciphers
8970: 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 */. if (use_s
8980: 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 upported) {..sk
8990: 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f = SSL_get1_suppo
89a0: 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c rted_ciphers(ssl
89b0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
89c0: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 .sk = SSL_get_ci
89d0: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 phers(ssl);.
89e0: 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d }.. if (sk !=
89f0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 NULL) {..if (!v
8a00: 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f erbose) {.. o
8a10: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c bjPtr = Tcl_NewL
8a20: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
8a30: 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 .. for (int i
8a40: 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c = 0; i < sk_SSL
8a50: 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b _CIPHER_num(sk);
8a60: 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 i++) {...const
8a70: 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 SSL_CIPHER *c =
8a80: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 sk_SSL_CIPHER_va
8a90: 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 lue(sk, i);...if
8aa0: 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e (c == NULL) con
8ab0: 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 tinue;..../* cip
8ac0: 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e her name or (NON
8ad0: 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c E) */...cp = SSL
8ae0: 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 _CIPHER_get_name
8af0: 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d (c);...if (cp ==
8b00: 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 NULL) break;...
8b10: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
8b20: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
8b30: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
8b40: 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 StringObj(cp, -1
8b50: 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 ));.. }...} e
8b60: 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 lse {.. objPt
8b70: 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e r = Tcl_NewStrin
8b80: 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 gObj("",0);..
8b90: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b for (int i = 0;
8ba0: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 i < sk_SSL_CIPH
8bb0: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 ER_num(sk); i++)
8bc0: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 {...const SSL_C
8bd0: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 IPHER *c = sk_SS
8be0: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 L_CIPHER_value(s
8bf0: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d k, i);...if (c =
8c00: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 = NULL) continue
8c10: 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 ;..../* textual
8c20: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 description of t
8c30: 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 he cipher */...i
8c40: 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 f (SSL_CIPHER_de
8c50: 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 scription(c, buf
8c60: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 , sizeof(buf)) !
8c70: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 = NULL) {...
8c80: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 Tcl_AppendToObj(
8c90: 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 54 63 objPtr, buf, (Tc
8ca0: 6c 5f 53 69 7a 65 29 20 73 74 72 6c 65 6e 28 62 l_Size) strlen(b
8cb0: 75 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b uf));...} else {
8cc0: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ... Tcl_Appen
8cd0: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 dToObj(objPtr, "
8ce0: 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a UNKNOWN\n", 8);.
8cf0: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 ..}.. }..}..i
8d00: 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 f (use_supported
8d10: 29 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f ) {.. sk_SSL_
8d20: 43 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b CIPHER_free(sk);
8d30: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 ..}. }. SS
8d40: 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 L_free(ssl);.
8d50: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
8d60: 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 73 x);.. Tcl_Res
8d70: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 etResult(interp)
8d80: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a ;. Tcl_SetObj
8d90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
8da0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
8db0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
8dc0: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
8dd0: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
8de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e20: 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c -. *. * Protocol
8e30: 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 sObjCmd -- list
8e40: 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 available protoc
8e50: 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 ols. *. *.This p
8e60: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
8e70: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 ked to process t
8e80: 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f he "tls::protoco
8e90: 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 ls" command. *.t
8ea0: 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 o list available
8eb0: 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 protocols.. *.
8ec0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
8ed0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
8ee0: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 ult list.. *. *
8ef0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
8f00: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d .none. *. *-----
8f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
8f50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72 */.static int.Pr
8f60: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c otocolsObjCmd(Cl
8f70: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
8f80: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
8f90: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
8fa0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
8fb0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
8fc0: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b Tcl_Obj *objPtr;
8fd0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
8fe0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
8ff0: 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 (objc != 1) {..
9000: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
9010: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
9020: 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 , "");..return T
9030: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
9040: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
9050: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a rror();.. obj
9060: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
9070: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a tObj(0, NULL);..
9080: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
9090: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
90a0: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 0100000L && !def
90b0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 ined(NO_SSL2) &&
90c0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
90d0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 L_NO_SSL2). T
90e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
90f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
9100: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
9110: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
9120: 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 ls[TLS_SSL2], -1
9130: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
9140: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
9150: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
9160: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 NSSL_NO_SSL3) &&
9170: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
9180: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 L_NO_SSL3_METHOD
9190: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
91a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
91b0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
91c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
91d0: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 protocols[TLS_SS
91e0: 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 L3], -1));.#endi
91f0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
9200: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 O_TLS1) && !defi
9210: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
9220: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
9230: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
9240: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c _METHOD). Tcl
9250: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
9260: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
9270: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
9280: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
9290: 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 [TLS_TLS1], -1))
92a0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
92b0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
92c0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
92d0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 NSSL_NO_TLS1_1)
92e0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
92f0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 SSL_NO_TLS1_1_ME
9300: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 THOD). Tcl_Li
9310: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
9320: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
9330: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
9340: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
9350: 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b S_TLS1_1], -1));
9360: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
9370: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
9380: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
9390: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 SSL_NO_TLS1_2) &
93a0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
93b0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 SL_NO_TLS1_2_MET
93c0: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 HOD). Tcl_Lis
93d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
93e0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
93f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
9400: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
9410: 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a _TLS1_2], -1));.
9420: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
9430: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 ned(NO_TLS1_3) &
9440: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
9450: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
9460: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
9470: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
9480: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
9490: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
94a0: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 ocols[TLS_TLS1_3
94b0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
94c0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
94d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
94e0: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 jPtr);. retur
94f0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e n TCL_OK;..clien
9500: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 tData = clientDa
9510: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ta;.}.../*. *---
9520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9560: 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 . *. * VersionOb
9570: 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 jCmd -- return v
9580: 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 ersion string fr
9590: 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 om OpenSSL.. *.
95a0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
95b0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
95c0: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
95d0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
95e0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
95f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
9630: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f tatic int.Versio
9640: 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 nObjCmd(ClientDa
9650: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
9660: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
9670: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
9680: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
9690: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []) {. Tcl_Ob
96a0: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 j *objPtr;..
96b0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
96c0: 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d );.. objPtr =
96d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
96e0: 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f j(OPENSSL_VERSIO
96f0: 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 N_TEXT, -1);.
9700: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
9710: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
9720: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
9730: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 CL_OK;..clientDa
9740: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
9750: 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 ..objc = objc;..
9760: 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c objv = objv;.}..
9770: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
9780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
97a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
97b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
97c0: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 HandshakeObjCmd
97d0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f --. *. *.This co
97e0: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f mmand is used to
97f0: 20 76 65 72 69 66 79 20 77 68 65 74 68 65 72 20 verify whether
9800: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 the handshake is
9810: 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 complete. *.or
9820: 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c not.. *. * Resul
9830: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
9840: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 d Tcl result. 1
9850: 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 means handshake
9860: 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e complete, 0 mean
9870: 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a s pending.. *. *
9880: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
9890: 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 *.May force SSL
98a0: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 negotiation to t
98b0: 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a ake place.. *. *
98c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
98d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
98e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
98f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9900: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
9910: 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 nt HandshakeObjC
9920: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
9930: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
9940: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
9950: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
9960: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
9970: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
9980: 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a chan; /*
9990: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
99a0: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a set a mode on. *
99b0: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 /. State *sta
99c0: 74 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a tePtr; /*
99d0: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f client state fo
99e0: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a r ssl socket */.
99f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
9a00: 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 errStr = NULL;.
9a10: 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a int ret = 1;.
9a20: 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b int err = 0;
9a30: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
9a40: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
9a50: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 (objc != 2) {..
9a60: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
9a70: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
9a80: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 , "channel");..r
9a90: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
9aa0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
9ab0: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
9ac0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
9ad0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
9ae0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
9af0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
9b00: 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 NULL), NULL);.
9b10: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
9b20: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
9b30: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c L) {..return(TCL
9b40: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a _ERROR);. }..
9b50: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
9b60: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
9b70: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
9b80: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
9b90: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
9ba0: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 el(chan);. if
9bb0: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
9bc0: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
9bd0: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
9be0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
9bf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
9c00: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
9c10: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
9c20: 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c e(chan),.. "\
9c30: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
9c40: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 nnel", NULL);..T
9c50: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
9c60: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
9c70: 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 43 48 41 HANDSHAKE", "CHA
9c80: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 NNEL", "INVALID"
9c90: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9ca0: 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 ;..return(TCL_ER
9cb0: 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ROR);. }.
9cc0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
9cd0: 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e e *)Tcl_GetChann
9ce0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 elInstanceData(c
9cf0: 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e han);.. dprin
9d00: 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f tf("Calling Tls_
9d10: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 WaitForConnect")
9d20: 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c 73 5f ;. ret = Tls_
9d30: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 WaitForConnect(s
9d40: 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c 20 31 tatePtr, &err, 1
9d50: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 );. dprintf("
9d60: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
9d70: 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25 69 22 ct returned: %i"
9d80: 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 , ret);.. if
9d90: 28 72 65 74 20 3c 20 30 20 26 26 20 28 28 73 74 (ret < 0 && ((st
9da0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 atePtr->flags &
9db0: 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 TLS_TCL_ASYNC) &
9dc0: 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41 49 4e & (err == EAGAIN
9dd0: 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 ))) {..dprintf("
9de0: 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65 72 Async set and er
9df0: 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 r = EAGAIN");..r
9e00: 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c et = 0;. } el
9e10: 73 65 20 69 66 20 28 72 65 74 20 3c 20 30 29 20 se if (ret < 0)
9e20: 7b 0a 09 6c 6f 6e 67 20 72 65 73 75 6c 74 3b 0a {..long result;.
9e30: 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 65 50 .errStr = stateP
9e40: 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 tr->err;..Tcl_Re
9e50: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 setResult(interp
9e60: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f );..Tcl_SetErrno
9e70: 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 (err);...if (!er
9e80: 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 rStr || (*errStr
9e90: 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 65 == 0)) {.. e
9ea0: 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 rrStr = Tcl_Posi
9eb0: 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a xError(interp);.
9ec0: 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 .}...Tcl_AppendR
9ed0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 esult(interp, "h
9ee0: 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a andshake failed:
9ef0: 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 68 61 ", errStr, (cha
9f00: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 r *) NULL);..if
9f10: 28 28 72 65 73 75 6c 74 20 3d 20 53 53 4c 5f 67 ((result = SSL_g
9f20: 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 et_verify_result
9f30: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 (statePtr->ssl))
9f40: 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b != X509_V_OK) {
9f50: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
9f60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
9f70: 20 64 75 65 20 74 6f 3a 20 22 2c 20 58 35 30 39 due to: ", X509
9f80: 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 _verify_cert_err
9f90: 6f 72 5f 73 74 72 69 6e 67 28 72 65 73 75 6c 74 or_string(result
9fa0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
9fb0: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72 );..}..Tcl_SetEr
9fc0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
9fd0: 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b "TLS", "HANDSHAK
9fe0: 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 E", "FAILED", (c
9ff0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 har *) NULL);..d
a000: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
a010: 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 g TCL_ERROR with
a020: 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 handshake faile
a030: 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29 3b d: %s", errStr);
a040: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
a050: 4f 52 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 OR);. } else
a060: 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29 {..if (err != 0)
a070: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
a080: 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69 "Got an error wi
a090: 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 th a completed h
a0a0: 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 andshake: err =
a0b0: 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 %i", err);..}..r
a0c0: 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 et = 1;. }..
a0d0: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 dprintf("Retu
a0e0: 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 rning TCL_OK wit
a0f0: 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 h data \"%i\"",
a100: 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ret);. Tcl_Se
a110: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
a120: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a p, Tcl_NewIntObj
a130: 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75 (ret));. retu
a140: 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 rn(TCL_OK);..cli
a150: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
a160: 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d Data;.}../*. *--
a170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a1b0: 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 -. *. * ImportOb
a1c0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
a1d0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
a1e0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
a1f0: 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d ss the "ssl" com
a200: 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 mand. *. *.The s
a210: 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 sl command pushe
a220: 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 s SSL over a (ne
a230: 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 wly connected) t
a240: 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 cp socket. *. *
a250: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
a260: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
a270: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
a280: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f fects:. *.May mo
a290: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f dify the behavio
a2a0: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e r of an IO chann
a2b0: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d el.. *. *-------
a2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
a300: 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f .static int.Impo
a310: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 rtObjCmd(ClientD
a320: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
a330: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
a340: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
a350: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
a360: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]) {. Tcl_C
a370: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a hannel chan;../*
a380: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
a390: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a set a mode on. *
a3a0: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 /. State *sta
a3b0: 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e tePtr;../* clien
a3c0: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 t state for ssl
a3d0: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 socket */. SS
a3e0: 4c 5f 43 54 58 20 2a 63 74 78 09 20 20 20 20 20 L_CTX *ctx.
a3f0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 = NULL;. T
a400: 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 20 cl_Obj *script.
a410: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
a420: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 Tcl_Obj *pass
a430: 77 6f 72 64 09 20 20 20 20 20 20 20 20 3d 20 4e word. = N
a440: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
a450: 20 2a 76 63 6d 64 09 20 20 20 20 20 20 20 20 3d *vcmd. =
a460: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 NULL;. Tcl_D
a470: 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 6e String upperChan
a480: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 nelTranslation,
a490: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
a4a0: 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e king, upperChann
a4b0: 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 elEncoding, uppe
a4c0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b rChannelEOFChar;
a4d0: 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c 65 . int idx, le
a4e0: 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 n;. int flags
a4f0: 09 09 20 20 20 20 20 20 20 20 3d 20 54 4c 53 5f .. = TLS_
a500: 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e TCL_INIT;. in
a510: 74 20 73 65 72 76 65 72 09 09 20 20 20 20 20 20 t server..
a520: 20 20 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e = 0;./* is con
a530: 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 nection incoming
a540: 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f or outgoing? */
a550: 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66 69 . char *keyfi
a560: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c le. = NUL
a570: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 L;. char *cer
a580: 74 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 tfile. =
a590: 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e NULL;. unsign
a5a0: 65 64 20 63 68 61 72 20 2a 6b 65 79 20 20 09 3d ed char *key .=
a5b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 6b NULL;. int k
a5c0: 65 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 ey_len
a5d0: 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 = 0;.
a5e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 unsigned char *c
a5f0: 65 72 74 20 20 20 20 20 20 20 20 20 3d 20 4e 55 ert = NU
a600: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 63 65 72 74 LL;. int cert
a610: 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 _len
a620: 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 = 0;. cha
a630: 72 20 2a 63 69 70 68 65 72 73 09 20 20 20 20 20 r *ciphers.
a640: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 = NULL;. c
a650: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 har *ciphersuite
a660: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c s. = NULL
a670: 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 ;. char *CAfi
a680: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c le. = NUL
a690: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 64 L;. char *CAd
a6a0: 69 72 09 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ir.. = NU
a6b0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 LL;. char *DH
a6c0: 70 61 72 61 6d 73 09 20 20 20 20 20 20 20 20 3d params. =
a6d0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
a6e0: 2a 6d 6f 64 65 6c 09 09 20 20 20 20 20 20 20 20 *model..
a6f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
a700: 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 20 20 20 *servername.
a710: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 = NULL;./*
a720: 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 hostname for Ser
a730: 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 ver Name Indicat
a740: 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 ion */. const
a750: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
a760: 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c session_id = NUL
a770: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a L;. Tcl_Obj *
a780: 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 alpn..= NULL;.
a790: 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 int ssl2 = 0,
a7a0: 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e ssl3 = 0;. in
a7b0: 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 t tls1 = 1, tls1
a7c0: 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d _1 = 1, tls1_2 =
a7d0: 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 1, tls1_3 = 1;.
a7e0: 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 int proto =
a7f0: 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 0, level = -1;.
a800: 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20 int verify =
a810: 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20 0, require = 0,
a820: 72 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 request = 1, pos
a830: 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b t_handshake = 0;
a840: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
a850: 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 alled");..#if de
a860: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c fined(NO_TLS1) |
a870: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
a880: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 L_NO_TLS1). t
a890: 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a ls1 = 0;.#endif.
a8a0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
a8b0: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_1) || define
a8c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
a8d0: 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 1_1). tls1_1
a8e0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 0;.#endif.#if
a8f0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
a900: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
a910: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
a920: 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b . tls1_2 = 0;
a930: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
a940: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c ned(NO_TLS1_3) |
a950: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
a960: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 L_NO_TLS1_3).
a970: 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e tls1_3 = 0;.#en
a980: 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a dif.. if (obj
a990: 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 c < 2) {..Tcl_Wr
a9a0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
a9b0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 p, 1, objv, "cha
a9c0: 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 nnel ?options?")
a9d0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
a9e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
a9f0: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
aa00: 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 );.. chan = T
aa10: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
aa20: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
aa30: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
aa40: 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 1], NULL), NULL)
aa50: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
aa60: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
aa70: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
aa80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
aa90: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
aaa0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
aab0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
aac0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
aad0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
aae0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 nnel(chan);..
aaf0: 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 for (idx = 2; i
ab00: 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b dx < objc; idx++
ab10: 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d ) {..char *opt =
ab20: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
ab30: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c omObj(objv[idx],
ab40: 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 NULL);...if (op
ab50: 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 t[0] != '-')..
ab60: 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 break;...OPTOB
ab70: 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 J("-alpn", alpn)
ab80: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64 69 ;..OPTSTR("-cadi
ab90: 72 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 r", CAdir);..OPT
aba0: 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 STR("-cafile", C
abb0: 41 66 69 6c 65 29 3b 0a 09 4f 50 54 42 59 54 45 Afile);..OPTBYTE
abc0: 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c 20 ("-cert", cert,
abd0: 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 cert_len);..OPTS
abe0: 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 TR("-certfile",
abf0: 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 certfile);..OPTS
ac00: 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69 TR("-cipher", ci
ac10: 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 phers);..OPTSTR(
ac20: 22 2d 63 69 70 68 65 72 73 22 2c 20 63 69 70 68 "-ciphers", ciph
ac30: 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ers);..OPTSTR("-
ac40: 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 20 63 ciphersuites", c
ac50: 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09 4f iphersuites);..O
ac60: 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 PTOBJ("-command"
ac70: 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 , script);..OPTS
ac80: 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 TR("-dhparams",
ac90: 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 DHparams);..OPTB
aca0: 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c YTE("-key", key,
acb0: 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 key_len);..OPTS
acc0: 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b TR("-keyfile", k
acd0: 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 eyfile);..OPTSTR
ace0: 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c ("-model", model
acf0: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 );..OPTOBJ("-pas
ad00: 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 64 sword", password
ad10: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f );..OPTBOOL("-po
ad20: 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 st_handshake", p
ad30: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a ost_handshake);.
ad40: 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 .OPTBOOL("-reque
ad50: 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 st", request);..
ad60: 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 OPTBOOL("-requir
ad70: 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f e", require);..O
ad80: 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79 PTINT("-security
ad90: 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a level", level);.
ada0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 .OPTBOOL("-serve
adb0: 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 r", server);..OP
adc0: 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d TSTR("-servernam
add0: 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b e", servername);
ade0: 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 ..OPTSTR("-sessi
adf0: 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f on_id", session_
ae00: 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d id);..OPTBOOL("-
ae10: 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f ssl2", ssl2);..O
ae20: 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 PTBOOL("-ssl3",
ae30: 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 ssl3);..OPTBOOL(
ae40: 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a "-tls1", tls1);.
ae50: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e .OPTBOOL("-tls1.
ae60: 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 1", tls1_1);..OP
ae70: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c TBOOL("-tls1.2",
ae80: 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f tls1_2);..OPTBO
ae90: 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c OL("-tls1.3", tl
aea0: 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 s1_3);..OPTOBJ("
aeb0: 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 -validatecommand
aec0: 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 ", vcmd);..OPTOB
aed0: 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 J("-vcmd", vcmd)
aee0: 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 ;...OPTBAD("opti
aef0: 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 on", "-alpn, -ca
af00: 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 dir, -cafile, -c
af10: 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 ert, -certfile,
af20: 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 -cipher, -cipher
af30: 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 suites, -command
af40: 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 , -dhparams, -ke
af50: 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f y, -keyfile, -mo
af60: 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 del, -password,
af70: 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c -post_handshake,
af80: 20 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 71 75 -request, -requ
af90: 69 72 65 2c 20 2d 73 65 63 75 72 69 74 79 6c 65 ire, -securityle
afa0: 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 vel, -server, -s
afb0: 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 ervername, -sess
afc0: 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d ion_id, -ssl2, -
afd0: 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c ssl3, -tls1, -tl
afe0: 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d s1.1, -tls1.2, -
aff0: 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 tls1.3, or -vali
b000: 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a datecommand");..
b010: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
b020: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
b030: 28 72 65 71 75 65 73 74 29 09 09 76 65 72 69 66 (request)..verif
b040: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
b050: 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 CLIENT_ONCE | SS
b060: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 L_VERIFY_PEER;.
b070: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 if (request &
b080: 26 20 72 65 71 75 69 72 65 29 09 76 65 72 69 66 & require).verif
b090: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
b0a0: 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f FAIL_IF_NO_PEER_
b0b0: 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 CERT;. if (re
b0c0: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 quest && post_ha
b0d0: 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 20 ndshake).verify
b0e0: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f |= SSL_VERIFY_PO
b0f0: 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 ST_HANDSHAKE;.
b100: 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 if (verify ==
b110: 30 29 09 09 76 65 72 69 66 79 20 3d 20 53 53 4c 0)..verify = SSL
b120: 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 _VERIFY_NONE;..
b130: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c proto |= (ssl
b140: 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 2 ? TLS_PROTO_SS
b150: 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f L2 : 0);. pro
b160: 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c to |= (ssl3 ? TL
b170: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 S_PROTO_SSL3 : 0
b180: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 );. proto |=
b190: 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 (tls1 ? TLS_PROT
b1a0: 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 O_TLS1 : 0);.
b1b0: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f proto |= (tls1_
b1c0: 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 1 ? TLS_PROTO_TL
b1d0: 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 S1_1 : 0);. p
b1e0: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 roto |= (tls1_2
b1f0: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 ? TLS_PROTO_TLS1
b200: 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f _2 : 0);. pro
b210: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 to |= (tls1_3 ?
b220: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
b230: 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 : 0);.. /* r
b240: 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 eset to NULL if
b250: 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f blank string pro
b260: 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 vided */. if
b270: 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 (cert && !*cert)
b280: 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20 .. cert.
b290: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
b2a0: 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a if (key && !*
b2b0: 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 key).. ke
b2c0: 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c y. = NULL
b2d0: 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 ;. if (certfi
b2e0: 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 le && !*certfile
b2f0: 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69 ) certfi
b300: 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 le.= NULL;. i
b310: 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a f (keyfile && !*
b320: 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c keyfile)..keyfil
b330: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c e. = NULL
b340: 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 ;. if (cipher
b350: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 s && !*ciphers).
b360: 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09 ciphers.
b370: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
b380: 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75 if (ciphersu
b390: 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 ites && !*cipher
b3a0: 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75 suites) ciphersu
b3b0: 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a ites = NULL;.
b3c0: 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 if (CAfile &
b3d0: 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 & !*CAfile).
b3e0: 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 CAfile.
b3f0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
b400: 66 20 28 43 41 64 69 72 20 26 26 20 21 2a 43 41 f (CAdir && !*CA
b410: 64 69 72 29 09 20 20 20 20 20 20 20 20 43 41 64 dir). CAd
b420: 69 72 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c ir. = NUL
b430: 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 L;. if (DHpar
b440: 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d ams && !*DHparam
b450: 73 29 09 20 20 20 20 20 20 20 20 44 48 70 61 72 s). DHpar
b460: 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c ams = NUL
b470: 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 L;.. /* new S
b480: 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 SL state */.
b490: 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 statePtr..= (Sta
b4a0: 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 te *) ckalloc((u
b4b0: 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 nsigned) sizeof(
b4c0: 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d State));. mem
b4d0: 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c set(statePtr, 0,
b4e0: 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b sizeof(State));
b4f0: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
b500: 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 flags.= flags;.
b510: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 statePtr->int
b520: 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 erp.= interp;.
b530: 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 statePtr->vfla
b540: 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 gs.= verify;.
b550: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d statePtr->err.=
b560: 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c "";.. /* all
b570: 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a ocate script */.
b580: 20 20 20 20 69 66 20 28 73 63 72 69 70 74 29 20 if (script)
b590: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 {..(void) Tcl_Ge
b5a0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 tStringFromObj(s
b5b0: 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 cript, &len);..i
b5c0: 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 f (len) {.. s
b5d0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
b5e0: 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20 k = script;..
b5f0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
b600: 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c t(statePtr->call
b610: 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a back);..}. }.
b620: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 . /* allocate
b630: 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 password */.
b640: 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b if (password) {
b650: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 ..(void) Tcl_Get
b660: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 StringFromObj(pa
b670: 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 ssword, &len);..
b680: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 if (len) {..
b690: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
b6a0: 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 rd = password;..
b6b0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
b6c0: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 ount(statePtr->p
b6d0: 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 assword);..}.
b6e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 }.. /* alloc
b6f0: 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 6f 6d ate validate com
b700: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 mand */. if (
b710: 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 vcmd) {..(void)
b720: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
b730: 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 mObj(vcmd, &len)
b740: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 ;..if (len) {..
b750: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 63 6d statePtr->vcm
b760: 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 d = vcmd;.. T
b770: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
b780: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
b790: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 ..}. }.. i
b7a0: 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c f (model != NULL
b7b0: 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 ) {..int mode;..
b7c0: 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 /* Get the "mode
b7d0: 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 l" context */..c
b7e0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
b7f0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 nnel(interp, mod
b800: 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 el, &mode);..if
b810: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
b820: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
b830: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
b840: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
b850: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
b860: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a _ERROR;..}.../*.
b870: 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f . * Make sure to
b880: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
b890: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a topmost channel.
b8a0: 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c . */..chan = Tcl
b8b0: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
b8c0: 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 han);..if (Tcl_G
b8d0: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
b8e0: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
b8f0: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20 elType()) {..
b900: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
b910: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
b920: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
b930: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
b940: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 han),..."\": not
b950: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c a TLS channel",
b960: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c NULL);.. Tcl
b970: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
b980: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
b990: 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 PORT", "CHANNEL"
b9a0: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 , "INVALID", (ch
b9b0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
b9c0: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
b9d0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
b9e0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
b9f0: 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 RROR;..}..ctx =
ba00: 28 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 ((State *)Tcl_Ge
ba10: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 tChannelInstance
ba20: 44 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 Data(chan))->ctx
ba30: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
ba40: 69 66 20 28 28 63 74 78 20 3d 20 43 54 58 5f 49 if ((ctx = CTX_I
ba50: 6e 69 74 28 73 74 61 74 65 50 74 72 2c 20 73 65 nit(statePtr, se
ba60: 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 rver, proto, key
ba70: 66 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 file, certfile,
ba80: 6b 65 79 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c key, cert, key_l
ba90: 65 6e 2c 0a 09 20 20 20 20 63 65 72 74 5f 6c 65 en,.. cert_le
baa0: 6e 2c 20 43 41 64 69 72 2c 20 43 41 66 69 6c 65 n, CAdir, CAfile
bab0: 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 , ciphers, ciphe
bac0: 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 rsuites, level,
bad0: 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 DHparams)) == NU
bae0: 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 LL) {.. Tls_F
baf0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
bb00: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
bb10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
bb20: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 }. }.. sta
bb30: 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 tePtr->ctx = ctx
bb40: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
bb50: 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 We need to make
bb60: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 sure that the c
bb70: 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 hannel works in
bb80: 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65 0a binary (for the.
bb90: 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69 6f * encryptio
bba0: 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f n not to get goo
bbb0: 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 fed up).. *
bbc0: 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 We only want to
bbd0: 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 66 65 adjust the buffe
bbe0: 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 63 ring in pre-v2 c
bbf0: 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 hannels, where.
bc00: 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e 6e * each chann
bc10: 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 el in the stack
bc20: 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20 6f maintained its o
bc30: 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20 20 wn buffers..
bc40: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 */. Tcl_DStr
bc50: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
bc60: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
bc70: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
bc80: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
bc90: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 nnelBlocking);.
bca0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
bcb0: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
bcc0: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 EOFChar);. Tc
bcd0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
bce0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
bcf0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 ing);. Tcl_Ge
bd00: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
bd10: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 nterp, chan, "-e
bd20: 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 ofchar", &upperC
bd30: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a hannelEOFChar);.
bd40: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e Tcl_GetChann
bd50: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
bd60: 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e chan, "-encodin
bd70: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 g", &upperChanne
bd80: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 lEncoding);.
bd90: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
bda0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
bdb0: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
bdc0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
bdd0: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 Translation);.
bde0: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c Tcl_GetChannel
bdf0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
be00: 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 han, "-blocking"
be10: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 , &upperChannelB
be20: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 locking);. Tc
be30: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
be40: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
be50: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c "-translation",
be60: 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 "binary");.
be70: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
be80: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
be90: 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 n, "-blocking",
bea0: 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70 72 "true");. dpr
beb0: 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 intf("Consuming
bec0: 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c Tcl channel %s",
bed0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
bee0: 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 ame(chan));.
bef0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
bf00: 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 Tcl_StackChanne
bf10: 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 l(interp, Tls_Ch
bf20: 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 6c annelType(), (Cl
bf30: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
bf40: 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 4c tr, (TCL_READABL
bf50: 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 E | TCL_WRITABLE
bf60: 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 ), chan);. dp
bf70: 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 63 rintf("Created c
bf80: 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 hannel named %s"
bf90: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
bfa0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
bfb0: 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 73 elf));. if (s
bfc0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d tatePtr->self ==
bfd0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
bfe0: 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e ULL) {../*.. * N
bff0: 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 o use of Tcl_Eve
c000: 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 61 ntuallyFree beca
c010: 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 use no possible
c020: 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 Tcl_Preserve...
c030: 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 */..Tls_Free((ch
c040: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
c050: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
c060: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
c070: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
c080: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ion(interp, stat
c090: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 ePtr->self, "-tr
c0a0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f anslation", Tcl_
c0b0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 DStringValue(&up
c0c0: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
c0d0: 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c ation));. Tcl
c0e0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
c0f0: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
c100: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f tr->self, "-enco
c110: 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 ding", Tcl_DStri
c120: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
c130: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b annelEncoding));
c140: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
c150: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
c160: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
c170: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 , "-eofchar", Tc
c180: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
c190: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 upperChannelEOFC
c1a0: 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 har));. Tcl_S
c1b0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
c1c0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
c1d0: 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 ->self, "-blocki
c1e0: 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 ng", Tcl_DString
c1f0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e Value(&upperChan
c200: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a nelBlocking));..
c210: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 /*. * SS
c220: 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e L Initialization
c230: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 . */. sta
c240: 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c tePtr->ssl = SSL
c250: 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 _new(statePtr->c
c260: 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 tx);. if (!st
c270: 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 atePtr->ssl) {..
c280: 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 /* SSL library e
c290: 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 rror */..Tcl_App
c2a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
c2b0: 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 , "couldn't cons
c2c0: 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f truct ssl sessio
c2d0: 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 n: ", REASON(),
c2e0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
c2f0: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f . Tcl_SetErro
c300: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
c310: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 LS", "IMPORT", "
c320: 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22 2c INIT", "FAILED",
c330: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
c340: 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 ..Tls_Free((char
c350: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
c360: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
c370: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
c380: 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 Set host server
c390: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 name */. if (
c3a0: 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f servername) {../
c3b0: 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 76 65 * Sets the serve
c3c0: 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f r name indicatio
c3d0: 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e n (SNI) in Clien
c3e0: 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e tHello extension
c3f0: 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 */../* Per RFC
c400: 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 6066, hostname i
c410: 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65 s a ASCII encode
c420: 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 d string, though
c430: 20 52 46 43 20 34 33 36 36 20 73 61 79 73 20 55 RFC 4366 says U
c440: 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 TF-8. */..if (!S
c450: 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f SL_set_tlsext_ho
c460: 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 st_name(statePtr
c470: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d ->ssl, servernam
c480: 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20 7b e) && require) {
c490: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
c4a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
c4b0: 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f 73 74 setting TLS host
c4c0: 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e 20 name extension
c4d0: 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a failed", (char *
c4e0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 ) NULL);.. Tc
c4f0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
c500: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
c510: 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 MPORT", "SNI", "
c520: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
c530: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c ) NULL);.. Tl
c540: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
c550: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
c560: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
c570: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f ;..}.../* Set ho
c580: 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20 stname for peer
c590: 63 65 72 74 69 66 69 63 61 74 65 20 68 6f 73 74 certificate host
c5a0: 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74 69 6f name verificatio
c5b0: 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 n in clients...
c5c0: 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f Don't use SSL_
c5d0: 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 set1_host since
c5e0: 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f it has limitatio
c5f0: 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c ns. */..if (!SSL
c600: 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 _add1_host(state
c610: 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 Ptr->ssl, server
c620: 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 name)) {.. Tc
c630: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
c640: 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 nterp, "setting
c650: 44 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 66 61 DNS host name fa
c660: 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 iled", (char *)
c670: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
c680: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
c690: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
c6a0: 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 ORT", "HOSTNAME"
c6b0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
c6c0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
c6d0: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 Tls_Free((char
c6e0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
c6f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
c700: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ROR;..}. }..
c710: 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 /* Resume ses
c720: 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 sion id */. i
c730: 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 f (session_id &&
c740: 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f strlen(session_
c750: 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 id) <= SSL_MAX_S
c760: 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b ID_CTX_LENGTH) {
c770: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 ../* SSL_set_ses
c780: 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 sion() */..if (!
c790: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 SSL_SESSION_set1
c7a0: 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f _id_context(SSL_
c7b0: 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 get_session(stat
c7c0: 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73 73 ePtr->ssl), sess
c7d0: 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 ion_id, (unsigne
c7e0: 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 d int) strlen(se
c7f0: 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 ssion_id))) {..
c800: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
c810: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 ult(interp, "Res
c820: 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 22 ume session id "
c830: 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 22 20 , session_id, "
c840: 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a failed", (char *
c850: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 ) NULL);.. Tc
c860: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
c870: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
c880: 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e MPORT", "SESSION
c890: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 ", "FAILED", (ch
c8a0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
c8b0: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
c8c0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
c8d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
c8e0: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a RROR;..}. }..
c8f0: 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70 /* Enable Ap
c900: 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20 plication-Layer
c910: 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 Protocol Negotia
c920: 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61 tion. Examples a
c930: 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68 re: http/1.0,..h
c940: 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c ttp/1.1, h2, h3,
c950: 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33 ftp, imap, pop3
c960: 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78 , xmpp-client, x
c970: 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 74 74 mpp-server, mqtt
c980: 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20 , irc, etc. */.
c990: 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 if (alpn) {..
c9a0: 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c /* Convert a TCL
c9b0: 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f list into a pro
c9c0: 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 tocol-list in wi
c9d0: 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e re-format */..un
c9e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f signed char *pro
c9f0: 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e tos, *p;..unsign
ca00: 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 ed int protos_le
ca10: 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c n = 0;..int i, l
ca20: 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 en, cnt;..Tcl_Ob
ca30: 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 j **list;...if (
ca40: 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c Tcl_ListObjGetEl
ca50: 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 ements(interp, a
ca60: 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 lpn, &cnt, &list
ca70: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
ca80: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
ca90: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
caa0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
cab0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 _ERROR;..}.../*
cac0: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 Determine the me
cad0: 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f mory required fo
cae0: 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c r the protocol-l
caf0: 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d ist */..for (i =
cb00: 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 0; i < cnt; i++
cb10: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 ) {.. Tcl_Get
cb20: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 StringFromObj(li
cb30: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 st[i], &len);..
cb40: 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 if (len > 255
cb50: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 ) {...Tcl_Append
cb60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
cb70: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 ALPN protocol na
cb80: 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 me too long", (c
cb90: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
cba0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
cbb0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
cbc0: 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 "IMPORT", "ALPN"
cbd0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
cbe0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c r *) NULL);...Tl
cbf0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
cc00: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 statePtr);...ret
cc10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
cc20: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f }.. proto
cc30: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e s_len += 1 + len
cc40: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 ;..}.../* Build
cc50: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f the complete pro
cc60: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 tocol-list */..p
cc70: 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 rotos = ckalloc(
cc80: 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a protos_len);../*
cc90: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 protocol-lists
cca0: 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 consist of 8-bit
ccb0: 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 length-prefixed
ccc0: 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a , byte strings *
ccd0: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c 20 70 /..for (i = 0, p
cce0: 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20 63 = protos; i < c
ccf0: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 nt; i++) {..
cd00: 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f char *str = Tcl_
cd10: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
cd20: 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b (list[i], &len);
cd30: 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e .. *p++ = len
cd40: 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c ;.. memcpy(p,
cd50: 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 20 str, len);..
cd60: 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 p += len;..}...
cd70: 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f /* SSL_set_alpn_
cd80: 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 protos makes a c
cd90: 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f opy of the proto
cda0: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 col-list */../*
cdb0: 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 Note: This funct
cdc0: 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 68 ions reverses th
cdd0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 e return value c
cde0: 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 onvention */..if
cdf0: 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 (SSL_set_alpn_p
ce00: 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e rotos(statePtr->
ce10: 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f ssl, protos, pro
ce20: 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 tos_len)) {..
ce30: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
ce40: 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c 65 t(interp, "faile
ce50: 64 20 74 6f 20 73 65 74 20 41 4c 50 4e 20 70 72 d to set ALPN pr
ce60: 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 20 otocols", (char
ce70: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
ce80: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
ce90: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
cea0: 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c IMPORT", "ALPN",
ceb0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
cec0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
ced0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
cee0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
cef0: 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 ckfree(protos)
cf00: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
cf10: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a L_ERROR;..}.../*
cf20: 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 Store protocols
cf30: 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 list */..stateP
cf40: 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f tr->protos = pro
cf50: 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e tos;..statePtr->
cf60: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f protos_len = pro
cf70: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 tos_len;. } e
cf80: 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d lse {..statePtr-
cf90: 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a >protos = NULL;.
cfa0: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
cfb0: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d s_len = 0;. }
cfc0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
cfd0: 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 SSL Callbacks.
cfe0: 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 */. SSL_se
cff0: 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 t_app_data(state
d000: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 Ptr->ssl, (void
d010: 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 *)statePtr);./*
d020: 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 point back to us
d030: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f */. SSL_set_
d040: 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d verify(statePtr-
d050: 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 >ssl, verify, Ve
d060: 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 rifyCallback);.
d070: 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f SSL_set_info_
d080: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 callback(statePt
d090: 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c r->ssl, InfoCall
d0a0: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 back);.. /* C
d0b0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 allback for obse
d0c0: 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d rving protocol m
d0d0: 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 essages */.#ifnd
d0e0: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ef OPENSSL_NO_SS
d0f0: 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 L_TRACE. /* v
d100: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f oid SSL_CTX_set_
d110: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 msg_callback_arg
d120: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
d130: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
d140: 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f );. void SSL_
d150: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c CTX_set_msg_call
d160: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 back(statePtr->c
d170: 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 tx, MessageCallb
d180: 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c ack); */. SSL
d190: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 _set_msg_callbac
d1a0: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e k_arg(statePtr->
d1b0: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ssl, (void *)sta
d1c0: 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f tePtr);. SSL_
d1d0: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b set_msg_callback
d1e0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
d1f0: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 MessageCallback)
d200: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a ;.#endif.. /*
d210: 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e Create Tcl_Chan
d220: 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 nel BIO Handler
d230: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d */. statePtr-
d240: 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 >p_bio.= BIO_new
d250: 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 _tcl(statePtr, B
d260: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 IO_NOCLOSE);.
d270: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d statePtr->bio.=
d280: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 BIO_new(BIO_f_s
d290: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 sl());.. if (
d2a0: 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 server) {../* Se
d2b0: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a rver callbacks *
d2c0: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 /..SSL_CTX_set_t
d2d0: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 lsext_servername
d2e0: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 _arg(statePtr->c
d2f0: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 tx, (void *)stat
d300: 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f ePtr);..SSL_CTX_
d310: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 set_tlsext_serve
d320: 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 rname_callback(s
d330: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e tatePtr->ctx, SN
d340: 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c ICallback);..SSL
d350: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f _CTX_set_client_
d360: 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 hello_cb(statePt
d370: 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c r->ctx, HelloCal
d380: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 lback, (void *)s
d390: 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73 tatePtr);..if (s
d3a0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
d3b0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
d3c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e SSL_CTX_set_alpn
d3d0: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 _select_cb(state
d3e0: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 Ptr->ctx, ALPNCa
d3f0: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 llback, (void *)
d400: 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65 statePtr);.#ifde
d410: 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 f USE_NPN.. i
d420: 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 f (tls1_2 == 0 &
d430: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b & tls1_3 == 0) {
d440: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e ...SSL_CTX_set_n
d450: 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 ext_protos_adver
d460: 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74 tised_cb(statePt
d470: 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 r->ctx, NPNCallb
d480: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ack, (void *)sta
d490: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 tePtr);.. }.#
d4a0: 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e endif..}.../* En
d4b0: 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73 able server to s
d4c0: 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74 end cert request
d4d0: 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65 after handshake
d4e0: 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 (TLS 1.3 only)
d4f0: 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f */../* A write o
d500: 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 peration must ta
d510: 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65 ke place for the
d520: 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71 Certificate Req
d530: 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73 uest to be.. s
d540: 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e ent to the clien
d550: 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64 t, this can be d
d560: 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f one with SSL_do_
d570: 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a handshake(). */.
d580: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 .if (request &&
d590: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 post_handshake &
d5a0: 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 & tls1_3) {..
d5b0: 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 SSL_verify_clie
d5c0: 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b nt_post_handshak
d5d0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
d5e0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 ;..}.../* set au
d5f0: 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65 tomatic curve se
d600: 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f lection */..SSL_
d610: 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 set_ecdh_auto(st
d620: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b atePtr->ssl, 1);
d630: 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72 .../* Set server
d640: 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 mode */..stateP
d650: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 tr->flags |= TLS
d660: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 _TCL_SERVER;..SS
d670: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 L_set_accept_sta
d680: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
d690: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
d6a0: 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 ./* Client callb
d6b0: 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 acks */.#ifdef U
d6c0: 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 SE_NPN..if (stat
d6d0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 ePtr->protos !=
d6e0: 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d NULL && tls1_2 =
d6f0: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d = 0 && tls1_3 ==
d700: 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 0) {.. SSL_C
d710: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 TX_set_next_prot
d720: 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 o_select_cb(stat
d730: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 ePtr->ctx, ALPNC
d740: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a allback, (void *
d750: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 )statePtr);..}.#
d760: 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 endif.../* Sessi
d770: 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 on caching */..S
d780: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 SL_CTX_set_sessi
d790: 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 on_cache_mode(st
d7a0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c atePtr->ctx, SSL
d7b0: 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 _SESS_CACHE_CLIE
d7c0: 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 NT | SSL_SESS_CA
d7d0: 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f CHE_NO_INTERNAL_
d7e0: 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 STORE);..SSL_CTX
d7f0: 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 _sess_set_new_cb
d800: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
d810: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 SessionCallback)
d820: 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f ;.../* Enable po
d830: 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 st handshake Aut
d840: 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 hentication exte
d850: 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f nsion. TLS 1.3 o
d860: 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e nly, not http/2.
d870: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 */..if (request
d880: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 && post_handsha
d890: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 ke) {.. SSL_s
d8a0: 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b et_post_handshak
d8b0: 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d e_auth(statePtr-
d8c0: 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f >ssl, 1);..}.../
d8d0: 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 * Set client mod
d8e0: 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f e */..SSL_set_co
d8f0: 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 nnect_state(stat
d900: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
d910: 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 }. SSL_set_bi
d920: 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c o(statePtr->ssl,
d930: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f statePtr->p_bio
d940: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 , statePtr->p_bi
d950: 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f o);. BIO_set_
d960: 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 ssl(statePtr->bi
d970: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c o, statePtr->ssl
d980: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a , BIO_NOCLOSE);.
d990: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 . /*. * E
d9a0: 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 nd of SSL Init.
d9b0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e */. dprin
d9c0: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 tf("Returning %s
d9d0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
d9e0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
d9f0: 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f self));. Tcl_
da00: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
da10: 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 , (char *) Tcl_G
da20: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
da30: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 atePtr->self), T
da40: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 CL_VOLATILE);..
da50: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
da60: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
da70: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
da80: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
da90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
daa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dac0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 --------. *. * U
dad0: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d nimportObjCmd --
dae0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
daf0: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
db00: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 to remove the t
db10: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 opmost channel f
db20: 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 ilter.. *. * Res
db30: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
db40: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
db50: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
db60: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 ts:. *.May modif
db70: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f y the behavior o
db80: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e f an IO channel.
db90: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
dba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
dbe0: 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 atic int.Unimpor
dbf0: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 tObjCmd(ClientDa
dc00: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
dc10: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
dc20: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
dc30: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
dc40: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 []) {. Tcl_Ch
dc50: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 annel chan;../*
dc60: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 The channel to s
dc70: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f et a mode on. */
dc80: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
dc90: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
dca0: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 (objc != 2) {..
dcb0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
dcc0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
dcd0: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 , "channel");..r
dce0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
dcf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e . }.. chan
dd00: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
dd10: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 l(interp, Tcl_Ge
dd20: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 tString(objv[1])
dd30: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 , NULL);. if
dd40: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
dd50: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
dd60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
dd70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
dd80: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
dd90: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
dda0: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
ddb0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
ddc0: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
ddd0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f );.. if (Tcl_
dde0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
ddf0: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e han) != Tls_Chan
de00: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 nelType()) {..Tc
de10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
de20: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
de30: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
de40: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
de50: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 ),..."\": not a
de60: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 TLS channel", NU
de70: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
de80: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
de90: 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 p, "TLS", "UNIMP
dea0: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c ORT", "CHANNEL",
deb0: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
dec0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
ded0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
dee0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 }.. if (Tc
def0: 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c l_UnstackChannel
df00: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d (interp, chan) =
df10: 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 = TCL_ERROR) {..
df20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
df30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 ;. }.. ret
df40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
df50: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
df60: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Data;.}.../*. *-
df70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
df80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
df90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dfa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dfb0: 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 --. *. * CTX_Ini
dfc0: 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 t -- construct a
dfd0: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 SSL_CTX instanc
dfe0: 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a e. *. * Results:
dff0: 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f . *.A valid SSL_
e000: 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 CTX instance or
e010: 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 NULL.. *. * Side
e020: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e effects:. *.con
e030: 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 structs SSL cont
e040: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d ext (CTX). *. *-
e050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e090: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 --. */.static SS
e0a0: 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 L_CTX *.CTX_Init
e0b0: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 (State *statePtr
e0c0: 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 , int isServer,
e0d0: 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 int proto, char
e0e0: 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a *keyfile, char *
e0f0: 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e certfile,. un
e100: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 signed char *key
e110: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
e120: 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c *cert, int key_l
e130: 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e en, int cert_len
e140: 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 , char *CAdir,.
e150: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c char *CAfile,
e160: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 char *ciphers,
e170: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 char *ciphersuit
e180: 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 es, int level, c
e190: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b har *DHparams) {
e1a0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
e1b0: 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 *interp = stateP
e1c0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
e1d0: 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e SSL_CTX *ctx = N
e1e0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ULL;. Tcl_DSt
e1f0: 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c ring ds;. Tcl
e200: 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 _DString ds1;.
e210: 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 int off = 0;.
e220: 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 int load_priv
e230: 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e ate_key;. con
e240: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d st SSL_METHOD *m
e250: 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 ethod;.. dpri
e260: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
e270: 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 if (!proto)
e280: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
e290: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 ult(interp, "no
e2a0: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 valid protocol s
e2b0: 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b elected", NULL);
e2c0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
e2d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 }.. /* cre
e2e0: 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 ate SSL context
e2f0: 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 */.#if OPENSSL_V
e300: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d ERSION_NUMBER >=
e310: 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 0x10100000L ||
e320: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
e330: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
e340: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
e350: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
e360: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 to, TLS_PROTO_SS
e370: 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 L2)) {..Tcl_Appe
e380: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
e390: 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 "SSL2 protocol
e3a0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
e3b0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
e3c0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
e3d0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
e3e0: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL3) || define
e3f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
e400: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 3). if (ENABL
e410: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
e420: 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 OTO_SSL3)) {..Tc
e430: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
e440: 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f nterp, "SSL3 pro
e450: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
e460: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ted", NULL);..re
e470: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
e480: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
e490: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 ned(NO_TLS1) ||
e4a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
e4b0: 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 NO_TLS1). if
e4c0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
e4d0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 TLS_PROTO_TLS1))
e4e0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
e4f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
e500: 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.0 protocol n
e510: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
e520: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
e530: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
e540: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
e550: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e TLS1_1) || defin
e560: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
e570: 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e S1_1). if (EN
e580: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
e590: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 _PROTO_TLS1_1))
e5a0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
e5b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ult(interp, "TLS
e5c0: 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 1.1 protocol no
e5d0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
e5e0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
e5f0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
e600: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
e610: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
e620: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
e630: 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 1_2). if (ENA
e640: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
e650: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b PROTO_TLS1_2)) {
e660: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
e670: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 lt(interp, "TLS
e680: 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 1.2 protocol not
e690: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
e6a0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
e6b0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ;. }.#endif.#
e6c0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
e6d0: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_3) || defined
e6e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
e6f0: 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 _3). if (ENAB
e700: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
e710: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a ROTO_TLS1_3)) {.
e720: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
e730: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
e740: 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .3 protocol not
e750: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
e760: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
e770: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 . }.#endif.
e780: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 if (proto == 0
e790: 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c ) {../* Use full
e7a0: 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 range */..SSL_C
e7b0: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f TX_set_min_proto
e7c0: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 _version(ctx, 0)
e7d0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d ;..SSL_CTX_set_m
e7e0: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e ax_proto_version
e7f0: 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a (ctx, 0);. }.
e800: 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f . switch (pro
e810: 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 to) {.#if OPENSS
e820: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
e830: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 < 0x10100000L &
e840: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 & !defined(NO_SS
e850: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L2) && !defined(
e860: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
e870: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
e880: 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f OTO_SSL2:..metho
e890: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 d = isServer ? S
e8a0: 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 SLv2_server_meth
e8b0: 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 od() : SSLv2_cli
e8c0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
e8d0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
e8e0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
e8f0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
e900: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 PENSSL_NO_SSL3)
e910: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
e920: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 SSL_NO_SSL3_METH
e930: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 OD). case TLS
e940: 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 _PROTO_SSL3:..me
e950: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
e960: 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d ? SSLv3_server_m
e970: 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f ethod() : SSLv3_
e980: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
e990: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
e9a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
e9b0: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 TLS1) && !define
e9c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
e9d0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
e9e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d PENSSL_NO_TLS1_M
e9f0: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 ETHOD). case
ea00: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a TLS_PROTO_TLS1:.
ea10: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
ea20: 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 er ? TLSv1_serve
ea30: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 r_method() : TLS
ea40: 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 v1_client_method
ea50: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
ea60: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
ea70: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 NO_TLS1_1) && !d
ea80: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
ea90: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 O_TLS1_1) && !de
eaa0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
eab0: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a _TLS1_1_METHOD).
eac0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
ead0: 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 TO_TLS1_1:..meth
eae0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
eaf0: 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d TLSv1_1_server_m
eb00: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f ethod() : TLSv1_
eb10: 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 1_client_method(
eb20: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
eb30: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
eb40: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
eb50: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
eb60: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
eb70: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
eb80: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 TLS1_2_METHOD).
eb90: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
eba0: 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f O_TLS1_2:..metho
ebb0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
ebc0: 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 LSv1_2_server_me
ebd0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 thod() : TLSv1_2
ebe0: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
ebf0: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
ec00: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
ec10: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 _TLS1_3) && !def
ec20: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
ec30: 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 TLS1_3). case
ec40: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
ec50: 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 3:../* Use the g
ec60: 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e eneric method an
ec70: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e d constraint ran
ec80: 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 ge after context
ec90: 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 is created */..
eca0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
ecb0: 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d r ? TLS_server_m
ecc0: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c ethod() : TLS_cl
ecd0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
ece0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 break;.#endif.
ecf0: 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e default:../* N
ed00: 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 egotiate highest
ed10: 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 available SSL/T
ed20: 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d LS version */..m
ed30: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
ed40: 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 ? TLS_server_me
ed50: 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 thod() : TLS_cli
ed60: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 ent_method();.#i
ed70: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
ed80: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
ed90: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 00000L && !defin
eda0: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 ed(NO_SSL2) && !
edb0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
edc0: 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d NO_SSL2)..off |=
edd0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
ede0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 TLS_PROTO_SSL2)
edf0: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f ? 0 : SSL_OP_
ee00: 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 NO_SSLv2);.#endi
ee10: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
ee20: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
ee30: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
ee40: 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e SL3)..off |= (EN
ee50: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
ee60: 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f _PROTO_SSL3) ?
ee70: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 0 : SSL_OP_NO_S
ee80: 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 SLv3);.#endif.#i
ee90: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
eea0: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
eeb0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
eec0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
eed0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
eee0: 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a TO_TLS1) ? 0 :
eef0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
ef00: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
ef10: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
ef20: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
ef30: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
ef40: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
ef50: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
ef60: 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a TO_TLS1_1) ? 0 :
ef70: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
ef80: 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 _1);.#endif.#if
ef90: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
efa0: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _2) && !defined(
efb0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
efc0: 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 2)..off |= (ENAB
efd0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
efe0: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 ROTO_TLS1_2) ? 0
eff0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
f000: 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 v1_2);.#endif.#i
f010: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
f020: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 S1_3) && !define
f030: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
f040: 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 1_3)..off |= (EN
f050: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
f060: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f _PROTO_TLS1_3) ?
f070: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
f080: 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a LSv1_3);.#endif.
f090: 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 .break;. }..
f0a0: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 ERR_clear_err
f0b0: 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d or();.. ctx =
f0c0: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 SSL_CTX_new(met
f0d0: 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63 hod);. if (!c
f0e0: 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 tx) {..return(NU
f0f0: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 LL);. }..
f100: 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 if (getenv(SSLKE
f110: 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 YLOGFILE)) {..SS
f120: 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 L_CTX_set_keylog
f130: 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b _callback(ctx, K
f140: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a eyLogCallback);.
f150: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 }..#if !defi
f160: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 ned(NO_TLS1_3) &
f170: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
f180: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
f190: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 if (proto == T
f1a0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
f1b0: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {..SSL_CTX_set_
f1c0: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f min_proto_versio
f1d0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
f1e0: 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 RSION);..SSL_CTX
f1f0: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 _set_max_proto_v
f200: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
f210: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 _3_VERSION);.
f220: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f }.#endif.. /
f230: 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 * Force cipher s
f240: 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 election order b
f250: 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 y server */.
f260: 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b if (!isServer) {
f270: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 ..SSL_CTX_set_op
f280: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f tions(ctx, SSL_O
f290: 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f P_CIPHER_SERVER_
f2a0: 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 PREFERENCE);.
f2b0: 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f }..#if OPENSSL_
f2c0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
f2d0: 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 0x10100000L.
f2e0: 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c OpenSSL_add_all
f2f0: 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f _algorithms(); /
f300: 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61 * Load ciphers a
f310: 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 nd digests */.#e
f320: 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 ndif.. SSL_CT
f330: 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 X_set_app_data(c
f340: 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 tx, (void*)inter
f350: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 p);./* remember
f360: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 the interpreter
f370: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
f380: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
f390: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 SSL_OP_ALL);./*
f3a0: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b all SSL bug work
f3b0: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 arounds */. S
f3c0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
f3d0: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e ns(ctx, SSL_OP_N
f3e0: 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 O_COMPRESSION);.
f3f0: 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 /* disable compr
f400: 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 ession even if s
f410: 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 upported */.
f420: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
f430: 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 ons(ctx, off);..
f440: 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f /* disable proto
f450: 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a col versions */.
f460: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
f470: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
f480: 30 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 0101000L. SSL
f490: 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 _CTX_set_mode(ct
f4a0: 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f x, SSL_MODE_AUTO
f4b0: 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 _RETRY);./* hand
f4c0: 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 le new handshake
f4d0: 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e s in background.
f4e0: 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69 On by default i
f4f0: 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e n OpenSSL 1.1.1.
f500: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 */.#endif. S
f510: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f SL_CTX_sess_set_
f520: 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 cache_size(ctx,
f530: 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 128);.. /* Se
f540: 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 t user defined c
f550: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 iphers, cipher s
f560: 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 uites, and secur
f570: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 ity level */.
f580: 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d if ((ciphers !=
f590: 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 NULL) && !SSL_C
f5a0: 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 TX_set_cipher_li
f5b0: 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 st(ctx, ciphers)
f5c0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
f5d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
f5e0: 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 et ciphers faile
f5f0: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 d: No valid ciph
f600: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ers", (char *) N
f610: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
f620: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
f630: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 n NULL;. }.
f640: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 75 69 if ((ciphersui
f650: 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 tes != NULL) &&
f660: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 !SSL_CTX_set_cip
f670: 68 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 hersuites(ctx, c
f680: 69 70 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a iphersuites)) {.
f690: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
f6a0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 t(interp, "Set c
f6b0: 69 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69 ipher suites fai
f6c0: 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 led: No valid ci
f6d0: 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 phers", (char *)
f6e0: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
f6f0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
f700: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
f710: 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 . /* Set secu
f720: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 rity level */.
f730: 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 if (level > -1
f740: 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b && level < 6) {
f750: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 ../* SSL_set_sec
f760: 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 urity_level */..
f770: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 SSL_CTX_set_secu
f780: 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 rity_level(ctx,
f790: 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 level);. }..
f7a0: 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 /* set some c
f7b0: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 allbacks */.
f7c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 SSL_CTX_set_defa
f7d0: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 ult_passwd_cb(ct
f7e0: 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 x, PasswordCallb
f7f0: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 ack);. SSL_CT
f800: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 X_set_default_pa
f810: 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 sswd_cb_userdata
f820: 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 (ctx, (void *)st
f830: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a atePtr);.. /*
f840: 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 read a Diffie-H
f850: 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 ellman parameter
f860: 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 s file, or use t
f870: 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 he built-in one
f880: 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 */.#ifdef OPENSS
f890: 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 L_NO_DH. if (
f8a0: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c DHparams != NULL
f8b0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
f8c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 esult(interp, "D
f8d0: 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 H parameter supp
f8e0: 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c ort not availabl
f8f0: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c e", (char *) NUL
f900: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
f910: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
f920: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 NULL;. }.#els
f930: 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b e. {..DH* dh;
f940: 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 ..if (DHparams !
f950: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 = NULL) {.. B
f960: 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 IO *bio;.. Tc
f970: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 l_DStringInit(&d
f980: 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 s);.. bio = B
f990: 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 IO_new_file(F2N(
f9a0: 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 DHparams, &ds),
f9b0: 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 "r");.. if (!
f9c0: 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 bio) {...Tcl_DSt
f9d0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
f9e0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
f9f0: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 t(interp, "Could
fa00: 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 not find DH par
fa10: 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 ameters file", (
fa20: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
fa30: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
fa40: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c x);...return NUL
fa50: 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 L;.. }...
fa60: 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 dh = PEM_read_bi
fa70: 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 o_DHparams(bio,
fa80: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c NULL, NULL, NULL
fa90: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 );.. BIO_free
faa0: 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f (bio);.. Tcl_
fab0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
fac0: 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20 ;.. if (!dh)
fad0: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {...Tcl_AppendRe
fae0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f sult(interp, "Co
faf0: 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 uld not read DH
fb00: 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 parameters from
fb10: 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 file", (char *)
fb20: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
fb30: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 _free(ctx);...re
fb40: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
fb50: 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 }..} else {..
fb60: 20 64 68 20 3d 20 67 65 74 5f 64 68 50 61 72 61 dh = get_dhPara
fb70: 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54 ms();..}..SSL_CT
fb80: 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 X_set_tmp_dh(ctx
fb90: 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 65 28 , dh);..DH_free(
fba0: 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 dh);. }.#endi
fbb0: 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 f.. /* set ou
fbc0: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f r certificate */
fbd0: 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 . load_privat
fbe0: 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 e_key = 0;. i
fbf0: 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e f (certfile != N
fc00: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 ULL) {..load_pri
fc10: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 vate_key = 1;...
fc20: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
fc30: 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f &ds);...if (SSL_
fc40: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
fc50: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 ate_file(ctx, F2
fc60: 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 N(certfile, &ds)
fc70: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 , SSL_FILETYPE_P
fc80: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 EM) <= 0) {..
fc90: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
fca0: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f (&ds);.. Tcl_
fcb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
fcc0: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
fcd0: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 set certificate
fce0: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 file ", certfile
fcf0: 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 , ": ",....
fd00: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
fd10: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
fd20: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
fd30: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
fd40: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 LL;..}. } els
fd50: 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 e if (cert != NU
fd60: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 LL) {..load_priv
fd70: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 ate_key = 1;..if
fd80: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 (SSL_CTX_use_ce
fd90: 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 rtificate_ASN1(c
fda0: 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 tx, cert_len, ce
fdb0: 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 rt) <= 0) {..
fdc0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
fdd0: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f (&ds);.. Tcl_
fde0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
fdf0: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
fe00: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a set certificate:
fe10: 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 ",.... REAS
fe20: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
fe30: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
fe40: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
fe50: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
fe60: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a .}. } else {.
fe70: 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 .certfile = (cha
fe80: 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 r*)X509_get_defa
fe90: 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b ult_cert_file();
fea0: 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 ...if (SSL_CTX_u
feb0: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 se_certificate_f
fec0: 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c ile(ctx, certfil
fed0: 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f e, SSL_FILETYPE_
fee0: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 PEM) <= 0) {.#if
fef0: 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 0.. Tcl_DStr
ff00: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
ff10: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
ff20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
ff30: 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 ble to use defau
ff40: 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 lt certificate f
ff50: 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c ile ", certfile,
ff60: 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 ": ",.... R
ff70: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
ff80: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 ) NULL);.. SS
ff90: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
ffa0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c .. return NUL
ffb0: 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 L;.#endif..}.
ffc0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f }.. /* set o
ffd0: 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a ur private key *
ffe0: 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 /. if (load_p
fff0: 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 rivate_key) {..i
10000 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 f (keyfile == NU
10010 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c LL && key == NUL
10020 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c L) {.. keyfil
10030 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d e = certfile;..}
10040 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 ...if (keyfile !
10050 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f = NULL) {.. /
10060 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74 * get the privat
10070 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 e key associated
10080 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69 with this certi
10090 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 ficate */.. i
100a0 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 f (keyfile == NU
100b0 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 LL) {...keyfile
100c0 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 = certfile;..
100d0 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c }... if (SSL
100e0 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 _CTX_use_Private
100f0 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 Key_file(ctx, F2
10100 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c N(keyfile, &ds),
10110 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 SSL_FILETYPE_PE
10120 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c M) <= 0) {...Tcl
10130 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
10140 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 );.../* flush th
10150 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 e passphrase whi
10160 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 ch might be left
10170 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a in the result *
10180 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c /...Tcl_SetResul
10190 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 t(interp, NULL,
101a0 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 TCL_STATIC);...T
101b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
101c0 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
101d0 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 to set public ke
101e0 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c y file ", keyfil
101f0 65 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20 e, " ",....
10200 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 REASON(), (c
10210 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
10220 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
10230 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c );...return NULL
10240 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 ;.. }.. Tc
10250 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
10260 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 s);...} else if
10270 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (key != NULL) {.
10280 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 . if (SSL_CTX
10290 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f _use_PrivateKey_
102a0 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 ASN1(EVP_PKEY_RS
102b0 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f A, ctx, key,key_
102c0 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 len) <= 0) {...T
102d0 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
102e0 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 ds);.../* flush
102f0 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 the passphrase w
10300 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 hich might be le
10310 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 ft in the result
10320 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 */...Tcl_SetRes
10330 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c ult(interp, NULL
10340 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 , TCL_STATIC);..
10350 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
10360 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
10370 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 e to set public
10380 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 key: ", REASON()
10390 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
103a0 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
103b0 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
103c0 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a NULL;.. }..}.
103d0 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 ./* Now we know
103e0 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 that a key and c
103f0 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 ert have been se
10400 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 t against.. * th
10410 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f e SSL context */
10420 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 ..if (!SSL_CTX_c
10430 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 heck_private_key
10440 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 (ctx)) {.. Tc
10450 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
10460 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 nterp, "private
10470 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 key does not mat
10480 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 ch the certifica
10490 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a te public key",.
104a0 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 ... (char *)
104b0 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c NULL);.. SSL
104c0 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
104d0 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c . return NULL
104e0 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
104f0 2f 2a 20 53 65 74 20 76 65 72 69 66 69 63 61 74 /* Set verificat
10500 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20 54 ion CAs */. T
10510 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
10520 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ds);. Tcl_DSt
10530 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a ringInit(&ds1);.
10540 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 /* There is
10550 6f 6e 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 one default dire
10560 63 74 6f 72 79 2c 20 6f 6e 65 20 64 65 66 61 75 ctory, one defau
10570 6c 74 20 66 69 6c 65 2c 20 61 6e 64 20 6f 6e 65 lt file, and one
10580 20 64 65 66 61 75 6c 74 20 73 74 6f 72 65 2e 0a default store..
10590 09 54 68 65 20 64 65 66 61 75 6c 74 20 43 41 20 .The default CA
105a0 63 65 72 74 69 66 69 63 61 74 65 73 20 64 69 72 certificates dir
105b0 65 63 74 6f 72 79 20 28 61 6e 64 20 64 65 66 61 ectory (and defa
105c0 75 6c 74 20 73 74 6f 72 65 29 20 69 73 20 69 6e ult store) is in
105d0 20 74 68 65 20 4f 70 65 6e 53 53 4c 0a 09 63 65 the OpenSSL..ce
105e0 72 74 73 20 64 69 72 65 63 74 6f 72 79 2e 20 49 rts directory. I
105f0 74 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 t can be overrid
10600 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 den by the SSL_C
10610 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e ERT_DIR env var.
10620 20 54 68 65 0a 09 64 65 66 61 75 6c 74 20 43 41 The..default CA
10630 20 63 65 72 74 69 66 69 63 61 74 65 73 20 66 69 certificates fi
10640 6c 65 20 69 73 20 63 61 6c 6c 65 64 20 63 65 72 le is called cer
10650 74 2e 70 65 6d 20 69 6e 20 74 68 65 20 64 65 66 t.pem in the def
10660 61 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 09 64 69 ault OpenSSL..di
10670 72 65 63 74 6f 72 79 2e 20 49 74 20 63 61 6e 20 rectory. It can
10680 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 be overridden by
10690 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 the SSL_CERT_FI
106a0 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 09 LE env var. */..
106b0 2f 2a 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73 /* int SSL_CTX_s
106c0 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 et_default_verif
106d0 79 5f 64 69 72 28 53 53 4c 5f 43 54 58 20 2a 63 y_dir(SSL_CTX *c
106e0 74 78 29 20 61 6e 64 20 69 6e 74 20 53 53 4c 5f tx) and int SSL_
106f0 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
10700 76 65 72 69 66 79 5f 66 69 6c 65 28 53 53 4c 5f verify_file(SSL_
10710 43 54 58 20 2a 63 74 78 29 20 2a 2f 0a 20 20 20 CTX *ctx) */.
10720 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f if (!SSL_CTX_lo
10730 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 ad_verify_locati
10740 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 ons(ctx, F2N(CAf
10750 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 ile, &ds), F2N(C
10760 41 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a Adir, &ds1)) ||.
10770 09 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 .!SSL_CTX_set_de
10780 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 fault_verify_pat
10790 68 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 hs(ctx)) {.#if 0
107a0 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
107b0 65 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 e(&ds);..Tcl_DSt
107c0 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a ringFree(&ds1);.
107d0 09 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e ./* Don't curren
107e0 74 6c 79 20 63 61 72 65 20 69 66 20 74 68 69 73 tly care if this
107f0 20 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 fails */..Tcl_A
10800 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
10810 72 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 rp, "SSL default
10820 20 76 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 verify paths: "
10830 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 , REASON(), (cha
10840 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c r *) NULL);..SSL
10850 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
10860 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 .return NULL;.#e
10870 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ndif. }..
10880 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 /* https://sourc
10890 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 eforge.net/p/tls
108a0 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 20 20 /bugs/57/ */.
108b0 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 /* XXX:TODO: Le
108c0 74 20 74 68 65 20 75 73 65 72 20 73 75 70 70 6c t the user suppl
108d0 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 69 6e y values here in
108e0 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 stead of somethi
108f0 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 20 6f ng that exists o
10900 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d n the filesystem
10910 20 2a 2f 0a 20 20 20 20 69 66 20 28 43 41 66 69 */. if (CAfi
10920 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 53 le != NULL) {..S
10930 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d TACK_OF(X509_NAM
10940 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 E) *certNames =
10950 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f SSL_load_client_
10960 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 CA_file(F2N(CAfi
10970 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69 66 20 28 le, &ds));..if (
10980 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c certNames != NUL
10990 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 L) {.. SSL_CT
109a0 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f X_set_client_CA_
109b0 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 list(ctx, certNa
109c0 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a mes);..}. }..
109d0 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
109e0 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 54 63 ree(&ds);. Tc
109f0 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
10a00 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 s1);. return
10a10 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ctx;.}.../*. *--
10a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a60 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 -. *. * StatusOb
10a70 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 jCmd -- return c
10a80 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 63 ertificate for c
10a90 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a 20 onnected peer..
10aa0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
10ab0 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
10ac0 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
10ad0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
10ae0 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
10af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
10b30 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74 61 /.static int.Sta
10b40 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 tusObjCmd(Client
10b50 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
10b60 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
10b70 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
10b80 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
10b90 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 74 jv[]) {. Stat
10ba0 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 e *statePtr;.
10bb0 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 X509 *peer;.
10bc0 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 Tcl_Obj *objPtr
10bd0 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 ;. Tcl_Channe
10be0 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 l chan;. char
10bf0 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a *channelName, *
10c00 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 ciphers;. int
10c10 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 mode;. const
10c20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
10c30 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 proto;. unsig
10c40 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 ned int len;.
10c50 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a 0a int nid, res;..
10c60 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
10c70 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
10c80 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 objc < 2 || objc
10c90 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d > 3 || (objc ==
10ca0 20 33 20 26 26 20 21 73 74 72 63 6d 70 28 54 63 3 && !strcmp(Tc
10cb0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
10cc0 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 [1]), "-local"))
10cd0 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
10ce0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
10cf0 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f objv, "?-local?
10d00 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 channel");..ret
10d10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
10d20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 }.. /* Get
10d30 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 channel Id */.
10d40 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d channelName =
10d50 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
10d60 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 28 6f 62 6a 63 omObj(objv[(objc
10d70 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d 2c == 2 ? 1 : 2)],
10d80 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 63 68 61 6e NULL);. chan
10d90 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
10da0 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 l(interp, channe
10db0 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 lName, &mode);.
10dc0 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
10dd0 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
10de0 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
10df0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
10e00 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
10e10 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
10e20 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
10e30 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 l */. chan =
10e40 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
10e50 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 l(chan);. if
10e60 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
10e70 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 ype(chan) != Tls
10e80 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 _ChannelType())
10e90 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
10ea0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
10eb0 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
10ec0 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
10ed0 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e (chan),..."\": n
10ee0 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
10ef0 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 ", NULL);..Tcl_S
10f00 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
10f10 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 rp, "TLS", "STAT
10f20 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 US", "CHANNEL",
10f30 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 "INVALID", (char
10f40 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
10f50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
10f60 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 }. statePtr
10f70 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c = (State *) Tcl
10f80 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
10f90 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a nceData(chan);..
10fa0 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 /* Get certi
10fb0 66 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 ficate for peer
10fc0 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 or self */. i
10fd0 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a f (objc == 2) {.
10fe0 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f .peer = SSL_get_
10ff0 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 peer_certificate
11000 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
11010 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 . } else {..p
11020 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 eer = SSL_get_ce
11030 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 rtificate(stateP
11040 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a tr->ssl);. }.
11050 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20 /* Get X509
11060 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f certificate info
11070 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72 */. if (peer
11080 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c ) {..objPtr = Tl
11090 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 s_NewX509Obj(int
110a0 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 erp, peer);..if
110b0 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 (objc == 2) {..
110c0 20 20 20 58 35 30 39 5f 66 72 65 65 28 70 65 65 X509_free(pee
110d0 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20 3d 20 r);.. peer =
110e0 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 NULL;..}. } e
110f0 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 lse {..objPtr =
11100 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
11110 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a , NULL);. }..
11120 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 /* Peer name
11130 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f */. LAPPEND_
11140 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11150 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c 20 tr, "peername",
11160 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d SSL_get0_peernam
11170 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
11180 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 , -1);. LAPPE
11190 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
111a0 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22 2c 20 bjPtr, "sbits",
111b0 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 SSL_get_cipher_b
111c0 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 its(statePtr->ss
111d0 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 l, NULL));..
111e0 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a ciphers = (char*
111f0 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 )SSL_get_cipher(
11200 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
11210 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
11220 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11230 22 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 "cipher", cipher
11240 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 s, -1);.. /*
11250 56 65 72 69 66 79 20 74 68 65 20 58 35 30 39 20 Verify the X509
11260 63 65 72 74 69 66 69 63 61 74 65 20 70 72 65 73 certificate pres
11270 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 65 ented by the pee
11280 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 r */. LAPPEND
11290 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
112a0 50 74 72 2c 20 22 76 65 72 69 66 79 52 65 73 75 Ptr, "verifyResu
112b0 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 69 66 lt",..X509_verif
112c0 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 y_cert_error_str
112d0 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 ing(SSL_get_veri
112e0 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 fy_result(stateP
112f0 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a tr->ssl)), -1);.
11300 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d . /* Verify m
11310 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 ode */. mode
11320 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 = SSL_get_verify
11330 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e _mode(statePtr->
11340 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f ssl);. if (mo
11350 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 de && SSL_VERIFY
11360 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e _NONE) {..LAPPEN
11370 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
11380 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 jPtr, "verifyMod
11390 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b e", "none", -1);
113a0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 . } else {..T
113b0 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 cl_Obj *listObjP
113c0 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 tr = Tcl_NewList
113d0 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 Obj(0, NULL);..i
113e0 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 f (mode && SSL_V
113f0 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 ERIFY_PEER) {..
11400 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
11410 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
11420 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 rp, listObjPtr,
11430 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
11440 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 ("peer", -1));..
11450 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 }..if (mode && S
11460 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 SL_VERIFY_FAIL_I
11470 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 F_NO_PEER_CERT)
11480 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
11490 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
114a0 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 interp, listObjP
114b0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
114c0 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f gObj("fail if no
114d0 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31 29 peer cert", -1)
114e0 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 );..}..if (mode
114f0 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c && SSL_VERIFY_CL
11500 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 IENT_ONCE) {..
11510 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
11520 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
11530 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 p, listObjPtr, T
11540 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
11550 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d "client once", -
11560 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 1));..}..if (mod
11570 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f e && SSL_VERIFY_
11580 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 POST_HANDSHAKE)
11590 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
115a0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
115b0 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 interp, listObjP
115c0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
115d0 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 gObj("post hands
115e0 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a hake", -1));..}.
115f0 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 .LAPPEND_OBJ(int
11600 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 erp, objPtr, "ve
11610 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f rifyMode", listO
11620 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20 bjPtr). }..
11630 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 /* Verify mode
11640 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41 depth */. LA
11650 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
11660 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 , objPtr, "verif
11670 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 65 74 yDepth", SSL_get
11680 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 73 74 _verify_depth(st
11690 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a atePtr->ssl));..
116a0 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 /* Report th
116b0 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
116c0 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
116d0 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 of the negotiati
116e0 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 on */. SSL_ge
116f0 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 t0_alpn_selected
11700 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
11710 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 &proto, &len);.
11720 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
11730 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11740 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 alpn", (char *)p
11750 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 29 roto, (int) len)
11760 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 ;. LAPPEND_ST
11770 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11780 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 , "protocol", SS
11790 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 L_get_version(st
117a0 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 atePtr->ssl), -1
117b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 );.. /* Valid
117c0 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 for non-RSA sig
117d0 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 nature and TLS 1
117e0 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 .3 */. if (ob
117f0 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 jc == 2) {..res
11800 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 = SSL_get_peer_s
11810 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 ignature_nid(sta
11820 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 tePtr->ssl, &nid
11830 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
11840 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 .res = SSL_get_s
11850 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 ignature_nid(sta
11860 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 tePtr->ssl, &nid
11870 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 );. }. if
11880 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b (!res) {nid = 0;
11890 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 }. LAPPEND_ST
118a0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
118b0 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 , "signatureHash
118c0 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f Algorithm", OBJ_
118d0 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 nid2ln(nid), -1)
118e0 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
118f0 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 2) {..res = S
11900 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e SL_get_peer_sign
11910 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 ature_type_nid(s
11920 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e tatePtr->ssl, &n
11930 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 id);. } else
11940 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 {..res = SSL_get
11950 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f _signature_type_
11960 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
11970 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a l, &nid);. }.
11980 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e if (!res) {n
11990 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 id = 0;}. LAP
119a0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
119b0 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 objPtr, "signat
119c0 75 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 ureType", OBJ_ni
119d0 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a d2ln(nid), -1);.
119e0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
119f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
11a00 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 jPtr);. retur
11a10 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e n TCL_OK;..clien
11a20 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 tData = clientDa
11a30 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ta;.}.../*. *---
11a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a80 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f . *. * Connectio
11a90 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 nInfoObjCmd -- r
11aa0 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e eturn connection
11ab0 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 info from OpenS
11ac0 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 SL.. *. * Result
11ad0 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 s:. *.A list of
11ae0 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a connection info.
11af0 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *----------
11b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
11b40 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 tatic int Connec
11b50 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 tionInfoObjCmd(C
11b60 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
11b70 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
11b80 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
11b90 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
11ba0 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
11bb0 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
11bc0 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e n;../* The chann
11bd0 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 el to set a mode
11be0 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 on */. State
11bf0 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 *statePtr;../*
11c00 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 client state for
11c10 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 ssl socket */.
11c20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
11c30 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 tr, *listPtr;.
11c40 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c const SSL *ssl
11c50 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f ;. const SSL_
11c60 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a CIPHER *cipher;.
11c70 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 const SSL_SE
11c80 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a SSION *session;.
11c90 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 const EVP_MD
11ca0 20 2a 6d 64 3b 0a 0a 20 20 20 20 69 66 20 28 6f *md;.. if (o
11cb0 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
11cc0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
11cd0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
11ce0 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
11cf0 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
11d00 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d }.. chan =
11d10 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
11d20 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
11d30 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
11d40 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c v[1], NULL), NUL
11d50 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e L);. if (chan
11d60 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
11d70 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
11d80 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
11d90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
11da0 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
11db0 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
11dc0 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
11dd0 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
11de0 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 Channel(chan);.
11df0 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
11e00 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
11e10 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
11e20 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
11e30 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
11e40 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
11e50 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
11e60 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 elName(chan),..
11e70 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c "\": not a TL
11e80 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c S channel", NULL
11e90 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 );..Tcl_SetError
11ea0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
11eb0 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 S", "CONNECTION"
11ec0 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e , "CHANNEL", "IN
11ed0 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 VALID", (char *)
11ee0 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 NULL);..return(
11ef0 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
11f00 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 }.. objPtr =
11f10 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
11f20 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a , NULL);.. /*
11f30 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f Connection info
11f40 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
11f50 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f = (State *)Tcl_
11f60 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
11f70 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 ceData(chan);.
11f80 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74 72 ssl = statePtr
11f90 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 ->ssl;. if (s
11fa0 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f sl != NULL) {../
11fb0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 * connection sta
11fc0 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 te */..LAPPEND_S
11fd0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11fe0 72 2c 20 22 73 74 61 74 65 22 2c 20 53 53 4c 5f r, "state", SSL_
11ff0 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e state_string_lon
12000 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f g(ssl), -1);.../
12010 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 65 73 * Get SNI reques
12020 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 ted server name
12030 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
12040 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12050 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 53 53 "servername", SS
12060 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 L_get_servername
12070 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d (ssl, TLSEXT_NAM
12080 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 ETYPE_host_name)
12090 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 , -1);.../* Get
120a0 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 protocol */..LAP
120b0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
120c0 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 objPtr, "protoc
120d0 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 ol", SSL_get_ver
120e0 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a sion(ssl), -1);.
120f0 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 ../* Renegotiati
12100 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c on allowed */..L
12110 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
12120 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e rp, objPtr, "ren
12130 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 egotiation_allow
12140 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 ed", SSL_get_sec
12150 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f ure_renegotiatio
12160 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 29 3b n_support(ssl));
12170 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 .../* Get securi
12180 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 ty level */..LAP
12190 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
121a0 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 72 69 objPtr, "securi
121b0 74 79 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 tylevel", SSL_ge
121c0 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c t_security_level
121d0 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 (ssl));.../* Ses
121e0 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 sion info */..LA
121f0 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
12200 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 p, objPtr, "sess
12210 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c ion_reused", SSL
12220 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 _session_reused(
12230 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 ssl));.../* Is s
12240 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c erver info */..L
12250 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
12260 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f rp, objPtr, "is_
12270 73 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f server", SSL_is_
12280 73 65 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 server(ssl));...
12290 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c /* Is DTLS */..L
122a0 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
122b0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f rp, objPtr, "is_
122c0 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 dtls", SSL_is_dt
122d0 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a ls(ssl));. }.
122e0 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 . /* Cipher i
122f0 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 nfo */. ciphe
12300 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 r = SSL_get_curr
12310 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b ent_cipher(ssl);
12320 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 20 . if (cipher
12330 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 != NULL) {..char
12340 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b buf[BUFSIZ] = {
12350 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 0};..int bits, a
12360 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 lg_bits;.../* Ci
12370 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 pher name */..LA
12380 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12390 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 , objPtr, "ciphe
123a0 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 r", SSL_CIPHER_g
123b0 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c et_name(cipher),
123c0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e -1);.../* RFC n
123d0 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f ame of cipher */
123e0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
123f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
12400 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 tandard_name", S
12410 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 SL_CIPHER_standa
12420 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c rd_name(cipher),
12430 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 -1);.../* OpenS
12440 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 SL name of ciphe
12450 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 r */..LAPPEND_ST
12460 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
12470 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 , "openssl_name"
12480 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 , OPENSSL_cipher
12490 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 _name(SSL_CIPHER
124a0 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 _standard_name(c
124b0 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 ipher)), -1);...
124c0 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 /* number of sec
124d0 72 65 74 20 62 69 74 73 20 75 73 65 64 20 66 6f ret bits used fo
124e0 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 r cipher */..bit
124f0 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 s = SSL_CIPHER_g
12500 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 et_bits(cipher,
12510 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 &alg_bits);..LAP
12520 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
12530 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74 objPtr, "secret
12540 5f 62 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 _bits", bits);..
12550 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
12560 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 rp, objPtr, "alg
12570 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c orithm_bits", al
12580 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 g_bits);../* alg
12590 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 _bits is actual
125a0 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e key secret bits.
125b0 20 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 If use bits and
125c0 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 secret (algorit
125d0 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c hm) bits differ,
125e0 0a 09 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 .. the rest of
125f0 20 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69 the bits are fi
12600 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 xed, i.e. for li
12610 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 mited export cip
12620 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 hers (bits < 56)
12630 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 */.../* Indicat
12640 65 73 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 es which SSL/TLS
12650 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f protocol versio
12660 6e 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 n first defined
12670 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c the cipher */..L
12680 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
12690 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f p, objPtr, "min_
126a0 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 version", SSL_CI
126b0 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e PHER_get_version
126c0 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a (cipher), -1);..
126d0 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 20 2a ./* Cipher NID *
126e0 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
126f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12700 63 69 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61 cipherNID", (cha
12710 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 r *)OBJ_nid2ln(S
12720 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69 SL_CIPHER_get_ci
12730 70 68 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29 pher_nid(cipher)
12740 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 ), -1);..LAPPEND
12750 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12760 50 74 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22 Ptr, "digestNID"
12770 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 , (char *)OBJ_ni
12780 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f d2ln(SSL_CIPHER_
12790 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 get_digest_nid(c
127a0 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c ipher)), -1);..L
127b0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
127c0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 p, objPtr, "keyE
127d0 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 xchangeNID", (ch
127e0 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 ar *)OBJ_nid2ln(
127f0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b SSL_CIPHER_get_k
12800 78 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 x_nid(cipher)),
12810 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 -1);..LAPPEND_ST
12820 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
12830 2c 20 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f , "authenticatio
12840 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f nNID", (char *)O
12850 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 BJ_nid2ln(SSL_CI
12860 50 48 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 PHER_get_auth_ni
12870 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b d(cipher)), -1);
12880 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 .../* message au
12890 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 thentication cod
128a0 65 20 2d 20 43 69 70 68 65 72 20 69 73 20 41 45 e - Cipher is AE
128b0 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 AD (e.g. GCM or
128c0 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 ChaCha20/Poly130
128d0 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 5) or not */../*
128e0 20 41 75 74 68 65 6e 74 69 63 61 74 65 64 20 45 Authenticated E
128f0 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61 ncryption with a
12900 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 20 28 ssociated data (
12910 41 45 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 AEAD) check */..
12920 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
12930 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 erp, objPtr, "ci
12940 70 68 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 pher_is_aead", S
12950 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61 SL_CIPHER_is_aea
12960 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a d(cipher));.../*
12970 20 44 69 67 65 73 74 20 75 73 65 64 20 64 75 72 Digest used dur
12980 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 ing the SSL/TLS
12990 68 61 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75 handshake when u
129a0 73 69 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e sing the cipher.
129b0 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 */..md = SSL_CI
129c0 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 PHER_get_handsha
129d0 6b 65 5f 64 69 67 65 73 74 28 63 69 70 68 65 72 ke_digest(cipher
129e0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
129f0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12a00 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 "handshake_diges
12a10 74 22 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f t", (char *)EVP_
12a20 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 MD_name(md), -1)
12a30 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 ;.../* Get OpenS
12a40 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 SL-specific ID,
12a50 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 not IANA ID */..
12a60 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
12a70 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 rp, objPtr, "cip
12a80 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 her_id", (int) S
12a90 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 SL_CIPHER_get_id
12aa0 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 (cipher));.../*
12ab0 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64 Two-byte ID used
12ac0 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74 in the TLS prot
12ad0 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65 ocol of the give
12ae0 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 n cipher */..LAP
12af0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
12b00 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 objPtr, "protoc
12b10 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 ol_id", (int) SS
12b20 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f L_CIPHER_get_pro
12b30 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 tocol_id(cipher)
12b40 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 );.../* Textual
12b50 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 description of t
12b60 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 69 66 he cipher */..if
12b70 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 (SSL_CIPHER_des
12b80 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c cription(cipher,
12b90 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 buf, sizeof(buf
12ba0 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 )) != NULL) {..
12bb0 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
12bc0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12bd0 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 description", bu
12be0 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d f, -1);..}. }
12bf0 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e .. /* Session
12c00 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 info */. ses
12c10 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 sion = SSL_get_s
12c20 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 ession(ssl);.
12c30 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 if (session !=
12c40 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 NULL) {..const u
12c50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 nsigned char *ti
12c60 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 cket;..size_t le
12c70 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e n2;..unsigned in
12c80 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 t ulen;..const u
12c90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 nsigned char *se
12ca0 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f ssion_id, *proto
12cb0 3b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b 53 ;..char buffer[S
12cc0 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 SL_MAX_MASTER_KE
12cd0 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 Y_LENGTH];.../*
12ce0 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 Report the selec
12cf0 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 ted protocol as
12d00 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 a result of the
12d10 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e ALPN negotiation
12d20 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e */..SSL_SESSION
12d30 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 _get0_alpn_selec
12d40 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 ted(session, &pr
12d50 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 oto, &len2);..LA
12d60 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12d70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 , objPtr, "alpn"
12d80 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f , (char *) proto
12d90 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a , (int) len2);..
12da0 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 ./* Report the s
12db0 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
12dc0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 as a result of
12dd0 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 the NPN negotiat
12de0 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 ion */.#ifdef US
12df0 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f E_NPN..SSL_get0_
12e00 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 next_proto_negot
12e10 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 iated(ssl, &prot
12e20 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 o, &ulen);..LAPP
12e30 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
12e40 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 objPtr, "npn", (
12e50 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 char *) proto, (
12e60 69 6e 74 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 int) ulen);.#end
12e70 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c if.../* Resumabl
12e80 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 e session */..LA
12e90 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
12ea0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 p, objPtr, "resu
12eb0 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 mable", SSL_SESS
12ec0 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 ION_is_resumable
12ed0 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a (session));.../*
12ee0 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 Session start t
12ef0 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e ime (seconds sin
12f00 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 ce epoch) */..LA
12f10 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 PPEND_LONG(inter
12f20 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 p, objPtr, "star
12f30 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 t_time", SSL_SES
12f40 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 SION_get_time(se
12f50 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 ssion));.../* Ti
12f60 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 meout value - SS
12f70 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 L_CTX_get_timeou
12f80 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a t (in seconds) *
12f90 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 /..LAPPEND_LONG(
12fa0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12fb0 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 "timeout", SSL_S
12fc0 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f ESSION_get_timeo
12fd0 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 ut(session));...
12fe0 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 /* Session id -
12ff0 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f TLSv1.2 and belo
13000 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 w only */..sessi
13010 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 on_id = SSL_SESS
13020 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 ION_get_id(sessi
13030 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 on, &ulen);..LAP
13040 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 PEND_BARRAY(inte
13050 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 rp, objPtr, "ses
13060 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f sion_id", sessio
13070 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e n_id, (int) ulen
13080 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
13090 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 context */..sess
130a0 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 ion_id = SSL_SES
130b0 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e SION_get0_id_con
130c0 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 text(session, &u
130d0 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 len);..LAPPEND_B
130e0 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 ARRAY(interp, ob
130f0 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 jPtr, "session_c
13100 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 69 6f 6e ontext", session
13110 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 _id, (int) ulen)
13120 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 ;.../* Session t
13130 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f icket - client o
13140 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 nly */..SSL_SESS
13150 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 ION_get0_ticket(
13160 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 session, &ticket
13170 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 , &len2);..LAPPE
13180 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 ND_BARRAY(interp
13190 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 , objPtr, "sessi
131a0 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 63 6b on_ticket", tick
131b0 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 3b et, (int) len2);
131c0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 .../* Session ti
131d0 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69 cket lifetime hi
131e0 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 nt (in seconds)
131f0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 */..LAPPEND_LONG
13200 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
13210 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 53 4c "lifetime", SSL
13220 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 _SESSION_get_tic
13230 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e ket_lifetime_hin
13240 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f t(session));.../
13250 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74 * Ticket app dat
13260 61 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f a */..SSL_SESSIO
13270 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 N_get0_ticket_ap
13280 70 64 61 74 61 28 73 65 73 73 69 6f 6e 2c 20 26 pdata(session, &
13290 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a ticket, &len2);.
132a0 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
132b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
132c0 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 "ticket_app_data
132d0 22 2c 20 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 ", ticket, (int)
132e0 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 47 65 74 len2);.../* Get
132f0 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 master key */..
13300 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 len2 = SSL_SESSI
13310 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 ON_get_master_ke
13320 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 y(session, buffe
13330 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 r, SSL_MAX_MASTE
13340 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 R_KEY_LENGTH);..
13350 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 LAPPEND_BARRAY(i
13360 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
13370 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 75 66 master_key", buf
13380 66 65 72 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 fer, (int) len2)
13390 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69 ;.../* Compressi
133a0 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e on id */..unsign
133b0 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f ed int id = SSL_
133c0 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 SESSION_get_comp
133d0 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e 29 ress_id(session)
133e0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
133f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
13400 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c compression_id",
13410 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 id == 1 ? "zlib
13420 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b " : "none", -1);
13430 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
13440 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 ompression info
13450 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 */. if (ssl !
13460 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 = NULL) {.#ifdef
13470 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 HAVE_SSL_COMPRE
13480 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d SSION..const COM
13490 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 P_METHOD *comp,
134a0 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 *expn;..comp = S
134b0 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 SL_get_current_c
134c0 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b ompression(ssl);
134d0 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 ..expn = SSL_get
134e0 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 _current_expansi
134f0 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 on(ssl);...LAPPE
13500 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
13510 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 bjPtr, "compress
13520 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c ion", comp ? SSL
13530 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 _COMP_get_name(c
13540 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d omp) : "none", -
13550 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 1);..LAPPEND_STR
13560 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
13570 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78 "expansion", ex
13580 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 pn ? SSL_COMP_ge
13590 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 t_name(expn) : "
135a0 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 none", -1);.#els
135b0 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 e..LAPPEND_STR(i
135c0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
135d0 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e compression", "n
135e0 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 one", -1);..LAPP
135f0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
13600 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 objPtr, "expansi
13610 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 on", "none", -1)
13620 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a ;.#endif. }..
13630 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e /* Server in
13640 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e fo */. {..lon
13650 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 g mode = SSL_CTX
13660 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 _get_session_cac
13670 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 he_mode(statePtr
13680 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d ->ctx);..char *m
13690 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 sg;...if (mode &
136a0 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f SSL_SESS_CACHE_
136b0 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 OFF) {.. msg
136c0 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65 = "off";..} else
136d0 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f if (mode & SSL_
136e0 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e SESS_CACHE_CLIEN
136f0 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 T) {.. msg =
13700 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 "client";..} els
13710 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c e if (mode & SSL
13720 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 _SESS_CACHE_SERV
13730 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d ER) {.. msg =
13740 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c "server";..} el
13750 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 se if (mode & SS
13760 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 L_SESS_CACHE_BOT
13770 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 H) {.. msg =
13780 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20 "both";..} else
13790 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75 6e {.. msg = "un
137a0 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 known";..}..LAPP
137b0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
137c0 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e objPtr, "session
137d0 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 _cache_mode", ms
137e0 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 g, -1);. }..
137f0 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f /* CA List */
13800 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61 . /* IF not a
13810 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61 73 server, same as
13820 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43 SSL_get0_peer_C
13830 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76 65 A_list. If serve
13840 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 54 r same as SSL_CT
13850 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f X_get_client_CA_
13860 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74 list */. list
13870 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
13880 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 tObj(0, NULL);.
13890 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 STACK_OF(X509
138a0 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b _NAME) *ca_list;
138b0 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69 73 . if ((ca_lis
138c0 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65 t = SSL_get_clie
138d0 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 29 nt_CA_list(ssl))
138e0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 != NULL) {..cha
138f0 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d r buffer[BUFSIZ]
13900 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 ;..for (int i =
13910 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 0; i < sk_X509_N
13920 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 AME_num(ca_list)
13930 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 ; i++) {.. X5
13940 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 09_NAME *name =
13950 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c sk_X509_NAME_val
13960 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a ue(ca_list, i);.
13970 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b . if (name) {
13980 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 ...X509_NAME_one
13990 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 65 line(name, buffe
139a0 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 63 r, BUFSIZ);...Tc
139b0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
139c0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c lement(interp, l
139d0 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 istPtr, Tcl_NewS
139e0 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c tringObj(buffer,
139f0 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d -1));.. }..}
13a00 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 . }. LAPPE
13a10 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f ND_OBJ(interp, o
13a20 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22 2c bjPtr, "caList",
13a30 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 4c listPtr);. L
13a40 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
13a50 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 p, objPtr, "caLi
13a60 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30 stCount", sk_X50
13a70 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 9_NAME_num(ca_li
13a80 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 st));.. Tcl_S
13a90 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
13aa0 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
13ab0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
13ac0 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
13ad0 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
13ae0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
13af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b20 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 ------. *. * Mis
13b30 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 cObjCmd -- misc
13b40 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 commands. *. * R
13b50 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
13b60 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
13b70 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
13b80 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
13b90 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
13ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13bd0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
13be0 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d ic int.MiscObjCm
13bf0 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
13c00 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
13c10 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
13c20 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
13c30 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
13c40 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 static const
13c50 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 char *commands
13c60 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 [] = { "req", "s
13c70 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a trreq", NULL };.
13c80 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 enum command
13c90 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 { C_REQ, C_STRR
13ca0 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 EQ, C_DUMMY };.
13cb0 20 20 20 69 6e 74 20 63 6d 64 2c 20 69 73 53 74 int cmd, isSt
13cc0 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 r;. char buff
13cd0 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 20 20 er[16384];..
13ce0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
13cf0 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
13d00 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f < 2) {..Tcl_Wro
13d10 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
13d20 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 , 1, objv, "subc
13d30 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b ommand ?args?");
13d40 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
13d50 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
13d60 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 (Tcl_GetIndexFr
13d70 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
13d80 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c jv[1], commands,
13d90 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 "command", 0, &
13da0 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 cmd) != TCL_OK)
13db0 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
13dc0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
13dd0 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
13de0 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20 );.. isStr =
13df0 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 (cmd == C_STRREQ
13e00 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 );. switch ((
13e10 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d enum command) cm
13e20 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 d) {..case C_REQ
13e30 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 51 :..case C_STRREQ
13e40 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 : {.. EVP_PKE
13e50 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 Y *pkey=NULL;..
13e60 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 X509 *cert=NU
13e70 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 LL;.. X509_NA
13e80 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 ME *name=NULL;..
13e90 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 Tcl_Obj **li
13ea0 73 74 76 3b 0a 09 20 20 20 20 69 6e 74 20 6c 69 stv;.. int li
13eb0 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f stc,i;... BIO
13ec0 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 *out=NULL;...
13ed0 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a char *k_C="",*
13ee0 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c k_ST="",*k_L="",
13ef0 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 *k_O="",*k_OU=""
13f00 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 ,*k_CN="",*k_Ema
13f10 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 il="";.. char
13f20 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 *keyout,*pemout
13f30 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 ,*str;.. int
13f40 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 keysize,serial=0
13f50 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 ,days=365;..#if
13f60 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
13f70 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
13f80 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 000L.. BIGNUM
13f90 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 *bne = NULL;..
13fa0 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 RSA *rsa = NU
13fb0 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 LL;.#else.. E
13fc0 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 VP_PKEY_CTX *ctx
13fd0 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a = NULL;.#endif.
13fe0 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c .. if ((objc<
13ff0 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 5) || (objc>6))
14000 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {...Tcl_WrongNum
14010 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 Args(interp, 2,
14020 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b objv, "keysize k
14030 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 eyfile certfile
14040 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 ?info?");...retu
14050 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
14060 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 }... if (T
14070 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
14080 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d (interp, objv[2]
14090 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 , &keysize) != T
140a0 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 CL_OK) {...retur
140b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
140c0 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d }.. keyout=
140d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
140e0 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d jv[3]);.. pem
140f0 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e out=Tcl_GetStrin
14100 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 g(objv[4]);..
14110 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 if (isStr) {...
14120 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 Tcl_SetVar(inter
14130 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a p,keyout,"",0);.
14140 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 ..Tcl_SetVar(int
14150 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 erp,pemout,"",0)
14160 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 ;.. }... i
14170 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 f (objc>=6) {...
14180 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 if (Tcl_ListObjG
14190 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 etElements(inter
141a0 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09 26 p, objv[5],....&
141b0 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 listc, &listv) !
141c0 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 = TCL_OK) {...
141d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
141e0 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 OR;...}....if ((
141f0 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b listc%2) != 0) {
14200 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 ... Tcl_SetRe
14210 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 sult(interp,"Inf
14220 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 ormation list mu
14230 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d st have even num
14240 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
14250 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 ",NULL);... r
14260 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
14270 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b ...}...for (i=0;
14280 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 i<listc; i+=2)
14290 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f {... str=Tcl_
142a0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
142b0 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 i]);... if (s
142c0 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 trcmp(str,"days"
142d0 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 )==0) {....if (T
142e0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
142f0 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b (interp,listv[i+
14300 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 1],&days)!=TCL_O
14310 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e K).... return
14320 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 TCL_ERROR;...
14330 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
14340 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 cmp(str,"serial"
14350 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 )==0) {....if (T
14360 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
14370 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b (interp,listv[i+
14380 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 1],&serial)!=TCL
14390 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 _OK).... retu
143a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
143b0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
143c0 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d trcmp(str,"C")==
143d0 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 0) {....k_C=Tcl_
143e0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
143f0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
14400 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
14410 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 tr,"ST")==0) {..
14420 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 ..k_ST=Tcl_GetSt
14430 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
14440 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
14450 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c f (strcmp(str,"L
14460 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d ")==0) {....k_L=
14470 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
14480 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
14490 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
144a0 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 mp(str,"O")==0)
144b0 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 {....k_O=Tcl_Get
144c0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
144d0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
144e0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
144f0 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b "OU")==0) {....k
14500 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e _OU=Tcl_GetStrin
14510 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
14520 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
14530 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 strcmp(str,"CN")
14540 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 ==0) {....k_CN=T
14550 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
14560 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
14570 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
14580 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d p(str,"Email")==
14590 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 0) {....k_Email=
145a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
145b0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
145c0 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c } else {....Tcl
145d0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
145e0 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d p,"Unknown param
145f0 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 eter",NULL);....
14600 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
14610 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 ;... }...}..
14620 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 }..#if OPENSS
14630 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
14640 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
14650 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 bne = BN_new
14660 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 ();.. rsa = R
14670 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 SA_new();.. p
14680 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e key = EVP_PKEY_n
14690 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 ew();.. if (b
146a0 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 ne == NULL || rs
146b0 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 a == NULL || pke
146c0 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e y == NULL || !BN
146d0 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 _set_word(bne,RS
146e0 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f A_F4) ||...!RSA_
146f0 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 generate_key_ex(
14700 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e rsa, keysize, bn
14710 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 e, NULL) || !EVP
14720 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 _PKEY_assign_RSA
14730 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 (pkey, rsa)) {..
14740 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 .EVP_PKEY_free(p
14750 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 key);.../* RSA_f
14760 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 ree(rsa); freed
14770 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 by EVP_PKEY_free
14780 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e */...BN_free(bn
14790 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 e);.#else.. p
147a0 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 key = EVP_RSA_ge
147b0 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 n((unsigned int)
147c0 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 keysize);..
147d0 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 ctx = EVP_PKEY_C
147e0 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c TX_new(pkey,NULL
147f0 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 );.. if (pkey
14800 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 == NULL || ctx
14810 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f == NULL || !EVP_
14820 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 PKEY_keygen_init
14830 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f (ctx) ||...!EVP_
14840 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 PKEY_CTX_set_rsa
14850 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 _keygen_bits(ctx
14860 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 , keysize) || !E
14870 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 VP_PKEY_keygen(c
14880 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 tx, &pkey)) {...
14890 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
148a0 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f ey);...EVP_PKEY_
148b0 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 CTX_free(ctx);.#
148c0 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 endif...Tcl_SetR
148d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 esult(interp,"Er
148e0 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 ror generating p
148f0 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c rivate key",NULL
14900 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
14910 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c ERROR;.. } el
14920 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 se {...if (isStr
14930 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 ) {... out=BI
14940 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 O_new(BIO_s_mem(
14950 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 ));... PEM_wr
14960 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b ite_bio_PrivateK
14970 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c ey(out,pkey,NULL
14980 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c ,NULL,0,NULL,NUL
14990 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f L);... i=BIO_
149a0 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c read(out,buffer,
149b0 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 sizeof(buffer)-1
149c0 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 );... i=(i<0)
149d0 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 ? 0 : i;...
149e0 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a buffer[i]='\0';.
149f0 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 .. Tcl_SetVar
14a00 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 (interp,keyout,b
14a10 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 uffer,0);...
14a20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a BIO_flush(out);.
14a30 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f .. BIO_free(o
14a40 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a ut);...} else {.
14a50 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 .. out=BIO_ne
14a60 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b w(BIO_s_file());
14a70 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 ... BIO_write
14a80 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 _filename(out,ke
14a90 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d yout);... PEM
14aa0 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 _write_bio_Priva
14ab0 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e teKey(out,pkey,N
14ac0 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c ULL,NULL,0,NULL,
14ad0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 NULL);... /*
14ae0 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 PEM_write_bio_RS
14af0 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c APrivateKey(out,
14b00 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c rsa, NULL, NULL
14b10 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 , 0, NULL, NULL)
14b20 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 ; */... BIO_f
14b30 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 ree_all(out);..
14b40 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d .}....if ((cert=
14b50 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c X509_new())==NUL
14b60 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 L) {... Tcl_S
14b70 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
14b80 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e "Error generatin
14b90 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65 g certificate re
14ba0 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 quest",NULL);...
14bb0 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 EVP_PKEY_fre
14bc0 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 e(pkey);.#if OPE
14bd0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
14be0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
14bf0 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 L... BN_free(
14c00 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 bne);.#endif...
14c10 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 return(TCL_ER
14c20 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 ROR);...}....X50
14c30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 9_set_version(ce
14c40 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e rt,2);...ASN1_IN
14c50 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 TEGER_set(X509_g
14c60 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 et_serialNumber(
14c70 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 cert),serial);..
14c80 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a .X509_gmtime_adj
14c90 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 (X509_getm_notBe
14ca0 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 fore(cert),0);..
14cb0 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a .X509_gmtime_adj
14cc0 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 (X509_getm_notAf
14cd0 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 ter(cert),(long)
14ce0 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 60*60*24*days);.
14cf0 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 ..X509_set_pubke
14d00 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 y(cert,pkey);...
14d10 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 .name=X509_get_s
14d20 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 ubject_name(cert
14d30 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f );....X509_NAME_
14d40 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
14d50 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 (name,"C", MBSTR
14d60 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
14d70 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
14d80 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_C, -1, -1, 0)
14d90 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
14da0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
14db0 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 ame,"ST", MBSTRI
14dc0 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
14dd0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
14de0 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_ST, -1, -1, 0)
14df0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
14e00 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
14e10 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e ame,"L", MBSTRIN
14e20 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
14e30 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
14e40 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a _L, -1, -1, 0);.
14e50 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
14e60 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
14e70 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f e,"O", MBSTRING_
14e80 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
14e90 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f gned char *) k_O
14ea0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
14eb0 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
14ec0 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
14ed0 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 "OU", MBSTRING_A
14ee0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
14ef0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 ned char *) k_OU
14f00 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
14f10 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
14f20 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
14f30 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 "CN", MBSTRING_A
14f40 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
14f50 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e ned char *) k_CN
14f60 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
14f70 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
14f80 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
14f90 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e "Email", MBSTRIN
14fa0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
14fb0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
14fc0 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 _Email, -1, -1,
14fd0 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 0);....X509_set_
14fe0 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 subject_name(cer
14ff0 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 t,name);....if (
15000 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c !X509_sign(cert,
15010 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 pkey,EVP_sha256(
15020 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 ))) {... X509
15030 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 _free(cert);...
15040 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 EVP_PKEY_free
15050 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e (pkey);.#if OPEN
15060 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
15070 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
15080 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 ... BN_free(b
15090 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 ne);.#endif...
150a0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 Tcl_SetResult(
150b0 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 interp,"Error si
150c0 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 gning certificat
150d0 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 e",NULL);...
150e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
150f0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 ;...}....if (isS
15100 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d tr) {... out=
15110 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 BIO_new(BIO_s_me
15120 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f m());... PEM_
15130 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f write_bio_X509(o
15140 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 ut,cert);...
15150 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 i=BIO_read(out,b
15160 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 uffer,sizeof(buf
15170 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 fer)-1);... i
15180 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a =(i<0) ? 0 : i;.
15190 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d .. buffer[i]=
151a0 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f '\0';... Tcl_
151b0 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 SetVar(interp,pe
151c0 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a mout,buffer,0);.
151d0 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 .. BIO_flush(
151e0 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f out);... BIO_
151f0 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 free(out);...} e
15200 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d lse {... out=
15210 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 BIO_new(BIO_s_fi
15220 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f le());... BIO
15230 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 _write_filename(
15240 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 out,pemout);...
15250 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
15260 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b _X509(out,cert);
15270 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f ... BIO_free_
15280 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 all(out);...}...
15290 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 .X509_free(cert)
152a0 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 ;...EVP_PKEY_fre
152b0 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 e(pkey);.#if OPE
152c0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
152d0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
152e0 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 L...BN_free(bne)
152f0 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a ;.#endif.. }.
15300 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 .}..break;. d
15310 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a efault:..break;.
15320 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
15330 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
15340 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
15350 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a a;.}.../********
15360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a ************/./*
15370 20 49 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 Init
15380 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./**********
15390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a **********/../*.
153a0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
153b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
153c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
153d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
153e0 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
153f0 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 Free --. *. *.Th
15400 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 is procedure cle
15410 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 ans up when a SS
15420 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 L socket based c
15430 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f hannel. *.is clo
15440 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 sed and its refe
15450 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c rence count fall
15460 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 s below 1. *. *
15470 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 Results:. *.none
15480 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
15490 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c cts:. *.Frees al
154a0 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 l the state. *.
154b0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
154c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
154d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
154e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
154f0 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c ----. */.void.Tl
15500 73 5f 46 72 65 65 28 63 68 61 72 20 2a 62 6c 6f s_Free(char *blo
15510 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 ckPtr) {. Sta
15520 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
15530 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 State *)blockPtr
15540 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
15550 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 Called");.. T
15560 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 ls_Clean(statePt
15570 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 r);. ckfree(b
15580 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a lockPtr);.}.../*
15590 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
155a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
155b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
155c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
155d0 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
155e0 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 _Clean --. *. *.
155f0 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 This procedure c
15600 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 leans up when a
15610 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 SSL socket based
15620 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 channel. *.is c
15630 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 losed and its re
15640 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 ference count fa
15650 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 lls below 1. Th
15660 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 is should. *.be
15670 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f called synchrono
15680 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 usly by the Clos
15690 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 eProc, not in th
156a0 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 e. *.EventuallyF
156b0 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a ree callback.. *
156c0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
156d0 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 none. *. * Side
156e0 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 effects:. *.Free
156f0 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a s all the state.
15700 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
15710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15740 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 --------. */.voi
15750 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 d Tls_Clean(Stat
15760 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 e *statePtr) {.
15770 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
15780 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 ed");.. /*.
15790 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d * we're assum
157a0 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 65 ing here that we
157b0 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 're single-threa
157c0 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 ded. */.
157d0 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 if (statePtr->ti
157e0 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 mer != (Tcl_Time
157f0 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a rToken) NULL) {.
15800 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 .Tcl_DeleteTimer
15810 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 Handler(statePtr
15820 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 ->timer);..state
15830 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c Ptr->timer = NUL
15840 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 L;. }.. if
15850 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 (statePtr->prot
15860 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 os) {..ckfree(st
15870 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b atePtr->protos);
15880 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
15890 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d os = NULL;. }
158a0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
158b0 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 r->bio) {../* Th
158c0 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c is will call SSL
158d0 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 _shutdown. Bug 1
158e0 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 414045 */..dprin
158f0 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c tf("BIO_free_all
15900 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d (%p)", statePtr-
15910 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 >bio);..BIO_free
15920 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 _all(statePtr->b
15930 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e io);..statePtr->
15940 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 bio = NULL;.
15950 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
15960 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 tr->ssl) {..dpri
15970 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 ntf("SSL_free(%p
15980 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 )", statePtr->ss
15990 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 l);..SSL_free(st
159a0 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 atePtr->ssl);..s
159b0 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e tatePtr->ssl = N
159c0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
159d0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 f (statePtr->ctx
159e0 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 ) {..SSL_CTX_fre
159f0 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 e(statePtr->ctx)
15a00 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ;..statePtr->ctx
15a10 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
15a20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
15a30 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 >callback) {..Tc
15a40 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 l_DecrRefCount(s
15a50 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
15a60 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 k);..statePtr->c
15a70 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a allback = NULL;.
15a80 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
15a90 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
15aa0 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 ) {..Tcl_DecrRef
15ab0 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
15ac0 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 password);..stat
15ad0 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d ePtr->password =
15ae0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
15af0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
15b00 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 cmd) {..Tcl_Decr
15b10 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
15b20 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 r->vcmd);..state
15b30 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c Ptr->vcmd = NULL
15b40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
15b50 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 intf("Returning"
15b60 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
15b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
15bb0 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d *. * Tls_Init -
15bc0 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 -. *. *.This is
15bd0 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 a package initia
15be0 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 lization procedu
15bf0 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c re, which is cal
15c00 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 led. *.by Tcl wh
15c10 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 en this package
15c20 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 is to be added t
15c30 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 o an interpreter
15c40 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
15c50 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 Ssl configured
15c60 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 and loaded. *.
15c70 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
15c80 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73 *. create the s
15c90 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 sl command, init
15ca0 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 ialize ssl conte
15cb0 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d xt. *. *--------
15cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
15d00 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c DLLEXPORT int Tl
15d10 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 s_Init(Tcl_Inter
15d20 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 p *interp) {.
15d30 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 const char tlsT
15d40 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d clInitScript[] =
15d50 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 {.#include "tls
15d60 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 .tcl.h"..0x00.
15d70 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 };.. dprint
15d80 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 f("Called");..#i
15d90 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 f TCL_MAJOR_VERS
15da0 49 4f 4e 20 3e 20 38 0a 23 69 66 64 65 66 20 55 ION > 8.#ifdef U
15db0 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 SE_TCL_STUBS.
15dc0 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 if (Tcl_InitStu
15dd0 62 73 28 69 6e 74 65 72 70 2c 20 22 39 2e 30 22 bs(interp, "9.0"
15de0 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a , 0) == NULL) {.
15df0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
15e00 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a R;. }.#endif.
15e10 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 if (Tcl_PkgR
15e20 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 equire(interp, "
15e30 54 63 6c 22 2c 20 22 39 2e 30 2d 22 2c 20 30 29 Tcl", "9.0-", 0)
15e40 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
15e50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
15e60 20 20 20 7d 0a 23 65 6c 73 65 0a 23 69 66 64 65 }.#else.#ifde
15e70 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a f USE_TCL_STUBS.
15e80 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 if (Tcl_Init
15e90 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 Stubs(interp, "8
15ea0 2e 35 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 .5", 0) == NULL)
15eb0 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
15ec0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 RROR;. }.#end
15ed0 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 50 if. if (Tcl_P
15ee0 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 kgRequire(interp
15ef0 2c 20 22 54 63 6c 22 2c 20 22 38 2e 35 2d 22 2c , "Tcl", "8.5-",
15f00 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 0) == NULL) {..
15f10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
15f20 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a ;. }.#endif..
15f30 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e if (TlsLibIn
15f40 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 it(0) != TCL_OK)
15f50 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
15f60 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f sult(interp, "co
15f70 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 uld not initiali
15f80 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c ze SSL library",
15f90 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
15fa0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
15fb0 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 .. Tcl_Create
15fc0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
15fd0 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 p, "tls::connect
15fe0 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e ion", Connection
15ff0 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 InfoObjCmd, (Cli
16000 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
16010 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
16020 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
16030 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
16040 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
16050 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 handshake", Hand
16060 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c shakeObjCmd, (Cl
16070 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
16080 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
16090 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
160a0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
160b0 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
160c0 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 :import", Import
160d0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
160e0 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
160f0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
16100 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
16110 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
16120 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 terp, "tls::misc
16130 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 ", MiscObjCmd, (
16140 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
16150 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
16160 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
16170 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
16180 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
16190 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e s::unimport", Un
161a0 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 importObjCmd, (C
161b0 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
161c0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
161d0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
161e0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
161f0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
16200 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 ::status", Statu
16210 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 sObjCmd, (Client
16220 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
16230 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
16240 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 ULL);.. Tcl_C
16250 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
16260 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 interp, "tls::ci
16270 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f phers", CiphersO
16280 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
16290 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
162a0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
162b0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
162c0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
162d0 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f erp, "tls::proto
162e0 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 cols", Protocols
162f0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
16300 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
16310 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
16320 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
16330 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
16340 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73 terp, "tls::vers
16350 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a ion", VersionObj
16360 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
16370 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
16380 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
16390 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 ;.. Tcl_Creat
163a0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
163b0 72 70 2c 20 22 74 6c 73 3a 3a 68 61 73 68 22 2c rp, "tls::hash",
163c0 20 48 61 73 68 43 6d 64 2c 20 28 43 6c 69 65 6e HashCmd, (Clien
163d0 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
163e0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
163f0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
16400 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
16410 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 interp, "tls::ha
16420 73 68 65 73 22 2c 20 48 61 73 68 4c 69 73 74 43 shes", HashListC
16430 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
16440 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
16450 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
16460 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
16470 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
16480 2c 20 22 74 6c 73 3a 3a 6d 64 34 22 2c 20 48 61 , "tls::md4", Ha
16490 73 68 4d 44 34 43 6d 64 2c 20 28 43 6c 69 65 6e shMD4Cmd, (Clien
164a0 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
164b0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
164c0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
164d0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
164e0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 interp, "tls::md
164f0 35 22 2c 20 48 61 73 68 4d 44 35 43 6d 64 2c 20 5", HashMD5Cmd,
16500 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
16510 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
16520 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
16530 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
16540 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
16550 6c 73 3a 3a 73 68 61 31 22 2c 20 48 61 73 68 53 ls::sha1", HashS
16560 48 41 31 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 HA1Cmd, (ClientD
16570 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
16580 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
16590 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
165a0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
165b0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 32 terp, "tls::sha2
165c0 35 36 22 2c 20 48 61 73 68 53 48 41 32 35 36 43 56", HashSHA256C
165d0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
165e0 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
165f0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
16600 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 .. if (interp
16610 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e ) {..Tcl_Eval(in
16620 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 terp, tlsTclInit
16630 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a Script);. }..
16640 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 return Tcl_P
16650 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 kgProvide(interp
16660 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 , PACKAGE_NAME,
16670 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 PACKAGE_VERSION)
16680 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
16690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
166a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
166b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
166c0 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 *. *. *.Tls_Safe
166d0 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d Init --. *. *.--
166e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 2a 0a --------------*.
16710 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 *.Standard proc
16720 65 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62 edure required b
16730 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 y 'load'.. *.Ini
16740 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 tializes this ex
16750 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 tension for a sa
16760 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a fe interpreter..
16770 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.-------------
16780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
167a0 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 ---*. *. *.Side
167b0 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 effects:. *..As
167c0 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a of 'Tls_Init'. *
167d0 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 . *.Result:. *..
167e0 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 A standard Tcl e
167f0 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a rror code.. *. *
16800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16830 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 ------*. */.DLLE
16840 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 XPORT int Tls_Sa
16850 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 feInit(Tcl_Inter
16860 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 p *interp) {.
16870 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
16880 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 ");. return(T
16890 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 29 ls_Init(interp))
168a0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
168b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
168c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
168d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
168e0 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e *. *. *.TlsLibIn
168f0 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d it --. *. *.----
16900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 2a 0a 20 2a ------------*. *
16930 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c .Initializes SSL
16940 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 library once pe
16950 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a r application. *
16960 09 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 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 -*. *. *.Side ef
169a0 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 fects:. *..initi
169b0 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 alizes SSL libra
169c0 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a ry. *. *.Result:
169d0 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d . *..none. *. *-
169e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
169f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a10 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 -----*. */.stati
16a20 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 c int TlsLibInit
16a30 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a (int uninitializ
16a40 65 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 e) {. static
16a50 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 int initialized
16a60 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 = 0;. int sta
16a70 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 tus = TCL_OK;.#i
16a80 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 f defined(OPENSS
16a90 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 L_THREADS) && de
16aa0 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 fined(TCL_THREAD
16ab0 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 S). size_t nu
16ac0 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a m_locks;.#endif.
16ad0 0a 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 . if (uniniti
16ae0 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 alize) {..if (!i
16af0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 nitialized) {..
16b00 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 dprintf("Aske
16b10 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a d to uninitializ
16b20 65 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f e, but we are no
16b30 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b t initialized");
16b40 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 ... return(TC
16b50 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 L_OK);..}...dpri
16b60 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e ntf("Asked to un
16b70 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 initialize");..#
16b80 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
16b90 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
16ba0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
16bb0 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f DS)..Tcl_MutexLo
16bc0 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 ck(&init_mx);...
16bd0 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 if (locks) {..
16be0 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 free(locks);..
16bf0 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c locks = NULL
16c00 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e ;.. locksCoun
16c10 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 t = 0;..}.#endif
16c20 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 ..initialized =
16c30 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 0;..#if defined(
16c40 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
16c50 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
16c60 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 THREADS)..Tcl_Mu
16c70 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f texUnlock(&init_
16c80 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 mx);.#endif...re
16c90 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 turn(TCL_OK);.
16ca0 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 }.. if (ini
16cb0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 tialized) {..dpr
16cc0 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 intf("Called, bu
16cd0 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 t using cached v
16ce0 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 28 alue");..return(
16cf0 73 74 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a status);. }..
16d00 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
16d10 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 led");..#if defi
16d20 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 ned(OPENSSL_THRE
16d30 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 ADS) && defined(
16d40 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 TCL_THREADS).
16d50 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 Tcl_MutexLock(&
16d60 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 init_mx);.#endif
16d70 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 . initialized
16d80 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e = 1;..#if defin
16d90 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
16da0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
16db0 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 CL_THREADS).
16dc0 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 num_locks = 1;.
16dd0 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 locksCount =
16de0 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b (int) num_locks;
16df0 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c . locks = mal
16e00 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b loc(sizeof(*lock
16e10 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b s) * num_locks);
16e20 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b . memset(lock
16e30 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f s, 0, sizeof(*lo
16e40 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 cks) * num_locks
16e50 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f );.#endif.. /
16e60 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 * Initialize BOT
16e70 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 H libcrypto and
16e80 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f libssl. */. O
16e90 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 PENSSL_init_ssl(
16ea0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 OPENSSL_INIT_LOA
16eb0 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 D_SSL_STRINGS |
16ec0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 OPENSSL_INIT_LOA
16ed0 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 D_CRYPTO_STRINGS
16ee0 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 ..| OPENSSL_INIT
16ef0 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 _ADD_ALL_CIPHERS
16f00 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f | OPENSSL_INIT_
16f10 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c ADD_ALL_DIGESTS,
16f20 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f NULL);.. BIO
16f30 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 _new_tcl(NULL, 0
16f40 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a );..#if 0. /*
16f50 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f . * XXX:TODO
16f60 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f : Remove this co
16f70 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 de and replace i
16f80 74 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 t with a check.
16f90 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 * for enough
16fa0 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 entropy and do
16fb0 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 not try to creat
16fc0 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a e our own. *
16fd0 20 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 terrible entrop
16fe0 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a y. */. /*
16ff0 0a 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 . * Seed the
17000 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 random number g
17010 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 enerator in the
17020 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 SSL library,.
17030 20 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f * using the do
17040 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 /while construct
17050 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 because of the
17060 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a bug note in the.
17070 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 * OpenSSL F
17080 41 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 AQ at http://www
17090 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 .openssl.org/sup
170a0 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 port/faq.html#US
170b0 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 ER1. *.
170c0 2a 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 * The crux of th
170d0 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 e problem is tha
170e0 74 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 t Solaris 7 does
170f0 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 not have a.
17100 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f * /dev/random o
17110 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 r /dev/urandom d
17120 65 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e evice so it cann
17130 6f 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 ot gather enough
17140 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 . * entropy
17150 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 from the RAND_se
17160 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e ed() when TLS in
17170 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 itializes and re
17180 66 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 fuses. * to
17190 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c go further. Earl
171a0 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 ier versions of
171b0 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 OpenSSL carried
171c0 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 on regardless..
171d0 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 */. srand
171e0 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 ((unsigned int)
171f0 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 time((time_t *)
17200 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b NULL));. do {
17210 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 ..for (i = 0; i
17220 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 < 16; i++) {..
17230 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 rnd_seed[i] =
17240 31 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 1 + (char) (255.
17250 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 0 * rand()/(RAND
17260 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 _MAX+1.0));..}..
17270 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 RAND_seed(rnd_se
17280 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 ed, sizeof(rnd_s
17290 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 eed));. } whi
172a0 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 le (RAND_status(
172b0 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a ) != 1);.#endif.
172c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
172d0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
172e0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
172f0 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 EADS)..Tcl_Mutex
17300 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 Unlock(&init_mx)
17310 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 ;.#endif...retur
17320 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a n(status);.}.