0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61 (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69 some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68 ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32 pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72 ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79 poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53 right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29 *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61 2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 ka SSL) Channel
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64 - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63 on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50 uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68 st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65 based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70 rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64 * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61 dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64 .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74 ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 full fileevent
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 Also work done
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68 ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 e impetus to do
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64 cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 pts.h".#include
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 rsa.h>.#include
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61 <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72 10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76 "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69 1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72 dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a (key), (dsp))).
04e0: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29 #define REASON()
04f0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f .ERR_reason_erro
0500: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74 r_string(ERR_get
0510: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69 _error())..stati
0520: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 c SSL_CTX *CTX_I
0530: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 nit(State *state
0540: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 Ptr, int isServe
0550: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 r, int proto, ch
0560: 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 ar *key,...char
0570: 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 *certfile, unsig
0580: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 ned char *key_as
0590: 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 n1, unsigned cha
05a0: 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 r *cert_asn1,...
05b0: 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e int key_asn1_len
05c0: 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f , int cert_asn1_
05d0: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72 len, char *CAdir
05e0: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a , char *CAfile,.
05f0: 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c ..char *ciphers,
0600: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 char *ciphersui
0610: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 tes, int level,
0620: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b char *DHparams);
0630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 ..static int.Tls
0640: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e LibInit(int unin
0650: 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66 itialize);..#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 ine TLS_PROTO_SS
0670: 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 L2..0x01.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 TLS_PROTO_SSL3.
0690: 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c .0x02.#define TL
06a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 S_PROTO_TLS1..0x
06b0: 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 04.#define TLS_P
06c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 ROTO_TLS1_1.0x08
06d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f .#define TLS_PRO
06e0: 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 TO_TLS1_2.0x10.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f define TLS_PROTO
0700: 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 _TLS1_3.0x20.#de
0710: 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 fine ENABLED(fla
0720: 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 g, mask).(((flag
0730: 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 ) & (mask)) == (
0740: 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20 mask))..#define
0750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22 SSLKEYLOGFILE.."
0760: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a SSLKEYLOGFILE"..
0770: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74 /*. * Static dat
0780: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f a structures. */
0790: 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 ..#ifndef OPENSS
07a0: 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 65 L_NO_DH.#include
07b0: 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a 23 "dh_params.h".#
07c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72 endif../*. * Thr
07d0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64 ead-Safe TLS Cod
07e0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 e. */..#ifdef TC
07f0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e L_THREADS.#defin
0800: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 e OPENSSL_THREAD
0810: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64 _DEFINES.#includ
0820: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 e <openssl/opens
0830: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65 slconf.h>..#ifde
0840: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 f OPENSSL_THREAD
0850: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e S.#include <open
0860: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69 ssl/crypto.h>.#i
0870: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0880: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 ssl.h>../*. * Th
0890: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e readed operation
08a0: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e requires lockin
08b0: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42 g callbacks. * B
08c0: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74 ased from /crypt
08d0: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20 o/cryptlib.c of
08e0: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70 OpenSSL and NSOp
08f0: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74 enSSL.. */..stat
0900: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f ic Tcl_Mutex *lo
0910: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 cks = NULL;.stat
0920: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e ic int locksCoun
0930: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63 t = 0;.static Tc
0940: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b l_Mutex init_mx;
0950: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53 .#endif /* OPENS
0960: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65 SL_THREADS */.#e
0970: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45 ndif /* TCL_THRE
0980: 41 44 53 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a ADS */../*******
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f *************/./
09a0: 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 * Callbacks
09b0: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a */./*********
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0c 0a ***********/....
09d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 --------. *. * I
0a20: 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 nfoCallback --.
0a30: 2a 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53 *. *.monitors SS
0a40: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f L connection pro
0a50: 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c cess. *. * Resul
0a60: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
0a70: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
0a80: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
0a90: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
0aa0: 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ae0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
0af0: 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 void.InfoCallbac
0b00: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
0b10: 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 , int where, int
0b20: 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 ret) {. Stat
0b30: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
0b40: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 tate*)SSL_get_ap
0b50: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 p_data((SSL *)ss
0b60: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 l);. Tcl_Inte
0b70: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
0b80: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
0b90: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
0ba0: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 tr;. char *ma
0bb0: 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 jor; char *minor
0bc0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
0bd0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
0be0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
0bf0: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
0c00: 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e j*)NULL)..return
0c10: 3b 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 ;.. cmdPtr =
0c20: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
0c30: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
0c40: 61 63 6b 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 ack);..#if 0.
0c50: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c if (where & SSL
0c60: 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 73 65 _CB_ALERT) {..se
0c70: 76 20 3d 20 53 53 4c 5f 61 6c 65 72 74 5f 74 79 v = SSL_alert_ty
0c80: 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 pe_string_long(r
0c90: 65 74 29 3b 0a 09 69 66 20 28 73 74 72 63 6d 70 et);..if (strcmp
0ca0: 28 73 65 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d (sev, "fatal")==
0cb0: 30 29 20 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65 0) {./* Map to e
0cc0: 72 72 6f 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73 rror */.. Tls
0cd0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
0ce0: 20 53 53 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20 SSL_ERROR(ssl,
0cf0: 30 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 0));.. return
0d00: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ;..}. }.#endi
0d10: 66 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 f. if (where
0d20: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 & SSL_CB_HANDSHA
0d30: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a KE_START) {..maj
0d40: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 or = "handshake"
0d50: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 ;..minor = "star
0d60: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 t";. } else i
0d70: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0d80: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 B_HANDSHAKE_DONE
0d90: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 ) {..major = "ha
0da0: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 ndshake";..minor
0db0: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d = "done";. }
0dc0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 else {..if (whe
0dd0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 re & SSL_CB_ALER
0de0: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 T)..major = "ale
0df0: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 rt";..else if (w
0e00: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f here & SSL_ST_CO
0e10: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 NNECT).major = "
0e20: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 connect";..else
0e30: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
0e40: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f ST_ACCEPT)..majo
0e50: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 r = "accept";..e
0e60: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 lse.....major =
0e70: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 "unknown";...if
0e80: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
0e90: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 READ)..minor = "
0ea0: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 read";..else if
0eb0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
0ec0: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 WRITE)..minor =
0ed0: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 "write";..else i
0ee0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0ef0: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d B_LOOP)..minor =
0f00: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 "loop";..else i
0f10: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0f20: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d B_EXIT)..minor =
0f30: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 "exit";..else..
0f40: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e ...minor = "unkn
0f50: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 own";. }..
0f60: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
0f70: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
0f80: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
0f90: 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f wStringObj("info
0fa0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
0fb0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
0fc0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
0fd0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
0fe0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
0ff0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
1000: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
1010: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
1020: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1030: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1040: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
1050: 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b Obj(major, -1));
1060: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1070: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1080: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
1090: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
10a0: 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 inor, -1));..
10b0: 20 69 66 20 28 77 68 65 72 65 20 26 20 28 53 53 if (where & (SS
10c0: 4c 5f 43 42 5f 4c 4f 4f 50 7c 53 53 4c 5f 43 42 L_CB_LOOP|SSL_CB
10d0: 5f 45 58 49 54 29 29 20 7b 0a 09 54 63 6c 5f 4c _EXIT)) {..Tcl_L
10e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1100: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
1110: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 StringObj(SSL_st
1120: 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 ate_string_long(
1130: 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ssl), -1));.
1140: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 } else if (where
1150: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 & SSL_CB_ALERT)
1160: 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a {..const char *
1170: 63 70 20 3d 20 28 63 68 61 72 20 2a 29 20 53 53 cp = (char *) SS
1180: 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 L_alert_desc_str
1190: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a 0a ing_long(ret);..
11a0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11c0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
11d0: 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d wStringObj(cp, -
11e0: 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 1));. } else
11f0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
1200: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
1210: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
1220: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1230: 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 j(SSL_state_stri
1240: 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 ng_long(ssl), -1
1250: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 ));. }. Tc
1260: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 l_Preserve((Clie
1270: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
1280: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 . Tcl_Preserv
1290: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
12a0: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 tatePtr);.. T
12b0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
12c0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 28 76 6f cmdPtr);. (vo
12d0: 69 64 29 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 id) Tcl_EvalObjE
12e0: 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 x(interp, cmdPtr
12f0: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 , TCL_EVAL_GLOBA
1300: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 L);. Tcl_Decr
1310: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
1320: 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 ;.. Tcl_Relea
1330: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
1340: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 statePtr);. T
1350: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
1360: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
1370: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
1380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
13c0: 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 . * VerifyCallba
13d0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 ck --. *. *.Moni
13e0: 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 tors SSL certifi
13f0: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 cate validation
1400: 70 72 6f 63 65 73 73 2e 0a 20 2a 09 54 68 69 73 process.. *.This
1410: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 is called whene
1420: 76 65 72 20 61 20 63 65 72 74 69 66 69 63 61 74 ver a certificat
1430: 65 20 69 73 20 69 6e 73 70 65 63 74 65 64 0a 20 e is inspected.
1440: 2a 09 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 *.or decided inv
1450: 61 6c 69 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 alid.. *. * Resu
1460: 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 lts:. *.A callba
1470: 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 ck bound to the
1480: 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72 socket may retur
1490: 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 n one of:. *.
14a0: 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 0...- the certi
14b0: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 ficate is deemed
14c0: 20 69 6e 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 invalid. *.
14d0: 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 1...- the certif
14e0: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 icate is deemed
14f0: 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 65 6d 70 valid. *. emp
1500: 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 ty string.- no c
1510: 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 hange to certifi
1520: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a cate validation.
1530: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
1540: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 ts:. *.The err f
1550: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 ield of the curr
1560: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 ently operative
1570: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 State is set. *.
1580: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 to a string de
1590: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c scribing the SSL
15a0: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 negotiation fai
15b0: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d lure reason. *--
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1600: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
1610: 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 .VerifyCallback(
1620: 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f int ok, X509_STO
1630: 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 RE_CTX *ctx) {.
1640: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
1650: 74 72 2c 20 2a 72 65 73 75 6c 74 3b 0a 20 20 20 tr, *result;.
1660: 20 63 68 61 72 20 2a 65 72 72 53 74 72 2c 20 2a char *errStr, *
1670: 73 74 72 69 6e 67 3b 0a 20 20 20 20 69 6e 74 20 string;. int
1680: 6c 65 6e 67 74 68 3b 0a 20 20 20 20 53 53 4c 20 length;. SSL
1690: 20 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 *ssl..= (SSL*)
16a0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 X509_STORE_CTX_g
16b0: 65 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20 et_ex_data(ctx,
16c0: 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f SSL_get_ex_data_
16d0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 X509_STORE_CTX_i
16e0: 64 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20 dx());. X509
16f0: 20 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53 *cert..= X509_S
1700: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 TORE_CTX_get_cur
1710: 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a rent_cert(ctx);.
1720: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
1730: 50 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53 Ptr.= (State*)SS
1740: 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73 L_get_app_data(s
1750: 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 sl);. Tcl_Int
1760: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
1770: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
1780: 20 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d int depth..=
1790: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f X509_STORE_CTX_
17a0: 67 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 get_error_depth(
17b0: 63 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 ctx);. int er
17c0: 72 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f r..= X509_STORE_
17d0: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 CTX_get_error(ct
17e0: 78 29 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 x);. int code
17f0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
1800: 56 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b 29 Verify: %d", ok)
1810: 3b 0a 0a 20 20 20 20 69 66 20 28 21 6f 6b 29 20 ;.. if (!ok)
1820: 7b 0a 09 65 72 72 53 74 72 20 3d 20 28 63 68 61 {..errStr = (cha
1830: 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 r*)X509_verify_c
1840: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 ert_error_string
1850: 28 65 72 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 (err);. } els
1860: 65 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 28 63 e {..errStr = (c
1870: 68 61 72 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a har *)0;. }..
1880: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
1890: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 ->callback == (T
18a0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
18b0: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 .if (statePtr->v
18c0: 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 flags & SSL_VERI
18d0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
18e0: 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 ER_CERT) {..
18f0: 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c return ok;..} el
1900: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e se {.. return
1910: 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 1;..}. }.
1920: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
1930: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
1940: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
1950: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1960: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1970: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
1980: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
1990: 76 65 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20 verify", -1));.
19a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
19b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
19c0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c rp, cmdPtr,..Tcl
19d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
19e0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
19f0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
1a00: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
1a10: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1a20: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1a30: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
1a40: 62 6a 28 64 65 70 74 68 29 29 3b 0a 20 20 20 20 bj(depth));.
1a50: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1a60: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1a70: 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f 4e 65 77 cmdPtr, Tls_New
1a80: 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 X509Obj(interp,
1a90: 63 65 72 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f cert));. Tcl_
1aa0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1ab0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1ac0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
1ad0: 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20 54 63 6c bj(ok));. Tcl
1ae0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1af0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
1b00: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
1b10: 69 6e 67 4f 62 6a 28 65 72 72 53 74 72 20 3f 20 ingObj(errStr ?
1b20: 65 72 72 53 74 72 20 3a 20 22 22 2c 20 2d 31 29 errStr : "", -1)
1b30: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 );.. Tcl_Pres
1b40: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 erve((ClientData
1b50: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 ) interp);. T
1b60: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
1b70: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
1b80: 72 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 r);.. statePt
1b90: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f r->flags |= TLS_
1ba0: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20 TCL_CALLBACK;..
1bb0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
1bc0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
1bd0: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c code = Tcl_Eval
1be0: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d ObjEx(interp, cm
1bf0: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 dPtr, TCL_EVAL_G
1c00: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 LOBAL);. if (
1c10: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 code != TCL_OK)
1c20: 7b 0a 09 2f 2a 20 49 74 20 67 6f 74 20 61 6e 20 {../* It got an
1c30: 65 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 error - reject t
1c40: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 2e 09 he certificate..
1c50: 09 2a 2f 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a .*/.#if (TCL_MAJ
1c60: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
1c70: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
1c80: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
1c90: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
1ca0: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
1cb0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
1cc0: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
1cd0: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 09 code);.#endif..
1ce0: 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c ok = 0;. } el
1cf0: 73 65 20 7b 0a 09 72 65 73 75 6c 74 20 3d 20 54 se {..result = T
1d00: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_GetObjResult(
1d10: 69 6e 74 65 72 70 29 3b 0a 09 73 74 72 69 6e 67 interp);..string
1d20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
1d30: 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 2c 20 FromObj(result,
1d40: 26 6c 65 6e 67 74 68 29 3b 0a 09 2f 2a 20 41 6e &length);../* An
1d50: 20 65 6d 70 74 79 20 72 65 73 75 6c 74 20 6c 65 empty result le
1d60: 61 76 65 73 20 76 65 72 69 66 69 63 61 74 69 6f aves verificatio
1d70: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f 0a n unchanged..*/.
1d80: 09 69 66 20 28 73 74 72 69 6e 67 20 21 3d 20 4e .if (string != N
1d90: 55 4c 4c 20 26 26 20 6c 65 6e 67 74 68 20 3e 20 ULL && length >
1da0: 30 29 20 7b 0a 09 20 20 20 20 63 6f 64 65 20 3d 0) {.. code =
1db0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f Tcl_GetIntFromO
1dc0: 62 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c bj(interp, resul
1dd0: 74 2c 20 26 6f 6b 29 3b 0a 09 20 20 20 20 69 66 t, &ok);.. if
1de0: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b (code != TCL_OK
1df0: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a ) {.#if (TCL_MAJ
1e00: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
1e10: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
1e20: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 09 54 63 ERSION < 6)...Tc
1e30: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f l_BackgroundErro
1e40: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 r(interp);.#else
1e50: 0a 09 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e ...Tcl_Backgroun
1e60: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 dException(inter
1e70: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 p, code);.#endif
1e80: 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 20 20 20 20 ...ok = 0;..
1e90: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 }..}. }. T
1ea0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
1eb0: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 73 74 cmdPtr);.. st
1ec0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d atePtr->flags &=
1ed0: 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 ~(TLS_TCL_CALLB
1ee0: 41 43 4b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 ACK);.. Tcl_R
1ef0: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
1f00: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 ta) statePtr);.
1f10: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
1f20: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
1f30: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 rp);. return(
1f40: 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 ok);./* By defau
1f50: 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 lt, leave verifi
1f60: 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 cation unchanged
1f70: 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ..*/.}.../*. *--
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fc0: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f -. *. * Tls_Erro
1fd0: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 r --. *. *.Calls
1fe0: 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 24 callback with $
1ff0: 66 64 20 61 6e 64 20 24 6d 73 67 20 2d 20 73 6f fd and $msg - so
2000: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 63 61 the callback ca
2010: 6e 20 64 65 63 69 64 65 0a 20 2a 09 77 68 61 74 n decide. *.what
2020: 20 74 6f 20 64 6f 20 77 69 74 68 20 65 72 72 6f to do with erro
2030: 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 rs.. *. * Side e
2040: 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 ffects:. *.The e
2050: 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 rr field of the
2060: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 currently operat
2070: 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 ive State is set
2080: 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e . *. to a strin
2090: 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 g describing the
20a0: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e SSL negotiation
20b0: 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a failure reason.
20c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2100: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 -----. */.void.T
2110: 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 2a ls_Error(State *
2120: 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 2a statePtr, char *
2130: 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 msg) {. Tcl_I
2140: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
2150: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
2160: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
2170: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 mdPtr;. int c
2180: 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ode;.. dprint
2190: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
21a0: 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a 6d 73 if (msg && *ms
21b0: 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 g) {..Tcl_SetErr
21c0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
21d0: 53 53 4c 22 2c 20 6d 73 67 2c 20 28 63 68 61 72 SSL", msg, (char
21e0: 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 *)NULL);. }
21f0: 65 6c 73 65 20 7b 0a 09 6d 73 67 20 3d 20 54 63 else {..msg = Tc
2200: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
2210: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 bj(Tcl_GetObjRes
2220: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55 4c ult(interp), NUL
2230: 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 L);. }. st
2240: 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 atePtr->err = ms
2250: 67 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 g;.. if (stat
2260: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
2270: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
2280: 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 ) {..char buf[BU
2290: 46 53 49 5a 5d 3b 0a 09 73 70 72 69 6e 74 66 28 FSIZ];..sprintf(
22a0: 62 75 66 2c 20 22 53 53 4c 20 63 68 61 6e 6e 65 buf, "SSL channe
22b0: 6c 20 5c 22 25 73 5c 22 3a 20 65 72 72 6f 72 3a l \"%s\": error:
22c0: 20 25 73 22 2c 0a 09 20 20 20 20 54 63 6c 5f 47 %s",.. Tcl_G
22d0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
22e0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 6d atePtr->self), m
22f0: 73 67 29 3b 0a 09 54 63 6c 5f 53 65 74 52 65 73 sg);..Tcl_SetRes
2300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 62 75 66 2c ult(interp, buf,
2310: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a TCL_VOLATILE);.
2320: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 #if (TCL_MAJOR_V
2330: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 ERSION == 8) &&
2340: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 (TCL_MINOR_VERSI
2350: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 ON < 6)..Tcl_Bac
2360: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 kgroundError(int
2370: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c erp);.#else..Tcl
2380: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 _BackgroundExcep
2390: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 54 43 4c tion(interp, TCL
23a0: 5f 45 52 52 4f 52 29 3b 0a 23 65 6e 64 69 66 0a _ERROR);.#endif.
23b0: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 .return;. }.
23c0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
23d0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
23e0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
23f0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f ;.. Tcl_ListO
2400: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2410: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2420: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2430: 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a ("error", -1));.
2440: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2450: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2460: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
2470: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
2480: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
2490: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
24a0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
24b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
24c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
24d0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
24e0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 wStringObj(msg,
24f0: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 -1));.. Tcl_P
2500: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
2510: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
2520: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
2530: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
2540: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ePtr);.. Tcl_
2550: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
2560: 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d Ptr);. code =
2570: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 Tcl_EvalObjEx(i
2580: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
2590: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b CL_EVAL_GLOBAL);
25a0: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d . if (code !=
25b0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 TCL_OK) {.#if (
25c0: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
25d0: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f N == 8) && (TCL_
25e0: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 MINOR_VERSION <
25f0: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6)..Tcl_Backgrou
2600: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b ndError(interp);
2610: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b .#else..Tcl_Back
2620: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 groundException(
2630: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 interp, code);.#
2640: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 endif. }.
2650: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
2660: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 (cmdPtr);. Tc
2670: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
2680: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
2690: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 ;. Tcl_Releas
26a0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
26b0: 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 nterp);.}.../*.
26c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2700: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f ----. *. * KeyLo
2710: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a gCallback --. *.
2720: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65 *.Write receive
2730: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f d key data to lo
2740: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 g file.. *. * Si
2750: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e de effects:. *.n
2760: 6f 6e 65 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d one. *----------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
27b0: 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 id KeyLogCallbac
27c0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
27d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 , const char *li
27e0: 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a ne) {. char *
27f0: 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c str = getenv(SSL
2800: 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 KEYLOGFILE);.
2810: 20 46 49 4c 45 20 2a 66 64 3b 0a 20 20 20 20 69 FILE *fd;. i
2820: 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 f (str) {..fd =
2830: 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b fopen(str, "a");
2840: 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25 ..fprintf(fd, "%
2850: 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c s\n",line);..fcl
2860: 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d ose(fd);. }.}
2870: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
28c0: 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 * Password Callb
28d0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c ack --. *. *.Cal
28e0: 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 77 led when a passw
28f0: 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 74 6f ord is needed to
2900: 20 75 6e 70 61 63 6b 20 52 53 41 20 61 6e 64 20 unpack RSA and
2910: 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 45 76 61 PEM keys.. *.Eva
2920: 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 70 61 73 ls any bound pas
2930: 73 77 6f 72 64 20 73 63 72 69 70 74 20 61 6e 64 sword script and
2940: 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65 73 returns the res
2950: 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 20 70 61 ult as. *.the pa
2960: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 2e 0a 20 ssword string..
2970: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29b0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
29c0: 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c int.PasswordCall
29d0: 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 back(char *buf,
29e0: 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76 65 int size, int ve
29f0: 72 69 66 79 2c 20 76 6f 69 64 20 2a 75 64 61 74 rify, void *udat
2a00: 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a a) {. State *
2a10: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 statePtr.= (Stat
2a20: 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 e *) udata;.
2a30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
2a40: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
2a50: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
2a60: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
2a70: 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 int code;.. d
2a80: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
2a90: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
2aa0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d Ptr->password ==
2ab0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 NULL) {..if (Tc
2ac0: 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c l_EvalEx(interp,
2ad0: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 "tls::password"
2ae0: 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 , -1, TCL_EVAL_G
2af0: 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b LOBAL) == TCL_OK
2b00: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 ) {.. char *r
2b10: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 et = (char *) Tc
2b20: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c l_GetStringResul
2b30: 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 t(interp);..
2b40: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 strncpy(buf, ret
2b50: 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 , (size_t) size)
2b60: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 ;.. return (i
2b70: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a nt)strlen(ret);.
2b80: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 .} else {.. r
2b90: 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 eturn -1;..}.
2ba0: 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d }.. cmdPtr =
2bb0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
2bc0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 j(statePtr->pass
2bd0: 77 6f 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f word);.. Tcl_
2be0: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
2bf0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
2c00: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
2c10: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
2c20: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c tePtr);.. Tcl
2c30: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
2c40: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 dPtr);. code
2c50: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 = Tcl_EvalObjEx(
2c60: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2c70: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
2c80: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 ;. if (code !
2c90: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 = TCL_OK) {.#if
2ca0: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 (TCL_MAJOR_VERSI
2cb0: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c ON == 8) && (TCL
2cc0: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c _MINOR_VERSION <
2cd0: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 6)..Tcl_Backgro
2ce0: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 undError(interp)
2cf0: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 ;.#else..Tcl_Bac
2d00: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e kgroundException
2d10: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a (interp, code);.
2d20: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 #endif. }.
2d30: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
2d40: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 t(cmdPtr);..
2d50: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
2d60: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
2d70: 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 63 6f 64 r);.. if (cod
2d80: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 e == TCL_OK) {..
2d90: 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 char *ret = (cha
2da0: 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 r *) Tcl_GetStri
2db0: 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 ngResult(interp)
2dc0: 3b 0a 09 69 66 20 28 73 74 72 6c 65 6e 28 72 65 ;..if (strlen(re
2dd0: 74 29 20 3c 20 73 69 7a 65 20 2d 20 31 29 20 7b t) < size - 1) {
2de0: 0a 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 .. strncpy(bu
2df0: 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 f, ret, (size_t)
2e00: 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 54 63 6c size);.. Tcl
2e10: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
2e20: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 Data) interp);..
2e30: 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 return (int)
2e40: 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 0a strlen(ret);..}.
2e50: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 }. Tcl_Re
2e60: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 lease((ClientDat
2e70: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 a) interp);.
2e80: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 76 65 72 69 return -1;..veri
2e90: 66 79 20 3d 20 76 65 72 69 66 79 3b 0a 7d 0a 0c fy = verify;.}..
2ea0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
2ef0: 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b Session Callback
2f00: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a for Clients --.
2f10: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 *. *.Called whe
2f20: 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 n a new session
2f30: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 is added to the
2f40: 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e cache. In TLS 1.
2f50: 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 3. *.this may be
2f60: 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 received multip
2f70: 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 le times after t
2f80: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f he handshake. Fo
2f90: 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 r. *.earlier ver
2fa0: 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c sions, this will
2fb0: 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72 be received dur
2fc0: 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b ing the handshak
2fd0: 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68 e.. *.This is th
2fe0: 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20 e preferred way
2ff0: 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75 to obtain a resu
3000: 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 mable session..
3010: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
3020: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
3030: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
3040: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
3050: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 defined). *. * R
3060: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 eturn codes:. *.
3070: 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20 0 = error where
3080: 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 session will be
3090: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f immediately remo
30a0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 ved from the int
30b0: 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 ernal cache.. *.
30c0: 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72 1 = success wher
30d0: 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65 e app retains se
30e0: 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e ssion in session
30f0: 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 cache, and must
3100: 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f call SSL_SESSIO
3110: 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f N_free() when do
3120: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
3170: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73 .static int.Sess
3180: 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 ionCallback(cons
3190: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f t SSL *ssl, SSL_
31a0: 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e SESSION *session
31b0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
31c0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
31d0: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 *)SSL_get_app_da
31e0: 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a ta((SSL *)ssl);.
31f0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
3200: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
3210: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
3220: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
3230: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
3240: 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b ed char *ticket;
3250: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
3260: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f ned char *sessio
3270: 6e 5f 69 64 3b 0a 20 20 20 20 69 6e 74 20 63 6f n_id;. int co
3280: 64 65 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c de;. size_t l
3290: 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 en2;. unsigne
32a0: 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 d int ulen;..
32b0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
32c0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ");.. if (sta
32d0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
32e0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
32f0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
3300: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a _TLSEXT_ERR_OK;.
3310: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
3320: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 sl == NULL) {..r
3330: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
3340: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
3350: 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 }.. cmdPtr =
3360: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
3370: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
3380: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 ack);. Tcl_Li
3390: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
33a0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
33b0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
33c0: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d Obj("session", -
33d0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 1));.. /* Ses
33e0: 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 sion id */. s
33f0: 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f ession_id = SSL_
3400: 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 SESSION_get_id(s
3410: 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a ession, &ulen);.
3420: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
3430: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3440: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
3450: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a _NewByteArrayObj
3460: 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e (session_id, (in
3470: 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 t) ulen));..
3480: 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 /* Session ticke
3490: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 t */. SSL_SES
34a0: 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 SION_get0_ticket
34b0: 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 (session, &ticke
34c0: 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 t, &len2);. T
34d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
34e0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
34f0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
3500: 74 72 69 6e 67 4f 62 6a 28 74 69 63 6b 65 74 2c tringObj(ticket,
3510: 20 28 69 6e 74 29 6c 65 6e 32 29 29 3b 0a 0a 20 (int)len2));..
3520: 20 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d /* Lifetime -
3530: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e number of secon
3540: 64 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 ds */. Tcl_Li
3550: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
3560: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
3570: 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f r,..Tcl_NewLongO
3580: 62 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 bj((long) SSL_SE
3590: 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 SSION_get_ticket
35a0: 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 _lifetime_hint(s
35b0: 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 ession)));..
35c0: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c Tcl_Preserve((Cl
35d0: 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 ientData) interp
35e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 );. Tcl_Prese
35f0: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 rve((ClientData)
3600: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 statePtr);..
3610: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
3620: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 t(cmdPtr);. c
3630: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 ode = Tcl_EvalOb
3640: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 jEx(interp, cmdP
3650: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f tr, TCL_EVAL_GLO
3660: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f BAL);. if (co
3670: 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a de != TCL_OK) {.
3680: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 #if (TCL_MAJOR_V
3690: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 ERSION == 8) &&
36a0: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 (TCL_MINOR_VERSI
36b0: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 ON < 6)..Tcl_Bac
36c0: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 kgroundError(int
36d0: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c erp);.#else..Tcl
36e0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 _BackgroundExcep
36f0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 tion(interp, cod
3700: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d e);.#endif. }
3710: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
3720: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a Count(cmdPtr);..
3730: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
3740: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
3750: 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f tePtr);. Tcl_
3760: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
3770: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 20 20 20 ata) interp);
3780: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f return 0;.}.../
3790: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
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 0a 20 2a 0a 20 2a 20 41 4c -------. *. * AL
37e0: 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 PN Callback for
37f0: 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a Servers --. *. *
3800: 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d .Perform server-
3810: 73 69 64 65 20 70 72 6f 74 6f 63 6f 6c 20 28 68 side protocol (h
3820: 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c ttp/1.1, h2, h3,
3830: 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e etc.) selection
3840: 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f for the. *.inco
3850: 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e ming connection.
3860: 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 Called after He
3870: 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 llo and server c
3880: 61 6c 6c 62 61 63 6b 73 0a 20 2a 0a 20 2a 20 52 allbacks. *. * R
3890: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
38a0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
38b0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
38c0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
38d0: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 d). *. * Return
38e0: 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c codes:. *.SSL_TL
38f0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 SEXT_ERR_OK: ALP
3900: 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 N protocol selec
3910: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
3920: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
3930: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
3940: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 _ALERT_FATAL: Th
3950: 65 72 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c ere was no overl
3960: 61 70 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 ap between the c
3970: 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 lient's. *. s
3980: 75 70 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 upplied list and
3990: 20 74 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 the server conf
39a0: 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 iguration. The c
39b0: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 onnection will b
39c0: 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 e aborted.. *.SS
39d0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
39e0: 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f CK: ALPN protoco
39f0: 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 l not selected,
3a00: 65 2e 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f e.g., because no
3a10: 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f ALPN. *. pro
3a20: 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 tocols are confi
3a30: 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 gured for this c
3a40: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 onnection. The c
3a50: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
3a60: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ues.. *. *------
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
3ab0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 /.static int.ALP
3ac0: 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 NCallback(const
3ad0: 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 SSL *ssl, const
3ae0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a unsigned char **
3af0: 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 out, unsigned ch
3b00: 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e ar *outlen,..con
3b10: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
3b20: 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 *in, unsigned i
3b30: 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a nt inlen, void *
3b40: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 arg) {. State
3b50: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
3b60: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 ate*)arg;. Tc
3b70: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
3b80: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
3b90: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
3ba0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e *cmdPtr;. in
3bb0: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 t code, res;..
3bc0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
3bd0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
3be0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
3bf0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
3c00: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
3c10: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
3c20: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
3c30: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ssl == NULL) {..
3c40: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
3c50: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
3c60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 }.. /* Selec
3c70: 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 t protocol */.
3c80: 20 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 if (SSL_select
3c90: 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74 2c _next_proto(out,
3ca0: 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 outlen, statePt
3cb0: 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 r->protos, state
3cc0: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c Ptr->protos_len,
3cd0: 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 ..in, inlen) ==
3ce0: 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f OPENSSL_NPN_NEGO
3cf0: 54 49 41 54 45 44 29 20 7b 0a 09 72 65 73 20 3d TIATED) {..res =
3d00: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
3d10: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b OK;. } else {
3d20: 0a 09 2f 2a 20 4e 6f 20 6f 76 65 72 6c 61 70 2c ../* No overlap,
3d30: 20 73 6f 20 66 69 72 73 74 20 63 6c 69 65 6e 74 so first client
3d40: 20 70 72 6f 74 6f 63 6f 6c 20 75 73 65 64 20 2a protocol used *
3d50: 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 /..res = SSL_TLS
3d60: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
3d70: 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 }.. cmdPtr
3d80: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
3d90: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 Obj(statePtr->ca
3da0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c llback);. Tcl
3db0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3dc0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3dd0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
3de0: 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d ingObj("alpn", -
3df0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
3e00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3e10: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3e20: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
3e30: 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a 0a bj(*out, -1));..
3e40: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
3e50: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
3e60: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 terp);. Tcl_P
3e70: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
3e80: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
3e90: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
3ea0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
3eb0: 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 code = Tcl_Ev
3ec0: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 alObjEx(interp,
3ed0: 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c cmdPtr, TCL_EVAL
3ee0: 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 _GLOBAL);. if
3ef0: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b (code != TCL_OK
3f00: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a ) {.#if (TCL_MAJ
3f10: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
3f20: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
3f30: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
3f40: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
3f50: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
3f60: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
3f70: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
3f80: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 code);.#endif.
3f90: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
3fa0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
3fb0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 );.. Tcl_Rele
3fc0: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
3fd0: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 statePtr);.
3fe0: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
3ff0: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
4000: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 ;. return res
4010: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
4020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
4060: 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 *. * SNI Callbac
4070: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d k for Servers --
4080: 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 . *. *.Perform s
4090: 65 72 76 65 72 2d 73 69 64 65 20 53 4e 49 20 68 erver-side SNI h
40a0: 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f ostname selectio
40b0: 6e 20 61 66 74 65 72 20 72 65 63 65 69 76 69 6e n after receivin
40c0: 67 20 53 4e 49 20 68 65 61 64 65 72 2e 0a 20 2a g SNI header.. *
40d0: 09 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 .Called after he
40e0: 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 llo callback but
40f0: 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c before ALPN cal
4100: 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 lback.. *. * Res
4110: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
4120: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
4130: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
4140: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
4150: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
4160: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 des:. *.SSL_TLSE
4170: 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 XT_ERR_OK: SNI h
4180: 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 ostname is accep
4190: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
41a0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
41b0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
41c0: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e _ALERT_FATAL: SN
41d0: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f I hostname is no
41e0: 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 t accepted. The
41f0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 connection. *.
4200: 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 is aborted. De
4210: 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 fault for alert
4220: 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f is SSL_AD_UNRECO
4230: 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 GNIZED_NAME.. *.
4240: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
4250: 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e LERT_WARNING: SN
4260: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f I hostname is no
4270: 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e t accepted, warn
4280: 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 ing alert. *.
4290: 20 73 65 6e 74 20 28 6e 6f 74 20 69 6e 20 54 4c sent (not in TL
42a0: 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e Sv1.3). The conn
42b0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
42c0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
42d0: 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 ERR_NOACK: SNI h
42e0: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 ostname is not a
42f0: 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 ccepted and not
4300: 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a acknowledged,. *
4310: 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 . e.g. if SNI
4320: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f has not been co
4330: 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f nfigured. The co
4340: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
4350: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d es.. *. *-------
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 0a 20 2a 2f ------------. */
43a0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 .static int.SNIC
43b0: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
43c0: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
43d0: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
43e0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
43f0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
4400: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
4410: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
4420: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
4430: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
4440: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
4450: 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 ;. char *serv
4460: 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a ername = NULL;..
4470: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
4480: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
4490: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
44a0: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 ck == (Tcl_Obj*)
44b0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
44c0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
44d0: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 K;. } else if
44e0: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b (ssl == NULL) {
44f0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
4500: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
4510: 20 20 20 7d 0a 0a 20 20 20 20 73 65 72 76 65 72 }.. server
4520: 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 name = SSL_get_s
4530: 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 ervername(ssl, T
4540: 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 LSEXT_NAMETYPE_h
4550: 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 ost_name);. i
4560: 66 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c f (!servername |
4570: 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 | servername[0]
4580: 3d 3d 20 27 5c 30 27 29 20 7b 0a 20 20 20 20 20 == '\0') {.
4590: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c return SSL_TL
45a0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
45b0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 }.. cmdPt
45c0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
45d0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 eObj(statePtr->c
45e0: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 allback);. Tc
45f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
4600: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
4610: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
4620: 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d ringObj("sni", -
4630: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
4640: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4650: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
4660: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
4670: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 bj(servername ,
4680: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 -1));.. Tcl_P
4690: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
46a0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
46b0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
46c0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
46d0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ePtr);.. Tcl_
46e0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
46f0: 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d Ptr);. code =
4700: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 Tcl_EvalObjEx(i
4710: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
4720: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b CL_EVAL_GLOBAL);
4730: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d . if (code !=
4740: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 TCL_OK) {.#if (
4750: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
4760: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f N == 8) && (TCL_
4770: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 MINOR_VERSION <
4780: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6)..Tcl_Backgrou
4790: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b ndError(interp);
47a0: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b .#else..Tcl_Back
47b0: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 groundException(
47c0: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 interp, code);.#
47d0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 endif. }.
47e0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
47f0: 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 (cmdPtr);.. T
4800: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
4810: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
4820: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 );. Tcl_Relea
4830: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
4840: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 interp);. ret
4850: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
4860: 52 52 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a RR_OK;.}.../*. *
4870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48b0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 65 6c 6c 6f 20 ---. *. * Hello
48c0: 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62 61 Handshake Callba
48d0: 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d ck for Servers -
48e0: 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79 20 -. *. *.Used by
48f0: 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69 6e server to examin
4900: 65 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d e the server nam
4910: 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e e indication (SN
4920: 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 I) extension. *.
4930: 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 provided by the
4940: 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 client in order
4950: 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70 70 to select an app
4960: 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 66 69 ropriate certifi
4970: 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73 65 cate to. *.prese
4980: 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68 nt, and make oth
4990: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e er configuration
49a0: 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c adjustments rel
49b0: 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73 65 evant to that se
49c0: 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 rver. *.name and
49d0: 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74 69 its configurati
49e0: 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 65 on. This include
49f0: 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20 74 s swapping out t
4a00: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 2a he associated. *
4a10: 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72 .SSL_CTX pointer
4a20: 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 , modifying the
4a30: 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f 66 server's list of
4a40: 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20 76 permitted TLS v
4a50: 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e ersions,. *.chan
4a60: 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 ging the server'
4a70: 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 69 6e s cipher list in
4a80: 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 response to the
4a90: 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65 72 client's cipher
4aa0: 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 0a 20 list, etc.. *.
4ab0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
4ac0: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
4ad0: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 fects:. *.Calls
4ae0: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 callback (if def
4af0: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 ined). *. * Retu
4b00: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c rn codes:. *.SSL
4b10: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 _CLIENT_HELLO_RE
4b20: 54 52 59 20 3d 20 73 75 73 70 65 6e 64 20 74 68 TRY = suspend th
4b30: 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 e handshake, and
4b40: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 the handshake f
4b50: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 unction will ret
4b60: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a urn immediately.
4b70: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 *.SSL_CLIENT_HE
4b80: 4c 4c 4f 5f 45 52 52 4f 52 20 3d 20 66 61 69 6c LLO_ERROR = fail
4b90: 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 ure, terminate c
4ba0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 onnection. Set a
4bb0: 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f lert to error co
4bc0: 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e de.. *.SSL_CLIEN
4bd0: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 20 T_HELLO_SUCCESS
4be0: 3d 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d = success. *. *-
4bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c30: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
4c40: 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 t.HelloCallback(
4c50: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 const SSL *ssl,
4c60: 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 int *alert, void
4c70: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 *arg) {. Sta
4c80: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
4c90: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 State*)arg;.
4ca0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
4cb0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
4cc0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
4cd0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
4ce0: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f int code;. co
4cf0: 6e 73 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 nst char *server
4d00: 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 name;. const
4d10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 unsigned char *p
4d20: 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e ;. size_t len
4d30: 2c 20 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 , remaining;..
4d40: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
4d50: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
4d60: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
4d70: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
4d80: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
4d90: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
4da0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
4db0: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ssl == NULL) {..
4dc0: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
4dd0: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
4de0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e }.. /* Get n
4df0: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 ames */. if (
4e00: 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c !SSL_client_hell
4e10: 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 o_get0_ext(ssl,
4e20: 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 TLSEXT_TYPE_serv
4e30: 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 er_name, &p, &re
4e40: 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 maining) || rema
4e50: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 20 20 ining <= 2) {.
4e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c return SSL
4e70: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
4e80: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
4e90: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 6c /* Extract the l
4ea0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 ength of the sup
4eb0: 70 6c 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 plied list of na
4ec0: 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 mes. */. len
4ed0: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b = (*(p++) << 8);
4ee0: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b . len += *(p+
4ef0: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 +);. if (len
4f00: 2b 20 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 + 2 != remaining
4f10: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 ) {. retu
4f20: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
4f30: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d LLO_ERROR;. }
4f40: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d . remaining =
4f50: 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 len;.. /* Th
4f60: 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 e list in practi
4f70: 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 ce only has a si
4f80: 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f ngle element, so
4f90: 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 we only conside
4fa0: 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e r the first one.
4fb0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 */. if (rema
4fc0: 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 ining == 0 || *p
4fd0: 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d ++ != TLSEXT_NAM
4fe0: 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 ETYPE_host_name)
4ff0: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 {. retur
5000: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
5010: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
5020: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b remaining--;
5030: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 77 65 20 .. /* Now we
5040: 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70 75 6c 6c can finally pull
5050: 20 6f 75 74 20 74 68 65 20 62 79 74 65 20 61 72 out the byte ar
5060: 72 61 79 20 77 69 74 68 20 74 68 65 20 61 63 74 ray with the act
5070: 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f ual hostname. */
5080: 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69 . if (remaini
5090: 6e 67 20 3c 3d 20 32 29 20 7b 0a 20 20 20 20 20 ng <= 2) {.
50a0: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c return SSL_CL
50b0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
50c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 ;. }. len
50d0: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b = (*(p++) << 8);
50e0: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b . len += *(p+
50f0: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 +);. if (len
5100: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 + 2 > remaining)
5110: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 {. retur
5120: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
5130: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
5140: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 remaining =
5150: 6c 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e len;. servern
5160: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 ame = (const cha
5170: 72 20 2a 29 70 3b 0a 0a 20 20 20 20 63 6d 64 50 r *)p;.. cmdP
5180: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
5190: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
51a0: 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 callback);. T
51b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
51c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
51d0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
51e0: 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22 tringObj("hello"
51f0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
5200: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5210: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
5220: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
5230: 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 ngObj(servername
5240: 2c 20 28 69 6e 74 29 6c 65 6e 29 29 3b 0a 0a 20 , (int)len));..
5250: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
5260: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 (ClientData) int
5270: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 erp);. Tcl_Pr
5280: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
5290: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a ta) statePtr);..
52a0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
52b0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
52c0: 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 code = Tcl_Eva
52d0: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 lObjEx(interp, c
52e0: 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f mdPtr, TCL_EVAL_
52f0: 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 GLOBAL);. if
5300: 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 (code != TCL_OK)
5310: 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f {.#if (TCL_MAJO
5320: 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 R_VERSION == 8)
5330: 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 && (TCL_MINOR_VE
5340: 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f RSION < 6)..Tcl_
5350: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 BackgroundError(
5360: 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 interp);.#else..
5370: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 Tcl_BackgroundEx
5380: 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 ception(interp,
5390: 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 code);.#endif.
53a0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 }. Tcl_Decr
53b0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
53c0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 ;.. Tcl_Relea
53d0: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
53e0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 statePtr);. T
53f0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
5400: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
5410: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f . return SSL_
5420: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 CLIENT_HELLO_SUC
5430: 43 45 53 53 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a CESS;.}.../*****
5440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
5450: 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 ./* Commands
5460: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a */./*******
5470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
5480: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
54d0: 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 iphersObjCmd --
54e0: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 list available c
54f0: 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 iphers. *. *.Thi
5500: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
5510: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
5520: 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 s the "tls::ciph
5530: 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 ers" command. *.
5540: 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c to list availabl
5550: 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 e ciphers, based
5560: 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 upon protocol s
5570: 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 elected.. *. * R
5580: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
5590: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
55a0: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 list.. *. * Sid
55b0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f e effects:. *.co
55c0: 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 nstructs and des
55d0: 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 troys SSL contex
55e0: 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d t (CTX). *. *---
55f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5630: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 . */.static cons
5640: 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c t char *protocol
5650: 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c s[] = {.."ssl2",
5660: 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c "ssl3", "tls1",
5670: 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 "tls1.1", "tls1
5680: 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e .2", "tls1.3", N
5690: 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 ULL.};.enum prot
56a0: 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 ocol {. TLS_S
56b0: 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 SL2, TLS_SSL3, T
56c0: 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 LS_TLS1, TLS_TLS
56d0: 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 1_1, TLS_TLS1_2,
56e0: 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 TLS_TLS1_3, TLS
56f0: 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 _NONE.};..static
5700: 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 int.CiphersObjC
5710: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
5720: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
5730: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
5740: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
5750: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
5760: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
5770: 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 jPtr = NULL;.
5780: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 SSL_CTX *ctx =
5790: 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 NULL;. SSL *s
57a0: 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 sl = NULL;. S
57b0: 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 TACK_OF(SSL_CIPH
57c0: 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 ER) *sk;. cha
57d0: 72 20 2a 63 70 2c 20 62 75 66 5b 42 55 46 53 49 r *cp, buf[BUFSI
57e0: 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 Z];. int inde
57f0: 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 x, verbose = 0,
5800: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 use_supported =
5810: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 0;.. dprintf(
5820: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
5830: 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c if ((objc < 2) |
5840: 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a | (objc > 4)) {.
5850: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
5860: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
5870: 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 v, "protocol ?ve
5880: 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 rbose? ?supporte
5890: 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 d?");..return TC
58a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
58b0: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e if (Tcl_GetIn
58c0: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
58d0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 p, objv[1], prot
58e0: 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c ocols, "protocol
58f0: 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d ", 0, &index) !=
5900: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
5910: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
5920: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a }. if ((obj
5930: 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 c > 2) && Tcl_Ge
5940: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 tBooleanFromObj(
5950: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c interp, objv[2],
5960: 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 &verbose) != TC
5970: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
5980: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
5990: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e . if ((objc >
59a0: 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 3) && Tcl_GetBo
59b0: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 oleanFromObj(int
59c0: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 erp, objv[3], &u
59d0: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d se_supported) !=
59e0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
59f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
5a00: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
5a10: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
5a20: 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 switch ((enum p
5a30: 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b rotocol)index) {
5a40: 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a ..case TLS_SSL2:
5a50: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
5a60: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 SION_NUMBER >= 0
5a70: 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 x10100000L || de
5a80: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c fined(NO_SSL2) |
5a90: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
5aa0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 L_NO_SSL2)..
5ab0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
5ac0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
5ad0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
5ae0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
5af0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 rted", NULL);..
5b00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
5b10: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
5b20: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
5b30: 77 28 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 w(SSLv2_method()
5b40: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ); break;.#endif
5b50: 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a ..case TLS_SSL3:
5b60: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
5b70: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL3) || defined
5b80: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
5b90: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
5ba0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 NSSL_NO_SSL3_MET
5bb0: 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 HOD).. Tcl_Ap
5bc0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
5bd0: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 p, protocols[ind
5be0: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c ex], ": protocol
5bf0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
5c00: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
5c10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
5c20: 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 else.. ctx =
5c30: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 SSL_CTX_new(SSLv
5c40: 33 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 3_method()); bre
5c50: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 ak;.#endif..case
5c60: 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 TLS_TLS1:.#if d
5c70: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
5c80: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
5c90: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 SL_NO_TLS1) || d
5ca0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
5cb0: 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09 O_TLS1_METHOD)..
5cc0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
5cd0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
5ce0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
5cf0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
5d00: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
5d10: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
5d20: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
5d30: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 ctx = SSL_CT
5d40: 58 5f 6e 65 77 28 54 4c 53 76 31 5f 6d 65 74 68 X_new(TLSv1_meth
5d50: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 od()); break;.#e
5d60: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
5d70: 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e LS1_1:.#if defin
5d80: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c ed(NO_TLS1_1) ||
5d90: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
5da0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 _NO_TLS1_1) || d
5db0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
5dc0: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 O_TLS1_1_METHOD)
5dd0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
5de0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
5df0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
5e00: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
5e10: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
5e20: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
5e30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
5e40: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f .. ctx = SSL_
5e50: 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 31 5f CTX_new(TLSv1_1_
5e60: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b method()); break
5e70: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 ;.#endif..case T
5e80: 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 LS_TLS1_2:.#if d
5e90: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
5ea0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
5eb0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 NSSL_NO_TLS1_2)
5ec0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
5ed0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 SL_NO_TLS1_2_MET
5ee0: 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 HOD).. Tcl_Ap
5ef0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
5f00: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 p, protocols[ind
5f10: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c ex], ": protocol
5f20: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
5f30: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
5f40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
5f50: 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 else.. ctx =
5f60: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 SSL_CTX_new(TLSv
5f70: 31 5f 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 1_2_method()); b
5f80: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 reak;.#endif..ca
5f90: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 se TLS_TLS1_3:.#
5fa0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
5fb0: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_3) || defined
5fc0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
5fd0: 5f 33 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 _3).. Tcl_App
5fe0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
5ff0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
6000: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
6010: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
6020: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
6030: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
6040: 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 lse.. ctx = S
6050: 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 5f 6d SL_CTX_new(TLS_m
6060: 65 74 68 6f 64 28 29 29 3b 0a 20 20 20 20 20 20 ethod());.
6070: 20 20 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 SSL_CTX_se
6080: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 t_min_proto_vers
6090: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
60a0: 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 VERSION);.. S
60b0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 SL_CTX_set_max_p
60c0: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
60d0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
60e0: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 );.. break;.#
60f0: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a endif..default:.
6100: 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 . break;.
6110: 7d 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d }. if (ctx ==
6120: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 NULL) {..Tcl_Ap
6130: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
6140: 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c p, REASON(), NUL
6150: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
6160: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
6170: 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 ssl = SSL_new(
6180: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73 ctx);. if (ss
6190: 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 l == NULL) {..Tc
61a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
61b0: 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c nterp, REASON(),
61c0: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
61d0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
61e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
61f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 }.. /* Use
6200: 20 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 list and order
6210: 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 as would be sent
6220: 20 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c in a ClientHell
6230: 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 o or all availab
6240: 6c 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 le ciphers */.
6250: 20 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 if (use_suppor
6260: 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c ted) {..sk = SSL
6270: 5f 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f _get1_supported_
6280: 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 ciphers(ssl);.
6290: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d } else {..sk =
62a0: 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 SSL_get_ciphers
62b0: 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 (ssl);. }..
62c0: 20 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c if (sk != NULL
62d0: 29 20 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 ) {..if (!verbos
62e0: 65 29 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 e) {.. objPtr
62f0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
6300: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 j(0, NULL);..
6310: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b for (int i = 0;
6320: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 i < sk_SSL_CIPH
6330: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 ER_num(sk); i++)
6340: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 {...const SSL_C
6350: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 IPHER *c = sk_SS
6360: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 L_CIPHER_value(s
6370: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d k, i);...if (c =
6380: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 = NULL) continue
6390: 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 6e ;..../* cipher n
63a0: 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f ame or (NONE) */
63b0: 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 ...cp = SSL_CIPH
63c0: 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a ER_get_name(c);.
63d0: 09 09 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c ..if (cp == NULL
63e0: 29 20 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c ) break;...Tcl_L
63f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
6400: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
6410: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
6420: 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 gObj(cp, -1));..
6430: 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b }...} else {
6440: 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
6450: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
6460: 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 "",0);.. for
6470: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 (int i = 0; i <
6480: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 sk_SSL_CIPHER_nu
6490: 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 m(sk); i++) {...
64a0: 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 const SSL_CIPHER
64b0: 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 *c = sk_SSL_CIP
64c0: 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 HER_value(sk, i)
64d0: 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c ;...if (c == NUL
64e0: 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 L) continue;....
64f0: 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 /* textual descr
6500: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 iption of the ci
6510: 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 pher */...if (SS
6520: 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 L_CIPHER_descrip
6530: 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a tion(c, buf, siz
6540: 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c eof(buf)) != NUL
6550: 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 L) {... Tcl_A
6560: 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 ppendToObj(objPt
6570: 72 2c 20 62 75 66 2c 20 28 69 6e 74 29 20 73 74 r, buf, (int) st
6580: 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d 20 rlen(buf));...}
6590: 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 6c else {... Tcl
65a0: 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a _AppendToObj(obj
65b0: 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 Ptr, "UNKNOWN\n"
65c0: 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d , 8);...}.. }
65d0: 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 70 ..}..if (use_sup
65e0: 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20 73 ported) {.. s
65f0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 65 k_SSL_CIPHER_fre
6600: 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a e(sk);..}. }.
6610: 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 6c SSL_free(ssl
6620: 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 );. SSL_CTX_f
6630: 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 ree(ctx);.. T
6640: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
6650: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
6660: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
6670: 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 OK;..clientData
6680: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a = clientData;.}.
6690: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
66a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
66e0: 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 ProtocolsObjCmd
66f0: 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 -- list availab
6700: 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a le protocols. *.
6710: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
6720: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 e is invoked to
6730: 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 process the "tls
6740: 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d ::protocols" com
6750: 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 mand. *.to list
6760: 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 available protoc
6770: 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ols.. *. * Resul
6780: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
6790: 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 d Tcl result lis
67a0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
67b0: 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 fects:. *.none.
67c0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
67d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6800: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
6810: 69 63 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 ic int.Protocols
6820: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
6830: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
6840: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
6850: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
6860: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
6870: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ]) {. Tcl_Obj
6880: 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 *objPtr;.. d
6890: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
68a0: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
68b0: 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 1) {..Tcl_Wro
68c0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
68d0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a , 1, objv, "");.
68e0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
68f0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 R;. }.. ob
6900: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
6910: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
6920: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
6930: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
6940: 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 10100000L && !de
6950: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 fined(NO_SSL2) &
6960: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
6970: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 SL_NO_SSL2).
6980: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
6990: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
69a0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
69b0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 StringObj(protoc
69c0: 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d ols[TLS_SSL2], -
69d0: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 1));.#endif.#if
69e0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 !defined(NO_SSL3
69f0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
6a00: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 ENSSL_NO_SSL3).
6a10: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
6a20: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
6a30: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
6a40: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
6a50: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d tocols[TLS_SSL3]
6a60: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
6a70: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
6a80: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
6a90: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
6aa0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
6ab0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
6ac0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
6ad0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
6ae0: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c protocols[TLS_TL
6af0: 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 S1], -1));.#endi
6b00: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
6b10: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 O_TLS1_1) && !de
6b20: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
6b30: 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 54 63 6c _TLS1_1). Tcl
6b40: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
6b50: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
6b60: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
6b70: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
6b80: 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 [TLS_TLS1_1], -1
6b90: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
6ba0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
6bb0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
6bc0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
6bd0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
6be0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
6bf0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
6c00: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
6c10: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c protocols[TLS_TL
6c20: 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e S1_2], -1));.#en
6c30: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
6c40: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 (NO_TLS1_3) && !
6c50: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
6c60: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 NO_TLS1_3). T
6c70: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
6c80: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
6c90: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
6ca0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
6cb0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 ls[TLS_TLS1_3],
6cc0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 -1));.#endif..
6cd0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
6ce0: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
6cf0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
6d00: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 CL_OK;..clientDa
6d10: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
6d20: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
6d70: 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a . * HandshakeObj
6d80: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
6d90: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 s command is use
6da0: 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74 d to verify whet
6db0: 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b her the handshak
6dc0: 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a e is complete. *
6dd0: 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 .or not.. *. * R
6de0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
6df0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
6e00: 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 . 1 means handsh
6e10: 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 ake complete, 0
6e20: 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 means pending..
6e30: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
6e40: 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 s:. *.May force
6e50: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 SSL negotiation
6e60: 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 to take place..
6e70: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
6e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
6ec0: 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 ic int Handshake
6ed0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
6ee0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
6ef0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
6f00: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
6f10: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
6f20: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
6f30: 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 nnel chan;
6f40: 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c /* The channel
6f50: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f to set a mode o
6f60: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 n. */. State
6f70: 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20 *statePtr;
6f80: 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 /* client stat
6f90: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 e for ssl socket
6fa0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 */. const ch
6fb0: 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c ar *errStr = NUL
6fc0: 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d L;. int ret =
6fd0: 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 1;. int err
6fe0: 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 = 0;.. dprint
6ff0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
7000: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 if (objc != 2)
7010: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
7020: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
7030: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 objv, "channel")
7040: 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 ;..return(TCL_ER
7050: 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ROR);. }..
7060: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
7070: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
7080: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
7090: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c Obj(objv[1], NUL
70a0: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 L), NULL);. i
70b0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
70c0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
70d0: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
70e0: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
70f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
7100: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
7110: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
7120: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
7130: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
7140: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 han);. if (Tc
7150: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
7160: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
7170: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
7180: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
7190: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
71a0: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
71b0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
71c0: 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 20 an), "\": not a
71d0: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 TLS channel", NU
71e0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c LL);..return(TCL
71f0: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 _ERROR);. }.
7200: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 statePtr = (S
7210: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 tate *)Tcl_GetCh
7220: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
7230: 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 a(chan);.. dp
7240: 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 rintf("Calling T
7250: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 ls_WaitForConnec
7260: 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 t");. ret = T
7270: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 ls_WaitForConnec
7280: 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 t(statePtr, &err
7290: 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 , 1);. dprint
72a0: 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f f("Tls_WaitForCo
72b0: 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20 nnect returned:
72c0: 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 %i", ret);..
72d0: 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 20 28 if (ret < 0 && (
72e0: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 (statePtr->flags
72f0: 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 & TLS_TCL_ASYNC
7300: 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41 47 ) && (err == EAG
7310: 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 AIN))) {..dprint
7320: 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e 64 f("Async set and
7330: 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29 3b err = EAGAIN");
7340: 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d ..ret = 0;. }
7350: 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c 20 else if (ret <
7360: 30 29 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 73 0) {..errStr = s
7370: 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 tatePtr->err;..T
7380: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 cl_ResetResult(i
7390: 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 nterp);..Tcl_Set
73a0: 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 Errno(err);...if
73b0: 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 (!errStr || (*e
73c0: 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 rrStr == 0)) {..
73d0: 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c errStr = Tcl
73e0: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 _PosixError(inte
73f0: 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 rp);..}...Tcl_Ap
7400: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
7410: 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 p, "handshake fa
7420: 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c iled: ", errStr,
7430: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
7440: 0a 09 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 ..dprintf("Retur
7450: 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 ning TCL_ERROR w
7460: 69 74 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 ith handshake fa
7470: 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 iled: %s", errSt
7480: 72 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f r);..return(TCL_
7490: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 20 65 6c ERROR);. } el
74a0: 73 65 20 7b 0a 09 69 66 20 28 65 72 72 20 21 3d se {..if (err !=
74b0: 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 0) {.. dprin
74c0: 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 tf("Got an error
74d0: 20 77 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 with a complete
74e0: 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 d handshake: err
74f0: 20 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d = %i", err);..}
7500: 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d ..ret = 1;. }
7510: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 .. dprintf("R
7520: 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 eturning TCL_OK
7530: 77 69 74 68 20 64 61 74 61 20 5c 22 25 69 5c 22 with data \"%i\"
7540: 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 54 63 6c ", ret);. Tcl
7550: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
7560: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 terp, Tcl_NewInt
7570: 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 72 Obj(ret));. r
7580: 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 eturn(TCL_OK);..
7590: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
75a0: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 20 entData;.}../*.
75b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75f0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 ----. *. * Impor
7600: 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a tObjCmd --. *. *
7610: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
7620: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 is invoked to pr
7630: 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 ocess the "ssl"
7640: 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 command. *. *.Th
7650: 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 e ssl command pu
7660: 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 shes SSL over a
7670: 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 (newly connected
7680: 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a ) tcp socket. *.
7690: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
76a0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
76b0: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
76c0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 effects:. *.May
76d0: 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 modify the beha
76e0: 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 vior of an IO ch
76f0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d annel.. *. *----
7700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
7740: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 */.static int.I
7750: 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 mportObjCmd(Clie
7760: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
7770: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
7780: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
7790: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
77a0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
77b0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 l_Channel chan;.
77c0: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 ./* The channel
77d0: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e to set a mode on
77e0: 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a . */. State *
77f0: 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c statePtr;../* cl
7800: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 ient state for s
7810: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 sl socket */.
7820: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 20 20 SSL_CTX *ctx.
7830: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
7840: 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 Tcl_Obj *scrip
7850: 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c t. = NULL
7860: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 ;. Tcl_Obj *p
7870: 61 73 73 77 6f 72 64 09 20 20 20 20 20 20 20 20 assword.
7880: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
7890: 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 DString upperCha
78a0: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c nnelTranslation,
78b0: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f upperChannelBlo
78c0: 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e cking, upperChan
78d0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 nelEncoding, upp
78e0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
78f0: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c ;. int idx, l
7900: 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 en;. int flag
7910: 73 09 09 20 20 20 20 20 20 20 20 3d 20 54 4c 53 s.. = TLS
7920: 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 _TCL_INIT;. i
7930: 6e 74 20 73 65 72 76 65 72 09 09 20 20 20 20 20 nt server..
7940: 20 20 20 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f = 0;./* is co
7950: 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e nnection incomin
7960: 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a g or outgoing? *
7970: 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66 /. char *keyf
7980: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ile. = NU
7990: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 LL;. char *ce
79a0: 72 74 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d rtfile. =
79b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 NULL;. unsig
79c0: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20 20 09 ned char *key .
79d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 = NULL;. int
79e0: 6b 65 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 key_len
79f0: 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 = 0;.
7a00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
7a10: 63 65 72 74 20 20 20 20 20 20 20 20 20 3d 20 4e cert = N
7a20: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 63 65 72 ULL;. int cer
7a30: 74 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 t_len
7a40: 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 68 = 0;. ch
7a50: 61 72 20 2a 63 69 70 68 65 72 73 09 20 20 20 20 ar *ciphers.
7a60: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
7a70: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 char *ciphersuit
7a80: 65 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c es. = NUL
7a90: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 L;. char *CAf
7aa0: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ile. = NU
7ab0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 LL;. char *CA
7ac0: 64 69 72 09 09 20 20 20 20 20 20 20 20 3d 20 4e dir.. = N
7ad0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 ULL;. char *D
7ae0: 48 70 61 72 61 6d 73 09 20 20 20 20 20 20 20 20 Hparams.
7af0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
7b00: 20 2a 6d 6f 64 65 6c 09 09 20 20 20 20 20 20 20 *model..
7b10: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
7b20: 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 20 20 r *servername.
7b30: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a = NULL;./*
7b40: 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 hostname for Se
7b50: 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 rver Name Indica
7b60: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 tion */. cons
7b70: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
7b80: 2a 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 *session_id = NU
7b90: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 LL;. Tcl_Obj
7ba0: 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 *alpn..= NULL;.
7bb0: 20 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c int ssl2 = 0,
7bc0: 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 ssl3 = 0;. i
7bd0: 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 nt tls1 = 1, tls
7be0: 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 1_1 = 1, tls1_2
7bf0: 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b = 1, tls1_3 = 1;
7c00: 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d . int proto =
7c10: 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 0, level = -1;.
7c20: 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d int verify =
7c30: 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 0, require = 0,
7c40: 20 72 65 71 75 65 73 74 20 3d 20 31 3b 0a 0a 20 request = 1;..
7c50: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
7c60: 65 64 22 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 ed");..#if OPENS
7c70: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
7c80: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 R < 0x10100000L
7c90: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
7ca0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 20 26 26 20 SSL_NO_SSL2) &&
7cb0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 !defined(NO_SSL2
7cc0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f ) && defined(NO_
7cd0: 53 53 4c 33 29 20 26 26 20 64 65 66 69 6e 65 64 SSL3) && defined
7ce0: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66 (NO_TLS1) && def
7cf0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
7d00: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c && defined(NO_TL
7d10: 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64 S1_2) && defined
7d20: 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 (NO_TLS1_3).
7d30: 73 73 6c 32 20 3d 20 31 3b 0a 23 65 6e 64 69 66 ssl2 = 1;.#endif
7d40: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4f 50 .#if !defined(OP
7d50: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 ENSSL_NO_SSL3) &
7d60: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 & !defined(NO_SS
7d70: 4c 33 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e L3) && defined(N
7d80: 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e O_SSL2) && defin
7d90: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 ed(NO_TLS1) && d
7da0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
7db0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f ) && defined(NO_
7dc0: 54 4c 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e TLS1_2) && defin
7dd0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 ed(NO_TLS1_3).
7de0: 20 20 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e 64 ssl3 = 1;.#end
7df0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
7e00: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e O_TLS1) || defin
7e10: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7e20: 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 S1). tls1 = 0
7e30: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ;.#endif.#if def
7e40: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
7e50: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
7e60: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 SL_NO_TLS1_1).
7e70: 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 tls1_1 = 0;.#e
7e80: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
7e90: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 (NO_TLS1_2) || d
7ea0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7eb0: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c O_TLS1_2). tl
7ec0: 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 s1_2 = 0;.#endif
7ed0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
7ee0: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e TLS1_3) || defin
7ef0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7f00: 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 S1_3). tls1_3
7f10: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 = 0;.#endif..
7f20: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 if (objc < 2)
7f30: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
7f40: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
7f50: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f bjv, "channel ?o
7f60: 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 ptions?");..retu
7f70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7f80: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 }.. chan =
7f90: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
7fa0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 nterp, Tcl_GetSt
7fb0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
7fc0: 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c [1], NULL), NULL
7fd0: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 );. if (chan
7fe0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
7ff0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
8000: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
8010: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 }.. /* Make s
8020: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f ure to operate o
8030: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 n the topmost ch
8040: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 annel */. cha
8050: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
8060: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 annel(chan);..
8070: 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 for (idx = 2;
8080: 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b idx < objc; idx+
8090: 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 +) {..char *opt
80a0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
80b0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d romObj(objv[idx]
80c0: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f , NULL);...if (o
80d0: 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20 pt[0] != '-')..
80e0: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 53 break;...OPTS
80f0: 54 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 64 TR("-cadir", CAd
8100: 69 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 ir);..OPTSTR("-c
8110: 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b afile", CAfile);
8120: 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66 ..OPTSTR("-certf
8130: 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b ile", certfile);
8140: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 ..OPTSTR("-ciphe
8150: 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f r", ciphers);..O
8160: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 22 PTSTR("-ciphers"
8170: 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 , ciphers);..OPT
8180: 53 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 74 STR("-ciphersuit
8190: 65 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 65 es", ciphersuite
81a0: 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f s);..OPTOBJ("-co
81b0: 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b mmand", script);
81c0: 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72 ..OPTSTR("-dhpar
81d0: 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b ams", DHparams);
81e0: 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69 ..OPTSTR("-keyfi
81f0: 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 le", keyfile);..
8200: 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c OPTSTR("-model",
8210: 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a model);..OPTOBJ
8220: 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 ("-password", pa
8230: 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f ssword);..OPTBOO
8240: 4c 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 L("-require", re
8250: 71 75 69 72 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c quire);..OPTBOOL
8260: 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 ("-request", req
8270: 75 65 73 74 29 3b 0a 09 4f 50 54 49 4e 54 28 22 uest);..OPTINT("
8280: 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c -securitylevel",
8290: 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f level);..OPTBOO
82a0: 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 L("-server", ser
82b0: 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ver);..OPTSTR("-
82c0: 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 servername", ser
82d0: 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 vername);..OPTST
82e0: 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c R("-session_id",
82f0: 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f session_id);..O
8300: 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 PTOBJ("-alpn", a
8310: 6c 70 6e 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 lpn);..OPTBOOL("
8320: 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 -ssl2", ssl2);..
8330: 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c OPTBOOL("-ssl3",
8340: 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c ssl3);..OPTBOOL
8350: 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b ("-tls1", tls1);
8360: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 ..OPTBOOL("-tls1
8370: 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f .1", tls1_1);..O
8380: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 PTBOOL("-tls1.2"
8390: 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 , tls1_2);..OPTB
83a0: 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 OOL("-tls1.3", t
83b0: 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 42 59 54 45 ls1_3);..OPTBYTE
83c0: 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c 20 ("-cert", cert,
83d0: 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 42 cert_len);..OPTB
83e0: 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c YTE("-key", key,
83f0: 20 6b 65 79 5f 6c 65 6e 29 3b 0a 0a 09 4f 50 54 key_len);...OPT
8400: 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d BAD("option", "-
8410: 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 alpn, -cadir, -c
8420: 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 afile, -cert, -c
8430: 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 ertfile, -cipher
8440: 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c , -ciphersuites,
8450: 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 -command, -dhpa
8460: 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 rams, -key, -key
8470: 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 file, -model, -p
8480: 61 73 73 77 6f 72 64 2c 20 2d 72 65 71 75 69 72 assword, -requir
8490: 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 73 65 e, -request, -se
84a0: 63 75 72 69 74 79 6c 65 76 65 6c 2c 20 2d 73 65 curitylevel, -se
84b0: 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d rver, -servernam
84c0: 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 e, -session_id,
84d0: 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 -ssl2, -ssl3, -t
84e0: 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 ls1, -tls1.1, -t
84f0: 6c 73 31 2e 32 2c 20 6f 72 20 2d 74 6c 73 31 2e ls1.2, or -tls1.
8500: 33 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 3");...return TC
8510: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
8520: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09 if (request).
8530: 20 20 20 20 76 65 72 69 66 79 20 7c 3d 20 53 53 verify |= SS
8540: 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f L_VERIFY_CLIENT_
8550: 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46 ONCE | SSL_VERIF
8560: 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28 Y_PEER;. if (
8570: 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75 69 request && requi
8580: 72 65 29 20 76 65 72 69 66 79 20 7c 3d 20 53 53 re) verify |= SS
8590: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 L_VERIFY_FAIL_IF
85a0: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20 _NO_PEER_CERT;.
85b0: 20 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d if (verify ==
85c0: 20 30 29 09 76 65 72 69 66 79 20 3d 20 53 53 4c 0).verify = SSL
85d0: 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 _VERIFY_NONE;..
85e0: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c proto |= (ssl
85f0: 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 2 ? TLS_PROTO_SS
8600: 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f L2 : 0);. pro
8610: 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c to |= (ssl3 ? TL
8620: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 S_PROTO_SSL3 : 0
8630: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 );. proto |=
8640: 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 (tls1 ? TLS_PROT
8650: 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 O_TLS1 : 0);.
8660: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f proto |= (tls1_
8670: 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 1 ? TLS_PROTO_TL
8680: 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 S1_1 : 0);. p
8690: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 roto |= (tls1_2
86a0: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 ? TLS_PROTO_TLS1
86b0: 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f _2 : 0);. pro
86c0: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 to |= (tls1_3 ?
86d0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
86e0: 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 : 0);.. /* r
86f0: 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 eset to NULL if
8700: 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f blank string pro
8710: 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 vided */. if
8720: 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 (cert && !*cert)
8730: 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20 .. cert.
8740: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
8750: 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a if (key && !*
8760: 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 key).. ke
8770: 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c y. = NULL
8780: 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 ;. if (certfi
8790: 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 le && !*certfile
87a0: 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69 ) certfi
87b0: 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 le.= NULL;. i
87c0: 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a f (keyfile && !*
87d0: 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c keyfile)..keyfil
87e0: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c e. = NULL
87f0: 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 ;. if (cipher
8800: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 s && !*ciphers).
8810: 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09 ciphers.
8820: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
8830: 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75 if (ciphersu
8840: 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 ites && !*cipher
8850: 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75 suites) ciphersu
8860: 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a ites = NULL;.
8870: 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 if (CAfile &
8880: 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 & !*CAfile).
8890: 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 CAfile.
88a0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
88b0: 66 20 28 43 41 64 69 72 20 26 26 20 21 2a 43 41 f (CAdir && !*CA
88c0: 64 69 72 29 09 20 20 20 20 20 20 20 20 43 41 64 dir). CAd
88d0: 69 72 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c ir. = NUL
88e0: 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 L;. if (DHpar
88f0: 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d ams && !*DHparam
8900: 73 29 09 20 20 20 20 20 20 20 20 44 48 70 61 72 s). DHpar
8910: 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c ams = NUL
8920: 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 L;.. /* new S
8930: 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 SL state */.
8940: 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 statePtr..= (Sta
8950: 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 te *) ckalloc((u
8960: 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 nsigned) sizeof(
8970: 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d State));. mem
8980: 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c set(statePtr, 0,
8990: 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b sizeof(State));
89a0: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
89b0: 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 flags.= flags;.
89c0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 statePtr->int
89d0: 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 erp.= interp;.
89e0: 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 statePtr->vfla
89f0: 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 gs.= verify;.
8a00: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d statePtr->err.=
8a10: 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c "";.. /* all
8a20: 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a ocate script */.
8a30: 20 20 20 20 69 66 20 28 73 63 72 69 70 74 29 20 if (script)
8a40: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 {..(void) Tcl_Ge
8a50: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 tStringFromObj(s
8a60: 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 cript, &len);..i
8a70: 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 f (len) {.. s
8a80: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
8a90: 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20 k = script;..
8aa0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
8ab0: 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c t(statePtr->call
8ac0: 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a back);..}. }.
8ad0: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 . /* allocate
8ae0: 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 password */.
8af0: 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b if (password) {
8b00: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 ..(void) Tcl_Get
8b10: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 StringFromObj(pa
8b20: 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 ssword, &len);..
8b30: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 if (len) {..
8b40: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
8b50: 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 rd = password;..
8b60: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
8b70: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 ount(statePtr->p
8b80: 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 assword);..}.
8b90: 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 }.. if (mode
8ba0: 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e l != NULL) {..in
8bb0: 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 t mode;../* Get
8bc0: 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 the "model" cont
8bd0: 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 ext */..chan = T
8be0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
8bf0: 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f terp, model, &mo
8c00: 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d de);..if (chan =
8c10: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
8c20: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 NULL) {.. Tls
8c30: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
8c40: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
8c50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8c60: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b ..}.../*.. * Mak
8c70: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
8c80: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
8c90: 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 channel.. */..c
8ca0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
8cb0: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 Channel(chan);..
8cc0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
8cd0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
8ce0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
8cf0: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 )) {.. Tcl_Ap
8d00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
8d10: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
8d20: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
8d30: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
8d40: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 ."\": not a TLS
8d50: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b channel", NULL);
8d60: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
8d70: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
8d80: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
8d90: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 CL_ERROR;..}..ct
8da0: 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54 63 x = ((State *)Tc
8db0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
8dc0: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29 2d anceData(chan))-
8dd0: 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 >ctx;. } else
8de0: 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20 43 {..if ((ctx = C
8df0: 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72 TX_Init(statePtr
8e00: 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c , server, proto,
8e10: 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66 69 keyfile, certfi
8e20: 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 0a 09 le, key, cert,..
8e30: 20 20 20 20 6b 65 79 5f 6c 65 6e 2c 20 63 65 72 key_len, cer
8e40: 74 5f 6c 65 6e 2c 20 43 41 64 69 72 2c 20 43 41 t_len, CAdir, CA
8e50: 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 file, ciphers, c
8e60: 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 iphersuites, lev
8e70: 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d el, DHparams)) =
8e80: 3d 20 28 53 53 4c 5f 43 54 58 2a 29 30 29 20 7b = (SSL_CTX*)0) {
8e90: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
8ea0: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
8eb0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
8ec0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 CL_ERROR;..}.
8ed0: 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 }.. statePtr
8ee0: 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 ->ctx = ctx;..
8ef0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e /*. * We n
8f00: 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 eed to make sure
8f10: 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 that the channe
8f20: 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 l works in binar
8f30: 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 y (for the.
8f40: 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 * encryption not
8f50: 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 to get goofed u
8f60: 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e p).. * We on
8f70: 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 ly want to adjus
8f80: 74 20 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 t the buffering
8f90: 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 in pre-v2 channe
8fa0: 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a ls, where. *
8fb0: 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e each channel in
8fc0: 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 the stack maint
8fd0: 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 ained its own bu
8fe0: 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 ffers.. */.
8ff0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
9000: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
9010: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 Translation);.
9020: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
9030: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 t(&upperChannelB
9040: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 locking);. Tc
9050: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
9060: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
9070: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ar);. Tcl_DSt
9080: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
9090: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b hannelEncoding);
90a0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
90b0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
90c0: 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 , chan, "-eofcha
90d0: 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 r", &upperChanne
90e0: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 lEOFChar);. T
90f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
9100: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
9110: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 , "-encoding", &
9120: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
9130: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 ding);. Tcl_G
9140: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
9150: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
9160: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 translation", &u
9170: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
9180: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c lation);. Tcl
9190: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
91a0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
91b0: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 "-blocking", &up
91c0: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 perChannelBlocki
91d0: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 ng);. Tcl_Set
91e0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
91f0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 terp, chan, "-tr
9200: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e anslation", "bin
9210: 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 ary");. Tcl_S
9220: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
9230: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
9240: 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 blocking", "true
9250: 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ");. dprintf(
9260: 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 "Consuming Tcl c
9270: 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f hannel %s", Tcl_
9280: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
9290: 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 han));. state
92a0: 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f Ptr->self = Tcl_
92b0: 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 StackChannel(int
92c0: 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c erp, Tls_Channel
92d0: 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 Type(), (ClientD
92e0: 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 20 28 ata) statePtr, (
92f0: 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 TCL_READABLE | T
9300: 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 CL_WRITABLE), ch
9310: 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 an);. dprintf
9320: 28 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 ("Created channe
9330: 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c l named %s", Tcl
9340: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
9350: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 statePtr->self))
9360: 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 ;. if (stateP
9370: 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c tr->self == (Tcl
9380: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
9390: 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 {../*.. * No use
93a0: 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c of Tcl_Eventual
93b0: 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e lyFree because n
93c0: 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 o possible Tcl_P
93d0: 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 reserve... */..T
93e0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
93f0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 statePtr);..ret
9400: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
9410: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 }.. Tcl_Se
9420: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
9430: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
9440: 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 >self, "-transla
9450: 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 tion", Tcl_DStri
9460: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
9470: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
9480: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ));. Tcl_SetC
9490: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
94a0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
94b0: 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 elf, "-encoding"
94c0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
94d0: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ue(&upperChannel
94e0: 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 Encoding));.
94f0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
9500: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 tion(interp, sta
9510: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 tePtr->self, "-e
9520: 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 ofchar", Tcl_DSt
9530: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
9540: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 ChannelEOFChar))
9550: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
9560: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
9570: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
9580: 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 f, "-blocking",
9590: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
95a0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c (&upperChannelBl
95b0: 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f ocking));.. /
95c0: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 *. * SSL Ini
95d0: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 tialization.
95e0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
95f0: 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 ->ssl = SSL_new(
9600: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a statePtr->ctx);.
9610: 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 if (!statePt
9620: 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 r->ssl) {../* SS
9630: 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 L library error
9640: 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 */..Tcl_AppendRe
9650: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f sult(interp, "co
9660: 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 uldn't construct
9670: 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c ssl session: ",
9680: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
9690: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f *) NULL);..Tls_
96a0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
96b0: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e atePtr);..return
96c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
96d0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f }.. /* Set ho
96e0: 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a st server name *
96f0: 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 /. if (server
9700: 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 name) {../* Sets
9710: 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 the server name
9720: 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 indication (SNI
9730: 29 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78 ) ClientHello ex
9740: 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 tension */..if (
9750: 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f !SSL_set_tlsext_
9760: 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 host_name(stateP
9770: 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e tr->ssl, servern
9780: 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 29 ame) && require)
9790: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
97a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
97b0: 20 22 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f "setting TLS ho
97c0: 73 74 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f st name extensio
97d0: 6e 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 n failed", (char
97e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 *) NULL);.
97f0: 20 20 20 20 20 20 20 54 6c 73 5f 46 72 65 65 28 Tls_Free(
9800: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
9810: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 r);.
9820: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
9830: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 09 2f 2a ;. }.../*
9840: 20 43 6f 6e 66 69 67 75 72 65 20 73 65 72 76 65 Configure serve
9850: 72 20 68 6f 73 74 20 6e 61 6d 65 20 63 68 65 63 r host name chec
9860: 6b 73 20 69 6e 20 74 68 65 20 53 53 4c 20 63 6c ks in the SSL cl
9870: 69 65 6e 74 2e 20 53 65 74 20 44 4e 53 20 68 6f ient. Set DNS ho
9880: 73 74 6e 61 6d 65 20 74 6f 0a 09 20 20 20 6e 61 stname to.. na
9890: 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 me for peer cert
98a0: 69 66 69 63 61 74 65 20 63 68 65 63 6b 73 2e 20 ificate checks.
98b0: 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 68 61 SSL_set1_host ha
98c0: 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a s limitations. *
98d0: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 /..if (!SSL_add1
98e0: 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e _host(statePtr->
98f0: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 ssl, servername)
9900: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
9910: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
9920: 2c 20 22 73 65 74 74 69 6e 67 20 44 4e 53 20 68 , "setting DNS h
9930: 6f 73 74 20 6e 61 6d 65 20 66 61 69 6c 65 64 22 ost name failed"
9940: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9950: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6c ;. Tl
9960: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
9970: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 statePtr);.
9980: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 return TC
9990: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 L_ERROR;..}.
99a0: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 }.. /* Resume
99b0: 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 session id */.
99c0: 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 if (session_i
99d0: 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 d && strlen(sess
99e0: 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d ion_id) <= SSL_M
99f0: 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 AX_SID_CTX_LENGT
9a00: 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 H) {../* SSL_set
9a10: 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 _session() */..i
9a20: 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f f (!SSL_SESSION_
9a30: 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 set1_id_context(
9a40: 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 SSL_get_session(
9a50: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 statePtr->ssl),
9a60: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 session_id, (uns
9a70: 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 igned int) strle
9a80: 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 n(session_id)))
9a90: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
9aa0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
9ab0: 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 "Resume session
9ac0: 69 64 20 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 id ", session_id
9ad0: 2c 20 22 20 66 61 69 6c 65 64 22 2c 20 28 63 68 , " failed", (ch
9ae0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 ar *) NULL);.
9af0: 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72 65 Tls_Fre
9b00: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
9b10: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 Ptr);.
9b20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
9b30: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 OR;..}. }..
9b40: 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f if (alpn) {../
9b50: 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 63 6c 20 * Convert a Tcl
9b60: 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 list into a prot
9b70: 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 ocol-list in wir
9b80: 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 e-format */..uns
9b90: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 igned char *prot
9ba0: 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 os, *p;..unsigne
9bb0: 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e d int protos_len
9bc0: 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c 65 = 0;..int i, le
9bd0: 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a n, cnt;..Tcl_Obj
9be0: 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 **list;...if (T
9bf0: 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 cl_ListObjGetEle
9c00: 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c ments(interp, al
9c10: 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 pn, &cnt, &list)
9c20: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 != TCL_OK) {..
9c30: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
9c40: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
9c50: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
9c60: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 ERROR;..}.../* D
9c70: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d etermine the mem
9c80: 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 ory required for
9c90: 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 the protocol-li
9ca0: 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 st */..for (i =
9cb0: 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 0; i < cnt; i++)
9cc0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 {.. Tcl_GetS
9cd0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 tringFromObj(lis
9ce0: 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 t[i], &len);..
9cf0: 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 if (len > 255)
9d00: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 {...Tcl_AppendR
9d10: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 esult(interp, "A
9d20: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d LPN protocol nam
9d30: 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 e too long", (ch
9d40: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 ar *) NULL);...T
9d50: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
9d60: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 statePtr);...re
9d70: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9d80: 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 . }.. prot
9d90: 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 os_len += 1 + le
9da0: 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 n;..}.../* Build
9db0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 the complete pr
9dc0: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 otocol-list */..
9dd0: 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 protos = ckalloc
9de0: 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f (protos_len);../
9df0: 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 * protocol-lists
9e00: 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 consist of 8-bi
9e10: 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 t length-prefixe
9e20: 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 d, byte strings
9e30: 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c 20 */..for (i = 0,
9e40: 70 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20 p = protos; i <
9e50: 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 cnt; i++) {..
9e60: 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c char *str = Tcl
9e70: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
9e80: 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 j(list[i], &len)
9e90: 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 ;.. *p++ = le
9ea0: 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 n;.. memcpy(p
9eb0: 2c 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 , str, len);..
9ec0: 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a p += len;..}..
9ed0: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e ./* SSL_set_alpn
9ee0: 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 _protos makes a
9ef0: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 copy of the prot
9f00: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a ocol-list */../*
9f10: 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 Note: This func
9f20: 74 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 tions reverses t
9f30: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 he return value
9f40: 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 convention */..i
9f50: 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f f (SSL_set_alpn_
9f60: 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d protos(statePtr-
9f70: 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 >ssl, protos, pr
9f80: 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 otos_len)) {..
9f90: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
9fa0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c lt(interp, "fail
9fb0: 65 64 20 74 6f 20 73 65 74 20 41 4c 50 4e 20 70 ed to set ALPN p
9fc0: 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 rotocols", (char
9fd0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
9fe0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
9ff0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
a000: 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 ckfree(protos)
a010: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
a020: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a L_ERROR;..}.../*
a030: 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 Store protocols
a040: 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 list */..stateP
a050: 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f tr->protos = pro
a060: 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e tos;..statePtr->
a070: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f protos_len = pro
a080: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 tos_len;. } e
a090: 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d lse {..statePtr-
a0a0: 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a >protos = NULL;.
a0b0: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
a0c0: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d s_len = 0;. }
a0d0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
a0e0: 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 SSL Callbacks.
a0f0: 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 */. SSL_se
a100: 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 t_app_data(state
a110: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 Ptr->ssl, (void
a120: 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 *)statePtr);./*
a130: 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 point back to us
a140: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f */. SSL_set_
a150: 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d verify(statePtr-
a160: 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 >ssl, verify, Ve
a170: 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 rifyCallback);.
a180: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 69 SSL_CTX_set_i
a190: 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 nfo_callback(sta
a1a0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 49 6e 66 6f tePtr->ctx, Info
a1b0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 Callback);..
a1c0: 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 /* Create Tcl_Ch
a1d0: 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 annel BIO Handle
a1e0: 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 r */. statePt
a1f0: 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e r->p_bio.= BIO_n
a200: 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c ew_tcl(statePtr,
a210: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 BIO_NOCLOSE);.
a220: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f statePtr->bio
a230: 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 .= BIO_new(BIO_f
a240: 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 _ssl());.. if
a250: 20 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 (server) {../*
a260: 53 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 Server callbacks
a270: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 */..SSL_CTX_set
a280: 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 _alpn_select_cb(
a290: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 statePtr->ctx, A
a2a0: 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f LPNCallback, (vo
a2b0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
a2c0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 .SSL_CTX_set_tls
a2d0: 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 ext_servername_a
a2e0: 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 rg(statePtr->ctx
a2f0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
a300: 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 tr);..SSL_CTX_se
a310: 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e t_tlsext_servern
a320: 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 ame_callback(sta
a330: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 tePtr->ctx, SNIC
a340: 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 allback);..SSL_C
a350: 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 TX_set_client_he
a360: 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d llo_cb(statePtr-
a370: 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 >ctx, HelloCallb
a380: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ack, (void *)sta
a390: 74 65 50 74 72 29 3b 0a 0a 09 73 74 61 74 65 50 tePtr);...stateP
a3a0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 tr->flags |= TLS
a3b0: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 _TCL_SERVER;..SS
a3c0: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 L_set_accept_sta
a3d0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
a3e0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
a3f0: 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68 ./* Session cach
a400: 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f ing */..SSL_CTX_
a410: 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 set_session_cach
a420: 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d e_mode(statePtr-
a430: 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 >ctx, SSL_SESS_C
a440: 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 ACHE_CLIENT | SS
a450: 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f L_SESS_CACHE_NO_
a460: 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b INTERNAL_STORE);
a470: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 ..SSL_CTX_sess_s
a480: 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 et_new_cb(stateP
a490: 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e tr->ctx, Session
a4a0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 53 53 4c Callback);...SSL
a4b0: 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 _set_connect_sta
a4c0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
a4d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c );. }. SSL
a4e0: 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 _set_bio(statePt
a4f0: 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 r->ssl, statePtr
a500: 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 ->p_bio, statePt
a510: 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 r->p_bio);. B
a520: 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 IO_set_ssl(state
a530: 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 Ptr->bio, stateP
a540: 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 tr->ssl, BIO_NOC
a550: 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 LOSE);.. /*.
a560: 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c * End of SSL
a570: 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 Init. */.
a580: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 dprintf("Retur
a590: 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 ning %s", Tcl_Ge
a5a0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
a5b0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 tePtr->self));.
a5c0: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 Tcl_SetResult
a5d0: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a (interp, (char *
a5e0: 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c ) Tcl_GetChannel
a5f0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
a600: 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 elf), TCL_VOLATI
a610: 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e LE);.. return
a620: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
a630: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
a640: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d a;.}.../*. *----
a650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
a690: 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 *. * UnimportOb
a6a0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
a6b0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
a6c0: 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 invoked to remov
a6d0: 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 e the topmost ch
a6e0: 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a annel filter.. *
a6f0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
a700: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
a710: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
a720: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 e effects:. *.Ma
a730: 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 y modify the beh
a740: 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 avior of an IO c
a750: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d hannel.. *. *---
a760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a7a0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
a7b0: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 UnimportObjCmd(C
a7c0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
a7d0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
a7e0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
a7f0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
a800: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
a810: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
a820: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e n;../* The chann
a830: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 el to set a mode
a840: 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72 on. */.. dpr
a850: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
a860: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
a870: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
a880: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
a890: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
a8a0: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c l");..return TCL
a8b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
a8c0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
a8d0: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
a8e0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
a8f0: 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a bjv[1]), NULL);.
a900: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
a910: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
a920: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
a930: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
a940: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
a950: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
a960: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
a970: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
a980: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
a990: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 el(chan);.. i
a9a0: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
a9b0: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
a9c0: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
a9d0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
a9e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
a9f0: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
aa00: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
aa10: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a me(chan),..."\":
aa20: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e not a TLS chann
aa30: 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 el", NULL);..ret
aa40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
aa50: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 }.. if (Tc
aa60: 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c l_UnstackChannel
aa70: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d (interp, chan) =
aa80: 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 = TCL_ERROR) {..
aa90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
aaa0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 ;. }.. ret
aab0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
aac0: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
aad0: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Data;.}.../*. *-
aae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aaf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ab00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ab10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ab20: 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 --. *. * CTX_Ini
ab30: 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 t -- construct a
ab40: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 SSL_CTX instanc
ab50: 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a e. *. * Results:
ab60: 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f . *.A valid SSL_
ab70: 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 CTX instance or
ab80: 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 NULL.. *. * Side
ab90: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e effects:. *.con
aba0: 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 structs SSL cont
abb0: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d ext (CTX). *. *-
abc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
abd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
abe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
abf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ac00: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 --. */.static SS
ac10: 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 L_CTX *.CTX_Init
ac20: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 (State *statePtr
ac30: 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 , int isServer,
ac40: 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 int proto, char
ac50: 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a *keyfile, char *
ac60: 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e certfile,. un
ac70: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 signed char *key
ac80: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
ac90: 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c *cert, int key_l
aca0: 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e en, int cert_len
acb0: 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 , char *CAdir,.
acc0: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c char *CAfile,
acd0: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 char *ciphers,
ace0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 char *ciphersuit
acf0: 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 es, int level, c
ad00: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b har *DHparams) {
ad10: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
ad20: 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 *interp = stateP
ad30: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
ad40: 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e SSL_CTX *ctx = N
ad50: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ULL;. Tcl_DSt
ad60: 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c ring ds;. Tcl
ad70: 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 _DString ds1;.
ad80: 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 int off = 0;.
ad90: 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 int load_priv
ada0: 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e ate_key;. con
adb0: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d st SSL_METHOD *m
adc0: 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 ethod;.. dpri
add0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
ade0: 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 if (!proto)
adf0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
ae00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 ult(interp, "no
ae10: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 valid protocol s
ae20: 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b elected", NULL);
ae30: 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 ..return (SSL_CT
ae40: 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 X *)0;. }..
ae50: 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 /* create SSL
ae60: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f context */.#if O
ae70: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
ae80: 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 UMBER >= 0x10100
ae90: 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 000L || defined(
aea0: 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 NO_SSL2) || defi
aeb0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
aec0: 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 SL2). if (ENA
aed0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
aee0: 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 PROTO_SSL2)) {..
aef0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
af00: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 (interp, "SSL2 p
af10: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
af20: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
af30: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
af40: 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 *)0;. }.#endi
af50: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
af60: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL3) || define
af70: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
af80: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 3). if (ENABL
af90: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
afa0: 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 OTO_SSL3)) {..Tc
afb0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
afc0: 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f nterp, "SSL3 pro
afd0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
afe0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ted", NULL);..re
aff0: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 turn (SSL_CTX *)
b000: 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0;. }.#endif.
b010: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
b020: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
b030: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
b040: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
b050: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
b060: 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f O_TLS1)) {..Tcl_
b070: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
b080: 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 erp, "TLS 1.0 pr
b090: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
b0a0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 rted", NULL);..r
b0b0: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
b0c0: 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 )0;. }.#endif
b0d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
b0e0: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e TLS1_1) || defin
b0f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
b100: 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e S1_1). if (EN
b110: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
b120: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 _PROTO_TLS1_1))
b130: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
b140: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ult(interp, "TLS
b150: 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 1.1 protocol no
b160: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
b170: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 LL);..return (SS
b180: 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d L_CTX *)0;. }
b190: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
b1a0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c ned(NO_TLS1_2) |
b1b0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
b1c0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 L_NO_TLS1_2).
b1d0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
b1e0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
b1f0: 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 S1_2)) {..Tcl_Ap
b200: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
b210: 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 p, "TLS 1.2 prot
b220: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
b230: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ed", NULL);..ret
b240: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
b250: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ;. }.#endif.#
b260: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
b270: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_3) || defined
b280: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
b290: 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 _3). if (ENAB
b2a0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
b2b0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a ROTO_TLS1_3)) {.
b2c0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
b2d0: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
b2e0: 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .3 protocol not
b2f0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
b300: 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f );..return (SSL_
b310: 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 CTX *)0;. }.#
b320: 65 6e 64 69 66 0a 0a 20 20 20 20 73 77 69 74 63 endif.. switc
b330: 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 h (proto) {.#if
b340: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
b350: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 NUMBER < 0x10100
b360: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 000L && !defined
b370: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 (NO_SSL2) && !de
b380: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
b390: 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 _SSL2). case
b3a0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a TLS_PROTO_SSL2:.
b3b0: 09 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 5f .method = SSLv2_
b3c0: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
b3d0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
b3e0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
b3f0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
b400: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 SL_NO_SSL3) && !
b410: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
b420: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a NO_SSL3_METHOD).
b430: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
b440: 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 TO_SSL3:..method
b450: 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 = SSLv3_method(
b460: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
b470: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
b480: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 O_TLS1) && !defi
b490: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
b4a0: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
b4b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
b4c0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 _METHOD). cas
b4d0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
b4e0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 :..method = TLSv
b4f0: 31 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 1_method();..bre
b500: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
b510: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
b520: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
b530: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
b540: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
b550: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f ENSSL_NO_TLS1_1_
b560: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 METHOD). case
b570: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
b580: 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 1:..method = TLS
b590: 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 v1_1_method();..
b5a0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
b5b0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
b5c0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
b5d0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
b5e0: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
b5f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
b600: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 _2_METHOD). c
b610: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
b620: 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 S1_2:..method =
b630: 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29 TLSv1_2_method()
b640: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
b650: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
b660: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 _TLS1_3) && !def
b670: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
b680: 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 TLS1_3). case
b690: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
b6a0: 33 3a 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 76 3:../*.. * The v
b6b0: 65 72 73 69 6f 6e 20 72 61 6e 67 65 20 69 73 20 ersion range is
b6c0: 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 65 6c 6f constrained belo
b6d0: 77 2c 0a 09 20 2a 20 61 66 74 65 72 20 74 68 65 w,.. * after the
b6e0: 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 context is crea
b6f0: 74 65 64 2e 20 20 55 73 65 20 74 68 65 0a 09 20 ted. Use the..
b700: 2a 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 * generic method
b710: 20 68 65 72 65 2e 0a 09 20 2a 2f 0a 09 6d 65 74 here... */..met
b720: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
b730: 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 TLS_server_meth
b740: 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e od() : TLS_clien
b750: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
b760: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 ak;.#endif. d
b770: 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f efault:../* Nego
b780: 74 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 tiate highest av
b790: 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 ailable SSL/TLS
b7a0: 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 version */..meth
b7b0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
b7c0: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f TLS_server_metho
b7d0: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 d() : TLS_client
b7e0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f _method();.#if O
b7f0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
b800: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
b810: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 00L && !defined(
b820: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 NO_SSL2) && !def
b830: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
b840: 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 SSL2)..off |= (E
b850: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
b860: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 S_PROTO_SSL2)
b870: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
b880: 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 SSLv2);.#endif.#
b890: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 if !defined(NO_S
b8a0: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
b8b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
b8c0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
b8d0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
b8e0: 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 OTO_SSL3) ? 0
b8f0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 : SSL_OP_NO_SSLv
b900: 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 3);.#endif.#if !
b910: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
b920: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
b930: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f NSSL_NO_TLS1)..o
b940: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
b950: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
b960: 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 TLS1) ? 0 : SS
b970: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a L_OP_NO_TLSv1);.
b980: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
b990: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 ned(NO_TLS1_1) &
b9a0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
b9b0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f SL_NO_TLS1_1)..o
b9c0: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
b9d0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
b9e0: 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 TLS1_1) ? 0 : SS
b9f0: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 L_OP_NO_TLSv1_1)
ba00: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
ba10: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
ba20: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
ba30: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a NSSL_NO_TLS1_2).
ba40: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
ba50: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
ba60: 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 O_TLS1_2) ? 0 :
ba70: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f SSL_OP_NO_TLSv1_
ba80: 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 2);.#endif.#if !
ba90: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
baa0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
bab0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
bac0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
bad0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
bae0: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 OTO_TLS1_3) ? 0
baf0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
bb00: 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 1_3);.#endif..br
bb10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 eak;. }..
bb20: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
bb30: 29 3b 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c );. ctx = SSL
bb40: 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 _CTX_new(method)
bb50: 3b 0a 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 ;.. if (!ctx)
bb60: 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 {..return(NULL)
bb70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
bb80: 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f (getenv(SSLKEYLO
bb90: 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 GFILE)) {..SSL_C
bba0: 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 TX_set_keylog_ca
bbb0: 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c llback(ctx, KeyL
bbc0: 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 ogCallback);.
bbd0: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 }..#if !defined
bbe0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 (NO_TLS1_3) && !
bbf0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
bc00: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 NO_TLS1_3). i
bc10: 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f f (proto == TLS_
bc20: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a PROTO_TLS1_3) {.
bc30: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e .SSL_CTX_set_min
bc40: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
bc50: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 tx, TLS1_3_VERSI
bc60: 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 ON);..SSL_CTX_se
bc70: 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 t_max_proto_vers
bc80: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
bc90: 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a VERSION);. }.
bca0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 #endif.. /* F
bcb0: 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 orce cipher sele
bcc0: 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 ction order by s
bcd0: 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 erver */. if
bce0: 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 (!isServer) {..S
bcf0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
bd00: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 ns(ctx, SSL_OP_C
bd10: 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 IPHER_SERVER_PRE
bd20: 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a FERENCE);. }.
bd30: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
bd40: 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 _app_data(ctx, (
bd50: 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f void*)interp);./
bd60: 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 * remember the i
bd70: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 nterpreter */.
bd80: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 SSL_CTX_set_op
bd90: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f tions(ctx, SSL_O
bda0: 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 P_ALL);./* all S
bdb0: 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e SL bug workaroun
bdc0: 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 ds */. SSL_CT
bdd0: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 X_set_options(ct
bde0: 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 x, off);../* dis
bdf0: 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 able protocol ve
be00: 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 rsions */.#if OP
be10: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
be20: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 30 MBER < 0x1010100
be30: 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 0L. SSL_CTX_s
be40: 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c et_mode(ctx, SSL
be50: 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 _MODE_AUTO_RETRY
be60: 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 );./* handle new
be70: 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 handshakes in b
be80: 61 63 6b 67 72 6f 75 6e 64 20 2a 2f 0a 23 65 6e ackground */.#en
be90: 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f dif. SSL_CTX_
bea0: 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 sess_set_cache_s
beb0: 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a ize(ctx, 128);..
bec0: 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 /* Set user
bed0: 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c defined ciphers,
bee0: 20 63 69 70 68 65 72 20 73 75 69 74 65 73 2c 20 cipher suites,
bef0: 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c 65 76 and security lev
bf00: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 28 el */. if (((
bf10: 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 ciphers != NULL)
bf20: 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 && !SSL_CTX_set
bf30: 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 _cipher_list(ctx
bf40: 2c 20 63 69 70 68 65 72 73 29 29 20 7c 7c 20 5c , ciphers)) || \
bf50: 0a 09 28 28 63 69 70 68 65 72 73 75 69 74 65 73 ..((ciphersuites
bf60: 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 != NULL) && !SS
bf70: 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 L_CTX_set_cipher
bf80: 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 suites(ctx, ciph
bf90: 65 72 73 75 69 74 65 73 29 29 29 20 7b 0a 09 20 ersuites))) {..
bfa0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
bfb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 ult(interp, "Set
bfc0: 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 22 ciphers failed"
bfd0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
bfe0: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
bff0: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
c000: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
c010: 29 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f )0;. }.. /
c020: 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 20 6c * Set security l
c030: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 evel */. if (
c040: 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 level > -1 && le
c050: 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 vel < 6) {../* S
c060: 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f SL_set_security_
c070: 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 level */..SSL_CT
c080: 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c X_set_security_l
c090: 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 evel(ctx, level)
c0a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
c0b0: 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 set some callbac
c0c0: 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 ks */. SSL_CT
c0d0: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 X_set_default_pa
c0e0: 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73 sswd_cb(ctx, Pas
c0f0: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a swordCallback);.
c100: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
c110: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 default_passwd_c
c120: 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c 20 b_userdata(ctx,
c130: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
c140: 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 );.. /* read
c150: 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e a Diffie-Hellman
c160: 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 parameters file
c170: 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 69 , or use the bui
c180: 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 lt-in one */.#if
c190: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 def OPENSSL_NO_D
c1a0: 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 H. if (DHpara
c1b0: 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 ms != NULL) {..T
c1c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
c1d0: 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 interp, "DH para
c1e0: 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f meter support no
c1f0: 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 t available", (c
c200: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 har *) NULL);..S
c210: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
c220: 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 ;..return (SSL_C
c230: 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 TX *)0;. }.#e
c240: 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 lse. {..DH* d
c250: 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 h;..if (DHparams
c260: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
c270: 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 BIO *bio;..
c280: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
c290: 26 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d &ds);.. bio =
c2a0: 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 BIO_new_file(F2
c2b0: 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 N(DHparams, &ds)
c2c0: 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 , "r");.. if
c2d0: 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 (!bio) {...Tcl_D
c2e0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
c2f0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
c300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 ult(interp, "Cou
c310: 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 ld not find DH p
c320: 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c arameters file",
c330: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
c340: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
c350: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 28 ctx);...return (
c360: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 20 20 SSL_CTX *)0;..
c370: 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 }... dh = P
c380: 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 EM_read_bio_DHpa
c390: 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 rams(bio, NULL,
c3a0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 NULL, NULL);..
c3b0: 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b BIO_free(bio);
c3c0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
c3d0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 gFree(&ds);..
c3e0: 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63 if (!dh) {...Tc
c3f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
c400: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f nterp, "Could no
c410: 74 20 72 65 61 64 20 44 48 20 70 61 72 61 6d 65 t read DH parame
c420: 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c ters from file",
c430: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
c440: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
c450: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 28 ctx);...return (
c460: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 20 20 SSL_CTX *)0;..
c470: 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 }..} else {..
c480: 20 20 20 64 68 20 3d 20 67 65 74 5f 64 68 50 61 dh = get_dhPa
c490: 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f rams();..}..SSL_
c4a0: 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 CTX_set_tmp_dh(c
c4b0: 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 tx, dh);..DH_fre
c4c0: 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e e(dh);. }.#en
c4d0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 dif.. /* set
c4e0: 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20 our certificate
c4f0: 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 */. load_priv
c500: 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 ate_key = 0;.
c510: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d if (certfile !=
c520: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 NULL) {..load_p
c530: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a rivate_key = 1;.
c540: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 ..Tcl_DStringIni
c550: 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 t(&ds);...if (SS
c560: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 L_CTX_use_certif
c570: 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 icate_file(ctx,
c580: 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 F2N(certfile, &d
c590: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 s), SSL_FILETYPE
c5a0: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 _PEM) <= 0) {..
c5b0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
c5c0: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 ee(&ds);.. Tc
c5d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
c5e0: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
c5f0: 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 o set certificat
c600: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 e file ", certfi
c610: 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 le, ": ",....
c620: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 REASON(), (cha
c630: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
c640: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
c650: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
c660: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d (SSL_CTX *)0;..}
c670: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
c680: 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a cert != NULL) {.
c690: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 .load_private_ke
c6a0: 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f y = 1;..if (SSL_
c6b0: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
c6c0: 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 65 ate_ASN1(ctx, ce
c6d0: 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d rt_len, cert) <=
c6e0: 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 0) {.. Tcl_D
c6f0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
c700: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
c710: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
c720: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 unable to set ce
c730: 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 rtificate: ",...
c740: 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 . REASON(),
c750: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
c760: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 . SSL_CTX_fre
c770: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 e(ctx);.. ret
c780: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
c790: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
c7a0: 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 {..certfile = (c
c7b0: 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 har*)X509_get_de
c7c0: 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 fault_cert_file(
c7d0: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 );...if (SSL_CTX
c7e0: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 _use_certificate
c7f0: 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 _file(ctx, certf
c800: 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ile, SSL_FILETYP
c810: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 E_PEM) <= 0) {.#
c820: 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 if 0.. Tcl_DS
c830: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
c840: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
c850: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
c860: 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 nable to use def
c870: 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 ault certificate
c880: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c file ", certfil
c890: 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 e, ": ",....
c8a0: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
c8b0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
c8c0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
c8d0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 );.. return (
c8e0: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 23 65 6e SSL_CTX *)0;.#en
c8f0: 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 dif..}. }..
c900: 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 /* set our pri
c910: 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 vate key */.
c920: 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 if (load_private
c930: 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 _key) {..if (key
c940: 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 file == NULL &&
c950: 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 key == NULL) {..
c960: 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 keyfile = ce
c970: 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 rtfile;..}...if
c980: 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c (keyfile != NULL
c990: 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 ) {.. /* get
c9a0: 74 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 the private key
c9b0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 associated with
c9c0: 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 this certificate
c9d0: 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 */.. if (key
c9e0: 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a file == NULL) {.
c9f0: 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 ..keyfile = cert
ca00: 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 file;.. }...
ca10: 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 if (SSL_CTX_u
ca20: 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69 se_PrivateKey_fi
ca30: 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 le(ctx, F2N(keyf
ca40: 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 ile, &ds), SSL_F
ca50: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 ILETYPE_PEM) <=
ca60: 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 0) {...Tcl_DStri
ca70: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f ngFree(&ds);.../
ca80: 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 * flush the pass
ca90: 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 phrase which mig
caa0: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 ht be left in th
cab0: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 e result */...Tc
cac0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
cad0: 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 rp, NULL, TCL_ST
cae0: 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 ATIC);...Tcl_App
caf0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
cb00: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 , "unable to set
cb10: 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 public key file
cb20: 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 ", keyfile, " "
cb30: 2c 0a 09 09 09 20 20 20 20 20 20 20 20 20 52 45 ,.... RE
cb40: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
cb50: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 NULL);...SSL_CT
cb60: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
cb70: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
cb80: 29 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 )0;.. }..
cb90: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
cba0: 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 &ds);...} else i
cbb0: 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 f (key != NULL)
cbc0: 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 {.. if (SSL_C
cbd0: 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 TX_use_PrivateKe
cbe0: 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f y_ASN1(EVP_PKEY_
cbf0: 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 RSA, ctx, key,ke
cc00: 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 y_len) <= 0) {..
cc10: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
cc20: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 (&ds);.../* flus
cc30: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 h the passphrase
cc40: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 which might be
cc50: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 left in the resu
cc60: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 lt */...Tcl_SetR
cc70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 esult(interp, NU
cc80: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b LL, TCL_STATIC);
cc90: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
cca0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
ccb0: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 ble to set publi
ccc0: 63 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e c key: ", REASON
ccd0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
cce0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
ccf0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
cd00: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a n (SSL_CTX *)0;.
cd10: 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f . }..}../* No
cd20: 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 w we know that a
cd30: 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 61 key and cert ha
cd40: 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 69 ve been set agai
cd50: 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 nst.. * the SSL
cd60: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 context */..if (
cd70: 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 !SSL_CTX_check_p
cd80: 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29 rivate_key(ctx))
cd90: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
cda0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
cdb0: 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 6f "private key do
cdc0: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 es not match the
cdd0: 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75 62 certificate pub
cde0: 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20 20 lic key",....
cdf0: 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 (char *) NULL)
ce00: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
ce10: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
ce20: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
ce30: 29 30 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 )0;..}. }..
ce40: 20 20 2f 2a 20 53 65 74 20 76 65 72 69 66 69 63 /* Set verific
ce50: 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 ation CAs */.
ce60: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
ce70: 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 (&ds);. Tcl_D
ce80: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 StringInit(&ds1)
ce90: 3b 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 ;. if (!SSL_C
cea0: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c TX_load_verify_l
ceb0: 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 ocations(ctx, F2
cec0: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 N(CAfile, &ds),
ced0: 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31 29 F2N(CAdir, &ds1)
cee0: 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73 ) ||..!SSL_CTX_s
cef0: 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 et_default_verif
cf00: 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a y_paths(ctx)) {.
cf10: 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 69 #if 0..Tcl_DStri
cf20: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 54 63 ngFree(&ds);..Tc
cf30: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
cf40: 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 s1);../* Don't c
cf50: 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20 69 66 urrently care if
cf60: 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09 this fails */..
cf70: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
cf80: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 65 (interp, "SSL de
cf90: 66 61 75 6c 74 20 76 65 72 69 66 79 20 70 61 74 fault verify pat
cfa0: 68 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c hs: ", REASON(),
cfb0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
cfc0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
cfd0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 tx);..return (SS
cfe0: 4c 5f 43 54 58 20 2a 29 30 3b 0a 23 65 6e 64 69 L_CTX *)0;.#endi
cff0: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 f. }.. /*
d000: 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f https://sourcefo
d010: 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 rge.net/p/tls/bu
d020: 67 73 2f 35 37 2f 20 2a 2f 0a 20 20 20 20 2f 2a gs/57/ */. /*
d030: 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 XXX:TODO: Let t
d040: 68 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 he user supply v
d050: 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 alues here inste
d060: 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 ad of something
d070: 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 that exists on t
d080: 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f he filesystem */
d090: 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 . if (CAfile
d0a0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 53 54 41 43 != NULL) {..STAC
d0b0: 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 K_OF(X509_NAME)
d0c0: 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c *certNames = SSL
d0d0: 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f _load_client_CA_
d0e0: 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c file(F2N(CAfile,
d0f0: 20 26 64 73 29 29 3b 0a 09 69 66 20 28 63 65 72 &ds));..if (cer
d100: 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 tNames != NULL)
d110: 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 {.. SSL_CTX_s
d120: 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 et_client_CA_lis
d130: 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 t(ctx, certNames
d140: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
d150: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
d160: 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 (&ds);. Tcl_D
d170: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 StringFree(&ds1)
d180: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 ;. return ctx
d190: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
d1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
d1e0: 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d *. * StatusObjCm
d1f0: 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 d -- return cert
d200: 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e ificate for conn
d210: 65 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 ected peer.. *.
d220: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
d230: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
d240: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
d250: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
d260: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
d270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
d2b0: 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 tatic int.Status
d2c0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
d2d0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
d2e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
d2f0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
d300: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
d310: 5d 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a ]) {. State *
d320: 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 statePtr;. X5
d330: 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 09 *peer;. Tc
d340: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 l_Obj *objPtr;.
d350: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
d360: 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 han;. char *c
d370: 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 hannelName, *cip
d380: 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f hers;. int mo
d390: 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e de;. const un
d3a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f signed char *pro
d3b0: 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 to;. unsigned
d3c0: 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 20 20 64 int len;.. d
d3d0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
d3e0: 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 6f ;.. switch (o
d3f0: 62 6a 63 29 20 7b 0a 09 63 61 73 65 20 32 3a 0a bjc) {..case 2:.
d400: 09 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 . channelName
d410: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
d420: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
d430: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 NULL);.. bre
d440: 61 6b 3b 0a 0a 09 63 61 73 65 20 33 3a 0a 09 20 ak;...case 3:..
d450: 20 20 20 69 66 20 28 21 73 74 72 63 6d 70 20 28 if (!strcmp (
d460: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 20 28 6f Tcl_GetString (o
d470: 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c bjv[1]), "-local
d480: 22 29 29 20 7b 0a 09 09 63 68 61 6e 6e 65 6c 4e ")) {...channelN
d490: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 ame = Tcl_GetStr
d4a0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
d4b0: 32 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 09 62 72 65 2], NULL);...bre
d4c0: 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 ak;.. }..
d4d0: 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 2d 74 68 72 /* else fall-thr
d4e0: 6f 75 67 68 20 2e 2e 2e 20 2a 2f 0a 23 69 66 20 ough ... */.#if
d4f0: 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f defined(__GNUC__
d500: 29 0a 09 20 20 20 20 5f 5f 61 74 74 72 69 62 75 ).. __attribu
d510: 74 65 5f 5f 28 28 66 61 6c 6c 74 68 72 6f 75 67 te__((fallthroug
d520: 68 29 29 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 h));.#endif..def
d530: 61 75 6c 74 3a 0a 09 20 20 20 20 54 63 6c 5f 57 ault:.. Tcl_W
d540: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
d550: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d rp, 1, objv, "?-
d560: 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 local? channel")
d570: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
d580: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
d590: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
d5a0: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
d5b0: 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 , channelName, &
d5c0: 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 mode);. if (c
d5d0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
d5e0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
d5f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
d600: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4d 61 6b }. /* Mak
d610: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
d620: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
d630: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
d640: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
d650: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
d660: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
d670: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
d680: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
d690: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ype()) {..Tcl_Ap
d6a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
d6b0: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
d6c0: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
d6d0: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
d6e0: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 ."\": not a TLS
d6f0: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b channel", NULL);
d700: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
d710: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 OR;. }. st
d720: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
d730: 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *) Tcl_GetChanne
d740: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
d750: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a an);. if (obj
d760: 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 c == 2) {..peer
d770: 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 = SSL_get_peer_c
d780: 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 ertificate(state
d790: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
d7a0: 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 else {..peer =
d7b0: 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 SSL_get_certific
d7c0: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ate(statePtr->ss
d7d0: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 l);. }. if
d7e0: 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 (peer) {..objPt
d7f0: 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f r = Tls_NewX509O
d800: 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 bj(interp, peer)
d810: 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 ;..if (objc == 2
d820: 29 20 7b 20 58 35 30 39 5f 66 72 65 65 28 70 65 ) { X509_free(pe
d830: 65 72 29 3b 20 7d 0a 20 20 20 20 7d 20 65 6c 73 er); }. } els
d840: 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 e {..objPtr = Tc
d850: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
d860: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL);. }..
d870: 20 20 2f 2a 20 50 65 65 72 20 63 65 72 74 20 63 /* Peer cert c
d880: 68 61 69 6e 20 28 63 6c 69 65 6e 74 20 6f 6e 6c hain (client onl
d890: 79 29 20 2a 2f 0a 20 20 20 20 53 54 41 43 4b 5f y) */. STACK_
d8a0: 4f 46 28 58 35 30 39 29 2a 20 73 73 6c 5f 63 65 OF(X509)* ssl_ce
d8b0: 72 74 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 rts = SSL_get_pe
d8c0: 65 72 5f 63 65 72 74 5f 63 68 61 69 6e 28 73 74 er_cert_chain(st
d8d0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
d8e0: 20 20 69 66 20 28 21 70 65 65 72 20 26 26 20 28 if (!peer && (
d8f0: 73 73 6c 5f 63 65 72 74 73 20 3d 3d 20 4e 55 4c ssl_certs == NUL
d900: 4c 20 7c 7c 20 73 6b 5f 58 35 30 39 5f 6e 75 6d L || sk_X509_num
d910: 28 73 73 6c 5f 63 65 72 74 73 29 20 3d 3d 20 30 (ssl_certs) == 0
d920: 29 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c )) {..return TCL
d930: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
d940: 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 /* Peer name
d950: 66 72 6f 6d 20 63 65 72 74 20 2a 2f 0a 20 20 20 from cert */.
d960: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
d970: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
d980: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
d990: 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 wStringObj("peer
d9a0: 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 name", -1));.
d9b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
d9c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
d9d0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
d9e0: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 wStringObj(SSL_g
d9f0: 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 et0_peername(sta
da00: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 tePtr->ssl), -1)
da10: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 );.. Tcl_List
da20: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
da30: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
da40: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
da50: 6a 28 22 73 62 69 74 73 22 2c 20 2d 31 29 29 3b j("sbits", -1));
da60: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
da70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
da80: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
da90: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f l_NewIntObj(SSL_
daa0: 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 get_cipher_bits(
dab0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e statePtr->ssl, N
dac0: 55 4c 4c 29 29 29 3b 0a 0a 20 20 20 20 63 69 70 ULL)));.. cip
dad0: 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 hers = (char*)SS
dae0: 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 L_get_cipher(sta
daf0: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
db00: 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d if ((ciphers !=
db10: 20 4e 55 4c 4c 29 20 26 26 20 28 73 74 72 63 6d NULL) && (strcm
db20: 70 28 63 69 70 68 65 72 73 2c 20 22 28 4e 4f 4e p(ciphers, "(NON
db30: 45 29 22 29 20 21 3d 20 30 29 29 20 7b 0a 09 54 E)") != 0)) {..T
db40: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
db50: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
db60: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
db70: 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 tringObj("cipher
db80: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
db90: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
dba0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
dbb0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
dbc0: 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 Obj(SSL_get_ciph
dbd0: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c er(statePtr->ssl
dbe0: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a ), -1));. }..
dbf0: 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 /* Verify th
dc00: 65 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61 e X509 certifica
dc10: 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 79 20 te presented by
dc20: 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 the peer */.
dc30: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
dc40: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
dc50: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
dc60: 53 74 72 69 6e 67 4f 62 6a 28 22 76 61 6c 69 64 StringObj("valid
dc70: 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 ation", -1));.
dc80: 20 20 69 66 20 28 53 53 4c 5f 67 65 74 5f 76 65 if (SSL_get_ve
dc90: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 rify_result(stat
dca0: 65 50 74 72 2d 3e 73 73 6c 29 20 21 3d 20 58 35 ePtr->ssl) != X5
dcb0: 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 70 09_V_OK) {../* p
dcc0: 72 6f 74 6f 20 3d 20 22 66 61 69 6c 65 64 22 3b roto = "failed";
dcd0: 20 2a 2f 0a 09 70 72 6f 74 6f 20 3d 20 52 45 41 */..proto = REA
dce0: 53 4f 4e 28 29 3b 0a 20 20 20 20 7d 20 65 6c 73 SON();. } els
dcf0: 65 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 6f 6b e {..proto = "ok
dd00: 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c ";. }. Tcl
dd10: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
dd20: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
dd30: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
dd40: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 2c 20 2d 31 ingObj(proto, -1
dd50: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f ));.. /* Repo
dd60: 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 rt the selected
dd70: 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 protocol as a re
dd80: 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f sult of the nego
dd90: 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 tiation */. S
dda0: 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c SL_get0_alpn_sel
ddb0: 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e ected(statePtr->
ddc0: 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 ssl, &proto, &le
ddd0: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 n);. Tcl_List
dde0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
ddf0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
de00: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
de10: 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a j("alpn", -1));.
de20: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
de30: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
de40: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
de50: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 _NewStringObj((c
de60: 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e har *)proto, (in
de70: 74 29 6c 65 6e 29 29 3b 0a 20 20 20 20 54 63 6c t)len));. Tcl
de80: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
de90: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
dea0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
deb0: 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f 63 6f 6c ingObj("protocol
dec0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
ded0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
dee0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
def0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
df00: 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 76 ingObj(SSL_get_v
df10: 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d ersion(statePtr-
df20: 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 >ssl), -1));..
df30: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
df40: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
df50: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
df60: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 CL_OK;..clientDa
df70: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
df80: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
df90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dfa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
dfd0: 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e . * ConnectionIn
dfe0: 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 foObjCmd -- retu
dff0: 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e rn connection in
e000: 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e fo from OpenSSL.
e010: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
e020: 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e *.A list of con
e030: 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a nection info. *
e040: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
e050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e080: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
e090: 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f ic int Connectio
e0a0: 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 nInfoObjCmd(Clie
e0b0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
e0c0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
e0d0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
e0e0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
e0f0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
e100: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 l_Channel chan;.
e110: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 ./* The channel
e120: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e to set a mode on
e130: 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a . */. State *
e140: 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c statePtr;../* cl
e150: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 ient state for s
e160: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 sl socket */.
e170: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 Tcl_Obj *objPtr
e180: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 ;. const SSL
e190: 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 *ssl;. const
e1a0: 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68 SSL_CIPHER *ciph
e1b0: 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 er;. const SS
e1c0: 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 L_SESSION *sessi
e1d0: 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e on;. const un
e1e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f signed char *pro
e1f0: 74 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20 6d 6f 64 to;. long mod
e200: 65 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 e;.. if (objc
e210: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 != 2) {..Tcl_Wr
e220: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
e230: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 p, 1, objv, "cha
e240: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 nnel");..return(
e250: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
e260: 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 }.. chan = Tc
e270: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
e280: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 erp, Tcl_GetStri
e290: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 ngFromObj(objv[1
e2a0: 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b ], NULL), NULL);
e2b0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
e2c0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
e2d0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 ULL) {..return(T
e2e0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
e2f0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
e300: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
e310: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
e320: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
e330: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
e340: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
e350: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
e360: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
e370: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
e380: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
e390: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
e3a0: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
e3b0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
e3c0: 61 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 ame(chan), "\":
e3d0: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
e3e0: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 l", NULL);..retu
e3f0: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
e400: 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 }.. objPtr
e410: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
e420: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 j(0, NULL);..
e430: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 /* Connection i
e440: 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 nfo */. state
e450: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 Ptr = (State *)T
e460: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
e470: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b tanceData(chan);
e480: 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 . ssl = state
e490: 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 Ptr->ssl;. if
e4a0: 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b (ssl != NULL) {
e4b0: 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 ../* connection
e4c0: 73 74 61 74 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 state */..Tcl_Li
e4d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
e4e0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
e4f0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
e500: 4f 62 6a 28 22 73 74 61 74 65 22 2c 20 2d 31 29 Obj("state", -1)
e510: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
e520: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
e530: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
e540: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
e550: 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c L_state_string_l
e560: 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a ong(ssl), -1));.
e570: 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71 ../* Get SNI req
e580: 75 65 73 74 65 64 20 73 65 72 76 65 72 20 6e 61 uested server na
e590: 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f me */..Tcl_ListO
e5a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
e5b0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
e5c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
e5d0: 28 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 2d ("servername", -
e5e0: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
e5f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
e600: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
e610: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
e620: 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 SSL_get_serverna
e630: 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e me(ssl, TLSEXT_N
e640: 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d AMETYPE_host_nam
e650: 65 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 e), -1));.../* G
e660: 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 et protocol */..
e670: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
e680: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
e690: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
e6a0: 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f StringObj("proto
e6b0: 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c col", -1));..Tcl
e6c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
e6d0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
e6e0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
e6f0: 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 76 ingObj(SSL_get_v
e700: 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 ersion(ssl), -1)
e710: 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 );.../* Renegoti
e720: 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f ation allowed */
e730: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
e740: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
e750: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
e760: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 6e ewStringObj("ren
e770: 65 67 6f 74 69 61 74 69 6f 6e 22 2c 20 2d 31 29 egotiation", -1)
e780: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
e790: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
e7a0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
e7b0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 _NewStringObj(..
e7c0: 20 20 20 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 SSL_get_secu
e7d0: 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e re_renegotiation
e7e0: 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 20 3f 20 _support(ssl) ?
e7f0: 22 73 75 70 70 6f 72 74 65 64 22 20 3a 20 22 6e "supported" : "n
e800: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 2d ot supported", -
e810: 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 1));.../* Get se
e820: 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a curity level */.
e830: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
e840: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
e850: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
e860: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 75 wStringObj("secu
e870: 72 69 74 79 6c 65 76 65 6c 22 2c 20 2d 31 29 29 ritylevel", -1))
e880: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
e890: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
e8a0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
e8b0: 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 NewIntObj(SSL_ge
e8c0: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c t_security_level
e8d0: 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 (ssl)));.../* Se
e8e0: 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 54 ssion info */..T
e8f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
e900: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
e910: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
e920: 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f tringObj("sessio
e930: 6e 5f 72 65 75 73 65 64 22 2c 20 2d 31 29 29 3b n_reused", -1));
e940: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
e950: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
e960: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
e970: 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c ewBooleanObj(SSL
e980: 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 _session_reused(
e990: 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 ssl)));.../* Is
e9a0: 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 server info */..
e9b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
e9c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
e9d0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
e9e0: 53 74 72 69 6e 67 4f 62 6a 28 22 69 73 5f 73 65 StringObj("is_se
e9f0: 72 76 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 rver", -1));..Tc
ea00: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
ea10: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
ea20: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f bjPtr, Tcl_NewBo
ea30: 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f 69 73 5f oleanObj(SSL_is_
ea40: 73 65 72 76 65 72 28 73 73 6c 29 29 29 3b 0a 20 server(ssl)));.
ea50: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 }.. /* Cip
ea60: 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 her info */.
ea70: 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 cipher = SSL_get
ea80: 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 _current_cipher(
ea90: 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 ssl);. if (ci
eaa0: 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a pher != NULL) {.
eab0: 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a .char buf[BUFSIZ
eac0: 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 ] = {0};..int bi
ead0: 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 ts, alg_bits;...
eae0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
eaf0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
eb00: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
eb10: 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 StringObj("ciphe
eb20: 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c r", -1));..Tcl_L
eb30: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
eb40: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
eb50: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
eb60: 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f gObj(SSL_CIPHER_
eb70: 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 get_name(cipher)
eb80: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
eb90: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
eba0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
ebb0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
ebc0: 62 6a 28 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d bj("standard_nam
ebd0: 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c e", -1));..Tcl_L
ebe0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
ebf0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
ec00: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
ec10: 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f gObj(SSL_CIPHER_
ec20: 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 standard_name(ci
ec30: 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 62 pher), -1));...b
ec40: 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 its = SSL_CIPHER
ec50: 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 _get_bits(cipher
ec60: 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 54 , &alg_bits);..T
ec70: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
ec80: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
ec90: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
eca0: 74 72 69 6e 67 4f 62 6a 28 22 62 69 74 73 22 2c tringObj("bits",
ecb0: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
ecc0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
ecd0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
ece0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 62 Tcl_NewIntObj(b
ecf0: 69 74 73 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 its));..Tcl_List
ed00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
ed10: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
ed20: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
ed30: 6a 28 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c j("secret_bits",
ed40: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
ed50: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
ed60: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
ed70: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 Tcl_NewIntObj(a
ed80: 6c 67 5f 62 69 74 73 29 29 3b 0a 09 2f 2a 20 61 lg_bits));../* a
ed90: 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 lg_bits is actua
eda0: 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 l key secret bit
edb0: 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 61 s. If use bits a
edc0: 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 nd secret (algor
edd0: 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 ithm) bits diffe
ede0: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 74 68 r,. th
edf0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 69 e rest of the bi
ee00: 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e ts are fixed, i.
ee10: 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 e. for limited e
ee20: 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 62 xport ciphers (b
ee30: 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 09 54 63 its < 56) */..Tc
ee40: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
ee50: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
ee60: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
ee70: 72 69 6e 67 4f 62 6a 28 22 6d 69 6e 5f 76 65 72 ringObj("min_ver
ee80: 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 sion", -1));..Tc
ee90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
eea0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
eeb0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
eec0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 ringObj(SSL_CIPH
eed0: 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 ER_get_version(c
eee0: 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 ipher), -1));...
eef0: 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 /* Get OpenSSL-s
ef00: 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 pecific ID, not
ef10: 49 41 4e 41 20 49 44 20 2a 2f 0a 09 54 63 6c 5f IANA ID */..Tcl_
ef20: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
ef30: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
ef40: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
ef50: 6e 67 4f 62 6a 28 22 69 64 22 2c 20 2d 31 29 29 ngObj("id", -1))
ef60: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
ef70: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
ef80: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
ef90: 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 20 NewIntObj((int)
efa0: 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 SSL_CIPHER_get_i
efb0: 64 28 63 69 70 68 65 72 29 29 29 3b 0a 0a 09 69 d(cipher)));...i
efc0: 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 f (SSL_CIPHER_de
efd0: 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 scription(cipher
efe0: 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 , buf, sizeof(bu
eff0: 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 f)) != NULL) {..
f000: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
f010: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f020: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f030: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 64 _NewStringObj("d
f040: 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 2d 31 29 escription", -1)
f050: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 );.. Tcl_List
f060: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
f070: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f080: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
f090: 6a 28 62 75 66 2c 20 2d 31 29 29 3b 0a 09 7d 0a j(buf, -1));..}.
f0a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
f0b0: 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 ssion info */.
f0c0: 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f session = SSL_
f0d0: 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 get_session(ssl)
f0e0: 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f ;. if (sessio
f0f0: 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f n != NULL) {..co
f100: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
f110: 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 r *ticket;..size
f120: 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e _t len2;..unsign
f130: 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f ed int ulen;..co
f140: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
f150: 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 09 r *session_id;..
f160: 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f char buffer[SSL_
f170: 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c MAX_MASTER_KEY_L
f180: 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 ENGTH];.../* Rep
f190: 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 ort the selected
f1a0: 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 protocol as a r
f1b0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 esult of the ALP
f1c0: 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f N negotiation */
f1d0: 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 ..SSL_SESSION_ge
f1e0: 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 t0_alpn_selected
f1f0: 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f (session, &proto
f200: 2c 20 26 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 , &len);..Tcl_Li
f210: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f220: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
f230: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
f240: 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 Obj("alpn", -1))
f250: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
f260: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
f270: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
f280: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 NewStringObj((ch
f290: 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 ar *)proto, (int
f2a0: 29 20 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20 50 65 ) len));.../* Pe
f2b0: 65 72 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f er */..Tcl_ListO
f2c0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
f2d0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f2e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
f2f0: 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 ("peer", -1));..
f300: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
f310: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
f320: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
f330: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 StringObj(SSL_SE
f340: 53 53 49 4f 4e 5f 67 65 74 30 5f 70 65 65 72 28 SSION_get0_peer(
f350: 73 65 73 73 69 6f 6e 29 2c 20 2d 31 29 29 3b 0a session), -1));.
f360: 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 ../* Resumable s
f370: 65 73 73 69 6f 6e 20 2a 2f 0a 09 54 63 6c 5f 4c ession */..Tcl_L
f380: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f390: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
f3a0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
f3b0: 67 4f 62 6a 28 22 72 65 73 75 6d 61 62 6c 65 22 gObj("resumable"
f3c0: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
f3d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
f3e0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
f3f0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
f400: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 SSL_SESSION_is_r
f410: 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e esumable(session
f420: 29 29 29 3b 0a 0a 09 2f 2a 20 53 74 61 72 74 20 )));.../* Start
f430: 74 69 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 time */..Tcl_Lis
f440: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
f450: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
f460: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
f470: 62 6a 28 22 73 74 61 72 74 5f 74 69 6d 65 22 2c bj("start_time",
f480: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
f490: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
f4a0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f4b0: 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 Tcl_NewLongObj(
f4c0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
f4d0: 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 29 3b time(session)));
f4e0: 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 .../* Timeout va
f4f0: 6c 75 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 lue */..Tcl_List
f500: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
f510: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f520: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
f530: 6a 28 22 74 69 6d 65 6f 75 74 22 2c 20 2d 31 29 j("timeout", -1)
f540: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
f550: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f560: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f570: 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f _NewLongObj(SSL_
f580: 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 SESSION_get_time
f590: 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a out(session)));.
f5a0: 0a 09 2f 2a 20 4c 69 66 65 74 69 6d 65 20 68 69 ../* Lifetime hi
f5b0: 6e 74 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f nt */..Tcl_ListO
f5c0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
f5d0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f5e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
f5f0: 28 22 6c 69 66 65 74 69 6d 65 22 2c 20 2d 31 29 ("lifetime", -1)
f600: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
f610: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f620: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f630: 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f _NewLongObj(SSL_
f640: 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b SESSION_get_tick
f650: 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 et_lifetime_hint
f660: 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f (session)));.../
f670: 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a * Session id */.
f680: 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 .session_id = SS
f690: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 L_SESSION_get_id
f6a0: 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 (session, &ulen)
f6b0: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
f6c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
f6d0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
f6e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 NewStringObj("se
f6f0: 73 73 69 6f 6e 5f 69 64 22 2c 20 2d 31 29 29 3b ssion_id", -1));
f700: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
f710: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
f720: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
f730: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 ewByteArrayObj(s
f740: 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 ession_id, (int)
f750: 20 75 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 ulen));.../* Se
f760: 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 ssion ticket - c
f770: 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 lient only */..S
f780: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f SL_SESSION_get0_
f790: 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 ticket(session,
f7a0: 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b &ticket, &len2);
f7b0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
f7c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
f7d0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
f7e0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 ewStringObj("ses
f7f0: 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 2d 31 sion_ticket", -1
f800: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
f810: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
f820: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
f830: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 l_NewByteArrayOb
f840: 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 j(ticket, (int)
f850: 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 len2));.../* Tic
f860: 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a ket app data */.
f870: 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 .SSL_SESSION_get
f880: 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61 0_ticket_appdata
f890: 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 (session, &ticke
f8a0: 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f t, &len2);..Tcl_
f8b0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
f8c0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
f8d0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
f8e0: 6e 67 4f 62 6a 28 22 74 69 63 6b 65 74 5f 61 70 ngObj("ticket_ap
f8f0: 70 5f 64 61 74 61 22 2c 20 2d 31 29 29 3b 0a 09 p_data", -1));..
f900: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
f910: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
f920: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
f930: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 ByteArrayObj(tic
f940: 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 ket, (int) len2)
f950: 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 );.../* Get mast
f960: 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 er key */..len2
f970: 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 = SSL_SESSION_ge
f980: 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73 t_master_key(ses
f990: 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 sion, buffer, SS
f9a0: 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 L_MAX_MASTER_KEY
f9b0: 5f 4c 45 4e 47 54 48 29 3b 0a 09 54 63 6c 5f 4c _LENGTH);..Tcl_L
f9c0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f9d0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
f9e0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
f9f0: 67 4f 62 6a 28 22 6d 61 73 74 65 72 5f 6b 65 79 gObj("master_key
fa00: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
fa10: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
fa20: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
fa30: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 r, Tcl_NewByteAr
fa40: 72 61 79 4f 62 6a 28 62 75 66 66 65 72 2c 20 28 rayObj(buffer, (
fa50: 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 20 20 20 int) len2));.
fa60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 }.. /* Compr
fa70: 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 ession info */.
fa80: 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 if (ssl != NU
fa90: 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 LL) {.#ifdef HAV
faa0: 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f E_SSL_COMPRESSIO
fab0: 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 N..const COMP_ME
fac0: 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 THOD *comp, *exp
fad0: 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 n;..comp = SSL_g
fae0: 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 et_current_compr
faf0: 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 ession(ssl);..ex
fb00: 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 pn = SSL_get_cur
fb10: 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 rent_expansion(s
fb20: 73 6c 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f sl);...Tcl_ListO
fb30: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
fb40: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
fb50: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
fb60: 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 ("compression",
fb70: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
fb80: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
fb90: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
fba0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
fbb0: 28 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 (comp ? SSL_COMP
fbc0: 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 _get_name(comp)
fbd0: 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a : "NONE", -1));.
fbe0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
fbf0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
fc00: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
fc10: 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78 70 61 wStringObj("expa
fc20: 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 nsion", -1));..T
fc30: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
fc40: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
fc50: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
fc60: 74 72 69 6e 67 4f 62 6a 28 65 78 70 6e 20 3f 20 tringObj(expn ?
fc70: 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d SSL_COMP_get_nam
fc80: 65 28 65 78 70 6e 29 20 3a 20 22 4e 4f 4e 45 22 e(expn) : "NONE"
fc90: 2c 20 2d 31 29 29 3b 0a 23 65 6c 73 65 0a 09 54 , -1));.#else..T
fca0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
fcb0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
fcc0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
fcd0: 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65 tringObj("compre
fce0: 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 ssion", -1));..T
fcf0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
fd00: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
fd10: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
fd20: 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c tringObj("NONE",
fd30: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
fd40: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
fd50: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
fd60: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
fd70: 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 2d j("expansion", -
fd80: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
fd90: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
fda0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
fdb0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
fdc0: 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 65 "NONE", -1));.#e
fdd0: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ndif. }..
fde0: 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a /* Server info *
fdf0: 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c /. mode = SSL
fe00: 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e _CTX_get_session
fe10: 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 _cache_mode(stat
fe20: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 ePtr->ctx);.
fe30: 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 if (mode & SSL_S
fe40: 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b ESS_CACHE_OFF) {
fe50: 0a 09 70 72 6f 74 6f 20 3d 20 22 6f 66 66 22 3b ..proto = "off";
fe60: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
fe70: 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f mode & SSL_SESS_
fe80: 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a CACHE_CLIENT) {.
fe90: 09 70 72 6f 74 6f 20 3d 20 22 63 6c 69 65 6e 74 .proto = "client
fea0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ";. } else if
feb0: 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 (mode & SSL_SES
fec0: 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 S_CACHE_SERVER)
fed0: 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 73 65 72 76 {..proto = "serv
fee0: 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 er";. } else
fef0: 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 if (mode & SSL_S
ff00: 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 ESS_CACHE_BOTH)
ff10: 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 62 6f 74 68 {..proto = "both
ff20: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ";. } else {.
ff30: 09 70 72 6f 74 6f 20 3d 20 22 75 6e 6b 6e 6f 77 .proto = "unknow
ff40: 6e 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 n";. }. Tc
ff50: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
ff60: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
ff70: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
ff80: 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e ringObj("session
ff90: 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 2d 31 _cache_mode", -1
ffa0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
ffb0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
ffc0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
ffd0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
ffe0: 6a 28 70 72 6f 74 6f 2c 20 2d 31 29 29 3b 0a 0a j(proto, -1));..
fff0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
10000 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
10010 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
10020 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
10030 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
10040 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d a;.}.../*. *----
10050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
10090 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a *. * VersionObj
100a0 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 Cmd -- return ve
100b0 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f rsion string fro
100c0 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a m OpenSSL.. *. *
100d0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
100e0 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
100f0 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
10100 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
10110 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
10120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10150 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
10160 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e atic int.Version
10170 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
10180 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
10190 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
101a0 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
101b0 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
101c0 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ]) {. Tcl_Obj
101d0 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 *objPtr;.. d
101e0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
101f0 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 ;.. objPtr =
10200 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
10210 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e (OPENSSL_VERSION
10220 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 _TEXT, -1);.
10230 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
10240 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
10250 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
10260 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 L_OK;..clientDat
10270 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a a = clientData;.
10280 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 6f .objc = objc;..o
10290 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a bjv = objv;.}...
102a0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
102b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
102c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
102d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
102e0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d --------. *. * M
102f0 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 iscObjCmd -- mis
10300 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a c commands. *. *
10310 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
10320 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
10330 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
10340 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
10350 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
10360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10390 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
103a0 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a atic int.MiscObj
103b0 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
103c0 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
103d0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
103e0 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
103f0 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
10400 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e {. static con
10410 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 st char *command
10420 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 s [] = { "req",
10430 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d "strreq", NULL }
10440 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 ;. enum comma
10450 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 nd { C_REQ, C_ST
10460 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b RREQ, C_DUMMY };
10470 0a 20 20 20 20 69 6e 74 20 63 6d 64 2c 20 69 73 . int cmd, is
10480 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 Str;. char bu
10490 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 ffer[16384];..
104a0 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
104b0 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
104c0 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 jc < 2) {..Tcl_W
104d0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
104e0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 rp, 1, objv, "su
104f0 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 bcommand ?args?"
10500 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
10510 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
10520 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 if (Tcl_GetIndex
10530 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
10540 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 objv[1], command
10550 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c s, "command", 0,
10560 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 &cmd) != TCL_OK)
10570 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
10580 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
10590 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d isStr = (cmd ==
105a0 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 C_STRREQ);.
105b0 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f switch ((enum co
105c0 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 mmand) cmd) {..c
105d0 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 ase C_REQ:..case
105e0 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 C_STRREQ: {..
105f0 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 EVP_PKEY *pkey
10600 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 =NULL;.. X509
10610 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 *cert=NULL;..
10620 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d X509_NAME *nam
10630 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c e=NULL;.. Tcl
10640 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 _Obj **listv;..
10650 20 20 20 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a int listc,i;.
10660 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e .. BIO *out=N
10670 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 ULL;... char
10680 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 *k_C="",*k_ST=""
10690 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 ,*k_L="",*k_O=""
106a0 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d ,*k_OU="",*k_CN=
106b0 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a "",*k_Email="";.
106c0 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 . char *keyou
106d0 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a t,*pemout,*str;.
106e0 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 . int keysize
106f0 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 ,serial=0,days=3
10700 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 65;..#if OPENSSL
10710 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
10720 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 < 0x30000000L..
10730 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d BIGNUM *bne =
10740 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 NULL;.. RSA
10750 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c *rsa = NULL;.#el
10760 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 se.. EVP_PKEY
10770 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c _CTX *ctx = NULL
10780 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 ;.#endif... i
10790 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 f ((objc<5) || (
107a0 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c objc>6)) {...Tcl
107b0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
107c0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 terp, 2, objv, "
107d0 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 keysize keyfile
107e0 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 certfile ?info?"
107f0 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
10800 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 ERROR;.. }...
10810 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 if (Tcl_GetI
10820 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
10830 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 , objv[2], &keys
10840 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ize) != TCL_OK)
10850 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {...return TCL_E
10860 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 RROR;.. }..
10870 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 keyout=Tcl_Get
10880 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b String(objv[3]);
10890 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c .. pemout=Tcl
108a0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
108b0 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 4]);.. if (is
108c0 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 Str) {...Tcl_Set
108d0 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 Var(interp,keyou
108e0 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 t,"",0);...Tcl_S
108f0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d etVar(interp,pem
10900 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 out,"",0);..
10910 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 }... if (objc
10920 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c >=6) {...if (Tcl
10930 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 _ListObjGetEleme
10940 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 nts(interp, objv
10950 5b 35 5d 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20 [5],....&listc,
10960 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f &listv) != TCL_O
10970 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 K) {... retur
10980 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
10990 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 ....if ((listc%2
109a0 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 ) != 0) {...
109b0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
109c0 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f terp,"Informatio
109d0 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 n list must have
109e0 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 even number of
109f0 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 arguments",NULL)
10a00 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 ;... return T
10a10 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 CL_ERROR;...}...
10a20 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 for (i=0; i<list
10a30 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 c; i+=2) {...
10a40 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 str=Tcl_GetStri
10a50 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 ng(listv[i]);...
10a60 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 if (strcmp(s
10a70 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b tr,"days")==0) {
10a80 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
10a90 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
10aa0 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 ,listv[i+1],&day
10ab0 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 s)!=TCL_OK)....
10ac0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
10ad0 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 ROR;... } els
10ae0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
10af0 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b ,"serial")==0) {
10b00 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
10b10 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
10b20 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 ,listv[i+1],&ser
10b30 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 ial)!=TCL_OK)...
10b40 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
10b50 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 ERROR;... } e
10b60 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
10b70 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 tr,"C")==0) {...
10b80 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 .k_C=Tcl_GetStri
10b90 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
10ba0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
10bb0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 (strcmp(str,"ST"
10bc0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d )==0) {....k_ST=
10bd0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
10be0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
10bf0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
10c00 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 mp(str,"L")==0)
10c10 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 {....k_L=Tcl_Get
10c20 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
10c30 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
10c40 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
10c50 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "O")==0) {....k_
10c60 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 O=Tcl_GetString(
10c70 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
10c80 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
10c90 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d rcmp(str,"OU")==
10ca0 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 0) {....k_OU=Tcl
10cb0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
10cc0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
10cd0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
10ce0 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a str,"CN")==0) {.
10cf0 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 ...k_CN=Tcl_GetS
10d00 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
10d10 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
10d20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
10d30 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 Email")==0) {...
10d40 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 .k_Email=Tcl_Get
10d50 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
10d60 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
10d70 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 {....Tcl_SetRes
10d80 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e ult(interp,"Unkn
10d90 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e own parameter",N
10da0 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 ULL);....return
10db0 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 TCL_ERROR;...
10dc0 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 }...}.. }..#
10dd0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
10de0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
10df0 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 000000L.. bne
10e00 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 = BN_new();..
10e10 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 rsa = RSA_new(
10e20 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 );.. pkey = E
10e30 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 VP_PKEY_new();..
10e40 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e if (bne == N
10e50 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 ULL || rsa == NU
10e60 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 LL || pkey == NU
10e70 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f LL || !BN_set_wo
10e80 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c rd(bne,RSA_F4) |
10e90 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 |...!RSA_generat
10ea0 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 e_key_ex(rsa, ke
10eb0 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c ysize, bne, NULL
10ec0 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 ) || !EVP_PKEY_a
10ed0 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 ssign_RSA(pkey,
10ee0 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b rsa)) {...EVP_PK
10ef0 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 EY_free(pkey);..
10f00 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 ./* RSA_free(rsa
10f10 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f ); freed by EVP_
10f20 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 PKEY_free */...B
10f30 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c N_free(bne);.#el
10f40 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 se.. pkey = E
10f50 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 VP_RSA_gen((unsi
10f60 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a gned int) keysiz
10f70 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 e);.. ctx = E
10f80 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 VP_PKEY_CTX_new(
10f90 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 pkey,NULL);..
10fa0 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c if (pkey == NUL
10fb0 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c L || ctx == NULL
10fc0 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 || !EVP_PKEY_ke
10fd0 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c ygen_init(ctx) |
10fe0 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 |...!EVP_PKEY_CT
10ff0 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e X_set_rsa_keygen
11000 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 _bits(ctx, keysi
11010 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 ze) || !EVP_PKEY
11020 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b _keygen(ctx, &pk
11030 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 ey)) {...EVP_PKE
11040 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 Y_free(pkey);...
11050 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 EVP_PKEY_CTX_fre
11060 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 e(ctx);.#endif..
11070 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
11080 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e nterp,"Error gen
11090 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 erating private
110a0 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 key",NULL);...re
110b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
110c0 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
110d0 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 if (isStr) {...
110e0 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
110f0 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 IO_s_mem());...
11100 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
11110 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c _PrivateKey(out,
11120 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 pkey,NULL,NULL,0
11130 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 ,NULL,NULL);...
11140 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 i=BIO_read(ou
11150 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 t,buffer,sizeof(
11160 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 buffer)-1);...
11170 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 i=(i<0) ? 0 :
11180 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b i;... buffer[
11190 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 i]='\0';... T
111a0 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
111b0 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 ,keyout,buffer,0
111c0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 );... BIO_flu
111d0 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 sh(out);... B
111e0 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 IO_free(out);...
111f0 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f } else {... o
11200 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
11210 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 _file());...
11220 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 BIO_write_filena
11230 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a me(out,keyout);.
11240 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
11250 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f bio_PrivateKey(o
11260 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c ut,pkey,NULL,NUL
11270 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a L,0,NULL,NULL);.
11280 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 .. /* PEM_wri
11290 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 te_bio_RSAPrivat
112a0 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e eKey(out, rsa, N
112b0 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 ULL, NULL, 0, NU
112c0 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 LL, NULL); */...
112d0 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c BIO_free_all
112e0 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 (out);.. .}....i
112f0 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 f ((cert=X509_ne
11300 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 w())==NULL) {...
11310 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
11320 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
11330 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 generating certi
11340 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c ficate request",
11350 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 NULL);... EVP
11360 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
11370 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
11380 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
11390 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 x30000000L...
113a0 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 BN_free(bne);.#
113b0 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 endif... retu
113c0 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 rn(TCL_ERROR);..
113d0 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 .}....X509_set_v
113e0 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a ersion(cert,2);.
113f0 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 ..ASN1_INTEGER_s
11400 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 et(X509_get_seri
11410 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 alNumber(cert),s
11420 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 erial);...X509_g
11430 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 mtime_adj(X509_g
11440 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 etm_notBefore(ce
11450 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 rt),0);...X509_g
11460 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 mtime_adj(X509_g
11470 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 etm_notAfter(cer
11480 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 t),(long)60*60*2
11490 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 4*days);...X509_
114a0 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c set_pubkey(cert,
114b0 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 pkey);....name=X
114c0 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 509_get_subject_
114d0 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 name(cert);....X
114e0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
114f0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
11500 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 C", MBSTRING_ASC
11510 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
11520 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d d char *) k_C, -
11530 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
11540 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
11550 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 _by_txt(name,"ST
11560 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
11570 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
11580 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d char *) k_ST, -
11590 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
115a0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
115b0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 _by_txt(name,"L"
115c0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
115d0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
115e0 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c char *) k_L, -1,
115f0 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
11600 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
11610 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 y_txt(name,"O",
11620 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
11630 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
11640 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d ar *) k_O, -1, -
11650 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
11660 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
11670 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d txt(name,"OU", M
11680 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
11690 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
116a0 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d r *) k_OU, -1, -
116b0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
116c0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
116d0 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d txt(name,"CN", M
116e0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
116f0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
11700 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d r *) k_CN, -1, -
11710 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
11720 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
11730 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 txt(name,"Email"
11740 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
11750 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
11760 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c char *) k_Email,
11770 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 -1, -1, 0);....
11780 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 X509_set_subject
11790 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 _name(cert,name)
117a0 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 ;....if (!X509_s
117b0 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 ign(cert,pkey,EV
117c0 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 P_sha256())) {..
117d0 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 . X509_free(c
117e0 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f ert);... EVP_
117f0 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
11800 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
11810 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
11820 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 30000000L...
11830 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
11840 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 ndif... Tcl_S
11850 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
11860 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 "Error signing c
11870 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c ertificate",NULL
11880 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 );... return
11890 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a TCL_ERROR;...}..
118a0 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 ..if (isStr) {..
118b0 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
118c0 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 (BIO_s_mem());..
118d0 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
118e0 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 io_X509(out,cert
118f0 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 );... i=BIO_r
11900 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 ead(out,buffer,s
11910 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 izeof(buffer)-1)
11920 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 ;... i=(i<0)
11930 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 ? 0 : i;... b
11940 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 uffer[i]='\0';..
11950 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 . Tcl_SetVar(
11960 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 interp,pemout,bu
11970 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 ffer,0);... B
11980 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 IO_flush(out);..
11990 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 . BIO_free(ou
119a0 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 t);...} else {..
119b0 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
119c0 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a (BIO_s_file());.
119d0 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f .. BIO_write_
119e0 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d filename(out,pem
119f0 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f out);... PEM_
11a00 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f write_bio_X509(o
11a10 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 ut,cert);...
11a20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 BIO_free_all(out
11a30 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 );...}....X509_f
11a40 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 ree(cert);...EVP
11a50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
11a60 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
11a70 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
11a80 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f x30000000L...BN_
11a90 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 free(bne);.#endi
11aa0 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 f.. }..}..bre
11ab0 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a ak;. default:
11ac0 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 ..break;. }.
11ad0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
11ae0 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
11af0 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
11b00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
11b10 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 *****/./* Init
11b20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a */./*
11b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11b40 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ***/../*. *-----
11b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
11b90 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d *. * Tls_Free --
11ba0 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
11bb0 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 edure cleans up
11bc0 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 when a SSL socke
11bd0 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a t based channel.
11be0 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 *.is closed and
11bf0 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 its reference c
11c00 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 ount falls below
11c10 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 1. *. * Results
11c20 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.none. *. *
11c30 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
11c40 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 .Frees all the s
11c50 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d tate. *. *------
11c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
11ca0 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 /.void.Tls_Free(
11cb0 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 char *blockPtr)
11cc0 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
11cd0 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
11ce0 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 )blockPtr;..
11cf0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
11d00 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 );.. Tls_Clea
11d10 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 n(statePtr);.
11d20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 ckfree(blockPtr
11d30 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
11d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
11d80 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 *. * Tls_Clean
11d90 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
11da0 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 ocedure cleans u
11db0 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 p when a SSL soc
11dc0 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 ket based channe
11dd0 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 l. *.is closed a
11de0 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 nd its reference
11df0 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c count falls bel
11e00 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 ow 1. This shou
11e10 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 ld. *.be called
11e20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 synchronously by
11e30 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 the CloseProc,
11e40 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 not in the. *.Ev
11e50 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c entuallyFree cal
11e60 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 lback.. *. * Res
11e70 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ults:. *.none. *
11e80 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
11e90 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 :. *.Frees all t
11ea0 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d he state. *. *--
11eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ef0 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 -. */.void Tls_C
11f00 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 lean(State *stat
11f10 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 ePtr) {. dpri
11f20 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
11f30 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 /*. * we
11f40 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 're assuming her
11f50 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e e that we're sin
11f60 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 gle-threaded.
11f70 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 */. if (sta
11f80 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 tePtr->timer !=
11f90 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 (Tcl_TimerToken)
11fa0 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 NULL) {..Tcl_De
11fb0 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 leteTimerHandler
11fc0 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 (statePtr->timer
11fd0 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 );..statePtr->ti
11fe0 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 mer = NULL;.
11ff0 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }.. if (state
12000 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 Ptr->protos) {..
12010 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 2d ckfree(statePtr-
12020 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 >protos);..state
12030 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 Ptr->protos = NU
12040 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
12050 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 (statePtr->bio)
12060 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c {../* This will
12070 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f call SSL_shutdo
12080 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 wn. Bug 1414045
12090 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f */..dprintf("BIO
120a0 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 _free_all(%p)",
120b0 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a statePtr->bio);.
120c0 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 .BIO_free_all(st
120d0 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 atePtr->bio);..s
120e0 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e tatePtr->bio = N
120f0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
12100 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c f (statePtr->ssl
12110 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 ) {..dprintf("SS
12120 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 L_free(%p)", sta
12130 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 tePtr->ssl);..SS
12140 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d L_free(statePtr-
12150 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 >ssl);..statePtr
12160 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ->ssl = NULL;.
12170 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
12180 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 ePtr->ctx) {..SS
12190 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 L_CTX_free(state
121a0 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 Ptr->ctx);..stat
121b0 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c ePtr->ctx = NULL
121c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
121d0 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
121e0 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 ck) {..Tcl_DecrR
121f0 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
12200 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 ->callback);..st
12210 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
12220 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
12230 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
12240 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 >password) {..Tc
12250 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 l_DecrRefCount(s
12260 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
12270 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 d);..statePtr->p
12280 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a assword = NULL;.
12290 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
122a0 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b tf("Returning");
122b0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
122c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
122d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
122e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
122f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
12300 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a . * Tls_Init --.
12310 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 *. *.This is a
12320 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 package initiali
12330 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 zation procedure
12340 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 , which is calle
12350 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e d. *.by Tcl when
12360 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73 this package is
12370 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 to be added to
12380 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a an interpreter..
12390 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 *. * Results:
123a0 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61 Ssl configured a
123b0 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 nd loaded. *. *
123c0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
123d0 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73 6c . create the ssl
123e0 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 command, initia
123f0 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 lize ssl context
12400 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
12410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12440 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c ---------. */.DL
12450 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f LEXPORT int Tls_
12460 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 Init(Tcl_Interp
12470 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 63 *interp) {. c
12480 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c onst char tlsTcl
12490 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b InitScript[] = {
124a0 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 .#include "tls.t
124b0 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20 cl.h"..0x00.
124c0 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 };.. dprintf(
124d0 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
124e0 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c /*. * We onl
124f0 79 20 73 75 70 70 6f 72 74 20 54 63 6c 20 38 2e y support Tcl 8.
12500 34 20 6f 72 20 6e 65 77 65 72 0a 20 20 20 20 20 4 or newer.
12510 2a 2f 0a 20 20 20 20 69 66 20 28 0a 23 69 66 64 */. if (.#ifd
12520 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 ef USE_TCL_STUBS
12530 0a 09 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 ..Tcl_InitStubs(
12540 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 interp, "8.4", 0
12550 29 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 50 6b 67 ).#else..Tcl_Pkg
12560 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 Require(interp,
12570 22 54 63 6c 22 2c 20 22 38 2e 34 2d 22 2c 20 30 "Tcl", "8.4-", 0
12580 29 0a 23 65 6e 64 69 66 0a 09 20 3d 3d 20 4e 55 ).#endif.. == NU
12590 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
125a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
125b0 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e if (TlsLibIn
125c0 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 it(0) != TCL_OK)
125d0 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
125e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f sult(interp, "co
125f0 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 uld not initiali
12600 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c ze SSL library",
12610 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
12620 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
12630 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 .. Tcl_Create
12640 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
12650 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 p, "tls::ciphers
12660 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 ", CiphersObjCmd
12670 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
12680 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
12690 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
126a0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
126b0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
126c0 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e "tls::connection
126d0 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 ", ConnectionInf
126e0 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 oObjCmd, (Client
126f0 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
12700 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
12710 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
12720 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
12730 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e nterp, "tls::han
12740 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 dshake", Handsha
12750 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e keObjCmd, (Clien
12760 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
12770 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
12780 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
12790 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
127a0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d interp, "tls::im
127b0 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a port", ImportObj
127c0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
127d0 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
127e0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
127f0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
12800 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
12810 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 p, "tls::unimpor
12820 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 t", UnimportObjC
12830 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
12840 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
12850 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
12860 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
12870 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
12880 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c , "tls::status",
12890 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 StatusObjCmd, (
128a0 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
128b0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
128c0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
128d0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
128e0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
128f0 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 s::version", Ver
12900 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 sionObjCmd, (Cli
12910 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
12920 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
12930 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
12940 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
12950 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
12960 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d misc", MiscObjCm
12970 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
12980 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
12990 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
129a0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
129b0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
129c0 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 "tls::protocols
129d0 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 ", ProtocolsObjC
129e0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
129f0 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
12a00 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
12a10 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 .. if (interp
12a20 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e ) {..Tcl_Eval(in
12a30 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 terp, tlsTclInit
12a40 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a Script);. }..
12a50 20 20 20 20 72 65 74 75 72 6e 28 54 63 6c 5f 50 return(Tcl_P
12a60 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 kgProvide(interp
12a70 2c 20 22 74 6c 73 22 2c 20 50 41 43 4b 41 47 45 , "tls", PACKAGE
12a80 5f 56 45 52 53 49 4f 4e 29 29 3b 0a 7d 0a 0a 2f _VERSION));.}../
12a90 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
12aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 ----------*. *.
12ad0 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d *.Tls_SafeInit -
12ae0 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d -. *. *.--------
12af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b10 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 --------*. *.Sta
12b20 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 ndard procedure
12b30 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 required by 'loa
12b40 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a d'.. *.Initializ
12b50 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f es this extensio
12b60 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74 n for a safe int
12b70 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d erpreter.. *.---
12b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
12bb0 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 *. *.Side effect
12bc0 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c s:. *..As of 'Tl
12bd0 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 s_Init'. *. *.Re
12be0 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e sult:. *..A stan
12bf0 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 dard Tcl error c
12c00 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ode.. *. *------
12c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c40 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 *. */.DLLEXPORT
12c50 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 int Tls_SafeInit
12c60 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
12c70 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e erp) {. dprin
12c80 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 tf("Called");.
12c90 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69 return(Tls_Ini
12ca0 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f t(interp));.}../
12cb0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
12cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 ----------*. *.
12cf0 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a *.TlsLibInit --.
12d00 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *.----------
12d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d30 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 ------*. *.Initi
12d40 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 alizes SSL libra
12d50 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c ry once per appl
12d60 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d ication. *.-----
12d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a -----------*. *.
12da0 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a *.Side effects:
12db0 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 . *..initializes
12dc0 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a SSL library. *.
12dd0 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e *.Result:. *..n
12de0 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d one. *. *-------
12df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
12e20 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 . */.static int
12e30 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 TlsLibInit(int u
12e40 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 ninitialize) {.
12e50 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e static int in
12e60 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 itialized = 0;.
12e70 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20 int status =
12e80 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 TCL_OK;.#if defi
12e90 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 ned(OPENSSL_THRE
12ea0 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 ADS) && defined(
12eb0 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 TCL_THREADS).
12ec0 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b size_t num_lock
12ed0 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 s;.#endif.. i
12ee0 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 f (uninitialize)
12ef0 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 {. if (!
12f00 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 20 initialized) {.
12f10 20 20 20 20 20 20 20 20 20 20 20 64 70 72 69 6e dprin
12f20 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 tf("Asked to uni
12f30 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 nitialize, but w
12f40 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 e are not initia
12f50 6c 69 7a 65 64 22 29 3b 0a 0a 20 20 20 20 20 20 lized");..
12f60 20 20 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c return(TCL
12f70 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a _OK);. }.
12f80 0a 20 20 20 20 20 20 20 20 64 70 72 69 6e 74 66 . dprintf
12f90 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 ("Asked to unini
12fa0 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 tialize");..#if
12fb0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
12fc0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
12fd0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
12fe0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4d 75 74 . Tcl_Mut
12ff0 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 exLock(&init_mx)
13000 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28 6c ;.. if (l
13010 6f 63 6b 73 29 20 7b 0a 20 20 20 20 20 20 20 20 ocks) {.
13020 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b free(locks);
13030 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 . loc
13040 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 ks = NULL;.
13050 20 20 20 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e locksCoun
13060 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d t = 0;. }
13070 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 .#endif.
13080 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b initialized = 0;
13090 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ..#if defined(OP
130a0 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
130b0 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
130c0 52 45 41 44 53 29 0a 20 20 20 20 20 20 20 20 54 READS). T
130d0 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 cl_MutexUnlock(&
130e0 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 init_mx);.#endif
130f0 0a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e .. return
13100 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a (TCL_OK);. }.
13110 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c . if (initial
13120 69 7a 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 ized) {.
13130 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c dprintf("Called,
13140 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 but using cache
13150 64 20 76 61 6c 75 65 22 29 3b 0a 20 20 20 20 20 d value");.
13160 20 20 20 72 65 74 75 72 6e 28 73 74 61 74 75 73 return(status
13170 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 );. }.. dp
13180 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
13190 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ..#if defined(OP
131a0 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
131b0 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
131c0 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d READS). Tcl_M
131d0 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d utexLock(&init_m
131e0 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 x);.#endif. i
131f0 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a nitialized = 1;.
13200 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
13210 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
13220 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
13230 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f EADS). num_lo
13240 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 cks = 1;. loc
13250 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 ksCount = (int)
13260 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c num_locks;. l
13270 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 ocks = malloc(si
13280 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e zeof(*locks) * n
13290 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d um_locks);. m
132a0 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 emset(locks, 0,
132b0 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a sizeof(*locks) *
132c0 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e num_locks);.#en
132d0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 dif.. /* Init
132e0 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 ialize BOTH libc
132f0 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c rypto and libssl
13300 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c . */. OPENSSL
13310 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 _init_ssl(OPENSS
13320 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f L_INIT_LOAD_SSL_
13330 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 STRINGS | OPENSS
13340 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 L_INIT_LOAD_CRYP
13350 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 TO_STRINGS..| OP
13360 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 ENSSL_INIT_ADD_A
13370 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 LL_CIPHERS | OPE
13380 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c NSSL_INIT_ADD_AL
13390 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 L_DIGESTS, NULL)
133a0 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 ;.. BIO_new_t
133b0 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 cl(NULL, 0);..#i
133c0 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 f 0. /*.
133d0 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f * XXX:TODO: Remo
133e0 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e 64 ve this code and
133f0 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 replace it with
13400 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a 20 a check. *
13410 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f for enough entro
13420 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72 py and do not tr
13430 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 y to create our
13440 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 69 own. * terri
13450 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 20 ble entropy.
13460 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 */. /*.
13470 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f * Seed the rando
13480 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 m number generat
13490 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 or in the SSL li
134a0 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 brary,. * us
134b0 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 ing the do/while
134c0 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75 construct becau
134d0 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f se of the bug no
134e0 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a te in the. *
134f0 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20 OpenSSL FAQ at
13500 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 http://www.opens
13510 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 sl.org/support/f
13520 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 aq.html#USER1.
13530 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 *. * The
13540 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62 crux of the prob
13550 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61 lem is that Sola
13560 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 ris 7 does not h
13570 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 65 ave a. * /de
13580 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 v/random or /dev
13590 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 /urandom device
135a0 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 so it cannot gat
135b0 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 her enough.
135c0 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 * entropy from t
135d0 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77 he RAND_seed() w
135e0 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 hen TLS initiali
135f0 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a zes and refuses.
13600 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 * to go fur
13610 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65 ther. Earlier ve
13620 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 rsions of OpenSS
13630 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67 L carried on reg
13640 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f ardless.. */
13650 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69 . srand((unsi
13660 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28 gned int) time((
13670 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 time_t *) NULL))
13680 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 ;. do {..for
13690 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 (i = 0; i < 16;
136a0 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f i++) {.. rnd_
136b0 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 seed[i] = 1 + (c
136c0 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61 har) (255.0 * ra
136d0 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 nd()/(RAND_MAX+1
136e0 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 .0));..}..RAND_s
136f0 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 eed(rnd_seed, si
13700 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b zeof(rnd_seed));
13710 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41 . } while (RA
13720 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31 ND_status() != 1
13730 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 );.#endif..#if d
13740 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
13750 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
13760 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
13770 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b .Tcl_MutexUnlock
13780 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 (&init_mx);.#end
13790 69 66 0a 0a 09 72 65 74 75 72 6e 28 73 74 61 74 if...return(stat
137a0 75 73 29 3b 0a 7d 0a us);.}.