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: 22 74 6c 73 55 75 69 64 2e 68 22 0a 23 69 6e 63 "tlsUuid.h".#inc
0370: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 lude <stdio.h>.#
0380: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e include <stdlib.
0390: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 h>.#include <ope
03a0: 6e 73 73 6c 2f 72 73 61 2e 68 3e 0a 23 69 6e 63 nssl/rsa.h>.#inc
03b0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 61 lude <openssl/sa
03c0: 66 65 73 74 61 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d festack.h>../* M
03d0: 69 6e 20 4f 70 65 6e 53 53 4c 20 76 65 72 73 69 in OpenSSL versi
03e0: 6f 6e 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 on */.#if OPENSS
03f0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
0400: 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 23 < 0x10101000L.#
0410: 65 72 72 6f 72 20 22 4f 6e 6c 79 20 4f 70 65 6e error "Only Open
0420: 53 53 4c 20 76 31 2e 31 2e 31 20 6f 72 20 6c 61 SSL v1.1.1 or la
0430: 74 65 72 20 69 73 20 73 75 70 70 6f 72 74 65 64 ter is supported
0440: 22 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 20 2a ".#endif.../*. *
0450: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 Forward declara
0460: 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 23 64 65 66 69 tions. */..#defi
0470: 6e 65 20 46 32 4e 28 6b 65 79 2c 20 64 73 70 29 ne F2N(key, dsp)
0480: 20 5c 0a 09 28 28 28 6b 65 79 29 20 3d 3d 20 4e \..(((key) == N
0490: 55 4c 4c 29 20 3f 20 28 63 68 61 72 20 2a 29 20 ULL) ? (char *)
04a0: 4e 55 4c 4c 20 3a 20 5c 0a 09 09 54 63 6c 5f 54 NULL : \...Tcl_T
04b0: 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 ranslateFileName
04c0: 28 69 6e 74 65 72 70 2c 20 28 6b 65 79 29 2c 20 (interp, (key),
04d0: 28 64 73 70 29 29 29 0a 0a 73 74 61 74 69 63 20 (dsp)))..static
04e0: 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 6e 69 SSL_CTX *CTX_Ini
04f0: 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 t(State *statePt
0500: 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c r, int isServer,
0510: 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 int proto, char
0520: 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 2a 63 *key,...char *c
0530: 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 6e 65 ertfile, unsigne
0540: 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 6e 31 d char *key_asn1
0550: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
0560: 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 54 63 *cert_asn1,...Tc
0570: 6c 5f 53 69 7a 65 20 6b 65 79 5f 61 73 6e 31 5f l_Size key_asn1_
0580: 6c 65 6e 2c 20 54 63 6c 5f 53 69 7a 65 20 63 65 len, Tcl_Size ce
0590: 72 74 5f 61 73 6e 31 5f 6c 65 6e 2c 20 63 68 61 rt_asn1_len, cha
05a0: 72 20 2a 43 41 70 61 74 68 2c 20 63 68 61 72 20 r *CApath, char
05b0: 2a 43 41 66 69 6c 65 2c 0a 09 09 63 68 61 72 20 *CAfile,...char
05c0: 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a *ciphers, char *
05d0: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e ciphersuites, in
05e0: 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 t level, char *D
05f0: 48 70 61 72 61 6d 73 29 3b 0a 0a 73 74 61 74 69 Hparams);..stati
0600: 63 20 69 6e 74 09 54 6c 73 4c 69 62 49 6e 69 74 c int.TlsLibInit
0610: 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a (int uninitializ
0620: 65 29 3b 0a 0a 23 64 65 66 69 6e 65 20 54 4c 53 e);..#define TLS
0630: 5f 50 52 4f 54 4f 5f 53 53 4c 32 09 09 30 78 30 _PROTO_SSL2..0x0
0640: 31 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 1.#define TLS_PR
0650: 4f 54 4f 5f 53 53 4c 33 09 09 30 78 30 32 0a 23 OTO_SSL3..0x02.#
0660: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f define TLS_PROTO
0670: 5f 54 4c 53 31 09 09 30 78 30 34 0a 23 64 65 66 _TLS1..0x04.#def
0680: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ine TLS_PROTO_TL
0690: 53 31 5f 31 09 30 78 30 38 0a 23 64 65 66 69 6e S1_1.0x08.#defin
06a0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
06b0: 5f 32 09 30 78 31 30 0a 23 64 65 66 69 6e 65 20 _2.0x10.#define
06c0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
06d0: 09 30 78 32 30 0a 23 64 65 66 69 6e 65 20 45 4e .0x20.#define EN
06e0: 41 42 4c 45 44 28 66 6c 61 67 2c 20 6d 61 73 6b ABLED(flag, mask
06f0: 29 09 28 28 28 66 6c 61 67 29 20 26 20 28 6d 61 ).(((flag) & (ma
0700: 73 6b 29 29 20 3d 3d 20 28 6d 61 73 6b 29 29 0a sk)) == (mask)).
0710: 0a 23 64 65 66 69 6e 65 20 53 53 4c 4b 45 59 4c .#define SSLKEYL
0720: 4f 47 46 49 4c 45 09 09 22 53 53 4c 4b 45 59 4c OGFILE.."SSLKEYL
0730: 4f 47 46 49 4c 45 22 0a 0a 2f 2a 0a 20 2a 20 54 OGFILE"../*. * T
0740: 68 72 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 hread-Safe TLS C
0750: 6f 64 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 ode. */..#ifdef
0760: 54 43 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 TCL_THREADS.#def
0770: 69 6e 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 ine OPENSSL_THRE
0780: 41 44 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c AD_DEFINES.#incl
0790: 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 ude <openssl/ope
07a0: 6e 73 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 nsslconf.h>..#if
07b0: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 def OPENSSL_THRE
07c0: 41 44 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 ADS.#include <op
07d0: 65 6e 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a enssl/crypto.h>.
07e0: 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 #include <openss
07f0: 6c 2f 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 l/ssl.h>../*. *
0800: 54 68 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 Threaded operati
0810: 6f 6e 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b on requires lock
0820: 69 6e 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a ing callbacks. *
0830: 20 42 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 Based from /cry
0840: 70 74 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f pto/cryptlib.c o
0850: 66 20 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 f OpenSSL and NS
0860: 4f 70 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 OpenSSL.. */..st
0870: 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a atic Tcl_Mutex *
0880: 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 locks = NULL;.st
0890: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f atic int locksCo
08a0: 75 6e 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 unt = 0;.static
08b0: 54 63 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d Tcl_Mutex init_m
08c0: 78 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 x;.#endif /* OPE
08d0: 4e 53 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a NSSL_THREADS */.
08e0: 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 #endif /* TCL_TH
08f0: 52 45 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a READS */..../***
0900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0910: 2a 2f 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 */./* Callbacks
0920: 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a */./*****
0930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
0940: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
0990: 20 45 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 Eval Callback C
09a0: 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ommand --. *. *.
09b0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
09c0: 6d 6d 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 mmand and catch
09d0: 61 6e 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a any errors. *. *
09e0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d Results:. *.0 =
09f0: 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 Command returne
0a00: 64 20 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 d fail or eval r
0a10: 65 74 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f eturned TCL_ERRO
0a20: 52 0a 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 R. *.1 = Command
0a30: 20 72 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 returned succes
0a40: 73 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e s or eval return
0a50: 65 64 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 ed TCL_OK. *. *
0a60: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
0a70: 09 45 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 .Evaluates callb
0a80: 61 63 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 ack command. *.
0a90: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ad0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
0ae0: 69 6e 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b int.EvalCallback
0af0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
0b00: 65 72 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 erp, State *stat
0b10: 65 50 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 ePtr, Tcl_Obj *c
0b20: 6d 64 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 mdPtr) {. int
0b30: 20 63 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a 0a code, ok = 0;..
0b40: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
0b50: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 63 6c 5f led");.. Tcl_
0b60: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
0b70: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
0b80: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
0b90: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
0ba0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 tePtr);.. /*
0bb0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 77 69 Eval callback wi
0bc0: 74 68 20 73 75 63 63 65 73 73 20 66 6f 72 20 6f th success for o
0bd0: 6b 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 k or return valu
0be0: 65 20 31 2c 20 66 61 69 6c 20 66 6f 72 20 65 72 e 1, fail for er
0bf0: 72 6f 72 20 6f 72 20 72 65 74 75 72 6e 20 76 61 ror or return va
0c00: 6c 75 65 20 30 20 2a 2f 0a 20 20 20 20 54 63 6c lue 0 */. Tcl
0c10: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 _ResetResult(int
0c20: 65 72 70 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d erp);. code =
0c30: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 Tcl_EvalObjEx(i
0c40: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
0c50: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b CL_EVAL_GLOBAL);
0c60: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 45 76 . dprintf("Ev
0c70: 61 6c 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c alCallback: %d",
0c80: 20 63 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 code);. if (
0c90: 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 code == TCL_OK)
0ca0: 7b 0a 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 {../* Check resu
0cb0: 6c 74 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 lt for return va
0cc0: 6c 75 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 lue */..Tcl_Obj
0cd0: 2a 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 *result = Tcl_Ge
0ce0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
0cf0: 70 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 p);..if (result
0d00: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 == NULL || Tcl_G
0d10: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 etIntFromObj(int
0d20: 65 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b erp, result, &ok
0d30: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
0d40: 20 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 09 ok = 1;..}..
0d50: 64 70 72 69 6e 74 66 28 22 52 65 73 75 6c 74 3a dprintf("Result:
0d60: 20 25 64 22 2c 20 6f 6b 29 3b 0a 20 20 20 20 7d %d", ok);. }
0d70: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45 72 72 6f else {../* Erro
0d80: 72 20 2d 20 72 65 6a 65 63 74 20 74 68 65 20 63 r - reject the c
0d90: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 64 ertificate */..d
0da0: 70 72 69 6e 74 66 28 22 54 63 6c 5f 42 61 63 6b printf("Tcl_Back
0db0: 67 72 6f 75 6e 64 45 72 72 6f 72 22 29 3b 0a 23 groundError");.#
0dc0: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
0dd0: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
0de0: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
0df0: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
0e00: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
0e10: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
0e20: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
0e30: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
0e40: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
0e50: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 . Tcl_Release
0e60: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 ((ClientData) st
0e70: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c atePtr);. Tcl
0e80: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
0e90: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
0ea0: 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 7d 0a return ok;.}.
0eb0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
0f00: 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d InfoCallback --
0f10: 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 . *. *.Monitors
0f20: 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 SSL connection p
0f30: 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 rocess. *. * Res
0f40: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
0f50: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
0f60: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
0f70: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
0f80: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
0fd0: 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f 43 61 atic void.InfoCa
0fe0: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
0ff0: 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 72 65 *ssl, int where
1000: 2c 20 69 6e 74 20 72 65 74 29 20 7b 0a 20 20 20 , int ret) {.
1010: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
1020: 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 = (State*)SSL_g
1030: 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c et_app_data((SSL
1040: 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c *)ssl);. Tcl
1050: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
1060: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
1070: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
1080: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e *cmdPtr;. con
1090: 73 74 20 63 68 61 72 20 2a 6d 61 6a 6f 72 2c 20 st char *major,
10a0: 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 70 72 *minor;.. dpr
10b0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
10c0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
10d0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 r->callback == (
10e0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 Tcl_Obj*)NULL)..
10f0: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66 20 return;.. if
1100: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1110: 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 54 29 HANDSHAKE_START)
1120: 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e {..major = "han
1130: 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 dshake";..minor
1140: 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 20 7d = "start";. }
1150: 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 else if (where
1160: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 & SSL_CB_HANDSHA
1170: 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f KE_DONE) {..majo
1180: 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b r = "handshake";
1190: 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 22 ..minor = "done"
11a0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
11b0: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
11c0: 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a 6f 72 CB_ALERT)..major
11d0: 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 6c 73 = "alert";..els
11e0: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 e if (where & SS
11f0: 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 6d 61 L_ST_CONNECT).ma
1200: 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 22 3b jor = "connect";
1210: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 ..else if (where
1220: 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 50 54 & SSL_ST_ACCEPT
1230: 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 63 65 )..major = "acce
1240: 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d pt";..else.....m
1250: 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 ajor = "unknown"
1260: 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 ;...if (where &
1270: 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 6d 69 SSL_CB_READ)..mi
1280: 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a 09 65 nor = "read";..e
1290: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 lse if (where &
12a0: 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 09 6d SSL_CB_WRITE)..m
12b0: 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 3b 0a inor = "write";.
12c0: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 .else if (where
12d0: 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09 & SSL_CB_LOOP)..
12e0: 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a minor = "loop";.
12f0: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 .else if (where
1300: 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 09 09 & SSL_CB_EXIT)..
1310: 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 3b 0a minor = "exit";.
1320: 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f 72 20 .else.....minor
1330: 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 = "unknown";.
1340: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
1350: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
1360: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c l with fn, chan,
1370: 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 2c 20 6d major, minor, m
1380: 65 73 73 61 67 65 2c 20 61 6e 64 20 74 79 70 65 essage, and type
1390: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 args */. cmd
13a0: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
13b0: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
13c0: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 >callback);.
13d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
13e0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
13f0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
1400: 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 StringObj("info"
1410: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
1420: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1430: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1440: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
1450: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 wStringObj(Tcl_G
1460: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
1470: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d atePtr->self), -
1480: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
1490: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
14a0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
14b0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
14c0: 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a bj(major, -1));.
14d0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
14e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
14f0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
1500: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 _NewStringObj(mi
1510: 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 nor, -1));..
1520: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
1530: 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c CB_ALERT) {..Tcl
1540: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1550: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
1560: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
1570: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f ewStringObj(SSL_
1580: 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 69 6e alert_desc_strin
1590: 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 g_long(ret), -1)
15a0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
15b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
15c0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
15d0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
15e0: 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 bj(SSL_alert_typ
15f0: 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 e_string_long(re
1600: 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 t), -1));. }
1610: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 else {..Tcl_List
1620: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1630: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
1640: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
1650: 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 ingObj(SSL_state
1660: 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c _string_long(ssl
1670: 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ), -1));..Tcl_Li
1680: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1690: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
16a0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
16b0: 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 Obj("info", -1))
16c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
16d0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
16e0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
16f0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
1700: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 dPtr);. EvalC
1710: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
1720: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
1730: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 );. Tcl_DecrR
1740: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
1750: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
17a0: 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 . * MessageCallb
17b0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e ack --. *. *.Mon
17c0: 69 74 6f 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 itors SSL protoc
17d0: 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 ol messages. *.
17e0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
17f0: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
1800: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 fects:. *.Calls
1810: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 callback (if def
1820: 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d ined). *. *-----
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
1870: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 */.#ifndef OPENS
1880: 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a SL_NO_SSL_TRACE.
1890: 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 static void.Mess
18a0: 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 ageCallback(int
18b0: 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 write_p, int ver
18c0: 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e sion, int conten
18d0: 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f t_type, const vo
18e0: 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 id *buf, size_t
18f0: 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 len, SSL *ssl, v
1900: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 oid *arg) {.
1910: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
1920: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 = (State*)arg;.
1930: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
1940: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
1950: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 ->interp;. Tc
1960: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
1970: 20 20 20 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 char *ver, *t
1980: 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 ype;. BIO *bi
1990: 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 o;. char buff
19a0: 65 72 5b 31 35 30 30 30 5d 3b 0a 20 20 20 20 62 er[15000];. b
19b0: 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 uffer[0] = 0;..
19c0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
19d0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
19e0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
19f0: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e k == (Tcl_Obj*)N
1a00: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 ULL)..return;..
1a10: 20 20 20 73 77 69 74 63 68 28 76 65 72 73 69 6f switch(versio
1a20: 6e 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c n) {.#if OPENSSL
1a30: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
1a40: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 < 0x10100000L &&
1a50: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
1a60: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
1a70: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a PENSSL_NO_SSL2).
1a80: 20 20 20 20 63 61 73 65 20 53 53 4c 32 5f 56 45 case SSL2_VE
1a90: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 RSION:..ver = "S
1aa0: 53 4c 76 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 SLv2";..break;.#
1ab0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
1ac0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 ed(NO_SSL3) && !
1ad0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
1ae0: 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 63 61 73 NO_SSL3). cas
1af0: 65 20 53 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a e SSL3_VERSION:.
1b00: 09 76 65 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a .ver = "SSLv3";.
1b10: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 .break;.#endif.
1b20: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 56 45 52 case TLS1_VER
1b30: 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c SION:..ver = "TL
1b40: 53 76 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 Sv1";..break;.
1b50: 20 20 63 61 73 65 20 54 4c 53 31 5f 31 5f 56 45 case TLS1_1_VE
1b60: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 RSION:..ver = "T
1b70: 4c 53 76 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b LSv1.1";..break;
1b80: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 32 . case TLS1_2
1b90: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d _VERSION:..ver =
1ba0: 20 22 54 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65 "TLSv1.2";..bre
1bb0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 ak;. case TLS
1bc0: 31 5f 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 1_3_VERSION:..ve
1bd0: 72 20 3d 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09 r = "TLSv1.3";..
1be0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1bf0: 30 3a 0a 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22 0:..ver = "none"
1c00: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 ;..break;. de
1c10: 66 61 75 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75 fault:..ver = "u
1c20: 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b nknown";..break;
1c30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 . }.. swit
1c40: 63 68 20 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65 ch (content_type
1c50: 29 20 7b 0a 20 20 20 20 63 61 73 65 20 53 53 4c ) {. case SSL
1c60: 33 5f 52 54 5f 48 45 41 44 45 52 3a 0a 09 74 79 3_RT_HEADER:..ty
1c70: 70 65 20 3d 20 22 48 65 61 64 65 72 22 3b 0a 09 pe = "Header";..
1c80: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1c90: 53 53 4c 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f SSL3_RT_INNER_CO
1ca0: 4e 54 45 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70 NTENT_TYPE:..typ
1cb0: 65 20 3d 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65 e = "Inner Conte
1cc0: 6e 74 20 54 79 70 65 22 3b 0a 09 62 72 65 61 6b nt Type";..break
1cd0: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f ;. case SSL3_
1ce0: 52 54 5f 43 48 41 4e 47 45 5f 43 49 50 48 45 52 RT_CHANGE_CIPHER
1cf0: 5f 53 50 45 43 3a 0a 09 74 79 70 65 20 3d 20 22 _SPEC:..type = "
1d00: 43 68 61 6e 67 65 20 43 69 70 68 65 72 22 3b 0a Change Cipher";.
1d10: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 .break;. case
1d20: 20 53 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a SSL3_RT_ALERT:.
1d30: 09 74 79 70 65 20 3d 20 22 41 6c 65 72 74 22 3b .type = "Alert";
1d40: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ..break;. cas
1d50: 65 20 53 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48 e SSL3_RT_HANDSH
1d60: 41 4b 45 3a 0a 09 74 79 70 65 20 3d 20 22 48 61 AKE:..type = "Ha
1d70: 6e 64 73 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b ndshake";..break
1d80: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f ;. case SSL3_
1d90: 52 54 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 RT_APPLICATION_D
1da0: 41 54 41 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 ATA:..type = "Ap
1db0: 70 20 44 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b p Data";..break;
1dc0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
1dd0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
1de0: 33 30 30 30 30 30 30 30 4c 0a 20 20 20 20 63 61 30000000L. ca
1df0: 73 65 20 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 se DTLS1_RT_HEAR
1e00: 54 42 45 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 TBEAT:..type = "
1e10: 48 65 61 72 74 62 65 61 74 22 3b 0a 09 62 72 65 Heartbeat";..bre
1e20: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 ak;.#endif. d
1e30: 65 66 61 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 efault:..type =
1e40: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d "unknown";. }
1e50: 0a 0a 20 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 .. /* Needs c
1e60: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 ompile time opti
1e70: 6f 6e 20 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 on "enable-ssl-t
1e80: 72 61 63 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 race". */. if
1e90: 20 28 28 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 ((bio = BIO_new
1ea0: 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 (BIO_s_mem())) !
1eb0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e = NULL) {..int n
1ec0: 3b 0a 09 53 53 4c 5f 74 72 61 63 65 28 77 72 69 ;..SSL_trace(wri
1ed0: 74 65 5f 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 te_p, version, c
1ee0: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 ontent_type, buf
1ef0: 2c 20 6c 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 , len, ssl, (voi
1f00: 64 20 2a 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 d *)bio);..n = B
1f10: 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 62 75 66 IO_read(bio, buf
1f20: 66 65 72 2c 20 42 49 4f 5f 70 65 6e 64 69 6e 67 fer, BIO_pending
1f30: 28 62 69 6f 29 20 3c 20 31 35 30 30 30 20 3f 20 (bio) < 15000 ?
1f40: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 BIO_pending(bio)
1f50: 20 3a 20 31 34 39 39 39 29 3b 0a 09 6e 20 3d 20 : 14999);..n =
1f60: 28 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09 (n<0) ? 0 : n;..
1f70: 62 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09 buffer[n] = 0;..
1f80: 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28 (void)BIO_flush(
1f90: 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28 bio);..BIO_free(
1fa0: 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20 bio);. }..
1fb0: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
1fc0: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 d to eval with f
1fd0: 6e 2c 20 63 68 61 6e 2c 20 64 69 72 65 63 74 69 n, chan, directi
1fe0: 6f 6e 2c 20 76 65 72 73 69 6f 6e 2c 20 74 79 70 on, version, typ
1ff0: 65 2c 20 61 6e 64 20 6d 65 73 73 61 67 65 20 61 e, and message a
2000: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 rgs */. cmdPt
2010: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
2020: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 eObj(statePtr->c
2030: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 allback);. Tc
2040: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2050: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
2060: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
2070: 72 69 6e 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 ringObj("message
2080: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
2090: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
20a0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
20b0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
20c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
20d0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
20e0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
20f0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
2100: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2110: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2120: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
2130: 4f 62 6a 28 77 72 69 74 65 5f 70 20 3f 20 22 53 Obj(write_p ? "S
2140: 65 6e 74 22 20 3a 20 22 52 65 63 65 69 76 65 64 ent" : "Received
2150: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
2160: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
2170: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
2180: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
2190: 69 6e 67 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 ingObj(ver, -1))
21a0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
21b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
21c0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
21d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
21e0: 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 type, -1));.
21f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2200: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2210: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
2220: 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 StringObj(buffer
2230: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 , -1));.. /*
2240: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
2250: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
2260: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
2270: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 dPtr);. EvalC
2280: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
2290: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
22a0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 );. Tcl_DecrR
22b0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
22c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 .}.#endif.../*.
22d0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2310: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 ----. *. * Verif
2320: 79 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a yCallback --. *.
2330: 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 *.Monitors SSL
2340: 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 certificate vali
2350: 64 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 dation process.
2360: 55 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 Used to control
2370: 74 68 65 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 the. *.behavior
2380: 77 68 65 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 when the SSL_VER
2390: 49 46 59 5f 50 45 45 52 20 66 6c 61 67 20 69 73 IFY_PEER flag is
23a0: 20 73 65 74 2e 20 54 68 69 73 20 69 73 20 63 61 set. This is ca
23b0: 6c 6c 65 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 lled. *.whenever
23c0: 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20 69 a certificate i
23d0: 73 20 69 6e 73 70 65 63 74 65 64 20 6f 72 20 64 s inspected or d
23e0: 65 63 69 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 ecided invalid.
23f0: 43 61 6c 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 Called for. *.ea
2400: 63 68 20 63 65 72 74 69 66 69 63 61 74 65 20 69 ch certificate i
2410: 6e 20 74 68 65 20 63 65 72 74 20 63 68 61 69 6e n the cert chain
2420: 2e 0a 20 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a .. *. * Checks:.
2430: 20 2a 09 54 68 65 20 63 65 72 74 69 66 69 63 61 *.The certifica
2440: 74 65 20 63 68 61 69 6e 20 69 73 20 63 68 65 63 te chain is chec
2450: 6b 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 ked starting wit
2460: 68 20 74 68 65 20 64 65 65 70 65 73 74 20 6e 65 h the deepest ne
2470: 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20 sting level. *.
2480: 20 28 74 68 65 20 72 6f 6f 74 20 43 41 20 63 65 (the root CA ce
2490: 72 74 69 66 69 63 61 74 65 29 20 61 6e 64 20 77 rtificate) and w
24a0: 6f 72 6b 65 64 20 75 70 77 61 72 64 20 74 6f 20 orked upward to
24b0: 74 68 65 20 70 65 65 72 27 73 20 63 65 72 74 69 the peer's certi
24c0: 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73 ficate.. *.All s
24d0: 69 67 6e 61 74 75 72 65 73 20 61 72 65 20 76 61 ignatures are va
24e0: 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 74 69 6d lid, current tim
24f0: 65 20 69 73 20 77 69 74 68 69 6e 20 66 69 72 73 e is within firs
2500: 74 20 61 6e 64 20 6c 61 73 74 20 76 61 6c 69 64 t and last valid
2510: 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65 ity time.. *.Che
2520: 63 6b 20 74 68 61 74 20 74 68 65 20 63 65 72 74 ck that the cert
2530: 69 66 69 63 61 74 65 20 69 73 20 69 73 73 75 65 ificate is issue
2540: 64 20 62 79 20 74 68 65 20 69 73 73 75 65 72 20 d by the issuer
2550: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73 75 certificate issu
2560: 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 er.. *.Check the
2570: 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 revocation stat
2580: 75 73 20 66 6f 72 20 65 61 63 68 20 63 65 72 74 us for each cert
2590: 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 68 65 63 ificate.. *.Chec
25a0: 6b 20 74 68 65 20 76 61 6c 69 64 69 74 79 20 6f k the validity o
25b0: 66 20 74 68 65 20 67 69 76 65 6e 20 43 52 4c 20 f the given CRL
25c0: 61 6e 64 20 74 68 65 20 63 65 72 74 20 72 65 76 and the cert rev
25d0: 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a ocation status..
25e0: 20 2a 09 43 68 65 63 6b 20 74 68 65 20 70 6f 6c *.Check the pol
25f0: 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 74 68 65 icies of all the
2600: 20 63 65 72 74 69 66 69 63 61 74 65 73 0a 20 2a certificates. *
2610: 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 72 65 76 . * Args. *.prev
2620: 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74 erify_ok indicat
2630: 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20 63 es whether the c
2640: 65 72 74 69 66 69 63 61 74 65 20 76 65 72 69 66 ertificate verif
2650: 69 63 61 74 69 6f 6e 20 70 61 73 73 65 64 20 28 ication passed (
2660: 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a 1) or not (0). *
2670: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
2680: 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 A callback bound
2690: 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20 6d to the socket m
26a0: 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 ay return one of
26b0: 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20 74 :. *. 0...- t
26c0: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69 he certificate i
26d0: 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69 64 s deemed invalid
26e0: 2c 20 73 65 6e 64 20 76 65 72 69 66 69 63 61 74 , send verificat
26f0: 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 61 69 6c ion. *.... fail
2700: 75 72 65 20 61 6c 65 72 74 20 74 6f 20 70 65 65 ure alert to pee
2710: 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 r, and terminate
2720: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 handshake.. *.
2730: 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65 72 1...- the cer
2740: 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d tificate is deem
2750: 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e ed valid, contin
2760: 75 65 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b ue with handshak
2770: 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 74 79 20 e.. *. empty
2780: 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e string.- no chan
2790: 67 65 20 74 6f 20 63 65 72 74 69 66 69 63 61 74 ge to certificat
27a0: 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a e validation. *.
27b0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
27c0: 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c . *.The err fiel
27d0: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 d of the current
27e0: 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 ly operative Sta
27f0: 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 te is set. *. t
2800: 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 o a string descr
2810: 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 ibing the SSL ne
2820: 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 gotiation failur
2830: 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d e reason. *. *--
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2880: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
2890: 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 .VerifyCallback(
28a0: 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f int ok, X509_STO
28b0: 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 RE_CTX *ctx) {.
28c0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
28d0: 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 tr;. SSL *s
28e0: 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 sl..= (SSL*)X509
28f0: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 _STORE_CTX_get_e
2900: 78 5f 64 61 74 61 28 63 74 78 2c 20 53 53 4c 5f x_data(ctx, SSL_
2910: 67 65 74 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 get_ex_data_X509
2920: 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 _STORE_CTX_idx()
2930: 29 3b 0a 20 20 20 20 58 35 30 39 20 20 2a 63 65 );. X509 *ce
2940: 72 74 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 rt..= X509_STORE
2950: 5f 43 54 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 _CTX_get_current
2960: 5f 63 65 72 74 28 63 74 78 29 3b 0a 20 20 20 20 _cert(ctx);.
2970: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 State *statePtr.
2980: 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 = (State*)SSL_ge
2990: 74 5f 61 70 70 5f 64 61 74 61 28 73 73 6c 29 3b t_app_data(ssl);
29a0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
29b0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
29c0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
29d0: 69 6e 74 20 64 65 70 74 68 09 09 3d 20 58 35 30 int depth..= X50
29e0: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 9_STORE_CTX_get_
29f0: 65 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78 29 error_depth(ctx)
2a00: 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 09 09 3d ;. int err..=
2a10: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f X509_STORE_CTX_
2a20: 67 65 74 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a get_error(ctx);.
2a30: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
2a40: 6c 6c 65 64 22 29 3b 0a 20 20 20 20 64 70 72 69 lled");. dpri
2a50: 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 ntf("VerifyCallb
2a60: 61 63 6b 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a ack: %d", ok);..
2a70: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
2a80: 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f ->vcmd == (Tcl_O
2a90: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 bj*)NULL) {../*
2aa0: 55 73 65 20 6f 6b 20 76 61 6c 75 65 20 69 66 20 Use ok value if
2ab0: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 73 20 verification is
2ac0: 72 65 71 75 69 72 65 64 20 2a 2f 0a 09 69 66 20 required */..if
2ad0: 28 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 (statePtr->vflag
2ae0: 73 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 s & SSL_VERIFY_F
2af0: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 AIL_IF_NO_PEER_C
2b00: 45 52 54 29 20 7b 0a 09 20 20 20 20 72 65 74 75 ERT) {.. retu
2b10: 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b rn ok;..} else {
2b20: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a .. return 1;.
2b30: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 .}. } else if
2b40: 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c (cert == NULL |
2b50: 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b | ssl == NULL) {
2b60: 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 ..return 0;.
2b70: 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 }.. dprintf("
2b80: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 VerifyCallback:
2b90: 65 76 61 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b eval callback");
2ba0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
2bb0: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
2bc0: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 with fn, chan, d
2bd0: 65 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 epth, cert info
2be0: 6c 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e list, status, an
2bf0: 64 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a d error args */.
2c00: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
2c10: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
2c20: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 atePtr->vcmd);.
2c30: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2c40: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2c50: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
2c60: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 NewStringObj("ve
2c70: 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 rify", -1));.
2c80: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2c90: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2ca0: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e , cmdPtr,..Tcl_N
2cb0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
2cc0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
2cd0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
2ce0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
2cf0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2d00: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2d10: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a r, Tcl_NewIntObj
2d20: 28 64 65 70 74 68 29 29 3b 0a 20 20 20 20 54 63 (depth));. Tc
2d30: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2d40: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
2d50: 6d 64 50 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 mdPtr, Tls_NewX5
2d60: 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 09Obj(interp, ce
2d70: 72 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 rt));. Tcl_Li
2d80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2d90: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2da0: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a r, Tcl_NewIntObj
2db0: 28 6f 6b 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c (ok));. Tcl_L
2dc0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2dd0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2de0: 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 tr,..Tcl_NewStri
2df0: 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 58 35 30 ngObj((char*)X50
2e00: 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 9_verify_cert_er
2e10: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c ror_string(err),
2e20: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 -1));.. /* P
2e30: 72 65 76 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 revent I/O while
2e40: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 callback is in
2e50: 70 72 6f 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 progress */.
2e60: 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 /* statePtr->fla
2e70: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 gs |= TLS_TCL_CA
2e80: 4c 4c 42 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 LLBACK; */..
2e90: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
2ea0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
2eb0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
2ec0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b (cmdPtr);. ok
2ed0: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 = EvalCallback(
2ee0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
2ef0: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 , cmdPtr);. T
2f00: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
2f10: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 64 70 cmdPtr);.. dp
2f20: 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c rintf("VerifyCal
2f30: 6c 62 61 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72 lback: command r
2f40: 65 73 75 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29 esult = %d", ok)
2f50: 3b 0a 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 ;.. /* stateP
2f60: 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 tr->flags &= ~(T
2f70: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 LS_TCL_CALLBACK)
2f80: 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 ; */. return
2f90: 6f 6b 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c ok;./* By defaul
2fa0: 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 t, leave verific
2fb0: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e ation unchanged.
2fc0: 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3010: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 . *. * Tls_Error
3020: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 --. *. *.Calls
3030: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 65 72 callback with er
3040: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a ror message.. *.
3050: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
3060: 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c . *.The err fiel
3070: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 d of the current
3080: 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 ly operative Sta
3090: 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 te is set. *. t
30a0: 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 o a string descr
30b0: 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 ibing the SSL ne
30c0: 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 gotiation failur
30d0: 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d e reason. *. *--
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3120: 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 -. */.void.Tls_E
3130: 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 rror(State *stat
3140: 65 50 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 ePtr, const char
3150: 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c *msg) {. Tcl
3160: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
3170: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
3180: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
3190: 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50 74 *cmdPtr, *listPt
31a0: 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 r;. unsigned
31b0: 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20 73 74 long err;. st
31c0: 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 atePtr->err = ms
31d0: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 g;.. dprintf(
31e0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
31f0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 if (statePtr->ca
3200: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f llback == (Tcl_O
3210: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 bj*)NULL)..retur
3220: 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 n;.. /* Creat
3230: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
3240: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c l with fn, chan,
3250: 20 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 and message arg
3260: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 s */. cmdPtr
3270: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
3280: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c bj(statePtr->cal
3290: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f lback);. Tcl_
32a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
32b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
32c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
32d0: 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d ngObj("error", -
32e0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
32f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3300: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3310: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
3320: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
3330: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
3340: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
3350: 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20 21 3d ;. if (msg !=
3360: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 NULL) {..Tcl_Li
3370: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
3380: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
3390: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
33a0: 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a Obj(msg, -1));..
33b0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28 } else if ((
33c0: 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 msg = Tcl_GetStr
33d0: 69 6e 67 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 ing(Tcl_GetObjRe
33e0: 73 75 6c 74 28 69 6e 74 65 72 70 29 29 29 20 21 sult(interp))) !
33f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c = NULL) {..Tcl_L
3400: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
3410: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
3420: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
3430: 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a gObj(msg, -1));.
3440: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c . } else {..l
3450: 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 istPtr = Tcl_New
3460: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
3470: 3b 0a 09 77 68 69 6c 65 20 28 28 65 72 72 20 3d ;..while ((err =
3480: 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 ERR_get_error()
3490: 29 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 ) != 0) {.. T
34a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
34b0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
34c0: 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 listPtr, Tcl_New
34d0: 53 74 72 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 StringObj(ERR_re
34e0: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e ason_error_strin
34f0: 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d g(err), -1));..}
3500: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
3510: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
3520: 70 2c 20 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 p, cmdPtr, listP
3530: 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 tr);. }..
3540: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
3550: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
3560: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
3570: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 (cmdPtr);. Ev
3580: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 alCallback(inter
3590: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 p, statePtr, cmd
35a0: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 Ptr);. Tcl_De
35b0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
35c0: 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d r);.}.../*. *---
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3610: 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c . *. * KeyLogCal
3620: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 lback --. *. *.W
3630: 72 69 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 rite received ke
3640: 79 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 y data to log fi
3650: 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 le.. *. * Side e
3660: 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a ffects:. *.none.
3670: 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 --------. */.voi
36c0: 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b d KeyLogCallback
36d0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c (const SSL *ssl,
36e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e const char *lin
36f0: 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 e) {. char *s
3700: 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b tr = getenv(SSLK
3710: 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 EYLOGFILE);.
3720: 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 FILE *fd;.. d
3730: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
3740: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 72 29 20 ;.. if (str)
3750: 7b 0a 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 {..fd = fopen(st
3760: 72 2c 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 r, "a");..fprint
3770: 66 28 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e f(fd, "%s\n",lin
3780: 65 29 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b e);..fclose(fd);
3790: 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a . }.}.../*. *
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37e0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f ---. *. * Passwo
37f0: 72 64 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 rd Callback --.
3800: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e *. *.Called when
3810: 20 61 20 70 61 73 73 77 6f 72 64 20 69 73 20 6e a password is n
3820: 65 65 64 65 64 20 66 6f 72 20 61 20 70 72 69 76 eeded for a priv
3830: 61 74 65 20 6b 65 79 20 77 68 65 6e 20 6c 6f 61 ate key when loa
3840: 64 69 6e 67 0a 20 2a 09 6f 72 20 73 74 6f 72 69 ding. *.or stori
3850: 6e 67 20 61 20 50 45 4d 20 63 65 72 74 69 66 69 ng a PEM certifi
3860: 63 61 74 65 20 77 69 74 68 20 65 6e 63 72 79 70 cate with encryp
3870: 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 6c 6c tion. Evals call
3880: 62 61 63 6b 0a 20 2a 09 73 63 72 69 70 74 20 61 back. *.script a
3890: 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 nd returns the r
38a0: 65 73 75 6c 74 20 61 73 20 74 68 65 20 70 61 73 esult as the pas
38b0: 73 77 6f 72 64 20 73 74 72 69 6e 67 20 69 6e 20 sword string in
38c0: 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c buf.. *. * Resul
38d0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
38e0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
38f0: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
3900: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
3910: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
3920: 09 50 61 73 73 77 6f 72 64 20 73 69 7a 65 20 69 .Password size i
3930: 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 20 66 6f n bytes or -1 fo
3940: 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 r an error.. *.
3950: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3990: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
39a0: 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c int.PasswordCall
39b0: 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 back(char *buf,
39c0: 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 72 77 int size, int rw
39d0: 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 61 74 flag, void *udat
39e0: 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a a) {. State *
39f0: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 statePtr.= (Stat
3a00: 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 e *) udata;.
3a10: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
3a20: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
3a30: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
3a40: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
3a50: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 54 63 int code;. Tc
3a60: 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 0a 20 20 20 l_Size len;..
3a70: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
3a80: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e ");.. /* If n
3a90: 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 o callback, use
3aa0: 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b default callback
3ab0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
3ac0: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d ePtr->password =
3ad0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 = NULL) {..if (T
3ae0: 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 cl_EvalEx(interp
3af0: 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 , "tls::password
3b00: 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f ", -1, TCL_EVAL_
3b10: 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f GLOBAL) == TCL_O
3b20: 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a K) {.. char *
3b30: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 ret = (char *) T
3b40: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
3b50: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 Obj(Tcl_GetObjRe
3b60: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c sult(interp), &l
3b70: 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 en);.. if (le
3b80: 6e 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 n > (Tcl_Size) s
3b90: 69 7a 65 2d 31 29 20 7b 0a 09 09 6c 65 6e 20 3d ize-1) {...len =
3ba0: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 (Tcl_Size) size
3bb0: 2d 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 -1;.. }..
3bc0: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 strncpy(buf, ret
3bd0: 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b , (size_t) len);
3be0: 0a 09 20 20 20 20 62 75 66 5b 6c 65 6e 5d 20 3d .. buf[len] =
3bf0: 20 27 5c 30 27 3b 0a 09 20 20 20 20 72 65 74 75 '\0';.. retu
3c00: 72 6e 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d rn (int) len;..}
3c10: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 else {.. ret
3c20: 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d urn -1;..}. }
3c30: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
3c40: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
3c50: 77 69 74 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c with fn, rwflag,
3c60: 20 61 6e 64 20 73 69 7a 65 20 61 72 67 73 20 2a and size args *
3c70: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
3c80: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
3c90: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
3ca0: 72 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 rd);. Tcl_Lis
3cb0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3cc0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3cd0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
3ce0: 62 6a 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d bj("password", -
3cf0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
3d00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3d10: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3d20: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
3d30: 72 77 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 rwflag));. Tc
3d40: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3d50: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
3d60: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e mdPtr, Tcl_NewIn
3d70: 74 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 tObj(size));..
3d80: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
3d90: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
3da0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 rp);. Tcl_Pre
3db0: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 serve((ClientDat
3dc0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 a) statePtr);..
3dd0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 /* Eval callb
3de0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 ack command */.
3df0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
3e00: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
3e10: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c code = Tcl_Eval
3e20: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d ObjEx(interp, cm
3e30: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 dPtr, TCL_EVAL_G
3e40: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 LOBAL);. if (
3e50: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 code != TCL_OK)
3e60: 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 {.#if (TCL_MAJOR
3e70: 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 _VERSION == 8) &
3e80: 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 & (TCL_MINOR_VER
3e90: 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 SION < 6)..Tcl_B
3ea0: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 ackgroundError(i
3eb0: 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 nterp);.#else..T
3ec0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 cl_BackgroundExc
3ed0: 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 eption(interp, c
3ee0: 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 ode);.#endif.
3ef0: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 }. Tcl_DecrR
3f00: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
3f10: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 .. Tcl_Releas
3f20: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
3f30: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f tatePtr);.. /
3f40: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c * If successful,
3f50: 20 70 61 73 73 20 62 61 63 6b 20 70 61 73 73 77 pass back passw
3f60: 6f 72 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74 ord string and t
3f70: 72 75 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c runcate if too l
3f80: 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 ong */. if (c
3f90: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b ode == TCL_OK) {
3fa0: 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 ..char *ret = (c
3fb0: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 har *) Tcl_GetSt
3fc0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f ringFromObj(Tcl_
3fd0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 GetObjResult(int
3fe0: 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 erp), &len);..if
3ff0: 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a (len > (Tcl_Siz
4000: 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20 e) size-1) {..
4010: 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a len = (Tcl_Siz
4020: 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73 e) size-1;..}..s
4030: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c trncpy(buf, ret,
4040: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a (size_t) len);.
4050: 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 .buf[len] = '\0'
4060: 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 ;..Tcl_Release((
4070: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
4080: 72 70 29 3b 0a 09 72 65 74 75 72 6e 20 28 69 6e rp);..return (in
4090: 74 29 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 t) len;. }.
40a0: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 Tcl_Release((C
40b0: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 lientData) inter
40c0: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d p);. return -
40d0: 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 1;.}.../*. *----
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4120: 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 *. * Session Ca
4130: 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e llback for Clien
4140: 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c ts --. *. *.Call
4150: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 73 65 ed when a new se
4160: 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 ssion is added t
4170: 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49 6e 20 o the cache. In
4180: 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 TLS 1.3. *.this
4190: 6d 61 79 20 62 65 20 72 65 63 65 69 76 65 64 20 may be received
41a0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 multiple times a
41b0: 66 74 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 fter the handsha
41c0: 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 ke. For. *.earli
41d0: 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 er versions, thi
41e0: 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69 76 s will be receiv
41f0: 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 68 61 ed during the ha
4200: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 ndshake.. *.This
4210: 20 69 73 20 74 68 65 20 70 72 65 66 65 72 72 65 is the preferre
4220: 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 d way to obtain
4230: 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65 73 73 a resumable sess
4240: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ion.. *. * Resul
4250: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
4260: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
4270: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
4280: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
4290: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 *. * Return code
42a0: 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 s:. *.0 = error
42b0: 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20 77 69 where session wi
42c0: 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c ll be immediatel
42d0: 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 y removed from t
42e0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 he internal cach
42f0: 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 65 73 e.. *.1 = succes
4300: 73 20 77 68 65 72 65 20 61 70 70 20 72 65 74 61 s where app reta
4310: 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 ins session in s
4320: 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e ession cache, an
4330: 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f d must call SSL_
4340: 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 SESSION_free() w
4350: 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d hen done.. *. *-
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43a0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
43b0: 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 t.SessionCallbac
43c0: 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f k(SSL *ssl, SSL_
43d0: 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e SESSION *session
43e0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
43f0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
4400: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 *)SSL_get_app_da
4410: 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a ta((SSL *)ssl);.
4420: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
4430: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
4440: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
4450: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
4460: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
4470: 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b ed char *ticket;
4480: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
4490: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f ned char *sessio
44a0: 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 n_id;. size_t
44b0: 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 len2;. unsig
44c0: 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 ned int ulen;..
44d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
44e0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
44f0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
4500: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e k == (Tcl_Obj*)N
4510: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
4520: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
4530: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
4540: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl == NULL) {.
4550: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
4560: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
4570: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
4580: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
4590: 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e al with fn, chan
45a0: 2c 20 73 65 73 73 69 6f 6e 20 69 64 2c 20 73 65 , session id, se
45b0: 73 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61 6e ssion ticket, an
45c0: 64 20 6c 69 66 65 74 69 6d 65 20 61 72 67 73 20 d lifetime args
45d0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 */. cmdPtr =
45e0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
45f0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
4600: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 ack);. Tcl_Li
4610: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4620: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4630: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
4640: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d Obj("session", -
4650: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
4660: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4670: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
4680: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
4690: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
46a0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
46b0: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
46c0: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f ;.. /* Sessio
46d0: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 n id */. sess
46e0: 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 ion_id = SSL_SES
46f0: 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 SION_get_id(sess
4700: 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 ion, &ulen);.
4710: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4720: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4730: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
4740: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 wByteArrayObj(se
4750: 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 ssion_id, (Tcl_S
4760: 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 ize) ulen));..
4770: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 /* Session tic
4780: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 ket */. SSL_S
4790: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b ESSION_get0_tick
47a0: 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 et(session, &tic
47b0: 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 ket, &len2);.
47c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
47d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
47e0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
47f0: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 wByteArrayObj(ti
4800: 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 cket, (Tcl_Size)
4810: 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a len2));.. /*
4820: 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 Lifetime - numb
4830: 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f er of seconds */
4840: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4850: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4860: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 terp, cmdPtr,..T
4870: 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c cl_NewLongObj((l
4880: 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e ong) SSL_SESSION
4890: 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 _get_ticket_life
48a0: 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f time_hint(sessio
48b0: 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 n)));.. /* Ev
48c0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
48d0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
48e0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
48f0: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c tr);. EvalCal
4900: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
4910: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b atePtr, cmdPtr);
4920: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
4930: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a Count(cmdPtr);..
4940: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 30 20 /* Return 0
4950: 66 6f 72 20 6e 6f 77 20 75 6e 74 69 6c 20 73 65 for now until se
4960: 73 73 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 69 ssion handling i
4970: 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 s complete */.
4980: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a return 0;.}...
4990: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 --------. *. * A
49e0: 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 LPN Callback for
49f0: 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e Servers and NPN
4a00: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c Callback for Cl
4a10: 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 ients --. *. *.P
4a20: 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 erform protocol
4a30: 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 (http/1.1, h2, h
4a40: 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69 3, etc.) selecti
4a50: 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e on for the. *.in
4a60: 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f coming connectio
4a70: 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 n. Called after
4a80: 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 Hello and server
4a90: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 callbacks.. *.W
4aa0: 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65 here 'out' is se
4ab0: 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
4ac0: 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20 and 'in' is the
4ad0: 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20 peer advertised
4ae0: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 list.. *. * Resu
4af0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
4b00: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
4b10: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
4b20: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
4b30: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
4b40: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es:. *.SSL_TLSEX
4b50: 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 T_ERR_OK: ALPN p
4b60: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
4b70: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
4b80: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 continues.. *.S
4b90: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
4ba0: 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 ERT_FATAL: There
4bb0: 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 was no overlap
4bc0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 between the clie
4bd0: 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 nt's. *. supp
4be0: 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 lied list and th
4bf0: 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 e server configu
4c00: 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e ration. The conn
4c10: 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 ection will be a
4c20: 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 borted.. *.SSL_T
4c30: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a LSEXT_ERR_NOACK:
4c40: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e ALPN protocol n
4c50: 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 ot selected, e.g
4c60: 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c ., because no AL
4c70: 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 PN. *. protoc
4c80: 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 ols are configur
4c90: 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e ed for this conn
4ca0: 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e ection. The conn
4cb0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
4cc0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
4d10: 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 tatic int.ALPNCa
4d20: 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c llback(SSL *ssl,
4d30: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
4d40: 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 char **out, unsi
4d50: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 gned char *outle
4d60: 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e n,..const unsign
4d70: 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 ed char *in, uns
4d80: 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c igned int inlen,
4d90: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 void *arg) {.
4da0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
4db0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b r = (State*)arg;
4dc0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
4dd0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
4de0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
4df0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
4e00: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 . int code, r
4e10: 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 es;.. dprintf
4e20: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
4e30: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
4e40: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 || arg == NULL)
4e50: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
4e60: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
4e70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
4e80: 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a elect protocol *
4e90: 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65 /. if (SSL_se
4ea0: 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 lect_next_proto(
4eb0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a (unsigned char *
4ec0: 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 *) out, outlen,
4ed0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
4ee0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 , statePtr->prot
4ef0: 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c os_len,..in, inl
4f00: 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e en) == OPENSSL_N
4f10: 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b PN_NEGOTIATED) {
4f20: 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 ../* Match found
4f30: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 */..res = SSL_T
4f40: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 LSEXT_ERR_OK;.
4f50: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f } else {../* O
4f60: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 PENSSL_NPN_NO_OV
4f70: 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c ERLAP = No overl
4f80: 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 ap, so use first
4f90: 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e item from clien
4fa0: 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 t protocol list
4fb0: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c */..res = SSL_TL
4fc0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4fd0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
4fe0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d tatePtr->vcmd ==
4ff0: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 (Tcl_Obj*)NULL)
5000: 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a {..return res;.
5010: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
5020: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
5030: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 eval with fn, ch
5040: 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20 an, depth, cert
5050: 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75 info list, statu
5060: 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67 s, and error arg
5070: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 s */. cmdPtr
5080: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
5090: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d bj(statePtr->vcm
50a0: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 d);. Tcl_List
50b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
50c0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
50d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
50e0: 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a j("alpn", -1));.
50f0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
5100: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
5110: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
5120: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
5130: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
5140: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
5150: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
5160: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5170: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5180: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
5190: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e 73 wStringObj((cons
51a0: 74 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c 20 t char *) *out,
51b0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
51c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
51d0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
51e0: 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 r, Tcl_NewBoolea
51f0: 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f nObj(res == SSL_
5200: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b TLSEXT_ERR_OK));
5210: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
5220: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
5230: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
5240: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
5250: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 if ((code =
5260: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
5270: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
5280: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 mdPtr)) > 1) {..
5290: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
52a0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
52b0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 } else if (code
52c0: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 1) {..res = S
52d0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
52e0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
52f0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
5300: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
5310: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
5320: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
5330: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
5340: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d res;.}.../*. *-
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5390: 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 --. *. * Adverti
53a0: 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c se Protocols Cal
53b0: 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 lback for Next P
53c0: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 rotocol Negotiat
53d0: 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 ion (NPN) in Ser
53e0: 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 verHello --. *.
53f0: 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 *.called when a
5400: 54 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 73 TLS server needs
5410: 20 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f a list of suppo
5420: 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 rted protocols f
5430: 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f or Next. *.Proto
5440: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e col Negotiation.
5450: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
5460: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
5470: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 de effects:. *.
5480: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
5490: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
54a0: 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 R_OK: NPN protoc
54b0: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 ol selected. The
54c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
54d0: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c inues.. *.SSL_TL
54e0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 SEXT_ERR_NOACK:
54f0: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 NPN protocol not
5500: 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 selected. The c
5510: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
5520: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ues.. *. *------
5530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
5570: 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e /.#ifdef USE_NPN
5580: 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 .static int.NPNC
5590: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
55a0: 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e L *ssl, const un
55b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 signed char **ou
55c0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 t, unsigned int
55d0: 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 *outlen, void *a
55e0: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 rg) {. State
55f0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
5600: 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 te*)arg;.. dp
5610: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
5620: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d .. if (ssl ==
5630: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 NULL || arg ==
5640: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
5650: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
5660: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 OACK;. }..
5670: 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c /* Set protocol
5680: 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 s list */. if
5690: 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 (statePtr->prot
56a0: 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a os != NULL) {..*
56b0: 6f 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e out = statePtr->
56c0: 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e protos;..*outlen
56d0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f = statePtr->pro
56e0: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 tos_len;. } e
56f0: 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 lse {..*out = NU
5700: 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 LL;..*outlen = 0
5710: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c ;..return SSL_TL
5720: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
5730: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
5740: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5750: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f OK;.}.#endif.../
5760: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e -------. *. * SN
57b0: 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 I Callback for S
57c0: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 ervers --. *. *.
57d0: 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 Perform server-s
57e0: 69 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 ide SNI hostname
57f0: 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 selection after
5800: 20 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65 receiving SNI e
5810: 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 xtension. *.in C
5820: 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c lient Hello. Cal
5830: 6c 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 led after hello
5840: 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66 callback but bef
5850: 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 ore ALPN callbac
5860: 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 k.. *. * Results
5870: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.None. *. *
5880: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
5890: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 .Calls callback
58a0: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a (if defined). *.
58b0: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a * Return codes:
58c0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
58d0: 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e RR_OK: SNI hostn
58e0: 61 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e ame is accepted.
58f0: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
5900: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
5910: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 L_TLSEXT_ERR_ALE
5920: 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f RT_FATAL: SNI ho
5930: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 stname is not ac
5940: 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e cepted. The conn
5950: 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 ection. *. is
5960: 20 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c aborted. Defaul
5970: 74 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53 t for alert is S
5980: 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a SL_AD_UNRECOGNIZ
5990: 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f ED_NAME.. *.SSL_
59a0: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 TLSEXT_ERR_ALERT
59b0: 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f _WARNING: SNI ho
59c0: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 stname is not ac
59d0: 63 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 cepted, warning
59e0: 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e alert. *. sen
59f0: 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 t (not supported
5a00: 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 in TLSv1.3). Th
5a10: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
5a20: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 tinues.. *.SSL_T
5a30: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a LSEXT_ERR_NOACK:
5a40: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 SNI hostname is
5a50: 20 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e not accepted an
5a60: 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 d not acknowledg
5a70: 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 ed,. *. e.g.
5a80: 69 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 if SNI has not b
5a90: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 een configured.
5aa0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
5ab0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d ontinues.. *. *-
5ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b00: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
5b10: 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f t.SNICallback(co
5b20: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e nst SSL *ssl, in
5b30: 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a t *alert, void *
5b40: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 arg) {. State
5b50: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
5b60: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 ate*)arg;. Tc
5b70: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
5b80: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
5b90: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
5ba0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e *cmdPtr;. in
5bb0: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 t code, res;.
5bc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72 const char *ser
5bd0: 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a vername = NULL;.
5be0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
5bf0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
5c00: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 (ssl == NULL ||
5c10: 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 arg == NULL) {..
5c20: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
5c30: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
5c40: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 }.. /* Only
5c50: 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e works for TLS 1.
5c60: 32 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 2 and earlier */
5c70: 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 . servername
5c80: 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 = SSL_get_server
5c90: 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 name(ssl, TLSEXT
5ca0: 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e _NAMETYPE_host_n
5cb0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 ame);. if (!s
5cc0: 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 ervername || ser
5cd0: 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c vername[0] == '\
5ce0: 30 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 0') {..return SS
5cf0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
5d00: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 CK;. }.. i
5d10: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d f (statePtr->vcm
5d20: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e d == (Tcl_Obj*)N
5d30: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
5d40: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
5d50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
5d60: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
5d70: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
5d80: 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 chan, and server
5d90: 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 name args */.
5da0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
5db0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
5dc0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
5dd0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5de0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5df0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
5e00: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 wStringObj("sni"
5e10: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
5e20: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5e30: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
5e40: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
5e50: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 wStringObj(Tcl_G
5e60: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
5e70: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d atePtr->self), -
5e80: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
5e90: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
5ea0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
5eb0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
5ec0: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 bj(servername ,
5ed0: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 -1));.. /* Ev
5ee0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
5ef0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
5f00: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
5f10: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f tr);. if ((co
5f20: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 de = EvalCallbac
5f30: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 k(interp, stateP
5f40: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 tr, cmdPtr)) > 1
5f50: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 ) {..res = SSL_T
5f60: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
5f70: 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 WARNING;..*alert
5f80: 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f = SSL_AD_UNRECO
5f90: 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 GNIZED_NAME; /*
5fa0: 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 Not supported by
5fb0: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 TLS 1.3 */.
5fc0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 } else if (code
5fd0: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 1) {..res = S
5fe0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
5ff0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
6000: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
6010: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
6020: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f ;..*alert = SSL_
6030: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f AD_UNRECOGNIZED_
6040: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 NAME; /* Not sup
6050: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e ported by TLS 1.
6060: 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 3 */. }. T
6070: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
6080: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 cmdPtr);. ret
6090: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a urn res;.}.../*.
60a0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
60b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60e0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 -----. *. * Clie
60f0: 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b ntHello Handshak
6100: 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 e Callback for S
6110: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 ervers --. *. *.
6120: 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74 Used by server t
6130: 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65 o examine the se
6140: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 rver name indica
6150: 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e tion (SNI) exten
6160: 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 sion. *.provided
6170: 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69 by the client i
6180: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63 n order to selec
6190: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 t an appropriate
61a0: 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a certificate to.
61b0: 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 *.present, and
61c0: 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 make other confi
61d0: 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d guration adjustm
61e0: 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f ents relevant to
61f0: 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09 that server. *.
6200: 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e name and its con
6210: 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 figuration. This
6220: 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69 includes swappi
6230: 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63 ng out the assoc
6240: 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 iated. *.SSL_CTX
6250: 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 pointer, modify
6260: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 ing the server's
6270: 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74 list of permitt
6280: 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c ed TLS versions,
6290: 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65 . *.changing the
62a0: 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72 server's cipher
62b0: 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 list in respons
62c0: 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 e to the client'
62d0: 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65 s cipher list, e
62e0: 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65 tc.. *.Called be
62f0: 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50 fore SNI and ALP
6300: 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a N callbacks.. *.
6310: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
6320: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
6330: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
6340: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
6350: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 fined). *. * Ret
6360: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
6370: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 L_CLIENT_HELLO_R
6380: 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68 ETRY: suspend th
6390: 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 e handshake, and
63a0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 the handshake f
63b0: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 unction will ret
63c0: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a urn immediately.
63d0: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 *.SSL_CLIENT_HE
63e0: 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75 LLO_ERROR: failu
63f0: 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f re, terminate co
6400: 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c nnection. Set al
6410: 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 ert to error cod
6420: 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 e.. *.SSL_CLIENT
6430: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20 _HELLO_SUCCESS:
6440: 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d success. *. *---
6450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6490: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
64a0: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 53 HelloCallback(SS
64b0: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
64c0: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
64d0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
64e0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
64f0: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
6500: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
6510: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
6520: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
6530: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
6540: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 , res;. const
6550: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
6560: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 e;. const uns
6570: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 igned char *p;.
6580: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 size_t len, r
6590: 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 emaining;.. d
65a0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
65b0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
65c0: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 Ptr->vcmd == (Tc
65d0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
65e0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
65f0: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b T_HELLO_SUCCESS;
6600: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
6610: 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 ssl == (const SS
6620: 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 L *)NULL || arg
6630: 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 == (void *)NULL)
6640: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 {..return SSL_C
6650: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
6660: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
6670: 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 Get names */.
6680: 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e if (!SSL_clien
6690: 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 t_hello_get0_ext
66a0: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 (ssl, TLSEXT_TYP
66b0: 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 E_server_name, &
66c0: 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c p, &remaining) |
66d0: 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 | remaining <= 2
66e0: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 ) {..*alert = SS
66f0: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f L_R_SSLV3_ALERT_
6700: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 ILLEGAL_PARAMETE
6710: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 R;..return SSL_C
6720: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
6730: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
6740: 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e Extract the len
6750: 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c gth of the suppl
6760: 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 ied list of name
6770: 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 s. */. len =
6780: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 (*(p++) << 8);.
6790: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 len += *(p++)
67a0: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 ;. if (len +
67b0: 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 2 != remaining)
67c0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
67d0: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c R_SSLV3_ALERT_IL
67e0: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b LEGAL_PARAMETER;
67f0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 ..return SSL_CLI
6800: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b ENT_HELLO_ERROR;
6810: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 . }. remai
6820: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 ning = len;..
6830: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 /* The list in
6840: 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 practice only ha
6850: 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 s a single eleme
6860: 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 nt, so we only c
6870: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 onsider the firs
6880: 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 t one. */. if
6890: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 (remaining == 0
68a0: 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 || *p++ != TLSE
68b0: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 XT_NAMETYPE_host
68c0: 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 _name) {..*alert
68d0: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
68e0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
68f0: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c ROR;..return SSL
6900: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
6910: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ROR;. }. r
6920: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 emaining--;..
6930: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 /* Now we can f
6940: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 inally pull out
6950: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 the byte array w
6960: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 ith the actual h
6970: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 ostname. */.
6980: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d if (remaining <=
6990: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 2) {..*alert =
69a0: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
69b0: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 T_INTERNAL_ERROR
69c0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
69d0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
69e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 ;. }. len
69f0: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b = (*(p++) << 8);
6a00: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b . len += *(p+
6a10: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 +);. if (len
6a20: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 + 2 > remaining)
6a30: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
6a40: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
6a50: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 NTERNAL_ERROR;..
6a60: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
6a70: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
6a80: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
6a90: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 ng = len;. se
6aa0: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 rvername = (cons
6ab0: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 t char *)p;..
6ac0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
6ad0: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 nd to eval with
6ae0: 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 fn, chan, and se
6af0: 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a rver name args *
6b00: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
6b10: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
6b20: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
6b30: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
6b40: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
6b50: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
6b60: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
6b70: 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 hello", -1));.
6b80: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
6b90: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
6ba0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
6bb0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
6bc0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
6bd0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
6be0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 lf), -1));. T
6bf0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
6c00: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
6c10: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
6c20: 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e tringObj(servern
6c30: 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 ame, (Tcl_Size)
6c40: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 len));.. /* E
6c50: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d val callback com
6c60: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f mand */. Tcl_
6c70: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
6c80: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 Ptr);. if ((c
6c90: 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 ode = EvalCallba
6ca0: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 ck(interp, state
6cb0: 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 Ptr, cmdPtr)) >
6cc0: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 1) {..res = SSL_
6cd0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 CLIENT_HELLO_RET
6ce0: 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 RY;..*alert = SS
6cf0: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f L_R_TLSV1_ALERT_
6d00: 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a USER_CANCELLED;.
6d10: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
6d20: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 ode == 1) {..res
6d30: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 = SSL_CLIENT_HE
6d40: 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 LLO_SUCCESS;.
6d50: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
6d60: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
6d70: 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 O_ERROR;..*alert
6d80: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
6d90: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
6da0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 ROR;. }. T
6db0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
6dc0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 cmdPtr);. ret
6dd0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a urn res;.}.../**
6de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6df0: 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 **/./* Commands
6e00: 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a */./****
6e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6e20: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d /../*. *--------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
6e70: 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 * CiphersObjCmd
6e80: 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c -- list availabl
6e90: 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 e ciphers. *. *.
6ea0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
6eb0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
6ec0: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 cess the "tls::c
6ed0: 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a iphers" command.
6ee0: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c *.to list avail
6ef0: 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 able ciphers, ba
6f00: 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f sed upon protoco
6f10: 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 l selected.. *.
6f20: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
6f30: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
6f40: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 ult list.. *. *
6f50: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
6f60: 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 .constructs and
6f70: 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e destroys SSL con
6f80: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a text (CTX). *. *
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fd0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 ---. */.static c
6fe0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f onst char *proto
6ff0: 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c cols[] = {.."ssl
7000: 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 2", "ssl3", "tls
7010: 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 1", "tls1.1", "t
7020: 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 ls1.2", "tls1.3"
7030: 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 , NULL.};.enum p
7040: 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c rotocol {. TL
7050: 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 S_SSL2, TLS_SSL3
7060: 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f , TLS_TLS1, TLS_
7070: 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 TLS1_1, TLS_TLS1
7080: 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 _2, TLS_TLS1_3,
7090: 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 TLS_NONE.};..sta
70a0: 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f tic int.CiphersO
70b0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
70c0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
70d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
70e0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
70f0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
7100: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 ) {. Tcl_Obj
7110: 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a *objPtr = NULL;.
7120: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 SSL_CTX *ctx
7130: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c = NULL;. SSL
7140: 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *ssl = NULL;.
7150: 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 STACK_OF(SSL_C
7160: 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 IPHER) *sk;.
7170: 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d char buf[BUFSIZ]
7180: 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c ;. int index,
7190: 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 verbose = 0, us
71a0: 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b e_supported = 0;
71b0: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d . const SSL_M
71c0: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 20 ETHOD *method;.
71d0: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 (void) client
71e0: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e Data;.. dprin
71f0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
7200: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 if ((objc < 2
7210: 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 ) || (objc > 4))
7220: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
7230: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
7240: 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 objv, "protocol
7250: 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f ?verbose? ?suppo
7260: 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e rted?");..return
7270: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
7280: 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 }. if (Tcl_Ge
7290: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e tIndexFromObj(in
72a0: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 terp, objv[1], p
72b0: 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f rotocols, "proto
72c0: 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 col", 0, &index)
72d0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
72e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
72f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 . }. if ((
7300: 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63 6c objc > 2) && Tcl
7310: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f _GetBooleanFromO
7320: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
7330: 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d 2], &verbose) !=
7340: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
7350: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7360: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a }. if ((obj
7370: 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 65 c > 3) && Tcl_Ge
7380: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 tBooleanFromObj(
7390: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c interp, objv[3],
73a0: 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 &use_supported)
73b0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
73c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
73d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
73e0: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
73f0: 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 switch ((enu
7400: 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 m protocol)index
7410: 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 ) {..case TLS_SS
7420: 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f L2:.#if OPENSSL_
7430: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e VERSION_NUMBER >
7440: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c = 0x10100000L ||
7450: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 defined(NO_SSL2
7460: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
7470: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 NSSL_NO_SSL2)..
7480: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
7490: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
74a0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
74b0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
74c0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
74d0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 *) NULL);.. r
74e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
74f0: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
7500: 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f od = SSLv2_metho
7510: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 d(); break;.#end
7520: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c if..case TLS_SSL
7530: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 3:.#if defined(N
7540: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e O_SSL3) || defin
7550: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
7560: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f L3) || defined(O
7570: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d PENSSL_NO_SSL3_M
7580: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f ETHOD).. Tcl_
7590: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
75a0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
75b0: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
75c0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
75d0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
75e0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
75f0: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
7600: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 . method = SS
7610: 4c 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 Lv3_method(); br
7620: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 eak;.#endif..cas
7630: 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 e TLS_TLS1:.#if
7640: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
7650: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7660: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 SSL_NO_TLS1) ||
7670: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7680: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a NO_TLS1_METHOD).
7690: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
76a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
76b0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
76c0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
76d0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
76e0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
76f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
7700: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 R;.#else.. me
7710: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 thod = TLSv1_met
7720: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 hod(); break;.#e
7730: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
7740: 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e LS1_1:.#if defin
7750: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c ed(NO_TLS1_1) ||
7760: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
7770: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 _NO_TLS1_1) || d
7780: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7790: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 O_TLS1_1_METHOD)
77a0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
77b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
77c0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
77d0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
77e0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
77f0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
7800: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
7810: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
7820: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f ethod = TLSv1_1_
7830: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b method(); break;
7840: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c .#endif..case TL
7850: 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 S_TLS1_2:.#if de
7860: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
7870: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7880: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c SSL_NO_TLS1_2) |
7890: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
78a0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 L_NO_TLS1_2_METH
78b0: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 OD).. Tcl_App
78c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
78d0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
78e0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
78f0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
7900: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
7910: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
7920: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 ERROR;.#else..
7930: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 method = TLSv1
7940: 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 _2_method(); bre
7950: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 ak;.#endif..case
7960: 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 TLS_TLS1_3:.#if
7970: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
7980: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _3) || defined(O
7990: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
79a0: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ).. Tcl_Appen
79b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
79c0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d protocols[index]
79d0: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f , ": protocol no
79e0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 t supported", (c
79f0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
7a00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
7a10: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
7a20: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 method = TLS_met
7a30: 68 6f 64 28 29 3b 0a 09 20 20 20 20 53 53 4c 5f hod();.. SSL_
7a40: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 CTX_set_min_prot
7a50: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 o_version(ctx, T
7a60: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a LS1_3_VERSION);.
7a70: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
7a80: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 _max_proto_versi
7a90: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 on(ctx, TLS1_3_V
7aa0: 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 ERSION);.. br
7ab0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 eak;.#endif..def
7ac0: 61 75 6c 74 3a 0a 09 20 20 20 20 6d 65 74 68 6f ault:.. metho
7ad0: 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 d = TLS_method()
7ae0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 ;.. break;.
7af0: 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 }.. ctx = S
7b00: 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f SL_CTX_new(metho
7b10: 64 29 3b 0a 20 20 20 20 69 66 20 28 63 74 78 20 d);. if (ctx
7b20: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f == NULL) {..Tcl_
7b30: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
7b40: 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 erp, GET_ERR_REA
7b50: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
7b60: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
7b70: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
7b80: 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e . ssl = SSL_n
7b90: 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20 ew(ctx);. if
7ba0: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl == NULL) {.
7bb0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
7bc0: 74 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 t(interp, GET_ER
7bd0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
7be0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c r *) NULL);..SSL
7bf0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
7c00: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
7c10: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
7c20: 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 Use list and or
7c30: 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20 der as would be
7c40: 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 sent in a Client
7c50: 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 Hello or all ava
7c60: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a ilable ciphers *
7c70: 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75 /. if (use_su
7c80: 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d pported) {..sk =
7c90: 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 SSL_get1_suppor
7ca0: 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29 ted_ciphers(ssl)
7cb0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
7cc0: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 sk = SSL_get_cip
7cd0: 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d hers(ssl);. }
7ce0: 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20 .. if (sk !=
7cf0: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 NULL) {..if (!ve
7d00: 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 63 6f rbose) {.. co
7d10: 6e 73 74 20 63 68 61 72 20 2a 63 70 3b 0a 09 20 nst char *cp;..
7d20: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
7d30: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
7d40: 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 LL);.. for (i
7d50: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b nt i = 0; i < sk
7d60: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 _SSL_CIPHER_num(
7d70: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f sk); i++) {...co
7d80: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a nst SSL_CIPHER *
7d90: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 c = sk_SSL_CIPHE
7da0: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a R_value(sk, i);.
7db0: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 ..if (c == NULL)
7dc0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a continue;..../*
7dd0: 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 cipher name or
7de0: 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d (NONE) */...cp =
7df0: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
7e00: 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63 name(c);...if (c
7e10: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b p == NULL) break
7e20: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 ;...Tcl_ListObjA
7e30: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
7e40: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
7e50: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 _NewStringObj((c
7e60: 68 61 72 20 2a 29 20 63 70 2c 20 2d 31 29 29 3b har *) cp, -1));
7e70: 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 .. }...} else
7e80: 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d {.. objPtr =
7e90: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
7ea0: 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f j("",0);.. fo
7eb0: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 r (int i = 0; i
7ec0: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f < sk_SSL_CIPHER_
7ed0: 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a num(sk); i++) {.
7ee0: 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 ..const SSL_CIPH
7ef0: 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 ER *c = sk_SSL_C
7f00: 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 IPHER_value(sk,
7f10: 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e i);...if (c == N
7f20: 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a ULL) continue;..
7f30: 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73 ../* textual des
7f40: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 cription of the
7f50: 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 cipher */...if (
7f60: 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 SSL_CIPHER_descr
7f70: 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 iption(c, buf, s
7f80: 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e izeof(buf)) != N
7f90: 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c ULL) {... Tcl
7fa0: 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a _AppendToObj(obj
7fb0: 50 74 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 Ptr, buf, (Tcl_S
7fc0: 69 7a 65 29 20 73 74 72 6c 65 6e 28 62 75 66 29 ize) strlen(buf)
7fd0: 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 );...} else {...
7fe0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f Tcl_AppendTo
7ff0: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b Obj(objPtr, "UNK
8000: 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d NOWN\n", 8);...}
8010: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 .. }..}..if (
8020: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b use_supported) {
8030: 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 .. sk_SSL_CIP
8040: 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d HER_free(sk);..}
8050: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 . }. SSL_f
8060: 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 ree(ssl);. SS
8070: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
8080: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
8090: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
80a0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
80b0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
80c0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
80d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8100: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 -------. *. * Pr
8110: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d otocolsObjCmd --
8120: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 list available
8130: 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 protocols. *. *.
8140: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
8150: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
8160: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 cess the "tls::p
8170: 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e rotocols" comman
8180: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 d. *.to list ava
8190: 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 ilable protocols
81a0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
81b0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
81c0: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a cl result list..
81d0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
81e0: 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 ts:. *.none. *.
81f0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
8200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8230: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
8240: 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a int.ProtocolsObj
8250: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
8260: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
8270: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
8280: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
8290: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
82a0: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f {. Tcl_Obj *o
82b0: 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 bjPtr;. (void
82c0: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
82d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
82e0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
82f0: 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c bjc != 1) {..Tcl
8300: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
8310: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
8320: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
8330: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
8340: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
8350: 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 r();.. objPtr
8360: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
8370: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 j(0, NULL);..#if
8380: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
8390: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
83a0: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 0000L && !define
83b0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 d(NO_SSL2) && !d
83c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
83d0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f O_SSL2). Tcl_
83e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
83f0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
8400: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
8410: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
8420: 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b TLS_SSL2], -1));
8430: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
8440: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 ined(NO_SSL3) &&
8450: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
8460: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 L_NO_SSL3) && !d
8470: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
8480: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 O_SSL3_METHOD).
8490: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
84a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
84b0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
84c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
84d0: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d tocols[TLS_SSL3]
84e0: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
84f0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
8500: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
8510: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
8520: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
8530: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 ENSSL_NO_TLS1_ME
8540: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 THOD). Tcl_Li
8550: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
8560: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
8570: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
8580: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
8590: 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 S_TLS1], -1));.#
85a0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
85b0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 ed(NO_TLS1_1) &&
85c0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
85d0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 L_NO_TLS1_1) &&
85e0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
85f0: 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f _NO_TLS1_1_METHO
8600: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f D). Tcl_ListO
8610: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
8620: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
8630: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
8640: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 (protocols[TLS_T
8650: 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 LS1_1], -1));.#e
8660: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
8670: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 d(NO_TLS1_2) &&
8680: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
8690: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 _NO_TLS1_2) && !
86a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
86b0: 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 NO_TLS1_2_METHOD
86c0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
86d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
86e0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
86f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
8700: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c protocols[TLS_TL
8710: 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e S1_2], -1));.#en
8720: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
8730: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 (NO_TLS1_3) && !
8740: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
8750: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 NO_TLS1_3). T
8760: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
8770: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
8780: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
8790: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
87a0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 ls[TLS_TLS1_3],
87b0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 -1));.#endif..
87c0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
87d0: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
87e0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
87f0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
8800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8840: 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 ---. *. * Handsh
8850: 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a akeObjCmd --. *.
8860: 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 *.This command
8870: 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 is used to verif
8880: 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 y whether the ha
8890: 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c ndshake is compl
88a0: 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 ete. *.or not..
88b0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
88c0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
88d0: 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 result. 1 means
88e0: 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 handshake comple
88f0: 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 te, 0 means pend
8900: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ing.. *. * Side
8910: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 effects:. *.May
8920: 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 force SSL negoti
8930: 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c ation to take pl
8940: 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ace.. *. *------
8950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
8990: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e /.static int Han
89a0: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 dshakeObjCmd(Cli
89b0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
89c0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
89d0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
89e0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
89f0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
8a00: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
8a10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 /* The c
8a20: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 hannel to set a
8a30: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 mode on. */.
8a40: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
8a50: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e /* clien
8a60: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 t state for ssl
8a70: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f socket */. co
8a80: 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 nst char *errStr
8a90: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 = NULL;. int
8aa0: 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e ret = 1;. in
8ab0: 74 20 65 72 72 20 3d 20 30 3b 0a 20 20 20 20 28 t err = 0;. (
8ac0: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
8ad0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
8ae0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
8af0: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a f (objc != 2) {.
8b00: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
8b10: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
8b20: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 v, "channel");..
8b30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
8b40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
8b50: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
8b60: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
8b70: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
8b80: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
8b90: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 (objv[1]), NULL)
8ba0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
8bb0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
8bc0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
8bd0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
8be0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
8bf0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
8c00: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
8c10: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
8c20: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
8c30: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
8c40: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
8c50: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
8c60: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
8c70: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
8c80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
8c90: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
8ca0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
8cb0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 ame(chan),..
8cc0: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
8cd0: 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a hannel", (char *
8ce0: 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 ) NULL);..Tcl_Se
8cf0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
8d00: 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 p, "TLS", "HANDS
8d10: 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 HAKE", "CHANNEL"
8d20: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 , "INVALID", (ch
8d30: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
8d40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
8d50: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 }. stateP
8d60: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 tr = (State *)Tc
8d70: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
8d80: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a anceData(chan);.
8d90: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
8da0: 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f lling Tls_WaitFo
8db0: 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 rConnect");.
8dc0: 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f ret = Tls_WaitFo
8dd0: 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 rConnect(statePt
8de0: 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 r, &err, 1);.
8df0: 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 dprintf("Tls_Wa
8e00: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 itForConnect ret
8e10: 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 urned: %i", ret)
8e20: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c ;.. if (ret <
8e30: 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72 0 && ((statePtr
8e40: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 ->flags & TLS_TC
8e50: 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 L_ASYNC) && (err
8e60: 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a == EAGAIN))) {.
8e70: 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 .dprintf("Async
8e80: 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 set and err = EA
8e90: 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 GAIN");..ret = 0
8ea0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
8eb0: 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e (ret < 0) {..lon
8ec0: 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 g result;..errSt
8ed0: 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 r = statePtr->er
8ee0: 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 r;..Tcl_ResetRes
8ef0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 ult(interp);..Tc
8f00: 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b l_SetErrno(err);
8f10: 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c ...if (!errStr |
8f20: 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 | (*errStr == 0)
8f30: 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 ) {.. errStr
8f40: 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 = Tcl_PosixError
8f50: 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 (interp);..}...T
8f60: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8f70: 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 interp, "handsha
8f80: 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 ke failed: ", er
8f90: 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e rStr, (char *) N
8fa0: 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75 ULL);..if ((resu
8fb0: 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 lt = SSL_get_ver
8fc0: 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 ify_result(state
8fd0: 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 Ptr->ssl)) != X5
8fe0: 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 09_V_OK) {..
8ff0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
9000: 28 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74 (interp, " due t
9010: 6f 20 5c 22 22 2c 20 58 35 30 39 5f 76 65 72 69 o \"", X509_veri
9020: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 fy_cert_error_st
9030: 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 22 5c ring(result), "\
9040: 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c "", (char *) NUL
9050: 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45 L);..}..Tcl_SetE
9060: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
9070: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 "TLS", "HANDSHA
9080: 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 KE", "FAILED", (
9090: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
90a0: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
90b0: 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 ng TCL_ERROR wit
90c0: 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c h handshake fail
90d0: 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29 ed: %s", errStr)
90e0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
90f0: 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ROR;. } else
9100: 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29 {..if (err != 0)
9110: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
9120: 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69 "Got an error wi
9130: 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 th a completed h
9140: 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 andshake: err =
9150: 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 %i", err);..}..r
9160: 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 et = 1;. }..
9170: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 dprintf("Retu
9180: 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 rning TCL_OK wit
9190: 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 h data \"%i\"",
91a0: 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ret);. Tcl_Se
91b0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
91c0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a p, Tcl_NewIntObj
91d0: 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75 (ret));. retu
91e0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a rn TCL_OK;.}../*
91f0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
9200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9230: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 ------. *. * Imp
9240: 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a ortObjCmd --. *.
9250: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
9260: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 e is invoked to
9270: 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c process the "ssl
9280: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 " command. *. *.
9290: 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 The ssl command
92a0: 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20 pushes SSL over
92b0: 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 a (newly connect
92c0: 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 ed) tcp socket.
92d0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
92e0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
92f0: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
9300: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d de effects:. *.M
9310: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 ay modify the be
9320: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 havior of an IO
9330: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d channel.. *. *--
9340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9380: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
9390: 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c .ImportObjCmd(Cl
93a0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
93b0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
93c0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
93d0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
93e0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
93f0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
9400: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 ;../* The channe
9410: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 l to set a mode
9420: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 on. */. State
9430: 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 *statePtr;../*
9440: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 client state for
9450: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 ssl socket */.
9460: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 SSL_CTX *ctx.
9470: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c .= NULL;. Tcl
9480: 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 09 3d 20 _Obj *script..=
9490: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 NULL;. Tcl_Ob
94a0: 6a 20 2a 70 61 73 73 77 6f 72 64 09 09 3d 20 4e j *password..= N
94b0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
94c0: 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a *vcmd..= NULL;.
94d0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 Tcl_DString
94e0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
94f0: 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 slation, upperCh
9500: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 annelBlocking, u
9510: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
9520: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 ing, upperChanne
9530: 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e lEOFChar;. in
9540: 74 20 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53 t idx;. Tcl_S
9550: 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 ize len;. int
9560: 20 66 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f 54 flags...= TLS_T
9570: 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 CL_INIT;. int
9580: 20 73 65 72 76 65 72 09 09 09 3d 20 30 3b 09 2f server...= 0;./
9590: 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 * is connection
95a0: 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 incoming or outg
95b0: 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 oing? */. cha
95c0: 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55 r *keyfile..= NU
95d0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 LL;. char *ce
95e0: 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a rtfile..= NULL;.
95f0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
9600: 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a r *key..= NULL;.
9610: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79 Tcl_Size key
9620: 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75 _len..= 0;. u
9630: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 nsigned char *ce
9640: 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 rt..= NULL;.
9650: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 Tcl_Size cert_le
9660: 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 n..= 0;. char
9670: 20 2a 63 69 70 68 65 72 73 09 09 3d 20 4e 55 4c *ciphers..= NUL
9680: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 L;. char *cip
9690: 68 65 72 73 75 69 74 65 73 09 09 3d 20 4e 55 4c hersuites..= NUL
96a0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 L;. char *CAf
96b0: 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ile..= NULL;.
96c0: 20 63 68 61 72 20 2a 43 41 70 61 74 68 09 09 3d char *CApath..=
96d0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
96e0: 2a 44 48 70 61 72 61 6d 73 09 09 3d 20 4e 55 4c *DHparams..= NUL
96f0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 L;. char *mod
9700: 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 el...= NULL;.
9710: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
9720: 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f e..= NULL;./* ho
9730: 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65 stname for Serve
9740: 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f r Name Indicatio
9750: 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 73 n */. char *s
9760: 65 73 73 69 6f 6e 5f 69 64 09 09 3d 20 4e 55 4c ession_id..= NUL
9770: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a L;. Tcl_Obj *
9780: 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 alpn..= NULL;.
9790: 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 int ssl2 = 0,
97a0: 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e ssl3 = 0;. in
97b0: 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 t tls1 = 1, tls1
97c0: 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d _1 = 1, tls1_2 =
97d0: 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 1, tls1_3 = 1;.
97e0: 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 int proto =
97f0: 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 0, level = -1;.
9800: 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20 int verify =
9810: 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20 0, require = 0,
9820: 72 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 request = 1, pos
9830: 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b t_handshake = 0;
9840: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 . (void) clie
9850: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 ntData;.. dpr
9860: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
9870: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
9880: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 TLS1) || defined
9890: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
98a0: 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a ). tls1 = 0;.
98b0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
98c0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c ed(NO_TLS1_1) ||
98d0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
98e0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 _NO_TLS1_1).
98f0: 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 tls1_1 = 0;.#end
9900: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
9910: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 O_TLS1_2) || def
9920: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
9930: 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 TLS1_2). tls1
9940: 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 _2 = 0;.#endif.#
9950: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
9960: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_3) || defined
9970: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
9980: 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d _3). tls1_3 =
9990: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 0;.#endif..
99a0: 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a if (objc < 2) {.
99b0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
99c0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
99d0: 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 v, "channel ?opt
99e0: 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e ions?");..return
99f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
9a00: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
9a10: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 _error();.. c
9a20: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
9a30: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c nnel(interp, Tcl
9a40: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
9a50: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 1]), NULL);.
9a60: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
9a70: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
9a80: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
9a90: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
9aa0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
9ab0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
9ac0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
9ad0: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
9ae0: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
9af0: 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 han);.. for (
9b00: 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f idx = 2; idx < o
9b10: 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 bjc; idx++) {..c
9b20: 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 har *opt = Tcl_G
9b30: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 64 etString(objv[id
9b40: 78 5d 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 x]);...if (opt[0
9b50: 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 ] != '-').. b
9b60: 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 reak;...OPTOBJ("
9b70: 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 -alpn", alpn);..
9b80: 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c OPTSTR("-cadir",
9b90: 20 43 41 70 61 74 68 29 3b 0a 09 4f 50 54 53 54 CApath);..OPTST
9ba0: 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 R("-cafile", CAf
9bb0: 69 6c 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 ile);..OPTBYTE("
9bc0: 2d 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 -cert", cert, ce
9bd0: 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 rt_len);..OPTSTR
9be0: 28 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 ("-certfile", ce
9bf0: 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 rtfile);..OPTSTR
9c00: 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 ("-cipher", ciph
9c10: 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ers);..OPTSTR("-
9c20: 63 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 ciphers", cipher
9c30: 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 s);..OPTSTR("-ci
9c40: 70 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 phersuites", cip
9c50: 68 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 hersuites);..OPT
9c60: 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 OBJ("-command",
9c70: 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 script);..OPTSTR
9c80: 28 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 ("-dhparams", DH
9c90: 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 params);..OPTBYT
9ca0: 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b E("-key", key, k
9cb0: 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 ey_len);..OPTSTR
9cc0: 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 ("-keyfile", key
9cd0: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 file);..OPTSTR("
9ce0: 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b -model", model);
9cf0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 ..OPTOBJ("-passw
9d00: 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b ord", password);
9d10: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 ..OPTBOOL("-post
9d20: 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 _handshake", pos
9d30: 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f t_handshake);..O
9d40: 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 PTBOOL("-request
9d50: 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 ", request);..OP
9d60: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 TBOOL("-require"
9d70: 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 , require);..OPT
9d80: 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79 5f 6c INT("-security_l
9d90: 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 evel", level);..
9da0: 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 OPTBOOL("-server
9db0: 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 ", server);..OPT
9dc0: 53 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 STR("-servername
9dd0: 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a ", servername);.
9de0: 09 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f .OPTSTR("-sessio
9df0: 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 n_id", session_i
9e00: 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 d);..OPTBOOL("-s
9e10: 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 sl2", ssl2);..OP
9e20: 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 TBOOL("-ssl3", s
9e30: 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 sl3);..OPTBOOL("
9e40: 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 -tls1", tls1);..
9e50: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 OPTBOOL("-tls1.1
9e60: 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 ", tls1_1);..OPT
9e70: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 BOOL("-tls1.2",
9e80: 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f tls1_2);..OPTBOO
9e90: 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 L("-tls1.3", tls
9ea0: 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 1_3);..OPTOBJ("-
9eb0: 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 validatecommand"
9ec0: 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a , vcmd);..OPTOBJ
9ed0: 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b ("-vcmd", vcmd);
9ee0: 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f ...OPTBAD("optio
9ef0: 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 n", "-alpn, -cad
9f00: 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 ir, -cafile, -ce
9f10: 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d rt, -certfile, -
9f20: 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 cipher, -ciphers
9f30: 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c uites, -command,
9f40: 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 -dhparams, -key
9f50: 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 , -keyfile, -mod
9f60: 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d el, -password, -
9f70: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 post_handshake,
9f80: 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 71 75 69 -request, -requi
9f90: 72 65 2c 20 2d 73 65 63 75 72 69 74 79 5f 6c 65 re, -security_le
9fa0: 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 vel, -server, -s
9fb0: 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 ervername, -sess
9fc0: 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d ion_id, -ssl2, -
9fd0: 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c ssl3, -tls1, -tl
9fe0: 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d s1.1, -tls1.2, -
9ff0: 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 tls1.3, or -vali
a000: 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a datecommand");..
a010: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
a020: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
a030: 28 72 65 71 75 65 73 74 29 09 09 76 65 72 69 66 (request)..verif
a040: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
a050: 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 CLIENT_ONCE | SS
a060: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 L_VERIFY_PEER;.
a070: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 if (request &
a080: 26 20 72 65 71 75 69 72 65 29 09 76 65 72 69 66 & require).verif
a090: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
a0a0: 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f FAIL_IF_NO_PEER_
a0b0: 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 CERT;. if (re
a0c0: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 quest && post_ha
a0d0: 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 20 ndshake).verify
a0e0: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f |= SSL_VERIFY_PO
a0f0: 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 ST_HANDSHAKE;.
a100: 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 if (verify ==
a110: 30 29 09 09 76 65 72 69 66 79 20 3d 20 53 53 4c 0)..verify = SSL
a120: 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 _VERIFY_NONE;..
a130: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c proto |= (ssl
a140: 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 2 ? TLS_PROTO_SS
a150: 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f L2 : 0);. pro
a160: 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c to |= (ssl3 ? TL
a170: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 S_PROTO_SSL3 : 0
a180: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 );. proto |=
a190: 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 (tls1 ? TLS_PROT
a1a0: 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 O_TLS1 : 0);.
a1b0: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f proto |= (tls1_
a1c0: 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 1 ? TLS_PROTO_TL
a1d0: 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 S1_1 : 0);. p
a1e0: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 roto |= (tls1_2
a1f0: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 ? TLS_PROTO_TLS1
a200: 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f _2 : 0);. pro
a210: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 to |= (tls1_3 ?
a220: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
a230: 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 : 0);.. /* r
a240: 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 eset to NULL if
a250: 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f blank string pro
a260: 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 vided */. if
a270: 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 (cert && !*cert)
a280: 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20 .. cert.
a290: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
a2a0: 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a if (key && !*
a2b0: 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 key).. ke
a2c0: 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c y. = NULL
a2d0: 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 ;. if (certfi
a2e0: 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 le && !*certfile
a2f0: 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69 ) certfi
a300: 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 le.= NULL;. i
a310: 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a f (keyfile && !*
a320: 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c keyfile)..keyfil
a330: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c e. = NULL
a340: 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 ;. if (cipher
a350: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 s && !*ciphers).
a360: 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09 ciphers.
a370: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
a380: 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75 if (ciphersu
a390: 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 ites && !*cipher
a3a0: 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75 suites) ciphersu
a3b0: 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a ites = NULL;.
a3c0: 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 if (CAfile &
a3d0: 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 & !*CAfile).
a3e0: 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 CAfile.
a3f0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
a400: 66 20 28 43 41 70 61 74 68 20 26 26 20 21 2a 43 f (CApath && !*C
a410: 41 70 61 74 68 29 09 20 20 20 20 20 20 20 20 43 Apath). C
a420: 41 70 61 74 68 09 20 20 20 20 20 20 20 20 3d 20 Apath. =
a430: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 NULL;. if (DH
a440: 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 params && !*DHpa
a450: 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 rams). DH
a460: 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 params =
a470: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 NULL;.. /* ne
a480: 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 w SSL state */.
a490: 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 statePtr..= (
a4a0: 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 State *) ckalloc
a4b0: 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 ((unsigned) size
a4c0: 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 of(State));.
a4d0: 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c memset(statePtr,
a4e0: 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 0, sizeof(State
a4f0: 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 ));.. statePt
a500: 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 r->flags.= flags
a510: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
a520: 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b interp.= interp;
a530: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 . statePtr->v
a540: 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a flags.= verify;.
a550: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 statePtr->er
a560: 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 r.= "";.. /*
a570: 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 allocate script
a580: 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 */. if (scrip
a590: 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c t) {..(void) Tcl
a5a0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
a5b0: 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b j(script, &len);
a5c0: 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 ..if (len) {..
a5d0: 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c statePtr->call
a5e0: 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 back = script;..
a5f0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
a600: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 ount(statePtr->c
a610: 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 allback);..}.
a620: 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 }.. /* alloc
a630: 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a ate password */.
a640: 20 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 64 if (password
a650: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f ) {..(void) Tcl_
a660: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
a670: 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 (password, &len)
a680: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 ;..if (len) {..
a690: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 statePtr->pas
a6a0: 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64 sword = password
a6b0: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 ;.. Tcl_IncrR
a6c0: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
a6d0: 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a ->password);..}.
a6e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c }.. /* al
a6f0: 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 locate validate
a700: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 command */. i
a710: 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 f (vcmd) {..(voi
a720: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 d) Tcl_GetString
a730: 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c FromObj(vcmd, &l
a740: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b en);..if (len) {
a750: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
a760: 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 vcmd = vcmd;..
a770: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
a780: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d nt(statePtr->vcm
a790: 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 d);..}. }..
a7a0: 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e if (model != N
a7b0: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 ULL) {..int mode
a7c0: 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d ;../* Get the "m
a7d0: 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f odel" context */
a7e0: 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 ..chan = Tcl_Get
a7f0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
a800: 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 model, &mode);..
a810: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
a820: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
a830: 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 {.. Tls_Free(
a840: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a (tls_free_type *
a850: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
a860: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
a870: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 OR;..}.../*.. *
a880: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
a890: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
a8a0: 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f ost channel.. */
a8b0: 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 ..chan = Tcl_Get
a8c0: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
a8d0: 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 ;..if (Tcl_GetCh
a8e0: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
a8f0: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
a900: 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c pe()) {.. Tcl
a910: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
a920: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
a930: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
a940: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
a950: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 ,..."\": not a T
a960: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 LS channel", (ch
a970: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
a980: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
a990: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
a9a0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 , "IMPORT", "CHA
a9b0: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 NNEL", "INVALID"
a9c0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
a9d0: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
a9e0: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a (tls_free_type *
a9f0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
aa00: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
aa10: 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 OR;..}..ctx = ((
aa20: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 State *)Tcl_GetC
aa30: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
aa40: 74 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a ta(chan))->ctx;.
aa50: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 } else {..if
aa60: 20 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 ((ctx = CTX_Ini
aa70: 74 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 t(statePtr, serv
aa80: 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 er, proto, keyfi
aa90: 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 le, certfile, ke
aaa0: 79 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65 6e y, cert, key_len
aab0: 2c 0a 09 20 20 20 20 63 65 72 74 5f 6c 65 6e 2c ,.. cert_len,
aac0: 20 43 41 70 61 74 68 2c 20 43 41 66 69 6c 65 2c CApath, CAfile,
aad0: 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 ciphers, cipher
aae0: 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44 suites, level, D
aaf0: 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c Hparams)) == NUL
ab00: 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 L) {.. Tls_Fr
ab10: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 ee((tls_free_typ
ab20: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a e *) statePtr);.
ab30: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
ab40: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
ab50: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 . statePtr->c
ab60: 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f tx = ctx;.. /
ab70: 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 *. * We need
ab80: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 to make sure th
ab90: 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 at the channel w
aba0: 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 orks in binary (
abb0: 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 for the. * e
abc0: 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f ncryption not to
abd0: 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e get goofed up).
abe0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c . */. Tcl
abf0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 _DStringInit(&up
ac00: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
ac10: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f ation);. Tcl_
ac20: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 DStringInit(&upp
ac30: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
ac40: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 g);. Tcl_DStr
ac50: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
ac60: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 annelEOFChar);.
ac70: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
ac80: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
ac90: 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 Encoding);. T
aca0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
acb0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
acc0: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 , "-eofchar", &u
acd0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
ace0: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 ar);. Tcl_Get
acf0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
ad00: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e terp, chan, "-en
ad10: 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 coding", &upperC
ad20: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b hannelEncoding);
ad30: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
ad40: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
ad50: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c , chan, "-transl
ad60: 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 ation", &upperCh
ad70: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
ad80: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
ad90: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
ada0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 rp, chan, "-bloc
adb0: 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 king", &upperCha
adc0: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 nnelBlocking);.
add0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
ade0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
adf0: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 chan, "-translat
ae00: 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b ion", "binary");
ae10: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
ae20: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
ae30: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 , chan, "-blocki
ae40: 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 ng", "true");.
ae50: 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 dprintf("Consu
ae60: 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c ming Tcl channel
ae70: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 %s", Tcl_GetCha
ae80: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b nnelName(chan));
ae90: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 . statePtr->s
aea0: 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 elf = Tcl_StackC
aeb0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
aec0: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
aed0: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 , (ClientData) s
aee0: 74 61 74 65 50 74 72 2c 0a 09 28 54 43 4c 5f 52 tatePtr,..(TCL_R
aef0: 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 EADABLE | TCL_WR
af00: 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a ITABLE), chan);.
af10: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65 dprintf("Cre
af20: 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d ated channel nam
af30: 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 ed %s", Tcl_GetC
af40: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
af50: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 Ptr->self));.
af60: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 if (statePtr->s
af70: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e elf == (Tcl_Chan
af80: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a nel) NULL) {../*
af90: 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 .. * No use of T
afa0: 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 cl_EventuallyFre
afb0: 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 e because no pos
afc0: 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 sible Tcl_Preser
afd0: 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 ve... */..Tls_Fr
afe0: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 ee((tls_free_typ
aff0: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a e *) statePtr);.
b000: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
b010: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 (&upperChannelTr
b020: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 09 54 63 6c anslation);..Tcl
b030: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 _DStringFree(&up
b040: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
b050: 6e 67 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e ng);..Tcl_DStrin
b060: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e gFree(&upperChan
b070: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 09 54 63 nelEOFChar);..Tc
b080: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 l_DStringFree(&u
b090: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
b0a0: 69 6e 67 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ing);..return TC
b0b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
b0c0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
b0d0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
b0e0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c statePtr->self,
b0f0: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c "-translation",
b100: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 Tcl_DStringValu
b110: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 e(&upperChannelT
b120: 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 ranslation));.
b130: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
b140: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 Option(interp, s
b150: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 tatePtr->self, "
b160: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f -encoding", Tcl_
b170: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 DStringValue(&up
b180: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
b190: 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ng));. Tcl_Se
b1a0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
b1b0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
b1c0: 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 >self, "-eofchar
b1d0: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 ", Tcl_DStringVa
b1e0: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 lue(&upperChanne
b1f0: 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20 lEOFChar));.
b200: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
b210: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 tion(interp, sta
b220: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 tePtr->self, "-b
b230: 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 locking", Tcl_DS
b240: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 tringValue(&uppe
b250: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
b260: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 ));. Tcl_DStr
b270: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 ingFree(&upperCh
b280: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
b290: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
b2a0: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 ngFree(&upperCha
b2b0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 nnelEncoding);.
b2c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
b2d0: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ee(&upperChannel
b2e0: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 EOFChar);. Tc
b2f0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 l_DStringFree(&u
b300: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
b310: 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 ing);.. /*.
b320: 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c * SSL Initial
b330: 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a ization. */.
b340: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 statePtr->ss
b350: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 l = SSL_new(stat
b360: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 ePtr->ctx);.
b370: 69 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 if (!statePtr->s
b380: 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 sl) {../* SSL li
b390: 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 brary error */..
b3a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
b3b0: 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e (interp, "couldn
b3c0: 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 't construct ssl
b3d0: 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 47 45 54 session: ", GET
b3e0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
b3f0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
b400: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 Tcl_SetError
b410: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
b420: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 49 S", "IMPORT", "I
b430: 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 NIT", "FAILED",
b440: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
b450: 09 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 .Tls_Free((tls_f
b460: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 ree_type *) stat
b470: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 ePtr);..return T
b480: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
b490: 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 . /* Set host
b4a0: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a server name */.
b4b0: 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e 61 if (serverna
b4c0: 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74 me) {../* Sets t
b4d0: 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 he server name i
b4e0: 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 ndication (SNI)
b4f0: 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 in ClientHello e
b500: 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 xtension */../*
b510: 50 65 72 20 52 46 43 20 36 30 36 36 2c 20 68 6f Per RFC 6066, ho
b520: 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43 49 stname is a ASCI
b530: 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 I encoded string
b540: 2c 20 74 68 6f 75 67 68 20 52 46 43 20 34 33 36 , though RFC 436
b550: 36 20 73 61 79 73 20 55 54 46 2d 38 2e 20 2a 2f 6 says UTF-8. */
b560: 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 ..if (!SSL_set_t
b570: 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 lsext_host_name(
b580: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 statePtr->ssl, s
b590: 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65 ervername) && re
b5a0: 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63 quire) {.. Tc
b5b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
b5c0: 6e 74 65 72 70 2c 20 22 53 65 74 20 53 4e 49 20 nterp, "Set SNI
b5d0: 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 extension failed
b5e0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
b5f0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
b600: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
b610: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
b620: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
b630: 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 46 41 ORT", "SNI", "FA
b640: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
b650: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f NULL);.. Tls_
b660: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 Free((tls_free_t
b670: 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 ype *) statePtr)
b680: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
b690: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a L_ERROR;..}.../*
b6a0: 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f Set hostname fo
b6b0: 72 20 70 65 65 72 20 63 65 72 74 69 66 69 63 61 r peer certifica
b6c0: 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 69 te hostname veri
b6d0: 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65 fication in clie
b6e0: 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75 nts... Don't u
b6f0: 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 se SSL_set1_host
b700: 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 6c 69 since it has li
b710: 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 mitations. */..i
b720: 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 f (!SSL_add1_hos
b730: 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c t(statePtr->ssl,
b740: 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a servername)) {.
b750: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
b760: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
b770: 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 et DNS hostname
b780: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 failed: ", GET_E
b790: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
b7a0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
b7b0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
b7c0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
b7d0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 , "IMPORT", "HOS
b7e0: 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 TNAME", "FAILED"
b7f0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b800: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
b810: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a (tls_free_type *
b820: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
b830: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
b840: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 OR;..}. }..
b850: 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 73 /* Resume sess
b860: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 ion id */. if
b870: 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 (session_id &&
b880: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 strlen(session_i
b890: 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 d) <= SSL_MAX_SI
b8a0: 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a D_CTX_LENGTH) {.
b8b0: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 ./* SSL_set_sess
b8c0: 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 ion() */..if (!S
b8d0: 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f SL_SESSION_set1_
b8e0: 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 id_context(SSL_g
b8f0: 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65 et_session(state
b900: 50 74 72 2d 3e 73 73 6c 29 2c 0a 09 09 28 63 6f Ptr->ssl),...(co
b910: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
b920: 72 20 2a 29 20 73 65 73 73 69 6f 6e 5f 69 64 2c r *) session_id,
b930: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 (unsigned int)
b940: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 strlen(session_i
b950: 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f d))) {.. Tcl_
b960: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
b970: 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73 erp, "Resume ses
b980: 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 sion failed: ",
b990: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
b9a0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b9b0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
b9c0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
b9d0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
b9e0: 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41 49 "SESSION", "FAI
b9f0: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
ba00: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
ba10: 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 ree((tls_free_ty
ba20: 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b pe *) statePtr);
ba30: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
ba40: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d _ERROR;..}. }
ba50: 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 .. /* Enable
ba60: 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 Application-Laye
ba70: 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 r Protocol Negot
ba80: 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 iation. Examples
ba90: 20 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a are: http/1.0,.
baa0: 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 .http/1.1, h2, h
bab0: 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 3, ftp, imap, po
bac0: 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c p3, xmpp-client,
bad0: 20 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 xmpp-server, mq
bae0: 74 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f tt, irc, etc. */
baf0: 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b . if (alpn) {
bb00: 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 ../* Convert a T
bb10: 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 CL list into a p
bb20: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 rotocol-list in
bb30: 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 wire-format */..
bb40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 unsigned char *p
bb50: 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 rotos, *p;..unsi
bb60: 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f gned int protos_
bb70: 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 len = 0;..Tcl_Si
bb80: 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 ze cnt, i;..int
bb90: 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 j;..Tcl_Obj **li
bba0: 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 st;...if (Tcl_Li
bbb0: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 stObjGetElements
bbc0: 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 (interp, alpn, &
bbd0: 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 cnt, &list) != T
bbe0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c CL_OK) {.. Tl
bbf0: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 s_Free((tls_free
bc00: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 _type *) statePt
bc10: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
bc20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 TCL_ERROR;..}...
bc30: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 /* Determine the
bc40: 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 memory required
bc50: 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 6f for the protoco
bc60: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 l-list */..for (
bc70: 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 i = 0; i < cnt;
bc80: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f i++) {.. Tcl_
bc90: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
bca0: 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b (list[i], &len);
bcb0: 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 .. if (len >
bcc0: 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 255) {...Tcl_App
bcd0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
bce0: 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c , "ALPN protocol
bcf0: 20 6e 61 6d 65 73 20 74 6f 6f 20 6c 6f 6e 67 22 names too long"
bd00: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
bd10: 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 ;...Tcl_SetError
bd20: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
bd30: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 S", "IMPORT", "A
bd40: 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 LPN", "FAILED",
bd50: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
bd60: 09 09 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f ..Tls_Free((tls_
bd70: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 free_type *) sta
bd80: 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e tePtr);...return
bd90: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 TCL_ERROR;..
bda0: 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c }.. protos_l
bdb0: 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20 en += 1 + (int)
bdc0: 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 len;..}.../* Bui
bdd0: 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 ld the complete
bde0: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f protocol-list */
bdf0: 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c ..protos = ckall
be00: 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a oc(protos_len);.
be10: 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 ./* protocol-lis
be20: 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d ts consist of 8-
be30: 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 bit length-prefi
be40: 78 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 xed, byte string
be50: 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30 s */..for (j = 0
be60: 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 , p = protos; j
be70: 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 < cnt; j++) {..
be80: 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 char *str = T
be90: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
bea0: 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 Obj(list[j], &le
beb0: 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 n);.. *p++ =
bec0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 20 (unsigned char)
bed0: 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 len;.. memcpy
bee0: 28 70 2c 20 73 74 72 2c 20 28 73 69 7a 65 5f 74 (p, str, (size_t
bef0: 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b ) len);.. p +
bf00: 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 = len;..}.../* S
bf10: 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 SL_set_alpn_prot
bf20: 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 os makes a copy
bf30: 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d of the protocol-
bf40: 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 list */../* Note
bf50: 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 : This function
bf60: 72 65 76 65 72 73 65 73 20 74 68 65 20 72 65 74 reverses the ret
bf70: 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e urn value conven
bf80: 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c tion */..if (SSL
bf90: 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 _set_alpn_protos
bfa0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
bfb0: 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c protos, protos_l
bfc0: 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f en)) {.. Tcl_
bfd0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
bfe0: 65 72 70 2c 20 22 53 65 74 20 41 4c 50 4e 20 70 erp, "Set ALPN p
bff0: 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a rotocols failed:
c000: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 ", GET_ERR_REAS
c010: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
c020: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 ULL);.. Tcl_S
c030: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
c040: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
c050: 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 RT", "ALPN", "FA
c060: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
c070: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f NULL);.. Tls_
c080: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 Free((tls_free_t
c090: 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 ype *) statePtr)
c0a0: 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72 ;.. ckfree(pr
c0b0: 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75 otos);.. retu
c0c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
c0d0: 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 .../* Store prot
c0e0: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 ocols list */..s
c0f0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
c100: 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 = protos;..state
c110: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 Ptr->protos_len
c120: 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 = protos_len;.
c130: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 } else {..stat
c140: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e ePtr->protos = N
c150: 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e ULL;..statePtr->
c160: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a protos_len = 0;.
c170: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
c180: 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 * SSL Callbac
c190: 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 ks. */. S
c1a0: 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 SL_set_app_data(
c1b0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 statePtr->ssl, (
c1c0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
c1d0: 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 ;./* point back
c1e0: 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c to us */. SSL
c1f0: 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74 _set_verify(stat
c200: 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 ePtr->ssl, verif
c210: 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 y, VerifyCallbac
c220: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f k);. SSL_set_
c230: 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 info_callback(st
c240: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 atePtr->ssl, Inf
c250: 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 oCallback);..
c260: 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 /* Callback for
c270: 20 6f 62 73 65 72 76 69 6e 67 20 70 72 6f 74 6f observing proto
c280: 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a col messages */.
c290: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f #ifndef OPENSSL_
c2a0: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20 20 20 NO_SSL_TRACE.
c2b0: 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 /* void SSL_CTX
c2c0: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 _set_msg_callbac
c2d0: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e k_arg(statePtr->
c2e0: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ctx, (void *)sta
c2f0: 74 65 50 74 72 29 3b 0a 20 20 20 20 76 6f 69 64 tePtr);. void
c300: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 SSL_CTX_set_msg
c310: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 _callback(stateP
c320: 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61 67 65 tr->ctx, Message
c330: 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 Callback); */.
c340: 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 SSL_set_msg_ca
c350: 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 llback_arg(state
c360: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 Ptr->ssl, (void
c370: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 *)statePtr);.
c380: 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c SSL_set_msg_cal
c390: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e lback(statePtr->
c3a0: 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c ssl, MessageCall
c3b0: 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 back);.#endif..
c3c0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c /* Create Tcl
c3d0: 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e _Channel BIO Han
c3e0: 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 dler */. stat
c3f0: 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 ePtr->p_bio.= BI
c400: 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50 O_new_tcl(stateP
c410: 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 tr, BIO_NOCLOSE)
c420: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
c430: 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 bio.= BIO_new(BI
c440: 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 O_f_ssl());..
c450: 20 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 if (server) {..
c460: 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62 61 /* Server callba
c470: 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f cks */..SSL_CTX_
c480: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 set_tlsext_serve
c490: 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 65 50 rname_arg(stateP
c4a0: 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a tr->ctx, (void *
c4b0: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c )statePtr);..SSL
c4c0: 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f _CTX_set_tlsext_
c4d0: 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 servername_callb
c4e0: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ack(statePtr->ct
c4f0: 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b x, SNICallback);
c500: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c ..SSL_CTX_set_cl
c510: 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 ient_hello_cb(st
c520: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c atePtr->ctx, Hel
c530: 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 loCallback, (voi
c540: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 d *)statePtr);..
c550: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 if (statePtr->pr
c560: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a otos != NULL) {.
c570: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
c580: 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 _alpn_select_cb(
c590: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 statePtr->ctx, A
c5a0: 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f LPNCallback, (vo
c5b0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
c5c0: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 #ifdef USE_NPN..
c5d0: 20 20 20 20 69 66 20 28 74 6c 73 31 5f 32 20 3d if (tls1_2 =
c5e0: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d = 0 && tls1_3 ==
c5f0: 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 0) {...SSL_CTX_
c600: 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f set_next_protos_
c610: 61 64 76 65 72 74 69 73 65 64 5f 63 62 28 73 74 advertised_cb(st
c620: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e atePtr->ctx, NPN
c630: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 Callback, (void
c640: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 *)statePtr);..
c650: 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 }.#endif..}...
c660: 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65 72 /* Enable server
c670: 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72 65 to send cert re
c680: 71 75 65 73 74 20 61 66 74 65 72 20 68 61 6e 64 quest after hand
c690: 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f shake (TLS 1.3 o
c6a0: 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 nly) */../* A wr
c6b0: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75 ite operation mu
c6c0: 73 74 20 74 61 6b 65 20 70 6c 61 63 65 20 66 6f st take place fo
c6d0: 72 20 74 68 65 20 43 65 72 74 69 66 69 63 61 74 r the Certificat
c6e0: 65 20 52 65 71 75 65 73 74 20 74 6f 20 62 65 0a e Request to be.
c6f0: 09 20 20 20 73 65 6e 74 20 74 6f 20 74 68 65 20 . sent to the
c700: 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 61 6e client, this can
c710: 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20 53 53 be done with SS
c720: 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29 L_do_handshake()
c730: 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 . */..if (reques
c740: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 t && post_handsh
c750: 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 29 20 7b ake && tls1_3) {
c760: 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66 79 .. SSL_verify
c770: 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e _client_post_han
c780: 64 73 68 61 6b 65 28 73 74 61 74 65 50 74 72 2d dshake(statePtr-
c790: 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 >ssl);..}.../* s
c7a0: 65 74 20 61 75 74 6f 6d 61 74 69 63 20 63 75 72 et automatic cur
c7b0: 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a ve selection */.
c7c0: 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 5f 61 75 .SSL_set_ecdh_au
c7d0: 74 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c to(statePtr->ssl
c7e0: 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 74 20 73 , 1);.../* Set s
c7f0: 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 erver mode */..s
c800: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c tatePtr->flags |
c810: 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 = TLS_TCL_SERVER
c820: 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 ;..SSL_set_accep
c830: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 t_state(statePtr
c840: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c ->ssl);. } el
c850: 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 se {../* Client
c860: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66 callbacks */.#if
c870: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20 def USE_NPN..if
c880: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
c890: 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73 s != NULL && tls
c8a0: 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 1_2 == 0 && tls1
c8b0: 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 _3 == 0) {..
c8c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 SSL_CTX_set_next
c8d0: 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62 _proto_select_cb
c8e0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c8f0: 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 ALPNCallback, (v
c900: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
c910: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 ..}.#endif.../*
c920: 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67 20 Session caching
c930: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f */..SSL_CTX_set_
c940: 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f session_cache_mo
c950: 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 de(statePtr->ctx
c960: 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 , SSL_SESS_CACHE
c970: 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45 _CLIENT | SSL_SE
c980: 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 SS_CACHE_NO_INTE
c990: 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53 RNAL_STORE);..SS
c9a0: 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e L_CTX_sess_set_n
c9b0: 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e ew_cb(statePtr->
c9c0: 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c ctx, SessionCall
c9d0: 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 back);.../* Enab
c9e0: 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61 6b le post handshak
c9f0: 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e e Authentication
ca00: 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 extension. TLS
ca10: 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 1.3 only, not ht
ca20: 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65 tp/2. */..if (re
ca30: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 quest && post_ha
ca40: 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 ndshake) {..
ca50: 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e SSL_set_post_han
ca60: 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61 74 dshake_auth(stat
ca70: 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 ePtr->ssl, 1);..
ca80: 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e }.../* Set clien
ca90: 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 t mode */..SSL_s
caa0: 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65 et_connect_state
cab0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
cac0: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73 . }. SSL_s
cad0: 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d et_bio(statePtr-
cae0: 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e >ssl, statePtr->
caf0: 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d p_bio, statePtr-
cb00: 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f >p_bio);. BIO
cb10: 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74 _set_ssl(statePt
cb20: 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72 r->bio, statePtr
cb30: 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f ->ssl, BIO_NOCLO
cb40: 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 SE);.. /*.
cb50: 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 * End of SSL I
cb60: 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 nit. */.
cb70: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
cb80: 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 ng %s", Tcl_GetC
cb90: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
cba0: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 Ptr->self));.
cbb0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 Tcl_SetResult(i
cbc0: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20 nterp, (char *)
cbd0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
cbe0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
cbf0: 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 f), TCL_VOLATILE
cc00: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
cc10: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
cc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc60: 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f ---. *. * Unimpo
cc70: 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 rtObjCmd --. *.
cc80: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
cc90: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 is invoked to r
cca0: 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 emove the topmos
ccb0: 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 t channel filter
ccc0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
ccd0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
cce0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
ccf0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
cd00: 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 *.May modify the
cd10: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 behavior of an
cd20: 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 IO channel.. *.
cd30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
cd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd70: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
cd80: 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 int.UnimportObjC
cd90: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
cda0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
cdb0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
cdc0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
cdd0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
cde0: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
cdf0: 20 63 68 61 6e 2c 20 63 68 69 6c 64 3b 09 2f 2a chan, child;./*
ce00: 20 54 68 65 20 73 74 61 63 6b 65 64 20 61 6e 64 The stacked and
ce10: 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e underlying chan
ce20: 6e 65 6c 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f nels */. Tcl_
ce30: 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 DString upperCha
ce40: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c nnelTranslation,
ce50: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f upperChannelBlo
ce60: 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e cking, upperChan
ce70: 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 nelEncoding, upp
ce80: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
ce90: 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 ;. int res =
cea0: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 28 76 6f 69 TCL_OK;. (voi
ceb0: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a d) clientData;..
cec0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
ced0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
cee0: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 objc != 2) {..Tc
cef0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
cf00: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
cf10: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 "channel");..ret
cf20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
cf30: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 61 6c }.. /* Val
cf40: 69 64 61 74 65 20 63 68 61 6e 6e 65 6c 20 6e 61 idate channel na
cf50: 6d 65 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d me */. chan =
cf60: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
cf70: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
cf80: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 tring(objv[1]),
cf90: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
cfa0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
cfb0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
cfc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
cfd0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
cfe0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
cff0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
d000: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
d010: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
d020: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
d030: 0a 20 20 20 20 63 68 69 6c 64 20 3d 20 54 63 6c . child = Tcl
d040: 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e _GetStackedChann
d050: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f el(chan);.. /
d060: 2a 20 56 65 72 69 66 79 20 69 73 20 61 20 73 74 * Verify is a st
d070: 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 2a 2f acked channel */
d080: 0a 20 20 20 20 69 66 20 28 63 68 69 6c 64 20 3d . if (child =
d090: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 = NULL) {..Tcl_A
d0a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
d0b0: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
d0c0: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
d0d0: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
d0e0: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 73 74 61 .."\": not a sta
d0f0: 63 6b 65 64 20 63 68 61 6e 6e 65 6c 22 2c 20 28 cked channel", (
d100: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
d110: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 Tcl_SetError
d120: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
d130: 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20 S", "UNIMPORT",
d140: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 "CHANNEL", "INVA
d150: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LID", (char *) N
d160: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
d170: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
d180: 20 20 20 20 2f 2a 20 46 6c 75 73 68 20 61 6e 79 /* Flush any
d190: 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 2a 2f pending data */
d1a0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 46 6c 75 . if (Tcl_Flu
d1b0: 73 68 28 63 68 61 6e 29 20 21 3d 20 54 43 4c 5f sh(chan) != TCL_
d1c0: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
d1d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
d1e0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
d1f0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
d200: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 lTranslation);.
d210: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
d220: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
d230: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 Blocking);. T
d240: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
d250: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 upperChannelEOFC
d260: 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 har);. Tcl_DS
d270: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 tringInit(&upper
d280: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
d290: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 75 ;.. /* Get cu
d2a0: 72 72 65 6e 74 20 63 6f 6e 66 69 67 20 2d 20 45 rrent config - E
d2b0: 4f 4c 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 OL translation,
d2c0: 65 6e 63 6f 64 69 6e 67 20 61 6e 64 20 62 75 66 encoding and buf
d2d0: 66 65 72 69 6e 67 20 6f 70 74 69 6f 6e 73 20 61 fering options a
d2e0: 72 65 20 73 68 61 72 65 64 20 62 65 74 77 65 65 re shared betwee
d2f0: 6e 20 61 6c 6c 20 63 68 61 6e 6e 65 6c 73 20 69 n all channels i
d300: 6e 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 20 n the stack */.
d310: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
d320: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
d330: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 chan, "-blocking
d340: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
d350: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 Blocking);. T
d360: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
d370: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
d380: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 , "-encoding", &
d390: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
d3a0: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 ding);. Tcl_G
d3b0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
d3c0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
d3d0: 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 eofchar", &upper
d3e0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
d3f0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
d400: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
d410: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c , chan, "-transl
d420: 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 ation", &upperCh
d430: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
d440: 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 73 74 61 );.. /* Unsta
d450: 63 6b 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 61 ck the channel a
d460: 6e 64 20 72 65 73 74 6f 72 65 20 75 6e 64 65 72 nd restore under
d470: 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 20 63 6f lying channel co
d480: 6e 66 69 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 nfig */. if (
d490: 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e Tcl_UnstackChann
d4a0: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 el(interp, chan)
d4b0: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 == TCL_OK) {..T
d4c0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
d4d0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 69 6c ion(interp, chil
d4e0: 64 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 d, "-encoding",
d4f0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
d500: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e (&upperChannelEn
d510: 63 6f 64 69 6e 67 29 29 3b 0a 09 54 63 6c 5f 53 coding));..Tcl_S
d520: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
d530: 69 6e 74 65 72 70 2c 20 63 68 69 6c 64 2c 20 22 interp, child, "
d540: 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 -eofchar", Tcl_D
d550: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
d560: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
d570: 29 29 3b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e ));..Tcl_SetChan
d580: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
d590: 2c 20 63 68 69 6c 64 2c 20 22 2d 74 72 61 6e 73 , child, "-trans
d5a0: 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 lation", Tcl_DSt
d5b0: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
d5c0: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
d5d0: 6f 6e 29 29 3b 0a 09 54 63 6c 5f 53 65 74 43 68 on));..Tcl_SetCh
d5e0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
d5f0: 72 70 2c 20 63 68 69 6c 64 2c 20 22 2d 62 6c 6f rp, child, "-blo
d600: 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 cking", Tcl_DStr
d610: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 ingValue(&upperC
d620: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 hannelBlocking))
d630: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
d640: 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b res = TCL_ERROR;
d650: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
d660: 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 54 lean-up */. T
d670: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
d680: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
d690: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 slation);. Tc
d6a0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 l_DStringFree(&u
d6b0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
d6c0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ing);. Tcl_DS
d6d0: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 tringFree(&upper
d6e0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
d6f0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d700: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e Free(&upperChann
d710: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 elBlocking);.
d720: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c return res;.}..
d730: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
d740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
d780: 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 CTX_Init -- cons
d790: 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 truct a SSL_CTX
d7a0: 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 instance. *. * R
d7b0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c esults:. *.A val
d7c0: 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 id SSL_CTX insta
d7d0: 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a nce or NULL.. *.
d7e0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
d7f0: 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 . *.constructs S
d800: 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 SL context (CTX)
d810: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
d820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
d860: 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 atic SSL_CTX *.C
d870: 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 TX_Init(State *s
d880: 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 tatePtr, int isS
d890: 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f erver, int proto
d8a0: 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c , char *keyfile,
d8b0: 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c char *certfile,
d8c0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
d8d0: 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 ar *key, unsigne
d8e0: 64 20 63 68 61 72 20 2a 63 65 72 74 2c 20 54 63 d char *cert, Tc
d8f0: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 2c 20 l_Size key_len,
d900: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 Tcl_Size cert_le
d910: 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c n, char *CApath,
d920: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c . char *CAfil
d930: 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 e, char *ciphers
d940: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 , char *ciphersu
d950: 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c ites, int level,
d960: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 char *DHparams)
d970: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 {. Tcl_Inter
d980: 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 p *interp = stat
d990: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
d9a0: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d SSL_CTX *ctx =
d9b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 NULL;. Tcl_D
d9c0: 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 69 String ds;. i
d9d0: 6e 74 20 6f 66 66 20 3d 20 30 2c 20 61 62 6f 72 nt off = 0, abor
d9e0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c t = 0;. int l
d9f0: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b oad_private_key;
da00: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d . const SSL_M
da10: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a ETHOD *method;..
da20: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
da30: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
da40: 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 !proto) {..Tcl_A
da50: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
da60: 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 rp, "no valid pr
da70: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 otocol selected"
da80: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
da90: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
daa0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 }.. /* cr
dab0: 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 eate SSL context
dac0: 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f */.#if OPENSSL_
dad0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e VERSION_NUMBER >
dae0: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c = 0x10100000L ||
daf0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 defined(NO_SSL2
db00: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
db10: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 NSSL_NO_SSL2).
db20: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
db30: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 oto, TLS_PROTO_S
db40: 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 SL2)) {..Tcl_App
db50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
db60: 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c , "SSL2 protocol
db70: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
db80: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
db90: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
dba0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
dbb0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
dbc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
dbd0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 SSL_NO_SSL3).
dbe0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
dbf0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 to, TLS_PROTO_SS
dc00: 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 L3)) {..Tcl_Appe
dc10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
dc20: 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 "SSL3 protocol
dc30: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
dc40: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
dc50: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
dc60: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 }.#endif.#if d
dc70: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
dc80: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
dc90: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 SL_NO_TLS1).
dca0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
dcb0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
dcc0: 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 1)) {..Tcl_Appen
dcd0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
dce0: 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f "TLS 1.0 protoco
dcf0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
dd00: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
dd10: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
dd20: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
dd30: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
dd40: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
dd50: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
dd60: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
dd70: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
dd80: 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 TO_TLS1_1)) {..T
dd90: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
dda0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 interp, "TLS 1.1
ddb0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
ddc0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
ddd0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
dde0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
ddf0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
de00: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 (NO_TLS1_2) || d
de10: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
de20: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 O_TLS1_2). if
de30: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
de40: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
de50: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 2)) {..Tcl_Appen
de60: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
de70: 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f "TLS 1.2 protoco
de80: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
de90: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
dea0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
deb0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
dec0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
ded0: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _3) || defined(O
dee0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
def0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
df00: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
df10: 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 TO_TLS1_3)) {..T
df20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
df30: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 interp, "TLS 1.3
df40: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
df50: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
df60: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
df70: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
df80: 6e 64 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f ndif. if (pro
df90: 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 to == 0) {../* U
dfa0: 73 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f se full range */
dfb0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 ..SSL_CTX_set_mi
dfc0: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 n_proto_version(
dfd0: 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54 ctx, 0);..SSL_CT
dfe0: 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f X_set_max_proto_
dff0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b version(ctx, 0);
e000: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 . }.. swit
e010: 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 ch (proto) {.#if
e020: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
e030: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
e040: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 0000L && !define
e050: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 d(NO_SSL2) && !d
e060: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e070: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 O_SSL2). case
e080: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a TLS_PROTO_SSL2:
e090: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
e0a0: 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 ver ? SSLv2_serv
e0b0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 er_method() : SS
e0c0: 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f Lv2_client_metho
e0d0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
e0e0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
e0f0: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 (NO_SSL3) && !de
e100: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e110: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
e120: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
e130: 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 L3_METHOD). c
e140: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 ase TLS_PROTO_SS
e150: 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 L3:..method = is
e160: 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 Server ? SSLv3_s
e170: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a erver_method() :
e180: 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 SSLv3_client_me
e190: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a thod();..break;.
e1a0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
e1b0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 ned(NO_TLS1) &&
e1c0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
e1d0: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 _NO_TLS1) && !de
e1e0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e1f0: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 _TLS1_METHOD).
e200: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
e210: 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d _TLS1:..method =
e220: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 isServer ? TLSv
e230: 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 1_server_method(
e240: 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 ) : TLSv1_client
e250: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
e260: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 k;.#endif.#if !d
e270: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
e280: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
e290: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
e2a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
e2b0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d NSSL_NO_TLS1_1_M
e2c0: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 ETHOD). case
e2d0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 TLS_PROTO_TLS1_1
e2e0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 :..method = isSe
e2f0: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 rver ? TLSv1_1_s
e300: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a erver_method() :
e310: 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f TLSv1_1_client_
e320: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
e330: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
e340: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
e350: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
e360: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 NSSL_NO_TLS1_2)
e370: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
e380: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 SSL_NO_TLS1_2_ME
e390: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 THOD). case T
e3a0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a LS_PROTO_TLS1_2:
e3b0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
e3c0: 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 ver ? TLSv1_2_se
e3d0: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 rver_method() :
e3e0: 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d TLSv1_2_client_m
e3f0: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b ethod();..break;
e400: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
e410: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
e420: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
e430: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
e440: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
e450: 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 O_TLS1_3:../* Us
e460: 65 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65 e the generic me
e470: 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 thod and constra
e480: 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72 20 int range after
e490: 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 74 context is creat
e4a0: 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 ed */..method =
e4b0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 isServer ? TLS_s
e4c0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a erver_method() :
e4d0: 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 TLS_client_meth
e4e0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
e4f0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 ndif. default
e500: 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 :../* Negotiate
e510: 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c highest availabl
e520: 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f e SSL/TLS versio
e530: 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 n */..method = i
e540: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 sServer ? TLS_se
e550: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 rver_method() :
e560: 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f TLS_client_metho
e570: 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c d();.#if OPENSSL
e580: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
e590: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 < 0x10100000L &&
e5a0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
e5b0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
e5c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a PENSSL_NO_SSL2).
e5d0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
e5e0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
e5f0: 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 O_SSL2) ? 0 :
e600: 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 SSL_OP_NO_SSLv2)
e610: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
e620: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
e630: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
e640: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 SL_NO_SSL3)..off
e650: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f |= (ENABLED(pro
e660: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 to, TLS_PROTO_SS
e670: 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f L3) ? 0 : SSL_
e680: 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 OP_NO_SSLv3);.#e
e690: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
e6a0: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 d(NO_TLS1) && !d
e6b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e6c0: 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 O_TLS1)..off |=
e6d0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
e6e0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 TLS_PROTO_TLS1)
e6f0: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ? 0 : SSL_OP_N
e700: 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 O_TLSv1);.#endif
e710: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
e720: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 _TLS1_1) && !def
e730: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
e740: 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 TLS1_1)..off |=
e750: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
e760: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 TLS_PROTO_TLS1_1
e770: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ) ? 0 : SSL_OP_N
e780: 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 O_TLSv1_1);.#end
e790: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
e7a0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 NO_TLS1_2) && !d
e7b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e7c0: 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c O_TLS1_2)..off |
e7d0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
e7e0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
e7f0: 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 _2) ? 0 : SSL_OP
e800: 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 _NO_TLSv1_2);.#e
e810: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
e820: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 d(NO_TLS1_3) &&
e830: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
e840: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 _NO_TLS1_3)..off
e850: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f |= (ENABLED(pro
e860: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
e870: 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f S1_3) ? 0 : SSL_
e880: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a OP_NO_TLSv1_3);.
e890: 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 #endif..break;.
e8a0: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c }.. ERR_cl
e8b0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 ear_error();..
e8c0: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f ctx = SSL_CTX_
e8d0: 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 new(method);.
e8e0: 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 if (!ctx) {..re
e8f0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
e900: 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 .. if (getenv
e910: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 (SSLKEYLOGFILE))
e920: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {..SSL_CTX_set_
e930: 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 keylog_callback(
e940: 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 ctx, KeyLogCallb
e950: 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 ack);. }..#if
e960: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
e970: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
e980: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
e990: 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 _3). if (prot
e9a0: 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 o == TLS_PROTO_T
e9b0: 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 LS1_3) {..SSL_CT
e9c0: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f X_set_min_proto_
e9d0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 version(ctx, TLS
e9e0: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 1_3_VERSION);..S
e9f0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 SL_CTX_set_max_p
ea00: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
ea10: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
ea20: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a );. }.#endif.
ea30: 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 . /* Force ci
ea40: 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f pher selection o
ea50: 72 64 65 72 20 62 79 20 73 65 72 76 65 72 20 2a rder by server *
ea60: 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 72 /. if (!isSer
ea70: 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f ver) {..SSL_CTX_
ea80: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c set_options(ctx,
ea90: 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 SSL_OP_CIPHER_S
eaa0: 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45 ERVER_PREFERENCE
eab0: 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 );. }..#if OP
eac0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
ead0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
eae0: 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61 0L. OpenSSL_a
eaf0: 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d dd_all_algorithm
eb00: 73 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69 70 s(); /* Load cip
eb10: 68 65 72 73 20 61 6e 64 20 64 69 67 65 73 74 73 hers and digests
eb20: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 */.#endif..
eb30: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f SSL_CTX_set_app_
eb40: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a data(ctx, (void*
eb50: 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d )interp);./* rem
eb60: 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 ember the interp
eb70: 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c reter */. SSL
eb80: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
eb90: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c (ctx, SSL_OP_ALL
eba0: 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 );./* all SSL bu
ebb0: 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f g workarounds */
ebc0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
ebd0: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 _options(ctx, SS
ebe0: 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 L_OP_NO_COMPRESS
ebf0: 49 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 62 6c 65 ION);./* disable
ec00: 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76 65 compression eve
ec10: 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64 20 2a n if supported *
ec20: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 /. SSL_CTX_se
ec30: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f t_options(ctx, o
ec40: 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 ff);../* disable
ec50: 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f protocol versio
ec60: 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 ns */.#if OPENSS
ec70: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
ec80: 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20 < 0x10101000L.
ec90: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d SSL_CTX_set_m
eca0: 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 ode(ctx, SSL_MOD
ecb0: 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f E_AUTO_RETRY);./
ecc0: 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e * handle new han
ecd0: 64 73 68 61 6b 65 73 20 69 6e 20 62 61 63 6b 67 dshakes in backg
ece0: 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64 65 66 round. On by def
ecf0: 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 ault in OpenSSL
ed00: 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 66 1.1.1. */.#endif
ed10: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 . SSL_CTX_ses
ed20: 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 s_set_cache_size
ed30: 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 (ctx, 128);..
ed40: 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66 /* Set user def
ed50: 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69 ined ciphers, ci
ed60: 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64 pher suites, and
ed70: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 security level
ed80: 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 */. if ((ciph
ed90: 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 ers != NULL) &&
eda0: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 !SSL_CTX_set_cip
edb0: 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 her_list(ctx, ci
edc0: 70 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 phers)) {..Tcl_A
edd0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
ede0: 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73 rp, "Set ciphers
edf0: 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 failed: No vali
ee00: 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 d ciphers", (cha
ee10: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c r *) NULL);..SSL
ee20: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
ee30: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
ee40: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70 }. if ((cip
ee50: 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c hersuites != NUL
ee60: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 L) && !SSL_CTX_s
ee70: 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 et_ciphersuites(
ee80: 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 ctx, ciphersuite
ee90: 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e s)) {..Tcl_Appen
eea0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
eeb0: 22 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74 "Set cipher suit
eec0: 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 es failed: No va
eed0: 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 lid ciphers", (c
eee0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 har *) NULL);..S
eef0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
ef00: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
ef10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
ef20: 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c t security level
ef30: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 */. if (leve
ef40: 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 l > -1 && level
ef50: 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 < 6) {../* SSL_s
ef60: 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 et_security_leve
ef70: 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 l */..SSL_CTX_se
ef80: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c t_security_level
ef90: 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 (ctx, level);.
efa0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 }.. /* set
efb0: 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a some callbacks *
efc0: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 /. SSL_CTX_se
efd0: 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 t_default_passwd
efe0: 5f 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 _cb(ctx, Passwor
eff0: 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 dCallback);.
f000: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 SSL_CTX_set_defa
f010: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 ult_passwd_cb_us
f020: 65 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 erdata(ctx, (voi
f030: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a d *)statePtr);..
f040: 20 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 /* read a Di
f050: 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 ffie-Hellman par
f060: 61 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 ameters file, or
f070: 20 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 use the built-i
f080: 6e 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 54 63 6c n one */. Tcl
f090: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 _DStringInit(&ds
f0a0: 29 3b 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 );.#ifdef OPENSS
f0b0: 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 L_NO_DH. if (
f0c0: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c DHparams != NULL
f0d0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
f0e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 esult(interp, "D
f0f0: 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 H parameter supp
f100: 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c ort not availabl
f110: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c e", (char *) NUL
f120: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
f130: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
f140: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 NULL;. }.#els
f150: 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b e. {..DH* dh;
f160: 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 ..if (DHparams !
f170: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 = NULL) {.. B
f180: 49 4f 20 2a 62 69 6f 3b 0a 0a 09 20 20 20 20 62 IO *bio;... b
f190: 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c io = BIO_new_fil
f1a0: 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 e(F2N(DHparams,
f1b0: 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 &ds), "r");..
f1c0: 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 if (!bio) {...T
f1d0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
f1e0: 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e ds);...Tcl_Appen
f1f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
f200: 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 "Could not find
f210: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 DH parameters fi
f220: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 le", (char *) NU
f230: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 LL);...SSL_CTX_f
f240: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 ree(ctx);...retu
f250: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a rn NULL;.. }.
f260: 0a 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 .. dh = PEM_r
f270: 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 ead_bio_DHparams
f280: 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c (bio, NULL, NULL
f290: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 , NULL);.. BI
f2a0: 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 O_free(bio);..
f2b0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
f2c0: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20 e(&ds);.. if
f2d0: 28 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 (!dh) {...Tcl_Ap
f2e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
f2f0: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 p, "Could not re
f300: 61 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 ad DH parameters
f310: 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 from file", (ch
f320: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 ar *) NULL);...S
f330: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
f340: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
f350: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 53 53 4c .. }.. SSL
f360: 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 _CTX_set_tmp_dh(
f370: 63 74 78 2c 20 64 68 29 3b 0a 09 20 20 20 20 44 ctx, dh);.. D
f380: 48 5f 66 72 65 65 28 64 68 29 3b 0a 0a 09 7d 20 H_free(dh);...}
f390: 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 20 55 else {.. /* U
f3a0: 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44 48 se well known DH
f3b0: 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 parameters that
f3c0: 20 68 61 76 65 20 62 75 69 6c 74 2d 69 6e 20 73 have built-in s
f3d0: 75 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e 53 53 upport in OpenSS
f3e0: 4c 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 21 53 L */.. if (!S
f3f0: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f 61 75 SL_CTX_set_dh_au
f400: 74 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a 09 09 to(ctx, 1)) {...
f410: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
f420: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 (interp, "Could
f430: 6e 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 20 44 not enable set D
f440: 48 20 61 75 74 6f 3a 20 22 2c 20 47 45 54 5f 45 H auto: ", GET_E
f450: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
f460: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 ar *) NULL);...S
f470: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
f480: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
f490: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d .. }..}. }
f4a0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 .#endif.. /*
f4b0: 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 set our certific
f4c0: 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f ate */. load_
f4d0: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b private_key = 0;
f4e0: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c . if (certfil
f4f0: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f e != NULL) {..lo
f500: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d ad_private_key =
f510: 20 31 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 1;...if (SSL_CT
f520: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 X_use_certificat
f530: 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 e_file(ctx, F2N(
f540: 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 certfile, &ds),
f550: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d SSL_FILETYPE_PEM
f560: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 ) <= 0) {.. T
f570: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
f580: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 ds);.. Tcl_Ap
f590: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
f5a0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 p, "unable to se
f5b0: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 t certificate fi
f5c0: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 le ", certfile,
f5d0: 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f ": ",...GET_ERR_
f5e0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
f5f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
f600: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
f610: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
f620: 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 LL;..}..Tcl_DStr
f630: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 20 ingFree(&ds);..
f640: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 } else if (ce
f650: 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c rt != NULL) {..l
f660: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 oad_private_key
f670: 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 = 1;..if (SSL_CT
f680: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 X_use_certificat
f690: 65 5f 41 53 4e 31 28 63 74 78 2c 20 28 69 6e 74 e_ASN1(ctx, (int
f6a0: 29 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 ) cert_len, cert
f6b0: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 ) <= 0) {.. T
f6c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
f6d0: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
f6e0: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 to set certifica
f6f0: 74 65 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 te: ",...GET_ERR
f700: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 _REASON(), (char
f710: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
f720: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
f730: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
f740: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c ULL;..}. } el
f750: 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d se {..certfile =
f760: 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 (char*)X509_get
f770: 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 _default_cert_fi
f780: 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f le();...if (SSL_
f790: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
f7a0: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 ate_file(ctx, ce
f7b0: 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 rtfile, SSL_FILE
f7c0: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 TYPE_PEM) <= 0)
f7d0: 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c {.#if 0.. Tcl
f7e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
f7f0: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
f800: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 use default cer
f810: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c tificate file ",
f820: 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c certfile, ": ",
f830: 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f ...GET_ERR_REASO
f840: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
f850: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
f860: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
f870: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 return NULL;.#
f880: 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a endif..}. }..
f890: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 /* set our p
f8a0: 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 rivate key */.
f8b0: 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 if (load_priva
f8c0: 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b te_key) {..if (k
f8d0: 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 eyfile == NULL &
f8e0: 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b & key == NULL) {
f8f0: 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 .. keyfile =
f900: 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 certfile;..}...i
f910: 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 f (keyfile != NU
f920: 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 LL) {.. /* ge
f930: 74 20 74 68 65 20 70 72 69 76 61 74 65 20 6b 65 t the private ke
f940: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 y associated wit
f950: 68 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61 h this certifica
f960: 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b te */.. if (k
f970: 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 eyfile == NULL)
f980: 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 {...keyfile = ce
f990: 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a rtfile;.. }..
f9a0: 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 . if (SSL_CTX
f9b0: 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f _use_PrivateKey_
f9c0: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 file(ctx, F2N(ke
f9d0: 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c yfile, &ds), SSL
f9e0: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c _FILETYPE_PEM) <
f9f0: 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 = 0) {...Tcl_DSt
fa00: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
fa10: 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 ./* flush the pa
fa20: 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d ssphrase which m
fa30: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 ight be left in
fa40: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 the result */...
fa50: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
fa60: 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f terp, NULL, TCL_
fa70: 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 STATIC);...Tcl_A
fa80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
fa90: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
faa0: 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 et public key fi
fab0: 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 le ", keyfile, "
fac0: 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52 ",... GET_ER
fad0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
fae0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
faf0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
fb00: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ...return NULL;.
fb10: 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f . }.. Tcl_
fb20: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
fb30: 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b ;...} else if (k
fb40: 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 ey != NULL) {..
fb50: 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 if (SSL_CTX_u
fb60: 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 se_PrivateKey_AS
fb70: 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c N1(EVP_PKEY_RSA,
fb80: 20 63 74 78 2c 20 6b 65 79 2c 20 28 69 6e 74 29 ctx, key, (int)
fb90: 20 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 key_len) <= 0)
fba0: 7b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 {.../* flush the
fbb0: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 passphrase whic
fbc0: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 h might be left
fbd0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f in the result */
fbe0: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
fbf0: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 (interp, NULL, T
fc00: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 CL_STATIC);...Tc
fc10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
fc20: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
fc30: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 o set public key
fc40: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
fc50: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
fc60: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
fc70: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 _free(ctx);...re
fc80: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
fc90: 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 }..}../* Now we
fca0: 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 know that a key
fcb0: 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 and cert have be
fcc0: 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 en set against..
fcd0: 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 * the SSL conte
fce0: 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f xt */..if (!SSL_
fcf0: 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 CTX_check_privat
fd00: 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 e_key(ctx)) {..
fd10: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
fd20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 ult(interp, "pri
fd30: 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f vate key does no
fd40: 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 t match the cert
fd50: 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b ificate public k
fd60: 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 ey",.... (ch
fd70: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
fd80: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
fd90: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tx);.. return
fda0: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a NULL;..}. }.
fdb0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 . /* Set to u
fdc0: 73 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 se default locat
fdd0: 69 6f 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 ion and file for
fde0: 20 43 65 72 74 69 66 69 63 61 74 65 20 41 75 74 Certificate Aut
fdf0: 68 6f 72 69 74 79 20 28 43 41 29 20 63 65 72 74 hority (CA) cert
fe00: 69 66 69 63 61 74 65 73 2e 20 54 68 65 0a 20 20 ificates. The.
fe10: 20 20 20 2a 20 76 65 72 69 66 79 20 70 61 74 68 * verify path
fe20: 20 61 6e 64 20 73 74 6f 72 65 20 63 61 6e 20 62 and store can b
fe30: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 e overridden by
fe40: 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 the SSL_CERT_DIR
fe50: 20 65 6e 76 20 76 61 72 2e 20 54 68 65 20 76 65 env var. The ve
fe60: 72 69 66 79 20 66 69 6c 65 20 63 61 6e 0a 20 20 rify file can.
fe70: 20 20 20 2a 20 62 65 20 6f 76 65 72 72 69 64 64 * be overridd
fe80: 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 en by the SSL_CE
fe90: 52 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e RT_FILE env var.
fea0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c */. if (!SSL
feb0: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 _CTX_set_default
fec0: 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 _verify_paths(ct
fed0: 78 29 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a x)) {..abort++;.
fee0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 }.. /* Ov
fef0: 65 72 72 69 64 65 73 20 66 6f 72 20 74 68 65 20 errides for the
ff00: 43 41 20 76 65 72 69 66 79 20 70 61 74 68 20 61 CA verify path a
ff10: 6e 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b nd file */. {
ff20: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
ff30: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
ff40: 33 30 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43 30000000L..if (C
ff50: 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c Apath != NULL ||
ff60: 20 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 CAfile != NULL)
ff70: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 {.. Tcl_DStr
ff80: 69 6e 67 20 64 73 31 3b 0a 09 20 20 20 20 54 63 ing ds1;.. Tc
ff90: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 l_DStringInit(&d
ffa0: 73 31 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 21 s1);... if (!
ffb0: 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 SSL_CTX_load_ver
ffc0: 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 ify_locations(ct
ffd0: 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 x, F2N(CAfile, &
ffe0: 64 73 29 2c 20 46 32 4e 28 43 41 70 61 74 68 2c ds), F2N(CApath,
fff0: 20 26 64 73 31 29 29 29 20 7b 0a 09 09 61 62 6f &ds1))) {...abo
10000 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 rt++;.. }..
10010 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
10020 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c e(&ds);.. Tcl
10030 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
10040 31 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 1);... /* Set
10050 20 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 list of CAs to
10060 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 send to client w
10070 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 hen requesting a
10080 20 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 client certific
10090 61 74 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 ate */.. /* h
100a0 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 ttps://sourcefor
100b0 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 ge.net/p/tls/bug
100c0 73 2f 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a s/57/ */.. /*
100d0 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 XXX:TODO: Let t
100e0 68 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 he user supply v
100f0 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 alues here inste
10100 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 ad of something
10110 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 that exists on t
10120 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f he filesystem */
10130 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 .. STACK_OF(X
10140 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 509_NAME) *certN
10150 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f ames = SSL_load_
10160 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 client_CA_file(F
10170 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 2N(CAfile, &ds))
10180 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e ;.. if (certN
10190 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a ames != NULL) {.
101a0 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c ..SSL_CTX_set_cl
101b0 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 ient_CA_list(ctx
101c0 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 , certNames);..
101d0 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 }.. Tcl_DS
101e0 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
101f0 09 7d 0a 0a 23 65 6c 73 65 0a 09 69 66 20 28 43 .}..#else..if (C
10200 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b Apath != NULL) {
10210 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 .. if (!SSL_C
10220 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64 TX_load_verify_d
10230 69 72 28 63 74 78 2c 20 46 32 4e 28 43 41 70 61 ir(ctx, F2N(CApa
10240 74 68 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 th, &ds))) {...a
10250 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 bort++;.. }..
10260 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
10270 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 09 69 66 ree(&ds);..}..if
10280 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c (CAfile != NULL
10290 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 ) {.. if (!SS
102a0 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 L_CTX_load_verif
102b0 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 y_file(ctx, F2N(
102c0 43 41 66 69 6c 65 2c 20 26 64 73 29 29 29 20 7b CAfile, &ds))) {
102d0 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 ...abort++;..
102e0 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 }.. Tcl_DStr
102f0 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 ingFree(&ds);...
10300 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 /* Set list
10310 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74 of CAs to send t
10320 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 o client when re
10330 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e questing a clien
10340 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f t certificate */
10350 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 .. STACK_OF(X
10360 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 509_NAME) *certN
10370 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f ames = SSL_load_
10380 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 client_CA_file(F
10390 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 2N(CAfile, &ds))
103a0 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e ;.. if (certN
103b0 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a ames != NULL) {.
103c0 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c ..SSL_CTX_set_cl
103d0 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 ient_CA_list(ctx
103e0 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 , certNames);..
103f0 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 }.. Tcl_DS
10400 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
10410 09 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a .}.#endif. }.
10420 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b . return ctx;
10430 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
10440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
10480 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 . * StatusObjCmd
10490 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 -- return certi
104a0 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 ficate for conne
104b0 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a cted peer.. *. *
104c0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
104d0 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
104e0 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
104f0 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
10500 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
10510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10540 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
10550 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f atic int.StatusO
10560 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
10570 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
10580 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
10590 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
105a0 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
105b0 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
105c0 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 tatePtr;. X50
105d0 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 9 *peer;. Tcl
105e0 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 _Obj *objPtr;.
105f0 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
10600 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 an;. char *ch
10610 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 annelName, *ciph
10620 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 ers;. int mod
10630 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 e;. const uns
10640 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 igned char *prot
10650 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 o;. unsigned
10660 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 int len;. int
10670 20 6e 69 64 2c 20 72 65 73 3b 0a 20 20 20 20 28 nid, res;. (
10680 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
10690 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
106a0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
106b0 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f f (objc < 2 || o
106c0 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 bjc > 3 || (objc
106d0 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70 == 3 && !strcmp
106e0 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f (Tcl_GetString(o
106f0 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c bjv[1]), "-local
10700 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e "))) {..Tcl_Wron
10710 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
10720 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 1, objv, "?-loc
10730 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 al? channel");..
10740 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
10750 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
10760 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a Get channel Id *
10770 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d /. channelNam
10780 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e e = Tcl_GetStrin
10790 67 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 g(objv[(objc ==
107a0 32 20 3f 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 2 ? 1 : 2)]);.
107b0 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
107c0 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
107d0 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f channelName, &mo
107e0 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 de);. if (cha
107f0 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
10800 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
10810 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
10820 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
10830 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
10840 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
10850 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
10860 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
10870 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 Channel(chan);.
10880 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
10890 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
108a0 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
108b0 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
108c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
108d0 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
108e0 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
108f0 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 elName(chan),...
10900 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
10910 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a hannel", (char *
10920 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 ) NULL);..Tcl_Se
10930 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
10940 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55 p, "TLS", "STATU
10950 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 S", "CHANNEL", "
10960 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
10970 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
10980 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
10990 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 }. statePtr
109a0 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f = (State *) Tcl_
109b0 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
109c0 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 ceData(chan);..
109d0 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66 /* Get certif
109e0 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f icate for peer o
109f0 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 r self */. if
10a00 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 (objc == 2) {..
10a10 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 peer = SSL_get_p
10a20 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 eer_certificate(
10a30 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
10a40 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 } else {..pe
10a50 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 er = SSL_get_cer
10a60 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 tificate(statePt
10a70 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 r->ssl);. }.
10a80 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63 /* Get X509 c
10a90 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20 ertificate info
10aa0 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72 29 */. if (peer)
10ab0 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 {..objPtr = Tls
10ac0 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 _NewX509Obj(inte
10ad0 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28 rp, peer);..if (
10ae0 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 objc == 2) {..
10af0 20 20 58 35 30 39 5f 66 72 65 65 28 70 65 65 72 X509_free(peer
10b00 29 3b 0a 09 20 20 20 20 70 65 65 72 20 3d 20 4e );.. peer = N
10b10 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c ULL;..}. } el
10b20 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 se {..objPtr = T
10b30 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
10b40 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 NULL);. }..
10b50 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 /* Peer name
10b60 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 */. LAPPEND_S
10b70 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
10b80 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 r, "peername", S
10b90 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 SL_get0_peername
10ba0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c (statePtr->ssl),
10bb0 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e -1);. LAPPEN
10bc0 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
10bd0 6a 50 74 72 2c 20 22 73 62 69 74 73 22 2c 20 53 jPtr, "sbits", S
10be0 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69 SL_get_cipher_bi
10bf0 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ts(statePtr->ssl
10c00 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 , NULL));.. c
10c10 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 iphers = (char*)
10c20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 SSL_get_cipher(s
10c30 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
10c40 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
10c50 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10c60 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 cipher", ciphers
10c70 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 , -1);.. /* V
10c80 65 72 69 66 79 20 74 68 65 20 58 35 30 39 20 63 erify the X509 c
10c90 65 72 74 69 66 69 63 61 74 65 20 70 72 65 73 65 ertificate prese
10ca0 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 65 72 nted by the peer
10cb0 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f */. LAPPEND_
10cc0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
10cd0 74 72 2c 20 22 76 65 72 69 66 79 52 65 73 75 6c tr, "verifyResul
10ce0 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 69 66 79 t",..X509_verify
10cf0 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 _cert_error_stri
10d00 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 ng(SSL_get_verif
10d10 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 y_result(statePt
10d20 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a r->ssl)), -1);..
10d30 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f /* Verify mo
10d40 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d de */. mode =
10d50 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f SSL_get_verify_
10d60 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 73 mode(statePtr->s
10d70 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 sl);. if (mod
10d80 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f e && SSL_VERIFY_
10d90 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 NONE) {..LAPPEND
10da0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
10db0 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 Ptr, "verifyMode
10dc0 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a ", "none", -1);.
10dd0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 } else {..Tc
10de0 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 l_Obj *listObjPt
10df0 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
10e00 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 bj(0, NULL);..if
10e10 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 (mode && SSL_VE
10e20 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 RIFY_PEER) {..
10e30 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
10e40 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
10e50 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 p, listObjPtr, T
10e60 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
10e70 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d "peer", -1));..}
10e80 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 ..if (mode && SS
10e90 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 L_VERIFY_FAIL_IF
10ea0 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b _NO_PEER_CERT) {
10eb0 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
10ec0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
10ed0 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 nterp, listObjPt
10ee0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
10ef0 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 Obj("fail if no
10f00 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29 peer cert", -1))
10f10 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 ;..}..if (mode &
10f20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 & SSL_VERIFY_CLI
10f30 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 ENT_ONCE) {..
10f40 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
10f50 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
10f60 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 , listObjPtr, Tc
10f70 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
10f80 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 client once", -1
10f90 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 ));..}..if (mode
10fa0 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 && SSL_VERIFY_P
10fb0 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b OST_HANDSHAKE) {
10fc0 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
10fd0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
10fe0 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 nterp, listObjPt
10ff0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
11000 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68 Obj("post handsh
11010 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 ake", -1));..}..
11020 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 LAPPEND_OBJ(inte
11030 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 rp, objPtr, "ver
11040 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 ifyMode", listOb
11050 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 jPtr). }..
11060 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 /* Verify mode
11070 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 depth */. LAP
11080 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
11090 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 objPtr, "verify
110a0 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f Depth", SSL_get_
110b0 76 65 72 69 66 79 5f 64 65 70 74 68 28 73 74 61 verify_depth(sta
110c0 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 tePtr->ssl));..
110d0 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 /* Report the
110e0 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 selected protoc
110f0 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f ol as a result o
11100 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f f the negotiatio
11110 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 n */. SSL_get
11120 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 0_alpn_selected(
11130 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 statePtr->ssl, &
11140 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 proto, &len);.
11150 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
11160 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 terp, objPtr, "a
11170 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 72 lpn", (char *)pr
11180 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 oto, (Tcl_Size)
11190 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e len);. LAPPEN
111a0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
111b0 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 jPtr, "protocol"
111c0 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f , SSL_get_versio
111d0 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 n(statePtr->ssl)
111e0 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 , -1);.. /* V
111f0 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 alid for non-RSA
11200 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54 signature and T
11210 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 LS 1.3 */. if
11220 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 (objc == 2) {..
11230 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 res = SSL_get_pe
11240 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 er_signature_nid
11250 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
11260 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 &nid);. } els
11270 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 e {..res = SSL_g
11280 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 et_signature_nid
11290 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
112a0 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 &nid);. }.
112b0 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 if (!res) {nid
112c0 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e = 0;}. LAPPEN
112d0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
112e0 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 jPtr, "signature
112f0 48 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 HashAlgorithm",
11300 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c OBJ_nid2ln(nid),
11310 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 -1);.. /* Ad
11320 64 65 64 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 ded in OpenSSL 1
11330 2e 31 2e 31 61 20 2a 2f 0a 23 69 66 20 4f 50 45 .1.1a */.#if OPE
11340 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
11350 42 45 52 20 3e 20 30 78 31 30 31 30 31 30 30 30 BER > 0x10101000
11360 4c 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d L. if (objc =
11370 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 = 2) {..res = SS
11380 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 L_get_peer_signa
11390 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 ture_type_nid(st
113a0 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
113b0 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b d);. } else {
113c0 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f ..res = SSL_get_
113d0 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e signature_type_n
113e0 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c id(statePtr->ssl
113f0 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 , &nid);. }.
11400 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 if (!res) {ni
11410 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 d = 0;}. LAPP
11420 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11430 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 objPtr, "signatu
11440 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 reType", OBJ_nid
11450 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 23 2ln(nid), -1);.#
11460 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 endif.. Tcl_S
11470 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
11480 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
11490 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
114a0 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
114b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
114c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
114d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
114e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
114f0 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 * ConnectionInf
11500 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 oObjCmd -- retur
11510 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 n connection inf
11520 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a o from OpenSSL..
11530 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
11540 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e *.A list of conn
11550 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a ection info. *.
11560 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
11570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
115a0 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
115b0 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e c int Connection
115c0 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e InfoObjCmd(Clien
115d0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
115e0 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
115f0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
11600 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
11610 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
11620 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 _Channel chan;..
11630 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 /* The channel t
11640 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 o set a mode on
11650 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 */. State *st
11660 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 atePtr;../* clie
11670 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c nt state for ssl
11680 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 socket */. T
11690 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 cl_Obj *objPtr,
116a0 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f *listPtr;. co
116b0 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 nst SSL *ssl;.
116c0 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 const SSL_CIPH
116d0 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 ER *cipher;.
116e0 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f const SSL_SESSIO
116f0 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 N *session;.
11700 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 const EVP_MD *md
11710 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 ;. (void) cli
11720 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 entData;.. if
11730 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 (objc != 2) {..
11740 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
11750 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
11760 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 , "channel");..r
11770 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
11780 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e . }.. chan
11790 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
117a0 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 l(interp, Tcl_Ge
117b0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 tString(objv[1])
117c0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 , NULL);. if
117d0 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
117e0 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
117f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
11800 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
11810 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
11820 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
11830 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
11840 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
11850 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
11860 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 );. if (Tcl_G
11870 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
11880 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
11890 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c elType()) {..Tcl
118a0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
118b0 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
118c0 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
118d0 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
118e0 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 ,.. "\": not
118f0 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 a TLS channel",
11900 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
11910 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
11920 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
11930 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 "CONNECTION", "
11940 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c CHANNEL", "INVAL
11950 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ID", (char *) NU
11960 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
11970 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
11980 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
11990 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
119a0 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e LL);.. /* Con
119b0 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a nection info */.
119c0 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
119d0 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 State *)Tcl_GetC
119e0 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
119f0 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 ta(chan);. ss
11a00 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 l = statePtr->ss
11a10 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 l;. if (ssl !
11a20 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f = NULL) {../* co
11a30 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a nnection state *
11a40 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
11a50 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11a60 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 state", SSL_stat
11a70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 e_string_long(ss
11a80 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 l), -1);.../* Ge
11a90 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 t SNI requested
11aa0 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 server name */..
11ab0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11ac0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 rp, objPtr, "ser
11ad0 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 vername", SSL_ge
11ae0 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c t_servername(ssl
11af0 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 , TLSEXT_NAMETYP
11b00 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 E_host_name), -1
11b10 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 );.../* Get prot
11b20 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 ocol */..LAPPEND
11b30 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11b40 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c Ptr, "protocol",
11b50 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e SSL_get_version
11b60 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a (ssl), -1);.../*
11b70 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 Renegotiation a
11b80 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 llowed */..LAPPE
11b90 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
11ba0 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 objPtr, "renegot
11bb0 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c iation_allowed",
11bc0 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f SSL_get_secure_
11bd0 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 renegotiation_su
11be0 70 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 73 pport((SSL *) ss
11bf0 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 l));.../* Get se
11c00 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a curity level */.
11c10 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 .LAPPEND_INT(int
11c20 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
11c30 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 curity_level", S
11c40 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f SL_get_security_
11c50 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f level(ssl));.../
11c60 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a * Session info *
11c70 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
11c80 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11c90 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 "session_reused"
11ca0 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 , SSL_session_re
11cb0 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a used(ssl));.../*
11cc0 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 Is server info
11cd0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c */..LAPPEND_BOOL
11ce0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11cf0 20 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53 "is_server", SS
11d00 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 L_is_server(ssl)
11d10 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 );.../* Is DTLS
11d20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c */..LAPPEND_BOOL
11d30 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11d40 20 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f "is_dtls", SSL_
11d50 69 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20 is_dtls(ssl));.
11d60 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 }.. /* Cip
11d70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 her info */.
11d80 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 cipher = SSL_get
11d90 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 _current_cipher(
11da0 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 ssl);. if (ci
11db0 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a pher != NULL) {.
11dc0 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a .char buf[BUFSIZ
11dd0 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 ] = {0};..int bi
11de0 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 ts, alg_bits;...
11df0 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a /* Cipher name *
11e00 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
11e10 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11e20 63 69 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 cipher", SSL_CIP
11e30 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 HER_get_name(cip
11e40 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 her), -1);.../*
11e50 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 RFC name of ciph
11e60 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 er */..LAPPEND_S
11e70 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11e80 72 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d r, "standard_nam
11e90 65 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 e", SSL_CIPHER_s
11ea0 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 tandard_name(cip
11eb0 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 her), -1);.../*
11ec0 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 OpenSSL name of
11ed0 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 cipher */..LAPPE
11ee0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11ef0 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f bjPtr, "openssl_
11f00 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 name", OPENSSL_c
11f10 69 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 ipher_name(SSL_C
11f20 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e IPHER_standard_n
11f30 61 6d 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31 ame(cipher)), -1
11f40 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f );.../* number o
11f50 66 20 73 65 63 72 65 74 20 62 69 74 73 20 75 73 f secret bits us
11f60 65 64 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f ed for cipher */
11f70 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 ..bits = SSL_CIP
11f80 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 HER_get_bits(cip
11f90 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b her, &alg_bits);
11fa0 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
11fb0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
11fc0 65 63 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74 ecret_bits", bit
11fd0 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 s);..LAPPEND_INT
11fe0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11ff0 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 "algorithm_bits
12000 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f ", alg_bits);../
12010 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 * alg_bits is ac
12020 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 tual key secret
12030 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 bits. If use bit
12040 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c s and secret (al
12050 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 gorithm) bits di
12060 66 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 ffer,.. the re
12070 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 st of the bits a
12080 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 re fixed, i.e. f
12090 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 or limited expor
120a0 74 20 63 69 70 68 65 72 73 20 28 62 69 74 73 20 t ciphers (bits
120b0 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e < 56) */.../* In
120c0 64 69 63 61 74 65 73 20 77 68 69 63 68 20 53 53 dicates which SS
120d0 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 L/TLS protocol v
120e0 65 72 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66 ersion first def
120f0 69 6e 65 64 20 74 68 65 20 63 69 70 68 65 72 20 ined the cipher
12100 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
12110 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12120 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 "min_version", S
12130 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 SL_CIPHER_get_ve
12140 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d rsion(cipher), -
12150 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 1);.../* Cipher
12160 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f NID */..LAPPEND_
12170 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12180 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22 2c tr, "cipherNID",
12190 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 (char *)OBJ_nid
121a0 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 2ln(SSL_CIPHER_g
121b0 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 69 et_cipher_nid(ci
121c0 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 pher)), -1);..LA
121d0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
121e0 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 73 , objPtr, "diges
121f0 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f tNID", (char *)O
12200 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 BJ_nid2ln(SSL_CI
12210 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74 5f PHER_get_digest_
12220 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 nid(cipher)), -1
12230 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
12240 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12250 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44 22 "keyExchangeNID"
12260 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 , (char *)OBJ_ni
12270 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f d2ln(SSL_CIPHER_
12280 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 get_kx_nid(ciphe
12290 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 r)), -1);..LAPPE
122a0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
122b0 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74 69 bjPtr, "authenti
122c0 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 cationNID", (cha
122d0 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 r *)OBJ_nid2ln(S
122e0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 75 SL_CIPHER_get_au
122f0 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c th_nid(cipher)),
12300 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 -1);.../* messa
12310 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f ge authenticatio
12320 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72 20 n code - Cipher
12330 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47 43 is AEAD (e.g. GC
12340 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50 6f M or ChaCha20/Po
12350 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a ly1305) or not *
12360 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 /../* Authentica
12370 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 ted Encryption w
12380 69 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 64 ith associated d
12390 61 74 61 20 28 41 45 41 44 29 20 63 68 65 63 6b ata (AEAD) check
123a0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f */..LAPPEND_BOO
123b0 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 L(interp, objPtr
123c0 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65 61 , "cipher_is_aea
123d0 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 d", SSL_CIPHER_i
123e0 73 5f 61 65 61 64 28 63 69 70 68 65 72 29 29 3b s_aead(cipher));
123f0 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65 .../* Digest use
12400 64 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c d during the SSL
12410 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77 /TLS handshake w
12420 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69 hen using the ci
12430 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 pher. */..md = S
12440 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61 SL_CIPHER_get_ha
12450 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63 ndshake_digest(c
12460 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 ipher);..LAPPEND
12470 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12480 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f Ptr, "handshake_
12490 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a digest", (char *
124a0 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 )EVP_MD_name(md)
124b0 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 , -1);.../* Get
124c0 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 OpenSSL-specific
124d0 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 ID, not IANA ID
124e0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 */..LAPPEND_INT
124f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12500 20 22 63 69 70 68 65 72 5f 69 64 22 2c 20 28 69 "cipher_id", (i
12510 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 nt) SSL_CIPHER_g
12520 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a et_id(cipher));.
12530 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 ../* Two-byte ID
12540 20 75 73 65 64 20 69 6e 20 74 68 65 20 54 4c 53 used in the TLS
12550 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 protocol of the
12560 20 67 69 76 65 6e 20 63 69 70 68 65 72 20 2a 2f given cipher */
12570 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
12580 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 terp, objPtr, "p
12590 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e rotocol_id", (in
125a0 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 t) SSL_CIPHER_ge
125b0 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 t_protocol_id(ci
125c0 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 pher));.../* Tex
125d0 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e tual description
125e0 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a of the cipher *
125f0 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 /..if (SSL_CIPHE
12600 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69 R_description(ci
12610 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f pher, buf, sizeo
12620 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 f(buf)) != NULL)
12630 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f {.. LAPPEND_
12640 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12650 74 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e tr, "description
12660 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a ", buf, -1);..}.
12670 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
12680 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 ssion info */.
12690 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f session = SSL_
126a0 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 get_session(ssl)
126b0 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f ;. if (sessio
126c0 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f n != NULL) {..co
126d0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
126e0 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 r *ticket;..size
126f0 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e _t len2;..unsign
12700 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f ed int ulen;..co
12710 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
12720 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a r *session_id, *
12730 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 proto;..unsigned
12740 20 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c char buffer[SSL
12750 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f _MAX_MASTER_KEY_
12760 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 LENGTH];.../* Re
12770 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 port the selecte
12780 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 d protocol as a
12790 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c result of the AL
127a0 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a PN negotiation *
127b0 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 /..SSL_SESSION_g
127c0 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 et0_alpn_selecte
127d0 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 d(session, &prot
127e0 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 o, &len2);..LAPP
127f0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
12800 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 objPtr, "alpn",
12810 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 (char *) proto,
12820 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 (Tcl_Size) len2)
12830 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 ;.../* Report th
12840 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
12850 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
12860 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 of the NPN negot
12870 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 iation */.#ifdef
12880 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 USE_NPN..SSL_ge
12890 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 t0_next_proto_ne
128a0 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70 gotiated(ssl, &p
128b0 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c roto, &ulen);..L
128c0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
128d0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 p, objPtr, "npn"
128e0 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f , (char *) proto
128f0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 , (Tcl_Size) ule
12900 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 n);.#endif.../*
12910 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f Resumable sessio
12920 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f n */..LAPPEND_BO
12930 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 OL(interp, objPt
12940 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 r, "resumable",
12950 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 SSL_SESSION_is_r
12960 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e esumable(session
12970 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e ));.../* Session
12980 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63 start time (sec
12990 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68 onds since epoch
129a0 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f ) */..LAPPEND_LO
129b0 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NG(interp, objPt
129c0 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c r, "start_time",
129d0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
129e0 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b _time(session));
129f0 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 .../* Timeout va
12a00 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 lue - SSL_CTX_ge
12a10 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 t_timeout (in se
12a20 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 conds) */..LAPPE
12a30 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
12a40 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 objPtr, "timeout
12a50 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 ", SSL_SESSION_g
12a60 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 et_timeout(sessi
12a70 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 on));.../* Sessi
12a80 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 on id - TLSv1.2
12a90 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a and below only *
12aa0 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 /..session_id =
12ab0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
12ac0 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 id(session, &ule
12ad0 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 n);..LAPPEND_BAR
12ae0 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 RAY(interp, objP
12af0 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 tr, "session_id"
12b00 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 , session_id, (T
12b10 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a cl_Size) ulen);.
12b20 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e ../* Session con
12b30 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e text */..session
12b40 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f _id = SSL_SESSIO
12b50 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 N_get0_id_contex
12b60 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e t(session, &ulen
12b70 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 );..LAPPEND_BARR
12b80 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 AY(interp, objPt
12b90 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 r, "session_cont
12ba0 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 ext", session_id
12bb0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 , (Tcl_Size) ule
12bc0 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e n);.../* Session
12bd0 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 ticket - client
12be0 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 only */..SSL_SE
12bf0 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 SSION_get0_ticke
12c00 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b t(session, &tick
12c10 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 et, &len2);..LAP
12c20 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 PEND_BARRAY(inte
12c30 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 rp, objPtr, "ses
12c40 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 sion_ticket", ti
12c50 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 cket, (Tcl_Size)
12c60 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 len2);.../* Ses
12c70 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 sion ticket life
12c80 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 time hint (in se
12c90 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 conds) */..LAPPE
12ca0 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
12cb0 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d objPtr, "lifetim
12cc0 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f e", SSL_SESSION_
12cd0 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 get_ticket_lifet
12ce0 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e ime_hint(session
12cf0 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 ));.../* Ticket
12d00 61 70 70 20 64 61 74 61 20 2a 2f 0a 23 69 66 20 app data */.#if
12d10 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
12d20 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
12d30 30 30 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f 000L..SSL_SESSIO
12d40 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 N_get0_ticket_ap
12d50 70 64 61 74 61 28 28 53 53 4c 5f 53 45 53 53 49 pdata((SSL_SESSI
12d60 4f 4e 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26 ON *) session, &
12d70 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a ticket, &len2);.
12d80 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
12d90 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12da0 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 "ticket_app_data
12db0 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f ", ticket, (Tcl_
12dc0 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e Size) len2);.#en
12dd0 64 69 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 dif.../* Get mas
12de0 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 ter key */..len2
12df0 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
12e00 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 et_master_key(se
12e10 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 ssion, buffer, S
12e20 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 SL_MAX_MASTER_KE
12e30 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 Y_LENGTH);..LAPP
12e40 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 END_BARRAY(inter
12e50 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 p, objPtr, "mast
12e60 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c er_key", buffer,
12e70 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
12e80 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 );.../* Compress
12e90 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 ion id */..unsig
12ea0 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c ned int id = SSL
12eb0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d _SESSION_get_com
12ec0 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e press_id(session
12ed0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
12ee0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12ef0 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 "compression_id"
12f00 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 , id == 1 ? "zli
12f10 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 b" : "none", -1)
12f20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
12f30 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f Compression info
12f40 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 */. if (ssl
12f50 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 != NULL) {.#ifde
12f60 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 f HAVE_SSL_COMPR
12f70 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f ESSION..const CO
12f80 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c MP_METHOD *comp,
12f90 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 *expn;..comp =
12fa0 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f SSL_get_current_
12fb0 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 compression(ssl)
12fc0 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 ;..expn = SSL_ge
12fd0 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 t_current_expans
12fe0 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 ion(ssl);...LAPP
12ff0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
13000 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 objPtr, "compres
13010 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 sion", comp ? SS
13020 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 L_COMP_get_name(
13030 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 comp) : "none",
13040 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 -1);..LAPPEND_ST
13050 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
13060 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 , "expansion", e
13070 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 xpn ? SSL_COMP_g
13080 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 et_name(expn) :
13090 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c "none", -1);.#el
130a0 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 se..LAPPEND_STR(
130b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
130c0 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 "compression", "
130d0 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 none", -1);..LAP
130e0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
130f0 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 objPtr, "expans
13100 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 ion", "none", -1
13110 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
13120 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 . /* Server i
13130 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f nfo */. {..lo
13140 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 ng mode = SSL_CT
13150 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 X_get_session_ca
13160 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 che_mode(statePt
13170 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a r->ctx);..char *
13180 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 msg;...if (mode
13190 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
131a0 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 _OFF) {.. msg
131b0 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 = "off";..} els
131c0 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c e if (mode & SSL
131d0 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 _SESS_CACHE_CLIE
131e0 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d NT) {.. msg =
131f0 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c "client";..} el
13200 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 se if (mode & SS
13210 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 L_SESS_CACHE_SER
13220 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 VER) {.. msg
13230 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 = "server";..} e
13240 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 lse if (mode & S
13250 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f SL_SESS_CACHE_BO
13260 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d TH) {.. msg =
13270 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 "both";..} else
13280 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75 {.. msg = "u
13290 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 nknown";..}..LAP
132a0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
132b0 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
132c0 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d n_cache_mode", m
132d0 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a sg, -1);. }..
132e0 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a /* CA List *
132f0 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 /. /* IF not
13300 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61 a server, same a
13310 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f s SSL_get0_peer_
13320 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76 CA_list. If serv
13330 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 er same as SSL_C
13340 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 TX_get_client_CA
13350 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 _list */. lis
13360 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 tPtr = Tcl_NewLi
13370 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
13380 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 STACK_OF(X50
13390 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 9_NAME) *ca_list
133a0 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69 ;. if ((ca_li
133b0 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 st = SSL_get_cli
133c0 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 ent_CA_list(ssl)
133d0 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 ) != NULL) {..ch
133e0 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a ar buffer[BUFSIZ
133f0 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d ];..for (int i =
13400 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 0; i < sk_X509_
13410 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 NAME_num(ca_list
13420 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 ); i++) {.. X
13430 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 509_NAME *name =
13440 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 sk_X509_NAME_va
13450 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b lue(ca_list, i);
13460 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 .. if (name)
13470 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e {...X509_NAME_on
13480 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 eline(name, buff
13490 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 er, BUFSIZ);...T
134a0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
134b0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
134c0 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 listPtr, Tcl_New
134d0 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 StringObj(buffer
134e0 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 , -1));.. }..
134f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 }. }. LAPP
13500 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 END_OBJ(interp,
13510 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22 objPtr, "caList"
13520 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 , listPtr);.
13530 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
13540 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c rp, objPtr, "caL
13550 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 istCount", sk_X5
13560 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 09_NAME_num(ca_l
13570 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ist));.. Tcl_
13580 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
13590 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
135a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
135b0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
135c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
135d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
135e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
135f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
13600 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d . * VersionObjCm
13610 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 d -- return vers
13620 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 ion string from
13630 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 OpenSSL.. *. * R
13640 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
13650 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
13660 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
13670 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
13680 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
13690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
136a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
136b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
136c0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
136d0 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 ic int.VersionOb
136e0 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
136f0 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
13700 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
13710 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
13720 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
13730 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
13740 6f 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 objPtr;. (voi
13750 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 d) clientData;.
13760 20 20 20 28 76 6f 69 64 29 20 6f 62 6a 63 3b 0a (void) objc;.
13770 20 20 20 20 28 76 6f 69 64 29 20 6f 62 6a 76 3b (void) objv;
13780 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
13790 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 alled");.. ob
137a0 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 jPtr = Tcl_NewSt
137b0 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f ringObj(OPENSSL_
137c0 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 VERSION_TEXT, -1
137d0 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 );. Tcl_SetOb
137e0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
137f0 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 objPtr);.. re
13800 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c turn TCL_OK;.}..
13810 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
13820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13850 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
13860 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 MiscObjCmd -- mi
13870 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 sc commands. *.
13880 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
13890 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
138a0 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
138b0 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
138c0 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
138d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
138e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
138f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
13910 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 tatic int.MiscOb
13920 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
13930 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
13940 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
13950 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
13960 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
13970 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f {. static co
13980 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e nst char *comman
13990 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c ds [] = { "req",
139a0 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 "strreq", NULL
139b0 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d };. enum comm
139c0 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 and { C_REQ, C_S
139d0 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d TRREQ, C_DUMMY }
139e0 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 ;. Tcl_Size c
139f0 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 74 md;. int isSt
13a00 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 r;. char buff
13a10 65 72 5b 31 36 33 38 34 5d 3b 0a 20 20 20 20 28 er[16384];. (
13a20 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
13a30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
13a40 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
13a50 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 f (objc < 2) {..
13a60 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
13a70 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
13a80 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 , "subcommand ?a
13a90 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 rgs?");..return
13aa0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
13ab0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
13ac0 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 IndexFromObj(int
13ad0 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f erp, objv[1], co
13ae0 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 mmands, "command
13af0 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 ", 0, &cmd) != T
13b00 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
13b10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
13b20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
13b30 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 _error();.. i
13b40 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 sStr = (cmd == C
13b50 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 _STRREQ);. sw
13b60 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d itch ((enum comm
13b70 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 and) cmd) {..cas
13b80 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 e C_REQ:..case C
13b90 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 _STRREQ: {..
13ba0 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e EVP_PKEY *pkey=N
13bb0 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a ULL;.. X509 *
13bc0 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 cert=NULL;..
13bd0 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d X509_NAME *name=
13be0 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f NULL;.. Tcl_O
13bf0 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 bj **listv;..
13c00 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b Tcl_Size listc;
13c10 0a 09 20 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20 .. int i;...
13c20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c BIO *out=NULL
13c30 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f ;... char *k_
13c40 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b C="",*k_ST="",*k
13c50 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b _L="",*k_O="",*k
13c60 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c _OU="",*k_CN="",
13c70 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 *k_Email="";..
13c80 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a char *keyout,*
13c90 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 pemout,*str;..
13ca0 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 int keysize,se
13cb0 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b rial=0,days=365;
13cc0 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
13cd0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
13ce0 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 x30000000L..
13cf0 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 BIGNUM *bne = NU
13d00 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 LL;.. RSA *rs
13d10 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a a = NULL;.#else.
13d20 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 . EVP_PKEY_CT
13d30 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 X *ctx = NULL;.#
13d40 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 endif... if (
13d50 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a (objc<5) || (obj
13d60 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 c>6)) {...Tcl_Wr
13d70 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
13d80 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 p, 2, objv, "key
13d90 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 size keyfile cer
13da0 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a tfile ?info?");.
13db0 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
13dc0 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 OR;.. }...
13dd0 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 if (Tcl_GetIntF
13de0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
13df0 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 bjv[2], &keysize
13e00 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
13e10 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
13e20 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b R;.. }.. k
13e30 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 eyout=Tcl_GetStr
13e40 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 ing(objv[3]);..
13e50 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 pemout=Tcl_Ge
13e60 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 tString(objv[4])
13e70 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72 ;.. if (isStr
13e80 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 ) {...Tcl_SetVar
13e90 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 (interp,keyout,"
13ea0 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 ",0);...Tcl_SetV
13eb0 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 ar(interp,pemout
13ec0 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a ,"",0);.. }..
13ed0 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 . if (objc>=6
13ee0 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 ) {...if (Tcl_Li
13ef0 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 stObjGetElements
13f00 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d (interp, objv[5]
13f10 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 , &listc, &listv
13f20 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
13f30 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
13f40 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 ERROR;...}....if
13f50 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 ((listc%2) != 0
13f60 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 ) {... Tcl_Se
13f70 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
13f80 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 Information list
13f90 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 must have even
13fa0 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 number of argume
13fb0 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 nts",NULL);...
13fc0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
13fd0 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 OR;...}...for (i
13fe0 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d =0; i<listc; i+=
13ff0 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 2) {... str=T
14000 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
14010 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 tv[i]);... if
14020 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 (strcmp(str,"da
14030 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 ys")==0) {....if
14040 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
14050 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 Obj(interp,listv
14060 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 [i+1],&days)!=TC
14070 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 L_OK).... ret
14080 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
14090 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
140a0 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 strcmp(str,"seri
140b0 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 al")==0) {....if
140c0 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
140d0 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 Obj(interp,listv
140e0 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d [i+1],&serial)!=
140f0 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 TCL_OK).... r
14100 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
14110 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
14120 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 (strcmp(str,"C"
14130 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 )==0) {....k_C=T
14140 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
14150 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
14160 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
14170 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 p(str,"ST")==0)
14180 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 {....k_ST=Tcl_Ge
14190 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
141a0 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
141b0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
141c0 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ,"L")==0) {....k
141d0 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 _L=Tcl_GetString
141e0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
141f0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
14200 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d trcmp(str,"O")==
14210 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 0) {....k_O=Tcl_
14220 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
14230 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
14240 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
14250 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 tr,"OU")==0) {..
14260 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 ..k_OU=Tcl_GetSt
14270 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
14280 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
14290 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 f (strcmp(str,"C
142a0 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 N")==0) {....k_C
142b0 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 N=Tcl_GetString(
142c0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
142d0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
142e0 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 rcmp(str,"Email"
142f0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 )==0) {....k_Ema
14300 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 il=Tcl_GetString
14310 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
14320 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 } else {....
14330 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
14340 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 terp,"Unknown pa
14350 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a rameter",NULL);.
14360 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
14370 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d ROR;... }...}
14380 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 .. }..#if OPE
14390 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
143a0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
143b0 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f L.. bne = BN_
143c0 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 new();.. rsa
143d0 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 = RSA_new();..
143e0 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 pkey = EVP_PKE
143f0 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 Y_new();.. if
14400 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (bne == NULL ||
14410 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 rsa == NULL ||
14420 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 pkey == NULL ||
14430 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 !BN_set_word(bne
14440 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 ,RSA_F4) ||...!R
14450 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f SA_generate_key_
14460 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c ex(rsa, keysize,
14470 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 bne, NULL) || !
14480 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f EVP_PKEY_assign_
14490 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 RSA(pkey, rsa))
144a0 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 {...EVP_PKEY_fre
144b0 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 e(pkey);.../* RS
144c0 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 A_free(rsa); fre
144d0 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 ed by EVP_PKEY_f
144e0 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 ree */...BN_free
144f0 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 (bne);.#else..
14500 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 pkey = EVP_RSA
14510 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 _gen((unsigned i
14520 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 nt) keysize);..
14530 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 ctx = EVP_PKE
14540 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e Y_CTX_new(pkey,N
14550 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 ULL);.. if (p
14560 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 key == NULL || c
14570 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 tx == NULL || !E
14580 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 VP_PKEY_keygen_i
14590 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 nit(ctx) ||...!E
145a0 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f VP_PKEY_CTX_set_
145b0 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 rsa_keygen_bits(
145c0 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c ctx, keysize) ||
145d0 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 !EVP_PKEY_keyge
145e0 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b n(ctx, &pkey)) {
145f0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
14600 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b (pkey);...EVP_PK
14610 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 EY_CTX_free(ctx)
14620 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 ;.#endif...Tcl_S
14630 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
14640 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e "Error generatin
14650 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e g private key",N
14660 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 ULL);...return T
14670 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
14680 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 else {...if (is
14690 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 Str) {... out
146a0 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d =BIO_new(BIO_s_m
146b0 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d em());... PEM
146c0 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 _write_bio_Priva
146d0 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e teKey(out,pkey,N
146e0 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c ULL,NULL,0,NULL,
146f0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 NULL);... i=B
14700 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 IO_read(out,buff
14710 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 er,sizeof(buffer
14720 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 )-1);... i=(i
14730 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 <0) ? 0 : i;...
14740 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 buffer[i]='\0
14750 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 ';... Tcl_Set
14760 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 Var(interp,keyou
14770 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 t,buffer,0);...
14780 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 BIO_flush(out
14790 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
147a0 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 e(out);...} else
147b0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
147c0 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 _new(BIO_s_file(
147d0 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 ));... BIO_wr
147e0 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 ite_filename(out
147f0 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 ,keyout);...
14800 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 PEM_write_bio_Pr
14810 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 ivateKey(out,pke
14820 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 y,NULL,NULL,0,NU
14830 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 LL,NULL);...
14840 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f /* PEM_write_bio
14850 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f _RSAPrivateKey(o
14860 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e ut, rsa, NULL, N
14870 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 ULL, 0, NULL, NU
14880 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 LL); */... BI
14890 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b O_free_all(out);
148a0 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 .. .}....if ((ce
148b0 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d rt=X509_new())==
148c0 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 NULL) {... Tc
148d0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
148e0 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 rp,"Error genera
148f0 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 ting certificate
14900 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b request",NULL);
14910 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f ... EVP_PKEY_
14920 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 free(pkey);.#if
14930 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
14940 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
14950 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 000L... BN_fr
14960 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a ee(bne);.#endif.
14970 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
14980 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58 _ERROR;...}....X
14990 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 509_set_version(
149a0 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f cert,2);...ASN1_
149b0 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 INTEGER_set(X509
149c0 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 _get_serialNumbe
149d0 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b r(cert),serial);
149e0 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 ...X509_gmtime_a
149f0 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 dj(X509_getm_not
14a00 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b Before(cert),0);
14a10 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 ...X509_gmtime_a
14a20 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 dj(X509_getm_not
14a30 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e After(cert),(lon
14a40 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 g)60*60*24*days)
14a50 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 ;...X509_set_pub
14a60 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a key(cert,pkey);.
14a70 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 ...name=X509_get
14a80 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 _subject_name(ce
14a90 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d rt);....X509_NAM
14aa0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
14ab0 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 xt(name,"C", MBS
14ac0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
14ad0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
14ae0 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 *) k_C, -1, -1,
14af0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
14b00 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
14b10 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 (name,"ST", MBST
14b20 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
14b30 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
14b40 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 ) k_ST, -1, -1,
14b50 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
14b60 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
14b70 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 (name,"L", MBSTR
14b80 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
14b90 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
14ba0 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_L, -1, -1, 0)
14bb0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
14bc0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
14bd0 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e ame,"O", MBSTRIN
14be0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
14bf0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
14c00 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a _O, -1, -1, 0);.
14c10 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
14c20 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
14c30 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 e,"OU", MBSTRING
14c40 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
14c50 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
14c60 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a OU, -1, -1, 0);.
14c70 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
14c80 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
14c90 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 e,"CN", MBSTRING
14ca0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
14cb0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
14cc0 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a CN, -1, -1, 0);.
14cd0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
14ce0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
14cf0 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 e,"Email", MBSTR
14d00 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
14d10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
14d20 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 k_Email, -1, -1
14d30 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 , 0);....X509_se
14d40 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 t_subject_name(c
14d50 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 ert,name);....if
14d60 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 (!X509_sign(cer
14d70 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 t,pkey,EVP_sha25
14d80 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 6())) {... X5
14d90 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09_free(cert);..
14da0 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 . EVP_PKEY_fr
14db0 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 ee(pkey);.#if OP
14dc0 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
14dd0 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
14de0 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 0L... BN_free
14df0 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 (bne);.#endif...
14e00 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
14e10 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
14e20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 signing certific
14e30 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 ate",NULL);...
14e40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
14e50 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 OR;...}....if (i
14e60 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 sStr) {... ou
14e70 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
14e80 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 mem());... PE
14e90 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 M_write_bio_X509
14ea0 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 (out,cert);...
14eb0 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 i=BIO_read(out
14ec0 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 ,buffer,sizeof(b
14ed0 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 uffer)-1);...
14ee0 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 i=(i<0) ? 0 : i
14ef0 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 ;... buffer[i
14f00 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 ]='\0';... Tc
14f10 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
14f20 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 pemout,buffer,0)
14f30 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 ;... BIO_flus
14f40 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 h(out);... BI
14f50 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d O_free(out);...}
14f60 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 else {... ou
14f70 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
14f80 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 file());... B
14f90 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d IO_write_filenam
14fa0 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 e(out,pemout);..
14fb0 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
14fc0 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 io_X509(out,cert
14fd0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
14fe0 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a e_all(out);...}.
14ff0 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 ...X509_free(cer
15000 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 t);...EVP_PKEY_f
15010 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f ree(pkey);.#if O
15020 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
15030 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
15040 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 00L...BN_free(bn
15050 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 e);.#endif..
15060 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 }..}..break;.
15070 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b default:..break
15080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
15090 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
150a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
150b0 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 ****/./* Init
150c0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a */./**
150d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
150e0 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d **/../*. *------
150f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
15130 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a . * Tls_Free --.
15140 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
15150 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 dure cleans up w
15160 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 hen a SSL socket
15170 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 based channel.
15180 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 *.is closed and
15190 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f its reference co
151a0 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 unt falls below
151b0 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 1. *. * Results:
151c0 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.none. *. * S
151d0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
151e0 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 Frees all the st
151f0 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ate. *. *-------
15200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
15240 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 74 .void.Tls_Free(t
15250 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 62 6c ls_free_type *bl
15260 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74 ockPtr) {. St
15270 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
15280 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 (State *)blockPt
15290 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 r;.. dprintf(
152a0 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
152b0 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 Tls_Clean(stateP
152c0 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 tr);. ckfree(
152d0 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f blockPtr);.}.../
152e0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
152f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15320 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
15330 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a s_Clean --. *. *
15340 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
15350 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 cleans up when a
15360 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
15370 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 d channel. *.is
15380 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 closed and its r
15390 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 eference count f
153a0 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 alls below 1. T
153b0 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 his should. *.be
153c0 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e called synchron
153d0 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f ously by the Clo
153e0 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 seProc, not in t
153f0 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 he. *.Eventually
15400 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 Free callback..
15410 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
15420 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .none. *. * Side
15430 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 effects:. *.Fre
15440 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 es all the state
15450 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
15460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15490 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
154a0 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 id Tls_Clean(Sta
154b0 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a te *statePtr) {.
154c0 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
154d0 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 led");.. /*.
154e0 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 * we're assu
154f0 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 ming here that w
15500 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 e're single-thre
15510 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 aded. */.
15520 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 if (statePtr->t
15530 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d imer != (Tcl_Tim
15540 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b erToken) NULL) {
15550 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 ..Tcl_DeleteTime
15560 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 rHandler(statePt
15570 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 r->timer);..stat
15580 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 ePtr->timer = NU
15590 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 LL;. }.. i
155a0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f f (statePtr->pro
155b0 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 tos) {..ckfree(s
155c0 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 tatePtr->protos)
155d0 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f ;..statePtr->pro
155e0 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 tos = NULL;.
155f0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
15600 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 tr->bio) {../* T
15610 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 his will call SS
15620 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 L_shutdown. Bug
15630 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 1414045 */..dpri
15640 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c ntf("BIO_free_al
15650 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 l(%p)", statePtr
15660 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 ->bio);..BIO_fre
15670 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e e_all(statePtr->
15680 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d bio);..statePtr-
15690 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 >bio = NULL;.
156a0 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
156b0 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 Ptr->ssl) {..dpr
156c0 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25 intf("SSL_free(%
156d0 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 p)", statePtr->s
156e0 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 sl);..SSL_free(s
156f0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 tatePtr->ssl);..
15700 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 statePtr->ssl =
15710 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
15720 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 if (statePtr->ct
15730 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 x) {..SSL_CTX_fr
15740 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ee(statePtr->ctx
15750 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 );..statePtr->ct
15760 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a x = NULL;. }.
15770 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
15780 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 ->callback) {..T
15790 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
157a0 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
157b0 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e ck);..statePtr->
157c0 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b callback = NULL;
157d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
157e0 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
157f0 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 d) {..Tcl_DecrRe
15800 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
15810 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 >password);..sta
15820 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 tePtr->password
15830 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
15840 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
15850 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 vcmd) {..Tcl_Dec
15860 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
15870 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 tr->vcmd);..stat
15880 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c ePtr->vcmd = NUL
15890 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 L;. }.. dp
158a0 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 rintf("Returning
158b0 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ");.}.../*. *---
158c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15900 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 75 69 6c 64 20 ---. *. * Build
15910 49 6e 66 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a Info Command --.
15920 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 63 6f 6d *. *.Create com
15930 6d 61 6e 64 20 74 6f 20 72 65 74 75 72 6e 20 62 mand to return b
15940 75 69 6c 64 20 69 6e 66 6f 20 66 6f 72 20 70 61 uild info for pa
15950 63 6b 61 67 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 ckage.. *. * Res
15960 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
15970 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 ard Tcl result.
15980 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
15990 73 3a 0a 20 2a 09 43 72 65 61 74 65 64 20 62 75 s:. *.Created bu
159a0 69 6c 64 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 ild-info command
159b0 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
159c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
15a00 2f 0a 0a 23 69 66 6e 64 65 66 20 53 54 52 49 4e /..#ifndef STRIN
15a10 47 49 46 59 0a 23 20 20 64 65 66 69 6e 65 20 53 GIFY.# define S
15a20 54 52 49 4e 47 49 46 59 28 78 29 20 53 54 52 49 TRINGIFY(x) STRI
15a30 4e 47 49 46 59 31 28 78 29 0a 23 20 20 64 65 66 NGIFY1(x).# def
15a40 69 6e 65 20 53 54 52 49 4e 47 49 46 59 31 28 78 ine STRINGIFY1(x
15a50 29 20 23 78 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 ) #x.#endif..int
15a60 0a 42 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e .BuildInfoComman
15a70 64 28 54 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e d(Tcl_Interp* in
15a80 74 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f terp) {. Tcl_
15a90 43 6d 64 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 CmdInfo info;..
15aa0 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 6f if (Tcl_GetCo
15ab0 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 mmandInfo(interp
15ac0 2c 20 22 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d , "::tcl::build-
15ad0 69 6e 66 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b info", &info)) {
15ae0 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 ..Tcl_CreateObjC
15af0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
15b00 3a 3a 74 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 ::tls::build-inf
15b10 6f 22 2c 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63 o", info.objProc
15b20 2c 20 28 76 6f 69 64 20 2a 29 28 0a 09 09 50 41 , (void *)(...PA
15b30 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b CKAGE_VERSION "+
15b40 22 20 53 54 52 49 4e 47 49 46 59 28 54 4c 53 5f " STRINGIFY(TLS_
15b50 56 45 52 53 49 4f 4e 5f 55 55 49 44 29 0a 23 69 VERSION_UUID).#i
15b60 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e f defined(__clan
15b70 67 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 g__) && defined(
15b80 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 __clang_major__)
15b90 0a 09 09 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d .... ".clang-
15ba0 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c " STRINGIFY(__cl
15bb0 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 ang_major__).#if
15bc0 20 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f __clang_minor__
15bd0 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 < 10.... "0"
15be0 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 .#endif.... S
15bf0 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 TRINGIFY(__clang
15c00 5f 6d 69 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 _minor__).#endif
15c10 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 .#if defined(__c
15c20 70 6c 75 73 70 6c 75 73 29 20 26 26 20 21 64 65 plusplus) && !de
15c30 66 69 6e 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a fined(__OBJC__).
15c40 09 09 09 20 20 20 20 22 2e 63 70 6c 75 73 70 6c ... ".cpluspl
15c50 75 73 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 us".#endif.#ifnd
15c60 65 66 20 4e 44 45 42 55 47 0a 09 09 09 20 20 20 ef NDEBUG....
15c70 20 22 2e 64 65 62 75 67 22 0a 23 65 6e 64 69 66 ".debug".#endif
15c80 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f .#if !defined(__
15c90 63 6c 61 6e 67 5f 5f 29 20 26 26 20 21 64 65 66 clang__) && !def
15ca0 69 6e 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d ined(__INTEL_COM
15cb0 50 49 4c 45 52 29 20 26 26 20 64 65 66 69 6e 65 PILER) && define
15cc0 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20 d(__GNUC__)....
15cd0 20 20 20 22 2e 67 63 63 2d 22 20 53 54 52 49 4e ".gcc-" STRIN
15ce0 47 49 46 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 GIFY(__GNUC__).#
15cf0 69 66 20 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f if __GNUC_MINOR_
15d00 5f 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 _ < 10.... "0
15d10 22 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 ".#endif....
15d20 53 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 STRINGIFY(__GNUC
15d30 5f 4d 49 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 _MINOR__).#endif
15d40 0a 23 69 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f .#ifdef __INTEL_
15d50 43 4f 4d 50 49 4c 45 52 0a 09 09 09 20 20 20 20 COMPILER....
15d60 22 2e 69 63 63 2d 22 20 53 54 52 49 4e 47 49 46 ".icc-" STRINGIF
15d70 59 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c Y(__INTEL_COMPIL
15d80 45 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 ER).#endif.#ifde
15d90 66 20 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a f TCL_MEM_DEBUG.
15da0 09 09 09 20 20 20 20 22 2e 6d 65 6d 64 65 62 75 ... ".memdebu
15db0 67 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 g".#endif.#if de
15dc0 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a fined(_MSC_VER).
15dd0 09 09 09 20 20 20 20 22 2e 6d 73 76 63 2d 22 20 ... ".msvc-"
15de0 53 54 52 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56 STRINGIFY(_MSC_V
15df0 45 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 ER).#endif.#ifde
15e00 66 20 55 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 f USE_NMAKE....
15e10 20 20 20 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 ".nmake".#end
15e20 69 66 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 if.#ifndef TCL_C
15e30 46 47 5f 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09 FG_OPTIMIZED....
15e40 20 20 20 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a ".no-optimiz
15e50 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 e".#endif.#ifdef
15e60 20 5f 5f 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20 __OBJC__....
15e70 20 22 2e 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a ".objective-c".
15e80 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 #if defined(__cp
15e90 6c 75 73 70 6c 75 73 29 0a 09 09 09 20 20 20 20 lusplus)....
15ea0 22 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 "plusplus".#endi
15eb0 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 f.#endif.#ifdef
15ec0 54 43 4c 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44 TCL_CFG_PROFILED
15ed0 0a 09 09 09 20 20 20 20 22 2e 70 72 6f 66 69 6c .... ".profil
15ee0 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 e".#endif.#ifdef
15ef0 20 50 55 52 49 46 59 0a 09 09 09 20 20 20 20 22 PURIFY.... "
15f00 2e 70 75 72 69 66 79 22 0a 23 65 6e 64 69 66 0a .purify".#endif.
15f10 23 69 66 64 65 66 20 53 54 41 54 49 43 5f 42 55 #ifdef STATIC_BU
15f20 49 4c 44 0a 09 09 09 20 20 20 20 22 2e 73 74 61 ILD.... ".sta
15f30 74 69 63 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c tic".#endif...),
15f40 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 NULL);. }.
15f50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
15f60 0a 7d 0a 0c 0a 2f 2a 20 49 6e 69 74 20 73 63 72 .}.../* Init scr
15f70 69 70 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f ipt */.static co
15f80 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49 nst char tlsTclI
15f90 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a nitScript[] = {.
15fa0 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 #include "tls.tc
15fb0 6c 2e 68 22 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d l.h".};../*. *--
15fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16000 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 -. *. * Tls_Init
16010 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 --. *. *.This i
16020 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 s a package init
16030 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 ialization proce
16040 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 dure, which is c
16050 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 alled. *.by Tcl
16060 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 when this packag
16070 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 e is to be added
16080 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 to an interpret
16090 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 er.. *. * Result
160a0 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 s: Ssl configur
160b0 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a ed and loaded. *
160c0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
160d0 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 :. *. create the
160e0 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e ssl command, in
160f0 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e itialize ssl con
16100 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d text. *. *------
16110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
16150 2f 0a 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 /..#if TCL_MAJOR
16160 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23 64 65 _VERSION > 8.#de
16170 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e fine MIN_VERSION
16180 20 22 39 2e 30 22 0a 23 65 6c 73 65 0a 23 64 65 "9.0".#else.#de
16190 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e fine MIN_VERSION
161a0 20 22 38 2e 35 22 0a 23 65 6e 64 69 66 0a 0a 44 "8.5".#endif..D
161b0 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 LLEXPORT int Tls
161c0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 _Init(Tcl_Interp
161d0 20 2a 69 6e 74 65 72 70 29 20 7b 0a 0a 20 20 20 *interp) {..
161e0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
161f0 22 29 3b 0a 0a 23 69 66 64 65 66 20 55 53 45 5f ");..#ifdef USE_
16200 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 20 69 66 TCL_STUBS. if
16210 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 (Tcl_InitStubs(
16220 69 6e 74 65 72 70 2c 20 4d 49 4e 5f 56 45 52 53 interp, MIN_VERS
16230 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 ION, 0) == NULL)
16240 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
16250 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 RROR;. }.#end
16260 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 50 if. if (Tcl_P
16270 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 kgRequire(interp
16280 2c 20 22 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 , "Tcl", MIN_VER
16290 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c SION, 0) == NULL
162a0 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
162b0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
162c0 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 if (TlsLibInit
162d0 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b (0) != TCL_OK) {
162e0 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
162f0 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c lt(interp, "coul
16300 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 d not initialize
16310 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 SSL library", (
16320 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
16330 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
16340 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c ;. }.. Tcl
16350 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
16360 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 d(interp, "::tls
16370 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 ::ciphers", Ciph
16380 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 ersObjCmd, (Clie
16390 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
163a0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
163b0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
163c0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
163d0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 and(interp, "::t
163e0 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c ls::connection",
163f0 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f ConnectionInfoO
16400 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
16410 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 ta) NULL, (Tcl_C
16420 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
16430 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
16440 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
16450 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a interp, "::tls::
16460 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 handshake", Hand
16470 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c shakeObjCmd, (Cl
16480 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
16490 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
164a0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
164b0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
164c0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
164d0 3a 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 :tls::import", I
164e0 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c mportObjCmd, (Cl
164f0 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
16500 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
16510 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
16520 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
16530 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
16540 3a 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c :tls::unimport",
16550 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c UnimportObjCmd,
16560 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
16570 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
16580 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
16590 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
165a0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
165b0 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 73 74 61 63 , "::tls::unstac
165c0 6b 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 k", UnimportObjC
165d0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
165e0 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 NULL, (Tcl_CmdD
165f0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
16600 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
16610 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
16620 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73 74 61 erp, "::tls::sta
16630 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 tus", StatusObjC
16640 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
16650 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 NULL, (Tcl_CmdD
16660 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
16670 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
16680 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
16690 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 76 65 72 erp, "::tls::ver
166a0 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 sion", VersionOb
166b0 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
166c0 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d a) NULL, (Tcl_Cm
166d0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
166e0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
166f0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
16700 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 6d nterp, "::tls::m
16710 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 isc", MiscObjCmd
16720 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e , (ClientData) N
16730 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ULL, (Tcl_CmdDel
16740 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
16750 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
16760 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
16770 70 2c 20 22 3a 3a 74 6c 73 3a 3a 70 72 6f 74 6f p, "::tls::proto
16780 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 cols", Protocols
16790 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
167a0 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f ata) NULL, (Tcl_
167b0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
167c0 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 75 69 NULL);.. Bui
167d0 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 69 6e ldInfoCommand(in
167e0 74 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 terp);.. if (
167f0 69 6e 74 65 72 70 20 26 26 20 54 63 6c 5f 45 76 interp && Tcl_Ev
16800 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 al(interp, tlsTc
16810 6c 49 6e 69 74 53 63 72 69 70 74 29 20 21 3d 20 lInitScript) !=
16820 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 TCL_OK) {..retur
16830 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
16840 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }.. return T
16850 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e cl_PkgProvide(in
16860 74 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 terp, PACKAGE_NA
16870 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 ME, PACKAGE_VERS
16880 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d ION);.}../*. *--
16890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
168a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f ----*. *. *.Tls_
168d0 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 SafeInit --. *.
168e0 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
168f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16910 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 --*. *.Standard
16920 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 procedure requir
16930 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a ed by 'load'.. *
16940 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 .Initializes thi
16950 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 s extension for
16960 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 a safe interpret
16970 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d er.. *.---------
16980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
169a0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 -------*. *. *.S
169b0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
169c0 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 .As of 'Tls_Init
169d0 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a '. *. *.Result:.
169e0 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 *..A standard T
169f0 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 cl error code..
16a00 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
16a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a ----------*. */.
16a40 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c DLLEXPORT int Tl
16a50 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 s_SafeInit(Tcl_I
16a60 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b nterp *interp) {
16a70 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
16a80 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 lled");. retu
16a90 72 6e 20 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 rn Tls_Init(inte
16aa0 72 70 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d rp);.}../*. *---
16ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ae0 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 ---*. *. *.TlsLi
16af0 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d bInit --. *. *.-
16b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
16b30 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 . *.Initializes
16b40 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 SSL library once
16b50 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e per application
16b60 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.------------
16b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b90 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 ----*. *. *.Side
16ba0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e effects:. *..in
16bb0 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 itializes SSL li
16bc0 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 brary. *. *.Resu
16bd0 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a lt:. *..none. *.
16be0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
16bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16c10 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 --------*. */.st
16c20 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 atic int TlsLibI
16c30 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 nit(int uninitia
16c40 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 lize) {. stat
16c50 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a ic int initializ
16c60 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 ed = 0;. int
16c70 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b status = TCL_OK;
16c80 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
16c90 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
16ca0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
16cb0 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 EADS). size_t
16cc0 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 num_locks;.#end
16cd0 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e if.. if (unin
16ce0 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 itialize) {..if
16cf0 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b (!initialized) {
16d00 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 .. dprintf("A
16d10 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 sked to uninitia
16d20 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 lize, but we are
16d30 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 not initialized
16d40 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e ");... return
16d50 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09 64 70 TCL_OK;..}...dp
16d60 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 rintf("Asked to
16d70 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a uninitialize");.
16d80 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
16d90 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
16da0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
16db0 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 EADS)..Tcl_Mutex
16dc0 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a Lock(&init_mx);.
16dd0 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 ..if (locks) {..
16de0 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b free(locks);
16df0 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 .. locks = NU
16e00 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f LL;.. locksCo
16e10 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 unt = 0;..}.#end
16e20 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 if..initialized
16e30 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 = 0;..#if define
16e40 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
16e50 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
16e60 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f L_THREADS)..Tcl_
16e70 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 MutexUnlock(&ini
16e80 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 t_mx);.#endif...
16e90 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 return TCL_OK;.
16ea0 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e }.. if (in
16eb0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 itialized) {..dp
16ec0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 rintf("Called, b
16ed0 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 ut using cached
16ee0 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e value");..return
16ef0 20 73 74 61 74 75 73 3b 0a 20 20 20 20 7d 0a 0a status;. }..
16f00 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
16f10 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 led");..#if defi
16f20 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 ned(OPENSSL_THRE
16f30 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 ADS) && defined(
16f40 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 TCL_THREADS).
16f50 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 Tcl_MutexLock(&
16f60 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 init_mx);.#endif
16f70 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 . initialized
16f80 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e = 1;..#if defin
16f90 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
16fa0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
16fb0 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 CL_THREADS).
16fc0 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 num_locks = 1;.
16fd0 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 locksCount =
16fe0 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b (int) num_locks;
16ff0 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c . locks = mal
17000 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b loc(sizeof(*lock
17010 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b s) * num_locks);
17020 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b . memset(lock
17030 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f s, 0, sizeof(*lo
17040 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 cks) * num_locks
17050 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f );.#endif.. /
17060 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 * Initialize BOT
17070 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 H libcrypto and
17080 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f libssl. */. O
17090 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 PENSSL_init_ssl(
170a0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 OPENSSL_INIT_LOA
170b0 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 D_SSL_STRINGS |
170c0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 OPENSSL_INIT_LOA
170d0 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 D_CRYPTO_STRINGS
170e0 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 ..| OPENSSL_INIT
170f0 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 _ADD_ALL_CIPHERS
17100 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f | OPENSSL_INIT_
17110 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c ADD_ALL_DIGESTS,
17120 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f NULL);.. BIO
17130 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 _new_tcl(NULL, 0
17140 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 );..#if defined(
17150 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
17160 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
17170 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 THREADS)..Tcl_Mu
17180 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f texUnlock(&init_
17190 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 mx);.#endif..
171a0 20 72 65 74 75 72 6e 20 73 74 61 74 75 73 3b 0a return status;.
171b0 7d 0a }.