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 4e 55 e {..errStr = NU
1870: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 LL;. }.. i
1880: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
1890: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
18a0: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 j*)NULL) {..if (
18b0: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 statePtr->vflags
18c0: 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 & SSL_VERIFY_FA
18d0: 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 IL_IF_NO_PEER_CE
18e0: 52 54 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 RT) {.. retur
18f0: 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a n ok;..} else {.
1900: 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 . return 1;..
1910: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6d 64 50 }. }. cmdP
1920: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
1930: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
1940: 63 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 callback);..
1950: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1960: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1970: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
1980: 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 StringObj("verif
1990: 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 y", -1));. Tc
19a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
19b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
19c0: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 mdPtr,..Tcl_NewS
19d0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
19e0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
19f0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
1a00: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
1a10: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1a20: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
1a30: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 Tcl_NewIntObj(de
1a40: 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c pth));. Tcl_L
1a50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1a60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1a70: 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f tr, Tls_NewX509O
1a80: 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 bj(interp, cert)
1a90: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
1aa0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1ab0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
1ac0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b Tcl_NewIntObj(ok
1ad0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
1ae0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1af0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
1b00: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1b10: 6a 28 65 72 72 53 74 72 20 3f 20 65 72 72 53 74 j(errStr ? errSt
1b20: 72 20 3a 20 22 22 2c 20 2d 31 29 29 3b 0a 0a 20 r : "", -1));..
1b30: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
1b40: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 (ClientData) int
1b50: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 erp);. Tcl_Pr
1b60: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
1b70: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a ta) statePtr);..
1b80: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c statePtr->fl
1b90: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 ags |= TLS_TCL_C
1ba0: 41 4c 4c 42 41 43 4b 3b 0a 0a 20 20 20 20 54 63 ALLBACK;.. Tc
1bb0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
1bc0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 mdPtr);. code
1bd0: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 = Tcl_EvalObjEx
1be0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
1bf0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c TCL_EVAL_GLOBAL
1c00: 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 );. if (code
1c10: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a != TCL_OK) {../*
1c20: 20 49 74 20 67 6f 74 20 61 6e 20 65 72 72 6f 72 It got an error
1c30: 20 2d 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 - reject the ce
1c40: 72 74 69 66 69 63 61 74 65 2e 09 09 2a 2f 0a 23 rtificate...*/.#
1c50: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
1c60: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
1c70: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
1c80: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
1c90: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
1ca0: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
1cb0: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
1cc0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
1cd0: 29 3b 0a 23 65 6e 64 69 66 0a 09 6f 6b 20 3d 20 );.#endif..ok =
1ce0: 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 0;. } else {.
1cf0: 09 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 .result = Tcl_Ge
1d00: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
1d10: 70 29 3b 0a 09 73 74 72 69 6e 67 20 3d 20 54 63 p);..string = Tc
1d20: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
1d30: 62 6a 28 72 65 73 75 6c 74 2c 20 26 6c 65 6e 67 bj(result, &leng
1d40: 74 68 29 3b 0a 09 2f 2a 20 41 6e 20 65 6d 70 74 th);../* An empt
1d50: 79 20 72 65 73 75 6c 74 20 6c 65 61 76 65 73 20 y result leaves
1d60: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 verification unc
1d70: 68 61 6e 67 65 64 2e 09 2a 2f 0a 09 69 66 20 28 hanged..*/..if (
1d80: 73 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 20 26 string != NULL &
1d90: 26 20 6c 65 6e 67 74 68 20 3e 20 30 29 20 7b 0a & length > 0) {.
1da0: 09 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f . code = Tcl_
1db0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e GetIntFromObj(in
1dc0: 74 65 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f terp, result, &o
1dd0: 6b 29 3b 0a 09 20 20 20 20 69 66 20 28 63 6f 64 k);.. if (cod
1de0: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
1df0: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
1e00: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
1e10: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
1e20: 4e 20 3c 20 36 29 0a 09 09 54 63 6c 5f 42 61 63 N < 6)...Tcl_Bac
1e30: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 kgroundError(int
1e40: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 09 54 63 erp);.#else...Tc
1e50: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 l_BackgroundExce
1e60: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f ption(interp, co
1e70: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 6f 6b de);.#endif...ok
1e80: 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a = 0;.. }..}.
1e90: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 }. Tcl_De
1ea0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
1eb0: 72 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 r);.. statePt
1ec0: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c r->flags &= ~(TL
1ed0: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b S_TCL_CALLBACK);
1ee0: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 .. Tcl_Releas
1ef0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
1f00: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 tatePtr);. Tc
1f10: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
1f20: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a tData) interp);.
1f30: 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 3b 09 return(ok);.
1f40: 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 6c /* By default, l
1f50: 65 61 76 65 20 76 65 72 69 66 69 63 61 74 69 6f eave verificatio
1f60: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f 0a n unchanged..*/.
1f70: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 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 0a 20 2a 0a ------------. *.
1fc0: 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a * Tls_Error --.
1fd0: 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c *. *.Calls call
1fe0: 62 61 63 6b 20 77 69 74 68 20 24 66 64 20 61 6e back with $fd an
1ff0: 64 20 24 6d 73 67 20 2d 20 73 6f 20 74 68 65 20 d $msg - so the
2000: 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65 63 callback can dec
2010: 69 64 65 0a 20 2a 09 77 68 61 74 20 74 6f 20 64 ide. *.what to d
2020: 6f 20 77 69 74 68 20 65 72 72 6f 72 73 2e 0a 20 o with errors..
2030: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
2040: 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 s:. *.The err fi
2050: 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 eld of the curre
2060: 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 ntly operative S
2070: 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 tate is set. *.
2080: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 to a string des
2090: 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 cribing the SSL
20a0: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c negotiation fail
20b0: 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d 2d ure reason. *---
20c0: 2d 2d 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: 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 . */.void.Tls_Er
2110: 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 ror(State *state
2120: 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20 Ptr, char *msg)
2130: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 {. Tcl_Interp
2140: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
2150: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
2160: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
2170: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a ;. int code;.
2180: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
2190: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
21a0: 28 6d 73 67 20 26 26 20 2a 6d 73 67 29 20 7b 0a (msg && *msg) {.
21b0: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
21c0: 65 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 22 2c e(interp, "SSL",
21d0: 20 6d 73 67 2c 20 28 63 68 61 72 20 2a 29 4e 55 msg, (char *)NU
21e0: 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 LL);. } else
21f0: 7b 0a 09 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 {..msg = Tcl_Get
2200: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 StringFromObj(Tc
2210: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
2220: 6e 74 65 72 70 29 2c 20 4e 55 4c 4c 29 3b 0a 20 nterp), NULL);.
2230: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 }. statePt
2240: 72 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 r->err = msg;..
2250: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
2260: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 >callback == (Tc
2270: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
2280: 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d char buf[BUFSIZ]
2290: 3b 0a 09 73 70 72 69 6e 74 66 28 62 75 66 2c 20 ;..sprintf(buf,
22a0: 22 53 53 4c 20 63 68 61 6e 6e 65 6c 20 5c 22 25 "SSL channel \"%
22b0: 73 5c 22 3a 20 65 72 72 6f 72 3a 20 25 73 22 2c s\": error: %s",
22c0: 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 .. Tcl_GetCha
22d0: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
22e0: 72 2d 3e 73 65 6c 66 29 2c 20 6d 73 67 29 3b 0a r->self), msg);.
22f0: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
2300: 6e 74 65 72 70 2c 20 62 75 66 2c 20 54 43 4c 5f nterp, buf, TCL_
2310: 56 4f 4c 41 54 49 4c 45 29 3b 0a 23 69 66 20 28 VOLATILE);.#if (
2320: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
2330: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f N == 8) && (TCL_
2340: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 MINOR_VERSION <
2350: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6)..Tcl_Backgrou
2360: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b ndError(interp);
2370: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b .#else..Tcl_Back
2380: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 groundException(
2390: 69 6e 74 65 72 70 2c 20 54 43 4c 5f 45 52 52 4f interp, TCL_ERRO
23a0: 52 29 3b 0a 23 65 6e 64 69 66 0a 09 72 65 74 75 R);.#endif..retu
23b0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6d rn;. }. cm
23c0: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
23d0: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
23e0: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 ->callback);..
23f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2400: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2410: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2420: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 ewStringObj("err
2430: 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 or", -1));. T
2440: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2450: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2460: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
2470: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
2480: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
2490: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
24a0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
24b0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
24c0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
24d0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
24e0: 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b ngObj(msg, -1));
24f0: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 .. Tcl_Preser
2500: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
2510: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c interp);. Tcl
2520: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
2530: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
2540: 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 ;.. Tcl_IncrR
2550: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
2560: 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f . code = Tcl_
2570: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 EvalObjEx(interp
2580: 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 , cmdPtr, TCL_EV
2590: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 AL_GLOBAL);.
25a0: 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f if (code != TCL_
25b0: 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d OK) {.#if (TCL_M
25c0: 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 AJOR_VERSION ==
25d0: 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 8) && (TCL_MINOR
25e0: 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 _VERSION < 6)..T
25f0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 cl_BackgroundErr
2600: 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 or(interp);.#els
2610: 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e e..Tcl_Backgroun
2620: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 dException(inter
2630: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 p, code);.#endif
2640: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 . }. Tcl_D
2650: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ecrRefCount(cmdP
2660: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c tr);. Tcl_Rel
2670: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 ease((ClientData
2680: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 ) statePtr);.
2690: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c Tcl_Release((Cl
26a0: 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 ientData) interp
26b0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
26c0: 2d 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 0a ---------------.
2700: 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c *. * KeyLogCall
2710: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 back --. *. *.Wr
2720: 69 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 ite received key
2730: 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c data to log fil
2740: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
2750: 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 fects:. *.none.
2760: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
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 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 ----. */.void Ke
27b0: 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e yLogCallback(con
27c0: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e st SSL *ssl, con
27d0: 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b st char *line) {
27e0: 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d . char *str =
27f0: 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f getenv(SSLKEYLO
2800: 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 GFILE);. FILE
2810: 20 2a 66 64 3b 0a 20 20 20 20 69 66 20 28 73 74 *fd;. if (st
2820: 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 6e r) {..fd = fopen
2830: 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 72 (str, "a");..fpr
2840: 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 2c intf(fd, "%s\n",
2850: 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 66 line);..fclose(f
2860: 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a d);. }.}.../*
2870: 0a 20 2a 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 50 61 73 ------. *. * Pas
28c0: 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 2d sword Callback -
28d0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 -. *. *.Called w
28e0: 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 69 hen a password i
28f0: 73 20 6e 65 65 64 65 64 20 74 6f 20 75 6e 70 61 s needed to unpa
2900: 63 6b 20 52 53 41 20 61 6e 64 20 50 45 4d 20 6b ck RSA and PEM k
2910: 65 79 73 2e 0a 20 2a 09 45 76 61 6c 73 20 61 6e eys.. *.Evals an
2920: 79 20 62 6f 75 6e 64 20 70 61 73 73 77 6f 72 64 y bound password
2930: 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 75 script and retu
2940: 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 61 rns the result a
2950: 73 0a 20 2a 09 74 68 65 20 70 61 73 73 77 6f 72 s. *.the passwor
2960: 64 20 73 74 72 69 6e 67 2e 0a 20 2a 2d 2d 2d 2d d string.. *----
2970: 2d 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 0a ---------------.
29b0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 */.static int.P
29c0: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 asswordCallback(
29d0: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 char *buf, int s
29e0: 69 7a 65 2c 20 69 6e 74 20 76 65 72 69 66 79 2c ize, int verify,
29f0: 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a void *udata) {.
2a00: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
2a10: 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 Ptr.= (State *)
2a20: 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 udata;. Tcl_I
2a30: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
2a40: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
2a50: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
2a60: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 mdPtr;. int c
2a70: 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ode;.. dprint
2a80: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
2a90: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
2aa0: 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c password == NULL
2ab0: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 ) {..if (Tcl_Eva
2ac0: 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 lEx(interp, "tls
2ad0: 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c ::password", -1,
2ae0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c TCL_EVAL_GLOBAL
2af0: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) == TCL_OK) {..
2b00: 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 char *ret =
2b10: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
2b20: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 StringResult(int
2b30: 65 72 70 29 3b 0a 09 20 20 20 20 73 74 72 6e 63 erp);.. strnc
2b40: 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 py(buf, ret, (si
2b50: 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 ze_t) size);..
2b60: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74 return (int)st
2b70: 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c rlen(ret);..} el
2b80: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e se {.. return
2b90: 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 -1;..}. }..
2ba0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
2bb0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
2bc0: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 tePtr->password)
2bd0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 ;.. Tcl_Prese
2be0: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 rve((ClientData)
2bf0: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 interp);. Tc
2c00: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 l_Preserve((Clie
2c10: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
2c20: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 );.. Tcl_Incr
2c30: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
2c40: 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c ;. code = Tcl
2c50: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 _EvalObjEx(inter
2c60: 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 p, cmdPtr, TCL_E
2c70: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 VAL_GLOBAL);.
2c80: 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c if (code != TCL
2c90: 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f _OK) {.#if (TCL_
2ca0: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d MAJOR_VERSION ==
2cb0: 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 8) && (TCL_MINO
2cc0: 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 R_VERSION < 6)..
2cd0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 Tcl_BackgroundEr
2ce0: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c ror(interp);.#el
2cf0: 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 se..Tcl_Backgrou
2d00: 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 ndException(inte
2d10: 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 rp, code);.#endi
2d20: 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f f. }. Tcl_
2d30: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
2d40: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 Ptr);.. Tcl_R
2d50: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
2d60: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a ta) statePtr);..
2d70: 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 if (code ==
2d80: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72 20 TCL_OK) {..char
2d90: 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 *ret = (char *)
2da0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 Tcl_GetStringRes
2db0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 66 ult(interp);..if
2dc0: 20 28 73 74 72 6c 65 6e 28 72 65 74 29 20 3c 20 (strlen(ret) <
2dd0: 73 69 7a 65 20 2d 20 31 29 20 7b 0a 09 20 20 20 size - 1) {..
2de0: 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 strncpy(buf, re
2df0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 t, (size_t) size
2e00: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 52 65 6c 65 );.. Tcl_Rele
2e10: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
2e20: 20 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 72 interp);.. r
2e30: 65 74 75 72 6e 20 28 69 6e 74 29 73 74 72 6c 65 eturn (int)strle
2e40: 6e 28 72 65 74 29 3b 0a 09 7d 0a 20 20 20 20 7d n(ret);..}. }
2e50: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 . Tcl_Release
2e60: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
2e70: 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 terp);. retur
2e80: 6e 20 2d 31 3b 0a 09 76 65 72 69 66 79 20 3d 20 n -1;..verify =
2e90: 76 65 72 69 66 79 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 verify;.}.../*.
2ea0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ee0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 ----. *. * Sessi
2ef0: 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 on Callback for
2f00: 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a Clients --. *. *
2f10: 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e .Called when a n
2f20: 65 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64 ew session is ad
2f30: 64 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65 ded to the cache
2f40: 2e 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 . In TLS 1.3. *.
2f50: 74 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65 this may be rece
2f60: 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 ived multiple ti
2f70: 6d 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61 mes after the ha
2f80: 6e 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 ndshake. For. *.
2f90: 65 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 earlier versions
2fa0: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 , this will be r
2fb0: 65 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74 eceived during t
2fc0: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a he handshake.. *
2fd0: 09 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65 .This is the pre
2fe0: 66 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62 ferred way to ob
2ff0: 74 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 tain a resumable
3000: 20 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 session.. *. *
3010: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 Results:. *.None
3020: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
3030: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 cts:. *.Calls ca
3040: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e llback (if defin
3050: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e ed). *. * Return
3060: 20 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 codes:. *.0 = e
3070: 72 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69 rror where sessi
3080: 6f 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 on will be immed
3090: 69 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 iately removed f
30a0: 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c rom the internal
30b0: 20 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 cache.. *.1 = s
30c0: 75 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70 uccess where app
30d0: 20 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e retains session
30e0: 20 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68 in session cach
30f0: 65 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c e, and must call
3100: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 SSL_SESSION_fre
3110: 65 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 e() when done..
3120: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
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 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
3170: 69 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 ic int.SessionCa
3180: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
3190: 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 *ssl, SSL_SESSI
31a0: 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 ON *session) {.
31b0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
31c0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c tr = (State*)SSL
31d0: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 _get_app_data((S
31e0: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 SL *)ssl);. T
31f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
3200: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
3210: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
3220: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 j *cmdPtr;. c
3230: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
3240: 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 ar *ticket;.
3250: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
3260: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b har *session_id;
3270: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 . int code;.
3280: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a size_t len2;.
3290: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 unsigned int
32a0: 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 ulen;.. dpri
32b0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
32c0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
32d0: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 ->callback == (T
32e0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
32f0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
3300: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
3310: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d else if (ssl ==
3320: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
3330: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
3340: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 NOACK;. }..
3350: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
3360: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
3370: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
3380: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
3390: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
33a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
33b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
33c0: 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a session", -1));.
33d0: 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 . /* Session
33e0: 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f id */. sessio
33f0: 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 n_id = SSL_SESSI
3400: 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f ON_get_id(sessio
3410: 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 n, &ulen);. T
3420: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3430: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
3440: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 cmdPtr, Tcl_NewB
3450: 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 yteArrayObj(sess
3460: 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c ion_id, (int) ul
3470: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 en));.. /* Se
3480: 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a ssion ticket */.
3490: 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f SSL_SESSION_
34a0: 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 get0_ticket(sess
34b0: 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c ion, &ticket, &l
34c0: 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 en2);. Tcl_Li
34d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
34e0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
34f0: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 r, Tcl_NewByteAr
3500: 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 rayObj(ticket, (
3510: 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 int) len2));..
3520: 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 /* Lifetime -
3530: 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 number of second
3540: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 s */. Tcl_Lis
3550: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3560: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3570: 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 ,..Tcl_NewLongOb
3580: 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 j((long) SSL_SES
3590: 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f SION_get_ticket_
35a0: 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 lifetime_hint(se
35b0: 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 54 ssion)));.. T
35c0: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
35d0: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
35e0: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 ;. Tcl_Preser
35f0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
3600: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
3610: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
3620: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
3630: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
3640: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
3650: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
3660: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
3670: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
3680: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
3690: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
36a0: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
36b0: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
36c0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
36d0: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
36e0: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
36f0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
3700: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
3710: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
3720: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
3730: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
3740: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
3750: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 ePtr);. Tcl_R
3760: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
3770: 74 61 29 20 69 6e 74 65 72 70 29 3b 20 20 20 20 ta) interp);
3780: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a return 0;.}.../*
3790: 0a 20 2a 2d 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 0a 20 2a 0a 20 2a 20 41 4c 50 ------. *. * ALP
37e0: 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 N Callback for S
37f0: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 ervers --. *. *.
3800: 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 Perform server-s
3810: 69 64 65 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 ide protocol (ht
3820: 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 tp/1.1, h2, h3,
3830: 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 etc.) selection
3840: 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d for the. *.incom
3850: 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 ing connection.
3860: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c Called after Hel
3870: 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 lo and server ca
3880: 6c 6c 62 61 63 6b 73 0a 20 2a 0a 20 2a 20 52 65 llbacks. *. * Re
3890: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 sults:. *.None.
38a0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
38b0: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c s:. *.Calls call
38c0: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 back (if defined
38d0: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 ). *. * Return c
38e0: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 odes:. *.SSL_TLS
38f0: 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e EXT_ERR_OK: ALPN
3900: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 protocol select
3910: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 ed. The connecti
3920: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
3930: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
3940: 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 ALERT_FATAL: The
3950: 72 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 re was no overla
3960: 70 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c p between the cl
3970: 69 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 ient's. *. su
3980: 70 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 pplied list and
3990: 74 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 the server confi
39a0: 67 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f guration. The co
39b0: 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 nnection will be
39c0: 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c aborted.. *.SSL
39d0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
39e0: 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c K: ALPN protocol
39f0: 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 not selected, e
3a00: 2e 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 .g., because no
3a10: 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 ALPN. *. prot
3a20: 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 ocols are config
3a30: 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f ured for this co
3a40: 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f nnection. The co
3a50: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
3a60: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d es.. *. *-------
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 0a 20 2a 2f ------------. */
3ab0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e .static int.ALPN
3ac0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
3ad0: 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 SL *ssl, const u
3ae0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f nsigned char **o
3af0: 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ut, unsigned cha
3b00: 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 r *outlen,..cons
3b10: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
3b20: 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e *in, unsigned in
3b30: 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 t inlen, void *a
3b40: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 rg) {. State
3b50: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
3b60: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c te*)arg;. Tcl
3b70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
3b80: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
3b90: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
3ba0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 *cmdPtr;. int
3bb0: 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20 code, res;..
3bc0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
3bd0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ");.. if (sta
3be0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
3bf0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
3c00: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
3c10: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a _TLSEXT_ERR_OK;.
3c20: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
3c30: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 sl == NULL) {..r
3c40: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
3c50: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
3c60: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 }.. /* Select
3c70: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 protocol */.
3c80: 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f if (SSL_select_
3c90: 6e 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74 2c 20 next_proto(out,
3ca0: 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72 outlen, statePtr
3cb0: 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50 ->protos, stateP
3cc0: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a tr->protos_len,.
3cd0: 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f .in, inlen) == O
3ce0: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 PENSSL_NPN_NEGOT
3cf0: 49 41 54 45 44 29 20 7b 0a 09 72 65 73 20 3d 20 IATED) {..res =
3d00: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
3d10: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a K;. } else {.
3d20: 09 2f 2a 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 ./* No overlap,
3d30: 73 6f 20 66 69 72 73 74 20 63 6c 69 65 6e 74 20 so first client
3d40: 70 72 6f 74 6f 63 6f 6c 20 75 73 65 64 20 2a 2f protocol used */
3d50: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 ..res = SSL_TLSE
3d60: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
3d70: 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 }.. cmdPtr
3d80: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
3d90: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c bj(statePtr->cal
3da0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f lback);. Tcl_
3db0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3dc0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3dd0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
3de0: 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 ngObj("alpn", -1
3df0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
3e00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3e10: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3e20: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3e30: 6a 28 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a 0a 20 j(*out, -1));..
3e40: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
3e50: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 (ClientData) int
3e60: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 erp);. Tcl_Pr
3e70: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
3e80: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a ta) statePtr);..
3e90: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
3ea0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
3eb0: 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 code = Tcl_Eva
3ec0: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 lObjEx(interp, c
3ed0: 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f mdPtr, TCL_EVAL_
3ee0: 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 GLOBAL);. if
3ef0: 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 (code != TCL_OK)
3f00: 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f {.#if (TCL_MAJO
3f10: 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 R_VERSION == 8)
3f20: 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 && (TCL_MINOR_VE
3f30: 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f RSION < 6)..Tcl_
3f40: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 BackgroundError(
3f50: 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 interp);.#else..
3f60: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 Tcl_BackgroundEx
3f70: 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 ception(interp,
3f80: 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 code);.#endif.
3f90: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 }. Tcl_Decr
3fa0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
3fb0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 ;.. Tcl_Relea
3fc0: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
3fd0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 statePtr);. T
3fe0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
3ff0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
4000: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b . return res;
4010: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 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 0a 20 2a -------------. *
4060: 0a 20 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b . * SNI Callback
4070: 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a for Servers --.
4080: 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 *. *.Perform se
4090: 72 76 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f rver-side SNI ho
40a0: 73 74 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e stname selection
40b0: 20 61 66 74 65 72 20 72 65 63 65 69 76 69 6e 67 after receiving
40c0: 20 53 4e 49 20 68 65 61 64 65 72 2e 0a 20 2a 09 SNI header.. *.
40d0: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 6c Called after hel
40e0: 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 lo callback but
40f0: 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c before ALPN call
4100: 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 back.. *. * Resu
4110: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
4120: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
4130: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
4140: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
4150: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
4160: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es:. *.SSL_TLSEX
4170: 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f T_ERR_OK: SNI ho
4180: 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74 stname is accept
4190: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 ed. The connecti
41a0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
41b0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
41c0: 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 ALERT_FATAL: SNI
41d0: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 hostname is not
41e0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 accepted. The c
41f0: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 onnection. *.
4200: 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66 is aborted. Def
4210: 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69 ault for alert i
4220: 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 s SSL_AD_UNRECOG
4230: 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 NIZED_NAME.. *.S
4240: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
4250: 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 ERT_WARNING: SNI
4260: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 hostname is not
4270: 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69 accepted, warni
4280: 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 ng alert. *.
4290: 73 65 6e 74 20 28 6e 6f 74 20 69 6e 20 54 4c 53 sent (not in TLS
42a0: 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e 65 v1.3). The conne
42b0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
42c0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
42d0: 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 6f RR_NOACK: SNI ho
42e0: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 stname is not ac
42f0: 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 61 cepted and not a
4300: 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a 09 cknowledged,. *.
4310: 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 20 e.g. if SNI
4320: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6e has not been con
4330: 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f 6e figured. The con
4340: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
4350: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d s.. *. *--------
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 0a 20 2a 2f 0a -----------. */.
43a0: 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 61 static int.SNICa
43b0: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
43c0: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 *ssl, int *aler
43d0: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a t, void *arg) {.
43e0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
43f0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
4400: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 g;. Tcl_Inter
4410: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
4420: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
4430: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
4440: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b r;. int code;
4450: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 . char *serve
4460: 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 rname = NULL;..
4470: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
4480: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
4490: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
44a0: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e k == (Tcl_Obj*)N
44b0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
44c0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
44d0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
44e0: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl == NULL) {.
44f0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
4500: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
4510: 20 20 7d 0a 0a 20 20 20 20 73 65 72 76 65 72 6e }.. servern
4520: 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 ame = SSL_get_se
4530: 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c rvername(ssl, TL
4540: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f SEXT_NAMETYPE_ho
4550: 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 st_name);. if
4560: 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c (!servername ||
4570: 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d servername[0] =
4580: 3d 20 27 5c 30 27 29 20 7b 0a 20 20 20 20 20 20 = '\0') {.
4590: 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 return SSL_TLS
45a0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
45b0: 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 }.. cmdPtr
45c0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
45d0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 Obj(statePtr->ca
45e0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c llback);. Tcl
45f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
4600: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
4610: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
4620: 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 ingObj("sni", -1
4630: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
4640: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
4650: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
4660: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
4670: 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 2d j(servername , -
4680: 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 1));.. Tcl_Pr
4690: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
46a0: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 ta) interp);.
46b0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 Tcl_Preserve((C
46c0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
46d0: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 Ptr);.. Tcl_I
46e0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
46f0: 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 tr);. code =
4700: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e Tcl_EvalObjEx(in
4710: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 terp, cmdPtr, TC
4720: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a L_EVAL_GLOBAL);.
4730: 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 if (code !=
4740: 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 TCL_OK) {.#if (T
4750: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e CL_MAJOR_VERSION
4760: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d == 8) && (TCL_M
4770: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 INOR_VERSION < 6
4780: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e )..Tcl_Backgroun
4790: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a dError(interp);.
47a0: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 #else..Tcl_Backg
47b0: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 roundException(i
47c0: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 nterp, code);.#e
47d0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 ndif. }. T
47e0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
47f0: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 cmdPtr);.. Tc
4800: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
4810: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
4820: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 ;. Tcl_Releas
4830: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
4840: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 nterp);. retu
4850: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
4860: 52 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d R_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 0a 20 2a 0a 20 2a 20 48 65 6c 6c 6f 20 48 --. *. * Hello H
48c0: 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62 61 63 andshake Callbac
48d0: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d k for Servers --
48e0: 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79 20 73 . *. *.Used by s
48f0: 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69 6e 65 erver to examine
4900: 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 the server name
4910: 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 indication (SNI
4920: 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 ) extension. *.p
4930: 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 63 rovided by the c
4940: 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 lient in order t
4950: 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70 70 72 o select an appr
4960: 6f 70 72 69 61 74 65 20 63 65 72 74 69 66 69 63 opriate certific
4970: 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73 65 6e ate to. *.presen
4980: 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68 65 t, and make othe
4990: 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 r configuration
49a0: 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c 65 adjustments rele
49b0: 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73 65 72 vant to that ser
49c0: 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 20 ver. *.name and
49d0: 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f its configuratio
49e0: 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73 n. This includes
49f0: 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20 74 68 swapping out th
4a00: 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 2a 09 e associated. *.
4a10: 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72 2c SSL_CTX pointer,
4a20: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73 modifying the s
4a30: 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f 66 20 erver's list of
4a40: 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20 76 65 permitted TLS ve
4a50: 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 rsions,. *.chang
4a60: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 ing the server's
4a70: 20 63 69 70 68 65 72 20 6c 69 73 74 20 69 6e 20 cipher list in
4a80: 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 response to the
4a90: 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65 72 20 client's cipher
4aa0: 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 0a 20 2a list, etc.. *. *
4ab0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
4ac0: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
4ad0: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 ects:. *.Calls c
4ae0: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 allback (if defi
4af0: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ned). *. * Retur
4b00: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f n codes:. *.SSL_
4b10: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 CLIENT_HELLO_RET
4b20: 52 59 20 3d 20 73 75 73 70 65 6e 64 20 74 68 65 RY = suspend the
4b30: 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 20 handshake, and
4b40: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 75 the handshake fu
4b50: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75 nction will retu
4b60: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20 rn immediately.
4b70: 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c *.SSL_CLIENT_HEL
4b80: 4c 4f 5f 45 52 52 4f 52 20 3d 20 66 61 69 6c 75 LO_ERROR = failu
4b90: 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f re, terminate co
4ba0: 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c nnection. Set al
4bb0: 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 ert to error cod
4bc0: 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 e.. *.SSL_CLIENT
4bd0: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 20 3d _HELLO_SUCCESS =
4be0: 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
4c40: 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 63 .HelloCallback(c
4c50: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 onst SSL *ssl, i
4c60: 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 nt *alert, void
4c70: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 *arg) {. Stat
4c80: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
4c90: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 tate*)arg;. T
4ca0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
4cb0: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
4cc0: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
4cd0: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 j *cmdPtr;. i
4ce0: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e nt code;. con
4cf0: 73 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e st char *servern
4d00: 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 ame;. const u
4d10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b nsigned char *p;
4d20: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c . size_t len,
4d30: 20 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 remaining;..
4d40: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
4d50: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ");.. if (sta
4d60: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
4d70: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
4d80: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
4d90: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 _CLIENT_HELLO_SU
4da0: 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 CCESS;. } els
4db0: 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c e if (ssl == NUL
4dc0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
4dd0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
4de0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
4df0: 2f 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a /* Get names */.
4e00: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 if (!SSL_cli
4e10: 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 ent_hello_get0_e
4e20: 78 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 xt(ssl, TLSEXT_T
4e30: 59 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c YPE_server_name,
4e40: 20 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 &p, &remaining)
4e50: 20 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d || remaining <=
4e60: 20 32 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 2) {. re
4e70: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
4e80: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
4e90: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 }.. /* Extra
4ea0: 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 ct the length of
4eb0: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 the supplied li
4ec0: 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a st of names. */.
4ed0: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b len = (*(p++
4ee0: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e ) << 8);. len
4ef0: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 += *(p++);.
4f00: 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 if (len + 2 != r
4f10: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 20 20 20 20 emaining) {.
4f20: 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 return SSL_C
4f30: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
4f40: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d R;. }. rem
4f50: 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 aining = len;..
4f60: 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 /* The list i
4f70: 6e 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 n practice only
4f80: 68 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 has a single ele
4f90: 6d 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 ment, so we only
4fa0: 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 consider the fi
4fb0: 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 rst one. */.
4fc0: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d if (remaining ==
4fd0: 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 0 || *p++ != TL
4fe0: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f SEXT_NAMETYPE_ho
4ff0: 73 74 5f 6e 61 6d 65 29 20 7b 0a 20 20 20 20 20 st_name) {.
5000: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c return SSL_CL
5010: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
5020: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 ;. }. rema
5030: 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a ining--;.. /*
5040: 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 69 6e 61 Now we can fina
5050: 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 lly pull out the
5060: 20 62 79 74 65 20 61 72 72 61 79 20 77 69 74 68 byte array with
5070: 20 74 68 65 20 61 63 74 75 61 6c 20 68 6f 73 74 the actual host
5080: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 name. */. if
5090: 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 (remaining <= 2)
50a0: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 {. retur
50b0: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
50c0: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
50d0: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b len = (*(p++
50e0: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e ) << 8);. len
50f0: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 += *(p++);.
5100: 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65 if (len + 2 > re
5110: 6d 61 69 6e 69 6e 67 29 20 7b 0a 20 20 20 20 20 maining) {.
5120: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c return SSL_CL
5130: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
5140: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 ;. }. rema
5150: 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 ining = len;.
5160: 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 servername = (c
5170: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a onst char *)p;..
5180: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
5190: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
51a0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
51b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
51c0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
51d0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
51e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
51f0: 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a ("hello", -1));.
5200: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
5210: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
5220: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
5230: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 _NewStringObj(se
5240: 72 76 65 72 6e 61 6d 65 2c 20 28 69 6e 74 29 20 rvername, (int)
5250: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f len));.. Tcl_
5260: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
5270: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
5280: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
5290: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
52a0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c tePtr);.. Tcl
52b0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
52c0: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 dPtr);. code
52d0: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 = Tcl_EvalObjEx(
52e0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
52f0: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
5300: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 ;. if (code !
5310: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 = TCL_OK) {.#if
5320: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 (TCL_MAJOR_VERSI
5330: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c ON == 8) && (TCL
5340: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c _MINOR_VERSION <
5350: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 6)..Tcl_Backgro
5360: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 undError(interp)
5370: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 ;.#else..Tcl_Bac
5380: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e kgroundException
5390: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a (interp, code);.
53a0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 #endif. }.
53b0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
53c0: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 t(cmdPtr);..
53d0: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
53e0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
53f0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 r);. Tcl_Rele
5400: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
5410: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 interp);. re
5420: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
5430: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 7d HELLO_SUCCESS;.}
5440: 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .../************
5450: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d ********/./* Com
5460: 6d 61 6e 64 73 20 20 20 20 20 20 20 20 20 2a 2f mands */
5470: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
5480: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54d0: 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f -. *. * CiphersO
54e0: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 bjCmd -- list av
54f0: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a ailable ciphers.
5500: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
5510: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
5520: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
5530: 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f tls::ciphers" co
5540: 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 mmand. *.to list
5550: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 available ciphe
5560: 72 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70 rs, based upon p
5570: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
5580: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
5590: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
55a0: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a cl result list..
55b0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
55c0: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 ts:. *.construct
55d0: 73 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53 s and destroys S
55e0: 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 SL context (CTX)
55f0: 0a 20 2a 0a 20 2a 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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
5640: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
5650: 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b *protocols[] = {
5660: 0a 09 22 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 .."ssl2", "ssl3"
5670: 2c 20 22 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e , "tls1", "tls1.
5680: 31 22 2c 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 1", "tls1.2", "t
5690: 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a ls1.3", NULL.};.
56a0: 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a enum protocol {.
56b0: 20 20 20 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c TLS_SSL2, TL
56c0: 53 5f 53 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 S_SSL3, TLS_TLS1
56d0: 2c 20 54 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c , TLS_TLS1_1, TL
56e0: 53 5f 54 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c S_TLS1_2, TLS_TL
56f0: 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d S1_3, TLS_NONE.}
5700: 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 69 ;..static int.Ci
5710: 70 68 65 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65 phersObjCmd(Clie
5720: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
5730: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
5740: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
5750: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
5760: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
5770: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 l_Obj *objPtr =
5780: 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54 NULL;. SSL_CT
5790: 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 X *ctx = NULL;.
57a0: 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 SSL *ssl = NU
57b0: 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 LL;. STACK_OF
57c0: 28 53 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b (SSL_CIPHER) *sk
57d0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 2c 20 ;. char *cp,
57e0: 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 buf[BUFSIZ];.
57f0: 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 int index, verb
5800: 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 ose = 0, use_sup
5810: 70 6f 72 74 65 64 20 3d 20 30 3b 0a 0a 20 20 20 ported = 0;..
5820: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
5830: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 ");.. if ((ob
5840: 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 jc < 2) || (objc
5850: 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 > 4)) {..Tcl_Wr
5860: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
5870: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f p, 1, objv, "pro
5880: 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 20 tocol ?verbose?
5890: 3f 73 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 ?supported?");..
58a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
58b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
58c0: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d Tcl_GetIndexFrom
58d0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
58e0: 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 [1], protocols,
58f0: 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 "protocol", 0, &
5900: 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b index) != TCL_OK
5910: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
5920: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
5930: 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 32 29 20 if ((objc > 2)
5940: 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 && Tcl_GetBoolea
5950: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c nFromObj(interp,
5960: 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72 62 6f objv[2], &verbo
5970: 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b se) != TCL_OK) {
5980: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
5990: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
59a0: 20 28 28 6f 62 6a 63 20 3e 20 33 29 20 26 26 20 ((objc > 3) &&
59b0: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 Tcl_GetBooleanFr
59c0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
59d0: 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 75 70 70 jv[3], &use_supp
59e0: 6f 72 74 65 64 29 20 21 3d 20 54 43 4c 5f 4f 4b orted) != TCL_OK
59f0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
5a00: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
5a10: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
5a20: 72 28 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 r();.. switch
5a30: 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c ((enum protocol
5a40: 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 73 65 20 )index) {..case
5a50: 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 4f 50 TLS_SSL2:.#if OP
5a60: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
5a70: 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 MBER >= 0x101000
5a80: 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 00L || defined(N
5a90: 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e O_SSL2) || defin
5aa0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
5ab0: 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 L2).. Tcl_App
5ac0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
5ad0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
5ae0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
5af0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
5b00: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
5b10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
5b20: 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 lse.. ctx = S
5b30: 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 32 SL_CTX_new(SSLv2
5b40: 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 _method()); brea
5b50: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 k;.#endif..case
5b60: 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 TLS_SSL3:.#if de
5b70: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c fined(NO_SSL3) |
5b80: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
5b90: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 L_NO_SSL3) || de
5ba0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
5bb0: 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 _SSL3_METHOD)..
5bc0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
5bd0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
5be0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
5bf0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
5c00: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
5c10: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
5c20: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 _ERROR;.#else..
5c30: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 ctx = SSL_CTX
5c40: 5f 6e 65 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f _new(SSLv3_metho
5c50: 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e d()); break;.#en
5c60: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c dif..case TLS_TL
5c70: 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 S1:.#if defined(
5c80: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 NO_TLS1) || defi
5c90: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
5ca0: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
5cb0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
5cc0: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c METHOD).. Tcl
5cd0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
5ce0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
5cf0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
5d00: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
5d10: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 d", NULL);..
5d20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
5d30: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 ;.#else.. ctx
5d40: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 = SSL_CTX_new(T
5d50: 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 LSv1_method());
5d60: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 break;.#endif..c
5d70: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a ase TLS_TLS1_1:.
5d80: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
5d90: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_1) || define
5da0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
5db0: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_1) || defined(
5dc0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
5dd0: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 1_METHOD).. T
5de0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
5df0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
5e00: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
5e10: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
5e20: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
5e30: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
5e40: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 OR;.#else.. c
5e50: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
5e60: 28 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 (TLSv1_1_method(
5e70: 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 )); break;.#endi
5e80: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 f..case TLS_TLS1
5e90: 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 _2:.#if defined(
5ea0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 NO_TLS1_2) || de
5eb0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
5ec0: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
5ed0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
5ee0: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 LS1_2_METHOD)..
5ef0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
5f00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
5f10: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
5f20: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
5f30: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
5f40: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
5f50: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 _ERROR;.#else..
5f60: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 ctx = SSL_CTX
5f70: 5f 6e 65 77 28 54 4c 53 76 31 5f 32 5f 6d 65 74 _new(TLSv1_2_met
5f80: 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 hod()); break;.#
5f90: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
5fa0: 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 TLS1_3:.#if defi
5fb0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c ned(NO_TLS1_3) |
5fc0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
5fd0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 L_NO_TLS1_3)..
5fe0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
5ff0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f lt(interp, proto
6000: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 cols[index], ":
6010: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
6020: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
6030: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
6040: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 ERROR;.#else..
6050: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f ctx = SSL_CTX_
6060: 6e 65 77 28 54 4c 53 5f 6d 65 74 68 6f 64 28 29 new(TLS_method()
6070: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 );. S
6080: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 SL_CTX_set_min_p
6090: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
60a0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
60b0: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
60c0: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 set_max_proto_ve
60d0: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f rsion(ctx, TLS1_
60e0: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 3_VERSION);..
60f0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
6100: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 62 72 default:.. br
6110: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 eak;. }. i
6120: 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 f (ctx == NULL)
6130: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
6140: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 ult(interp, REAS
6150: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ON(), NULL);..re
6160: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6170: 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d }.. ssl =
6180: 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 SSL_new(ctx);.
6190: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 if (ssl == NU
61a0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
61b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
61c0: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b REASON(), NULL);
61d0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
61e0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c tx);..return TCL
61f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
6200: 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 /* Use list a
6210: 6e 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c nd order as woul
6220: 64 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43 d be sent in a C
6230: 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c lientHello or al
6240: 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 l available ciph
6250: 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 ers */. if (u
6260: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a se_supported) {.
6270: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 .sk = SSL_get1_s
6280: 75 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73 upported_ciphers
6290: 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 (ssl);. } els
62a0: 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 e {..sk = SSL_ge
62b0: 74 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a t_ciphers(ssl);.
62c0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
62d0: 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 k != NULL) {..if
62e0: 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 (!verbose) {..
62f0: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
6300: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
6310: 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 LL);.. for (i
6320: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b nt i = 0; i < sk
6330: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 _SSL_CIPHER_num(
6340: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f sk); i++) {...co
6350: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a nst SSL_CIPHER *
6360: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 c = sk_SSL_CIPHE
6370: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a R_value(sk, i);.
6380: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 ..if (c == NULL)
6390: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a continue;..../*
63a0: 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 cipher name or
63b0: 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d (NONE) */...cp =
63c0: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
63d0: 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63 name(c);...if (c
63e0: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b p == NULL) break
63f0: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 ;...Tcl_ListObjA
6400: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
6410: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
6420: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 _NewStringObj(cp
6430: 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a , -1));.. }..
6440: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f .} else {.. o
6450: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 bjPtr = Tcl_NewS
6460: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a tringObj("",0);.
6470: 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 . for (int i
6480: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f = 0; i < sk_SSL_
6490: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 CIPHER_num(sk);
64a0: 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 i++) {...const S
64b0: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 SL_CIPHER *c = s
64c0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c k_SSL_CIPHER_val
64d0: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 ue(sk, i);...if
64e0: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 (c == NULL) cont
64f0: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 inue;..../* text
6500: 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 ual description
6510: 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f of the cipher */
6520: 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 ...if (SSL_CIPHE
6530: 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 2c R_description(c,
6540: 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 buf, sizeof(buf
6550: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 )) != NULL) {...
6560: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f Tcl_AppendTo
6570: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c Obj(objPtr, buf,
6580: 20 28 69 6e 74 29 20 73 74 72 6c 65 6e 28 62 75 (int) strlen(bu
6590: 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a f));...} else {.
65a0: 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
65b0: 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 ToObj(objPtr, "U
65c0: 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 NKNOWN\n", 8);..
65d0: 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 .}.. }..}..if
65e0: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 (use_supported)
65f0: 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 {.. sk_SSL_C
6600: 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a IPHER_free(sk);.
6610: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c .}. }. SSL
6620: 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 _free(ssl);.
6630: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
6640: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f );.. Tcl_SetO
6650: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
6660: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 objPtr);. re
6670: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c turn TCL_OK;..cl
6680: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
6690: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a tData;.}.../*. *
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 2d 2d 2d 2d 2d 2d ----------------
66e0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 ---. *. * Protoc
66f0: 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 olsObjCmd -- lis
6700: 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 t available prot
6710: 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 ocols. *. *.This
6720: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e procedure is in
6730: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 voked to process
6740: 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f the "tls::proto
6750: 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a cols" command. *
6760: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 .to list availab
6770: 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a le protocols.. *
6780: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
6790: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
67a0: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 esult list.. *.
67b0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
67c0: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *.none. *. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6810: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
6820: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 ProtocolsObjCmd(
6830: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
6840: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
6850: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
6860: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
6870: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
6880: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
6890: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 r;.. dprintf(
68a0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
68b0: 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b if (objc != 1) {
68c0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
68d0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
68e0: 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e jv, "");..return
68f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
6900: 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 }.. objPtr =
6910: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
6920: 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 , NULL);..#if OP
6930: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
6940: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
6950: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
6960: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
6970: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
6980: 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 SL2). Tcl_Lis
6990: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
69a0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
69b0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
69c0: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
69d0: 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 _SSL2], -1));.#e
69e0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
69f0: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 d(NO_SSL3) && !d
6a00: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
6a10: 4f 5f 53 53 4c 33 29 0a 20 20 20 20 54 63 6c 5f O_SSL3). Tcl_
6a20: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
6a30: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
6a40: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
6a50: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
6a60: 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b TLS_SSL3], -1));
6a70: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
6a80: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 ined(NO_TLS1) &&
6a90: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
6aa0: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 54 L_NO_TLS1). T
6ab0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
6ac0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
6ad0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
6ae0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
6af0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 ls[TLS_TLS1], -1
6b00: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
6b10: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
6b20: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
6b30: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
6b40: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
6b50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
6b60: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
6b70: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
6b80: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c protocols[TLS_TL
6b90: 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e S1_1], -1));.#en
6ba0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
6bb0: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 (NO_TLS1_2) && !
6bc0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
6bd0: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 54 NO_TLS1_2). T
6be0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
6bf0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
6c00: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
6c10: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
6c20: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 ls[TLS_TLS1_2],
6c30: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 -1));.#endif.#if
6c40: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
6c50: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
6c60: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
6c70: 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 _3). Tcl_List
6c80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
6c90: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
6ca0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
6cb0: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f j(protocols[TLS_
6cc0: 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 TLS1_3], -1));.#
6cd0: 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 endif.. Tcl_S
6ce0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
6cf0: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
6d00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
6d10: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
6d20: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
6d30: 0a 20 2a 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 2d 2d 2d ----------------
6d70: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e ------. *. * Han
6d80: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a dshakeObjCmd --.
6d90: 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 *. *.This comma
6da0: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 nd is used to ve
6db0: 72 69 66 79 20 77 68 65 74 68 65 72 20 74 68 65 rify whether the
6dc0: 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f handshake is co
6dd0: 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 mplete. *.or not
6de0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
6df0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
6e00: 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 cl result. 1 mea
6e10: 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d ns handshake com
6e20: 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 plete, 0 means p
6e30: 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 ending.. *. * Si
6e40: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d de effects:. *.M
6e50: 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 ay force SSL neg
6e60: 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 otiation to take
6e70: 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d place.. *. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ec0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 . */.static int
6ed0: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 HandshakeObjCmd(
6ee0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
6ef0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
6f00: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
6f10: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
6f20: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
6f30: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
6f40: 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 an; /* Th
6f50: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 e channel to set
6f60: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 a mode on. */.
6f70: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
6f80: 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c tr; /* cl
6f90: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 ient state for s
6fa0: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 sl socket */.
6fb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 const char *err
6fc0: 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 Str = NULL;.
6fd0: 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 int ret = 1;.
6fe0: 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20 int err = 0;..
6ff0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
7000: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
7010: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
7020: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
7030: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
7040: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
7050: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
7060: 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d }.. chan =
7070: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
7080: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
7090: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
70a0: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c v[1], NULL), NUL
70b0: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e L);. if (chan
70c0: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
70d0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
70e0: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
70f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
7100: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
7110: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
7120: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
7130: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
7140: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 Channel(chan);.
7150: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
7160: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
7170: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
7180: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
7190: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
71a0: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
71b0: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
71c0: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20 22 5c elName(chan), "\
71d0: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
71e0: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 nnel", NULL);..r
71f0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
7200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 ;. }. stat
7210: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
7220: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e Tcl_GetChannelIn
7230: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 stanceData(chan)
7240: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
7250: 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 Calling Tls_Wait
7260: 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 ForConnect");.
7270: 20 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 ret = Tls_Wait
7280: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 ForConnect(state
7290: 50 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 Ptr, &err, 1);.
72a0: 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f dprintf("Tls_
72b0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 WaitForConnect r
72c0: 65 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 eturned: %i", re
72d0: 74 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 t);.. if (ret
72e0: 20 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 50 < 0 && ((stateP
72f0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f tr->flags & TLS_
7300: 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 TCL_ASYNC) && (e
7310: 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 rr == EAGAIN)))
7320: 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e {..dprintf("Asyn
7330: 63 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 c set and err =
7340: 45 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d EAGAIN");..ret =
7350: 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 0;. } else i
7360: 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 65 f (ret < 0) {..e
7370: 72 72 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 rrStr = statePtr
7380: 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 ->err;..Tcl_Rese
7390: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b tResult(interp);
73a0: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 ..Tcl_SetErrno(e
73b0: 72 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 rr);...if (!errS
73c0: 74 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d tr || (*errStr =
73d0: 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72 = 0)) {.. err
73e0: 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 Str = Tcl_PosixE
73f0: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d rror(interp);..}
7400: 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
7410: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e ult(interp, "han
7420: 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 dshake failed: "
7430: 2c 20 65 72 72 53 74 72 2c 20 28 63 68 61 72 20 , errStr, (char
7440: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e *) NULL);..dprin
7450: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 tf("Returning TC
7460: 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e L_ERROR with han
7470: 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 dshake failed: %
7480: 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 s", errStr);..re
7490: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
74a0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 . } else {..i
74b0: 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 f (err != 0) {..
74c0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 dprintf("Got
74d0: 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 an error with a
74e0: 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 completed hands
74f0: 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c hake: err = %i",
7500: 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d err);..}..ret =
7510: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 1;. }.. d
7520: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
7530: 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 g TCL_OK with da
7540: 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 ta \"%i\"", ret)
7550: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a ;. Tcl_SetObj
7560: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
7570: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 cl_NewIntObj(ret
7580: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 ));. return(T
7590: 43 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 CL_OK);..clientD
75a0: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 ata = clientData
75b0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
7600: 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 . * ImportObjCmd
7610: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 --. *. *.This p
7620: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
7630: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 ked to process t
7640: 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 he "ssl" command
7650: 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 . *. *.The ssl c
7660: 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53 ommand pushes SS
7670: 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20 L over a (newly
7680: 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73 connected) tcp s
7690: 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 ocket. *. * Resu
76a0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
76b0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
76c0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
76d0: 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 s:. *.May modify
76e0: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 the behavior of
76f0: 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a an IO channel..
7700: 20 2a 0a 20 2a 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 2d ----------------
7740: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
7750: 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 tic int.ImportOb
7760: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
7770: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
7780: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
7790: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
77a0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
77b0: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e {. Tcl_Chann
77c0: 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 el chan;../* The
77d0: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 channel to set
77e0: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 a mode on. */.
77f0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
7800: 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 r;../* client st
7810: 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b ate for ssl sock
7820: 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 et */. SSL_CT
7830: 58 20 2a 63 74 78 09 20 20 20 20 20 20 20 20 3d X *ctx. =
7840: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f NULL;. Tcl_O
7850: 62 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20 20 bj *script.
7860: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 = NULL;. T
7870: 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 cl_Obj *password
7880: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
7890: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
78a0: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 upperChannelTra
78b0: 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 nslation, upperC
78c0: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 hannelBlocking,
78d0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
78e0: 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e ding, upperChann
78f0: 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 elEOFChar;. i
7900: 6e 74 20 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 nt idx, len;.
7910: 20 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20 20 int flags..
7920: 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e = TLS_TCL_IN
7930: 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 IT;. int serv
7940: 65 72 09 09 20 20 20 20 20 20 20 20 3d 20 30 3b er.. = 0;
7950: 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f ./* is connectio
7960: 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 n incoming or ou
7970: 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 tgoing? */. c
7980: 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 20 har *keyfile.
7990: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
79a0: 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09 char *certfile.
79b0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
79c0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
79d0: 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b r *key .= NULL;
79e0: 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e . int key_len
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7a00: 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e = 0;. unsign
7a10: 65 64 20 63 68 61 72 20 2a 63 65 72 74 20 20 20 ed char *cert
7a20: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
7a30: 20 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 20 20 int cert_len
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 =
7a50: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 0;. char *cip
7a60: 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e hers. = N
7a70: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 ULL;. char *c
7a80: 69 70 68 65 72 73 75 69 74 65 73 09 20 20 20 20 iphersuites.
7a90: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
7aa0: 63 68 61 72 20 2a 43 41 66 69 6c 65 09 20 20 20 char *CAfile.
7ab0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
7ac0: 20 63 68 61 72 20 2a 43 41 64 69 72 09 09 20 20 char *CAdir..
7ad0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
7ae0: 20 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 char *DHparams
7af0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
7b00: 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c . char *model
7b10: 09 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c .. = NULL
7b20: 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 ;. char *serv
7b30: 65 72 6e 61 6d 65 09 20 20 20 20 20 20 20 20 3d ername. =
7b40: 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 NULL;./* hostna
7b50: 6d 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 me for Server Na
7b60: 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f me Indication */
7b70: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
7b80: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f ned char *sessio
7b90: 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 n_id = NULL;.
7ba0: 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 Tcl_Obj *alpn..
7bb0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 = NULL;. int
7bc0: 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d ssl2 = 0, ssl3 =
7bd0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 0;. int tls1
7be0: 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 = 1, tls1_1 = 1
7bf0: 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c , tls1_2 = 1, tl
7c00: 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e s1_3 = 1;. in
7c10: 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 t proto = 0, lev
7c20: 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 el = -1;. int
7c30: 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 verify = 0, req
7c40: 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 uire = 0, reques
7c50: 74 20 3d 20 31 3b 0a 0a 20 20 20 20 64 70 72 69 t = 1;.. dpri
7c60: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
7c70: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
7c80: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
7c90: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 0100000L && !def
7ca0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
7cb0: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 SSL2) && !define
7cc0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 d(NO_SSL2) && de
7cd0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
7ce0: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 & defined(NO_TLS
7cf0: 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 1) && defined(NO
7d00: 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 65 66 69 _TLS1_1) && defi
7d10: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 ned(NO_TLS1_2) &
7d20: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 & defined(NO_TLS
7d30: 31 5f 33 29 0a 20 20 20 20 73 73 6c 32 20 3d 20 1_3). ssl2 =
7d40: 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 1;.#endif.#if !d
7d50: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7d60: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
7d70: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 ned(NO_SSL3) &&
7d80: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
7d90: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 && defined(NO_T
7da0: 4c 53 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 LS1) && defined(
7db0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 65 NO_TLS1_1) && de
7dc0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
7dd0: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 && defined(NO_T
7de0: 4c 53 31 5f 33 29 0a 20 20 20 20 73 73 6c 33 20 LS1_3). ssl3
7df0: 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 1;.#endif.#if
7e00: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
7e10: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7e20: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 SSL_NO_TLS1).
7e30: 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 tls1 = 0;.#endi
7e40: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
7e50: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
7e60: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
7e70: 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f LS1_1). tls1_
7e80: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 1 = 0;.#endif.#i
7e90: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
7ea0: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
7eb0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
7ec0: 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 2). tls1_2 =
7ed0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 0;.#endif.#if de
7ee0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
7ef0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7f00: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
7f10: 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 tls1_3 = 0;.#
7f20: 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f endif.. if (o
7f30: 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f bjc < 2) {..Tcl_
7f40: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
7f50: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
7f60: 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f hannel ?options?
7f70: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
7f80: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
7f90: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
7fa0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
7fb0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
7fc0: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 mObj(objv[1], NU
7fd0: 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 LL), NULL);.
7fe0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
7ff0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
8000: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
8010: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
8020: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
8030: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
8040: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
8050: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
8060: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
8070: 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 han);.. for (
8080: 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f idx = 2; idx < o
8090: 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 bjc; idx++) {..c
80a0: 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 har *opt = Tcl_G
80b0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
80c0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 objv[idx], NULL)
80d0: 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 ;...if (opt[0] !
80e0: 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 = '-').. brea
80f0: 6b 3b 0a 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 k;...OPTSTR("-ca
8100: 64 69 72 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f dir", CAdir);..O
8110: 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c PTSTR("-cafile",
8120: 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 CAfile);..OPTST
8130: 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 R("-certfile", c
8140: 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 ertfile);..OPTST
8150: 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 R("-cipher", cip
8160: 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 hers);..OPTSTR("
8170: 2d 63 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 -ciphers", ciphe
8180: 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 rs);..OPTSTR("-c
8190: 69 70 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 iphersuites", ci
81a0: 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 phersuites);..OP
81b0: 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c TOBJ("-command",
81c0: 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 script);..OPTST
81d0: 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 R("-dhparams", D
81e0: 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 53 54 Hparams);..OPTST
81f0: 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 R("-keyfile", ke
8200: 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 yfile);..OPTSTR(
8210: 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 "-model", model)
8220: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 ;..OPTOBJ("-pass
8230: 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 word", password)
8240: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 ;..OPTBOOL("-req
8250: 75 69 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b uire", require);
8260: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 ..OPTBOOL("-requ
8270: 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a est", request);.
8280: 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 .OPTINT("-securi
8290: 74 79 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 tylevel", level)
82a0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 ;..OPTBOOL("-ser
82b0: 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 ver", server);..
82c0: 4f 50 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e OPTSTR("-servern
82d0: 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 ame", servername
82e0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73 );..OPTSTR("-ses
82f0: 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f sion_id", sessio
8300: 6e 5f 69 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 n_id);..OPTOBJ("
8310: 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 -alpn", alpn);..
8320: 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c OPTBOOL("-ssl2",
8330: 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c ssl2);..OPTBOOL
8340: 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b ("-ssl3", ssl3);
8350: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 ..OPTBOOL("-tls1
8360: 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f ", tls1);..OPTBO
8370: 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c OL("-tls1.1", tl
8380: 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 s1_1);..OPTBOOL(
8390: 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f "-tls1.2", tls1_
83a0: 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 2);..OPTBOOL("-t
83b0: 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b ls1.3", tls1_3);
83c0: 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 ..OPTBYTE("-cert
83d0: 22 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 ", cert, cert_le
83e0: 6e 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b n);..OPTBYTE("-k
83f0: 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 ey", key, key_le
8400: 6e 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 n);...OPTBAD("op
8410: 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d tion", "-alpn, -
8420: 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 cadir, -cafile,
8430: 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 -cert, -certfile
8440: 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68 , -cipher, -ciph
8450: 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 ersuites, -comma
8460: 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d nd, -dhparams, -
8470: 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d key, -keyfile, -
8480: 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 model, -password
8490: 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 72 65 71 , -require, -req
84a0: 75 65 73 74 2c 20 2d 73 65 63 75 72 69 74 79 6c uest, -securityl
84b0: 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d evel, -server, -
84c0: 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 servername, -ses
84d0: 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 sion_id, -ssl2,
84e0: 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 -ssl3, -tls1, -t
84f0: 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 ls1.1, -tls1.2,
8500: 6f 72 20 2d 74 6c 73 31 2e 33 22 29 3b 0a 0a 09 or -tls1.3");...
8510: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
8520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
8530: 72 65 71 75 65 73 74 29 09 20 20 20 20 76 65 72 request). ver
8540: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 ify |= SSL_VERIF
8550: 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 Y_CLIENT_ONCE |
8560: 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b SSL_VERIFY_PEER;
8570: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 . if (request
8580: 20 26 26 20 72 65 71 75 69 72 65 29 20 76 65 72 && require) ver
8590: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 ify |= SSL_VERIF
85a0: 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 Y_FAIL_IF_NO_PEE
85b0: 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 R_CERT;. if (
85c0: 76 65 72 69 66 79 20 3d 3d 20 30 29 09 76 65 72 verify == 0).ver
85d0: 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 ify = SSL_VERIFY
85e0: 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 _NONE;.. prot
85f0: 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 o |= (ssl2 ? TLS
8600: 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 _PROTO_SSL2 : 0)
8610: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
8620: 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f ssl3 ? TLS_PROTO
8630: 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 _SSL3 : 0);.
8640: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f proto |= (tls1 ?
8650: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 TLS_PROTO_TLS1
8660: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
8670: 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 |= (tls1_1 ? TLS
8680: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 _PROTO_TLS1_1 :
8690: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
86a0: 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 (tls1_2 ? TLS_P
86b0: 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 ROTO_TLS1_2 : 0)
86c0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
86d0: 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f tls1_3 ? TLS_PRO
86e0: 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a TO_TLS1_3 : 0);.
86f0: 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f . /* reset to
8700: 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 NULL if blank s
8710: 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a tring provided *
8720: 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 26 /. if (cert &
8730: 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 20 & !*cert)..
8740: 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20 20 cert.
8750: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
8760: 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20 key && !*key)..
8770: 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 20 key.
8780: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
8790: 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 21 f (certfile && !
87a0: 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 20 *certfile)
87b0: 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 certfile.= NU
87c0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66 LL;. if (keyf
87d0: 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 ile && !*keyfile
87e0: 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20 )..keyfile.
87f0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
8800: 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21 2a f (ciphers && !*
8810: 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20 20 ciphers).
8820: 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 ciphers.
8830: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
8840: 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26 26 (ciphersuites &&
8850: 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73 29 !*ciphersuites)
8860: 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20 20 ciphersuites
8870: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
8880: 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66 (CAfile && !*CAf
8890: 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 66 ile). CAf
88a0: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ile. = NU
88b0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 64 69 LL;. if (CAdi
88c0: 72 20 26 26 20 21 2a 43 41 64 69 72 29 09 20 20 r && !*CAdir).
88d0: 20 20 20 20 20 20 43 41 64 69 72 09 20 20 20 20 CAdir.
88e0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
88f0: 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20 if (DHparams &&
8900: 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20 !*DHparams).
8910: 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20 DHparams
8920: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 = NULL;..
8930: 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74 /* new SSL stat
8940: 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 e */. statePt
8950: 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63 r..= (State *) c
8960: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 kalloc((unsigned
8970: 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 ) sizeof(State))
8980: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61 ;. memset(sta
8990: 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 tePtr, 0, sizeof
89a0: 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 (State));.. s
89b0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d tatePtr->flags.=
89c0: 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74 flags;. stat
89d0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 ePtr->interp.= i
89e0: 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 nterp;. state
89f0: 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 Ptr->vflags.= ve
8a00: 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50 rify;. stateP
8a10: 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 tr->err.= "";..
8a20: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 /* allocate s
8a30: 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 cript */. if
8a40: 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 (script) {..(voi
8a50: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 d) Tcl_GetString
8a60: 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 FromObj(script,
8a70: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 &len);..if (len)
8a80: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 {.. statePtr
8a90: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 ->callback = scr
8aa0: 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e ipt;.. Tcl_In
8ab0: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
8ac0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
8ad0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
8ae0: 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f allocate passwo
8af0: 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 rd */. if (pa
8b00: 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 ssword) {..(void
8b10: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 ) Tcl_GetStringF
8b20: 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c romObj(password,
8b30: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e &len);..if (len
8b40: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 ) {.. statePt
8b50: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61 r->password = pa
8b60: 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c ssword;.. Tcl
8b70: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _IncrRefCount(st
8b80: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
8b90: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
8ba0: 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 if (model != NU
8bb0: 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b LL) {..int mode;
8bc0: 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f ../* Get the "mo
8bd0: 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a del" context */.
8be0: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 .chan = Tcl_GetC
8bf0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d hannel(interp, m
8c00: 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 odel, &mode);..i
8c10: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
8c20: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
8c30: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
8c40: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
8c50: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
8c60: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
8c70: 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 *.. * Make sure
8c80: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
8c90: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
8ca0: 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 l.. */..chan = T
8cb0: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
8cc0: 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c (chan);..if (Tcl
8cd0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
8ce0: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
8cf0: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 nnelType()) {..
8d00: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
8d10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
8d20: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
8d30: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
8d40: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e (chan),..."\": n
8d50: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
8d60: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 ", NULL);.. T
8d70: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
8d80: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
8d90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
8da0: 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 R;..}..ctx = ((S
8db0: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 tate *)Tcl_GetCh
8dc0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
8dd0: 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 a(chan))->ctx;.
8de0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
8df0: 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 ((ctx = CTX_Init
8e00: 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 (statePtr, serve
8e10: 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c r, proto, keyfil
8e20: 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 e, certfile, key
8e30: 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c , cert, key_len,
8e40: 0a 09 20 20 20 20 63 65 72 74 5f 6c 65 6e 2c 20 .. cert_len,
8e50: 43 41 64 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 CAdir, CAfile, c
8e60: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 73 75 iphers, ciphersu
8e70: 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 ites, level, DHp
8e80: 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 arams)) == NULL)
8e90: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 {.. Tls_Free
8ea0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
8eb0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
8ec0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 TCL_ERROR;..}.
8ed0: 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 }.. stateP
8ee0: 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a tr->ctx = ctx;..
8ef0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 /*. * We
8f00: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 need to make su
8f10: 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e re that the chan
8f20: 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e nel works in bin
8f30: 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 ary (for the.
8f40: 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e * encryption n
8f50: 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 ot to get goofed
8f60: 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 up).. * We
8f70: 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a only want to adj
8f80: 75 73 74 20 74 68 65 20 62 75 66 66 65 72 69 6e ust the bufferin
8f90: 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e g in pre-v2 chan
8fa0: 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20 nels, where.
8fb0: 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 * each channel
8fc0: 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69 in the stack mai
8fd0: 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 ntained its own
8fe0: 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f buffers.. */
8ff0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
9000: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
9010: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a elTranslation);.
9020: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
9030: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
9040: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 lBlocking);.
9050: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
9060: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
9070: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 Char);. Tcl_D
9080: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
9090: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
90a0: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
90b0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
90c0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 rp, chan, "-eofc
90d0: 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e har", &upperChan
90e0: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 nelEOFChar);.
90f0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
9100: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
9110: 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c an, "-encoding",
9120: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e &upperChannelEn
9130: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c coding);. Tcl
9140: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
9150: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
9160: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 "-translation",
9170: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 &upperChannelTra
9180: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 nslation);. T
9190: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
91a0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
91b0: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 , "-blocking", &
91c0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
91d0: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 king);. Tcl_S
91e0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
91f0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
9200: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 translation", "b
9210: 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c inary");. Tcl
9220: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
9230: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
9240: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 "-blocking", "tr
9250: 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 ue");. dprint
9260: 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c f("Consuming Tcl
9270: 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 channel %s", Tc
9280: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
9290: 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 (chan));. sta
92a0: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 tePtr->self = Tc
92b0: 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 l_StackChannel(i
92c0: 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e nterp, Tls_Chann
92d0: 65 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e elType(), (Clien
92e0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c tData) statePtr,
92f0: 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c (TCL_READABLE |
9300: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 TCL_WRITABLE),
9310: 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e chan);. dprin
9320: 74 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e tf("Created chan
9330: 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 nel named %s", T
9340: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
9350: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
9360: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 ));. if (stat
9370: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 ePtr->self == (T
9380: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
9390: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 ) {../*.. * No u
93a0: 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 se of Tcl_Eventu
93b0: 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 allyFree because
93c0: 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c no possible Tcl
93d0: 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a _Preserve... */.
93e0: 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 .Tls_Free((char
93f0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 *) statePtr);..r
9400: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
9410: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f . }.. Tcl_
9420: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
9430: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
9440: 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 r->self, "-trans
9450: 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 lation", Tcl_DSt
9460: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
9470: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
9480: 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 on));. Tcl_Se
9490: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
94a0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
94b0: 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e >self, "-encodin
94c0: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 g", Tcl_DStringV
94d0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
94e0: 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 elEncoding));.
94f0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
9500: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 Option(interp, s
9510: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 tatePtr->self, "
9520: 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 -eofchar", Tcl_D
9530: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
9540: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
9550: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ));. Tcl_SetC
9560: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
9570: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
9580: 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 elf, "-blocking"
9590: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
95a0: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ue(&upperChannel
95b0: 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 Blocking));..
95c0: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 /*. * SSL I
95d0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 nitialization.
95e0: 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 */. stateP
95f0: 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 tr->ssl = SSL_ne
9600: 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 w(statePtr->ctx)
9610: 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65 ;. if (!state
9620: 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 Ptr->ssl) {../*
9630: 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f SSL library erro
9640: 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 r */..Tcl_Append
9650: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
9660: 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 couldn't constru
9670: 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 ct ssl session:
9680: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 ", REASON(), (ch
9690: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c ar *) NULL);..Tl
96a0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
96b0: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 statePtr);..retu
96c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
96d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 }.. /* Set
96e0: 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 host server name
96f0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 */. if (serv
9700: 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 ername) {../* Se
9710: 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 ts the server na
9720: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 me indication (S
9730: 4e 49 29 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 NI) ClientHello
9740: 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 69 66 extension */..if
9750: 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 (!SSL_set_tlsex
9760: 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 t_host_name(stat
9770: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 ePtr->ssl, serve
9780: 72 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 rname) && requir
9790: 65 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 e) {.. Tcl_Ap
97a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
97b0: 70 2c 20 22 73 65 74 74 69 6e 67 20 54 4c 53 20 p, "setting TLS
97c0: 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 65 6e 73 host name extens
97d0: 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20 28 63 68 ion failed", (ch
97e0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 ar *) NULL);.
97f0: 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72 65 Tls_Fre
9800: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
9810: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 Ptr);.
9820: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
9830: 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 09 OR;. }...
9840: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 73 65 72 /* Configure ser
9850: 76 65 72 20 68 6f 73 74 20 6e 61 6d 65 20 63 68 ver host name ch
9860: 65 63 6b 73 20 69 6e 20 74 68 65 20 53 53 4c 20 ecks in the SSL
9870: 63 6c 69 65 6e 74 2e 20 53 65 74 20 44 4e 53 20 client. Set DNS
9880: 68 6f 73 74 6e 61 6d 65 20 74 6f 0a 09 20 20 20 hostname to..
9890: 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 name for peer ce
98a0: 72 74 69 66 69 63 61 74 65 20 63 68 65 63 6b 73 rtificate checks
98b0: 2e 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 . SSL_set1_host
98c0: 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e has limitations.
98d0: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 */..if (!SSL_ad
98e0: 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 d1_host(statePtr
98f0: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d ->ssl, servernam
9900: 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 e)) {.. Tcl_A
9910: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
9920: 72 70 2c 20 22 73 65 74 74 69 6e 67 20 44 4e 53 rp, "setting DNS
9930: 20 68 6f 73 74 20 6e 61 6d 65 20 66 61 69 6c 65 host name faile
9940: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
9950: 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 L);.
9960: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
9970: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 ) statePtr);.
9980: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 return
9990: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
99a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 }.. /* Resu
99b0: 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f me session id */
99c0: 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e . if (session
99d0: 5f 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 _id && strlen(se
99e0: 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c ssion_id) <= SSL
99f0: 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e _MAX_SID_CTX_LEN
9a00: 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 GTH) {../* SSL_s
9a10: 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a et_session() */.
9a20: 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f .if (!SSL_SESSIO
9a30: 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 N_set1_id_contex
9a40: 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f t(SSL_get_sessio
9a50: 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 n(statePtr->ssl)
9a60: 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 , session_id, (u
9a70: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 nsigned int) str
9a80: 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 len(session_id))
9a90: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
9aa0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
9ab0: 2c 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f , "Resume sessio
9ac0: 6e 20 69 64 20 22 2c 20 73 65 73 73 69 6f 6e 5f n id ", session_
9ad0: 69 64 2c 20 22 20 66 61 69 6c 65 64 22 2c 20 28 id, " failed", (
9ae0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 char *) NULL);.
9af0: 20 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 Tls_F
9b00: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
9b10: 74 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 tePtr);.
9b20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
9b30: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a RROR;..}. }..
9b40: 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a if (alpn) {.
9b50: 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 63 ./* Convert a Tc
9b60: 6c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 l list into a pr
9b70: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 otocol-list in w
9b80: 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 ire-format */..u
9b90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 nsigned char *pr
9ba0: 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 otos, *p;..unsig
9bb0: 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c ned int protos_l
9bc0: 65 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 en = 0;..int i,
9bd0: 6c 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f len, cnt;..Tcl_O
9be0: 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 bj **list;...if
9bf0: 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 (Tcl_ListObjGetE
9c00: 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 lements(interp,
9c10: 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 alpn, &cnt, &lis
9c20: 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a t) != TCL_OK) {.
9c30: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
9c40: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
9c50: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
9c60: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a L_ERROR;..}.../*
9c70: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d Determine the m
9c80: 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 emory required f
9c90: 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d or the protocol-
9ca0: 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 list */..for (i
9cb0: 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b = 0; i < cnt; i+
9cc0: 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 +) {.. Tcl_Ge
9cd0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c tStringFromObj(l
9ce0: 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 ist[i], &len);..
9cf0: 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 if (len > 25
9d00: 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 5) {...Tcl_Appen
9d10: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
9d20: 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e "ALPN protocol n
9d30: 61 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 ame too long", (
9d40: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
9d50: 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 .Tls_Free((char
9d60: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 *) statePtr);...
9d70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
9d80: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 ;.. }.. pr
9d90: 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 otos_len += 1 +
9da0: 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 len;..}.../* Bui
9db0: 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 ld the complete
9dc0: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f protocol-list */
9dd0: 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c ..protos = ckall
9de0: 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a oc(protos_len);.
9df0: 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 ./* protocol-lis
9e00: 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d ts consist of 8-
9e10: 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 bit length-prefi
9e20: 78 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 xed, byte string
9e30: 73 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 s */..for (i = 0
9e40: 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 , p = protos; i
9e50: 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 < cnt; i++) {..
9e60: 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 char *str = T
9e70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
9e80: 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 Obj(list[i], &le
9e90: 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 n);.. *p++ =
9ea0: 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 len;.. memcpy
9eb0: 28 70 2c 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 (p, str, len);..
9ec0: 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d p += len;..}
9ed0: 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c .../* SSL_set_al
9ee0: 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 pn_protos makes
9ef0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 a copy of the pr
9f00: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 otocol-list */..
9f10: 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 /* Note: This fu
9f20: 6e 63 74 69 6f 6e 73 20 72 65 76 65 72 73 65 73 nctions reverses
9f30: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 the return valu
9f40: 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a e convention */.
9f50: 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 .if (SSL_set_alp
9f60: 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 n_protos(statePt
9f70: 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 r->ssl, protos,
9f80: 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 protos_len)) {..
9f90: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
9fa0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 66 61 sult(interp, "fa
9fb0: 69 6c 65 64 20 74 6f 20 73 65 74 20 41 4c 50 4e iled to set ALPN
9fc0: 20 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 protocols", (ch
9fd0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
9fe0: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
9ff0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
a000: 20 20 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f ckfree(proto
a010: 73 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 s);.. return
a020: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 TCL_ERROR;..}...
a030: 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f /* Store protoco
a040: 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 ls list */..stat
a050: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 ePtr->protos = p
a060: 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 rotos;..statePtr
a070: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 ->protos_len = p
a080: 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d rotos_len;. }
a090: 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 else {..statePt
a0a0: 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c r->protos = NULL
a0b0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f ;..statePtr->pro
a0c0: 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 tos_len = 0;.
a0d0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 }.. /*.
a0e0: 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a * SSL Callbacks.
a0f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f */. SSL_
a100: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 set_app_data(sta
a110: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 tePtr->ssl, (voi
a120: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f d *)statePtr);./
a130: 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 * point back to
a140: 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 us */. SSL_se
a150: 74 5f 76 65 72 69 66 79 28 73 74 61 74 65 50 74 t_verify(statePt
a160: 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 r->ssl, verify,
a170: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b VerifyCallback);
a180: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
a190: 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 _info_callback(s
a1a0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 49 6e tatePtr->ctx, In
a1b0: 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 foCallback);..
a1c0: 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f /* Create Tcl_
a1d0: 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 Channel BIO Hand
a1e0: 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 ler */. state
a1f0: 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f Ptr->p_bio.= BIO
a200: 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74 _new_tcl(statePt
a210: 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b r, BIO_NOCLOSE);
a220: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 . statePtr->b
a230: 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f io.= BIO_new(BIO
a240: 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 _f_ssl());..
a250: 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 2f if (server) {../
a260: 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62 61 63 * Server callbac
a270: 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 ks */..SSL_CTX_s
a280: 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 et_alpn_select_c
a290: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c b(statePtr->ctx,
a2a0: 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 ALPNCallback, (
a2b0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
a2c0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 ;..SSL_CTX_set_t
a2d0: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 lsext_servername
a2e0: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 _arg(statePtr->c
a2f0: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 tx, (void *)stat
a300: 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f ePtr);..SSL_CTX_
a310: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 set_tlsext_serve
a320: 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 rname_callback(s
a330: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e tatePtr->ctx, SN
a340: 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c ICallback);..SSL
a350: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f _CTX_set_client_
a360: 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 hello_cb(statePt
a370: 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c r->ctx, HelloCal
a380: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 lback, (void *)s
a390: 74 61 74 65 50 74 72 29 3b 0a 0a 09 73 74 61 74 tatePtr);...stat
a3a0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 ePtr->flags |= T
a3b0: 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 LS_TCL_SERVER;..
a3c0: 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 SSL_set_accept_s
a3d0: 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 tate(statePtr->s
a3e0: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 sl);. } else
a3f0: 7b 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 {../* Session ca
a400: 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 ching */..SSL_CT
a410: 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 X_set_session_ca
a420: 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 che_mode(statePt
a430: 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 r->ctx, SSL_SESS
a440: 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 _CACHE_CLIENT |
a450: 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e SSL_SESS_CACHE_N
a460: 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 O_INTERNAL_STORE
a470: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 );..SSL_CTX_sess
a480: 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 _set_new_cb(stat
a490: 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 ePtr->ctx, Sessi
a4a0: 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 53 onCallback);...S
a4b0: 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 SL_set_connect_s
a4c0: 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 tate(statePtr->s
a4d0: 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 sl);. }. S
a4e0: 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 SL_set_bio(state
a4f0: 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 Ptr->ssl, stateP
a500: 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 tr->p_bio, state
a510: 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 Ptr->p_bio);.
a520: 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 BIO_set_ssl(sta
a530: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 tePtr->bio, stat
a540: 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e ePtr->ssl, BIO_N
a550: 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a OCLOSE);.. /*
a560: 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 . * End of S
a570: 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a SL Init. */.
a580: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 dprintf("Ret
a590: 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f urning %s", Tcl_
a5a0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
a5b0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b tatePtr->self));
a5c0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 . Tcl_SetResu
a5d0: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 lt(interp, (char
a5e0: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e *) Tcl_GetChann
a5f0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
a600: 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 >self), TCL_VOLA
a610: 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 TILE);.. retu
a620: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
a630: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
a640: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
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 2d ----------------
a690: 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 -. *. * Unimport
a6a0: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ObjCmd --. *. *.
a6b0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
a6c0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d s invoked to rem
a6d0: 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 ove the topmost
a6e0: 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a channel filter..
a6f0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
a700: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
a710: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
a720: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
a730: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 May modify the b
a740: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f ehavior of an IO
a750: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d channel.. *. *-
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: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
a7b0: 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 t.UnimportObjCmd
a7c0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
a7d0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
a7e0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
a7f0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
a800: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
a810: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
a820: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 han;../* The cha
a830: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f nnel to set a mo
a840: 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 de on. */.. d
a850: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
a860: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
a870: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
a880: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
a890: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
a8a0: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 nel");..return T
a8b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
a8c0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
a8d0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
a8e0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
a8f0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 (objv[1]), NULL)
a900: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
a910: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
a920: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
a930: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
a940: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
a950: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
a960: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
a970: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
a980: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
a990: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 nnel(chan);..
a9a0: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e if (Tcl_GetChan
a9b0: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d nelType(chan) !=
a9c0: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
a9d0: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e ()) {..Tcl_Appen
a9e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
a9f0: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 "bad channel \""
aa00: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
aa10: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c Name(chan),..."\
aa20: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
aa30: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 nnel", NULL);..r
aa40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
aa50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
aa60: 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e Tcl_UnstackChann
aa70: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 el(interp, chan)
aa80: 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b == TCL_ERROR) {
aa90: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
aaa0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 OR;. }.. r
aab0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
aac0: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
aad0: 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ntData;.}.../*.
aae0: 2a 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 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 ----. *. * CTX_I
ab30: 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 nit -- construct
ab40: 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 a SSL_CTX insta
ab50: 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 nce. *. * Result
ab60: 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 s:. *.A valid SS
ab70: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f L_CTX instance o
ab80: 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 r NULL.. *. * Si
ab90: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 de effects:. *.c
aba0: 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f onstructs SSL co
abb0: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 ntext (CTX). *.
abc0: 2a 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 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
ac10: 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e SSL_CTX *.CTX_In
ac20: 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 it(State *stateP
ac30: 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 tr, int isServer
ac40: 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 , int proto, cha
ac50: 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 r *keyfile, char
ac60: 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 *certfile,.
ac70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b unsigned char *k
ac80: 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ey, unsigned cha
ac90: 72 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 r *cert, int key
aca0: 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c _len, int cert_l
acb0: 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c en, char *CAdir,
acc0: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c . char *CAfil
acd0: 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 e, char *ciphers
ace0: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 , char *ciphersu
acf0: 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c ites, int level,
ad00: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 char *DHparams)
ad10: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 {. Tcl_Inter
ad20: 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 p *interp = stat
ad30: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
ad40: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d SSL_CTX *ctx =
ad50: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 NULL;. Tcl_D
ad60: 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 String ds;. T
ad70: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a cl_DString ds1;.
ad80: 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b int off = 0;
ad90: 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 . int load_pr
ada0: 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 ivate_key;. c
adb0: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 onst SSL_METHOD
adc0: 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 *method;.. dp
add0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
ade0: 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f .. if (!proto
adf0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
ae00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e esult(interp, "n
ae10: 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c o valid protocol
ae20: 20 73 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c selected", NULL
ae30: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
ae40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 . }.. /* c
ae50: 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 reate SSL contex
ae60: 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c t */.#if OPENSSL
ae70: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
ae80: 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c >= 0x10100000L |
ae90: 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c | defined(NO_SSL
aea0: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
aeb0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 ENSSL_NO_SSL2).
aec0: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
aed0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
aee0: 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 SSL2)) {..Tcl_Ap
aef0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
af00: 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f p, "SSL2 protoco
af10: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
af20: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
af30: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
af40: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
af50: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 NO_SSL3) || defi
af60: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
af70: 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 SL3). if (ENA
af80: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
af90: 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 PROTO_SSL3)) {..
afa0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
afb0: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 (interp, "SSL3 p
afc0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
afd0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
afe0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
aff0: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
b000: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c fined(NO_TLS1) |
b010: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
b020: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 L_NO_TLS1). i
b030: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
b040: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
b050: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
b060: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
b070: 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c TLS 1.0 protocol
b080: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
b090: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
b0a0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
b0b0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
b0c0: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 O_TLS1_1) || def
b0d0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
b0e0: 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 TLS1_1). if (
b0f0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
b100: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 LS_PROTO_TLS1_1)
b110: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
b120: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 esult(interp, "T
b130: 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 LS 1.1 protocol
b140: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
b150: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
b160: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
b170: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
b180: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
b190: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
b1a0: 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 LS1_2). if (E
b1b0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
b1c0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 S_PROTO_TLS1_2))
b1d0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
b1e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
b1f0: 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.2 protocol n
b200: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
b210: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
b220: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
b230: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
b240: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e TLS1_3) || defin
b250: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
b260: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e S1_3). if (EN
b270: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
b280: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 _PROTO_TLS1_3))
b290: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
b2a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ult(interp, "TLS
b2b0: 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 1.3 protocol no
b2c0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
b2d0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
b2e0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
b2f0: 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f . switch (pro
b300: 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 to) {.#if OPENSS
b310: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
b320: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 < 0x10100000L &
b330: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 & !defined(NO_SS
b340: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L2) && !defined(
b350: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
b360: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
b370: 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f OTO_SSL2:..metho
b380: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 d = isServer ? S
b390: 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 SLv2_server_meth
b3a0: 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 od() : SSLv2_cli
b3b0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
b3c0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
b3d0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
b3e0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
b3f0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 PENSSL_NO_SSL3)
b400: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
b410: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 SSL_NO_SSL3_METH
b420: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 OD). case TLS
b430: 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 _PROTO_SSL3:..me
b440: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
b450: 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d ? SSLv3_server_m
b460: 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f ethod() : SSLv3_
b470: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
b480: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
b490: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
b4a0: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 TLS1) && !define
b4b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
b4c0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
b4d0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d PENSSL_NO_TLS1_M
b4e0: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 ETHOD). case
b4f0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a TLS_PROTO_TLS1:.
b500: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
b510: 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 er ? TLSv1_serve
b520: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 r_method() : TLS
b530: 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 v1_client_method
b540: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
b550: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
b560: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 NO_TLS1_1) && !d
b570: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
b580: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 O_TLS1_1) && !de
b590: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
b5a0: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a _TLS1_1_METHOD).
b5b0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
b5c0: 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 TO_TLS1_1:..meth
b5d0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
b5e0: 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d TLSv1_1_server_m
b5f0: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f ethod() : TLSv1_
b600: 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 1_client_method(
b610: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
b620: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
b630: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
b640: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
b650: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
b660: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
b670: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 TLS1_2_METHOD).
b680: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
b690: 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f O_TLS1_2:..metho
b6a0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
b6b0: 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 LSv1_2_server_me
b6c0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 thod() : TLSv1_2
b6d0: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
b6e0: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
b6f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
b700: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 _TLS1_3) && !def
b710: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
b720: 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 TLS1_3). case
b730: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
b740: 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 3:../* Use the g
b750: 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e eneric method an
b760: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e d constraint ran
b770: 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 ge after context
b780: 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 is created */..
b790: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
b7a0: 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d r ? TLS_server_m
b7b0: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c ethod() : TLS_cl
b7c0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
b7d0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 break;.#endif.
b7e0: 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e default:../* N
b7f0: 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 egotiate highest
b800: 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 available SSL/T
b810: 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d LS version */..m
b820: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
b830: 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 ? TLS_server_me
b840: 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 thod() : TLS_cli
b850: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 ent_method();.#i
b860: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
b870: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
b880: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 00000L && !defin
b890: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 ed(NO_SSL2) && !
b8a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
b8b0: 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d NO_SSL2)..off |=
b8c0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
b8d0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 TLS_PROTO_SSL2)
b8e0: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f ? 0 : SSL_OP_
b8f0: 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 NO_SSLv2);.#endi
b900: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
b910: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
b920: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
b930: 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e SL3)..off |= (EN
b940: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
b950: 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f _PROTO_SSL3) ?
b960: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 0 : SSL_OP_NO_S
b970: 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 SLv3);.#endif.#i
b980: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
b990: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
b9a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
b9b0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
b9c0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
b9d0: 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a TO_TLS1) ? 0 :
b9e0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
b9f0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
ba00: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
ba10: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
ba20: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
ba30: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
ba40: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
ba50: 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a TO_TLS1_1) ? 0 :
ba60: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
ba70: 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 _1);.#endif.#if
ba80: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
ba90: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _2) && !defined(
baa0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
bab0: 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 2)..off |= (ENAB
bac0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
bad0: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 ROTO_TLS1_2) ? 0
bae0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
baf0: 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 v1_2);.#endif.#i
bb00: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
bb10: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 S1_3) && !define
bb20: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
bb30: 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 1_3)..off |= (EN
bb40: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
bb50: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f _PROTO_TLS1_3) ?
bb60: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
bb70: 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a LSv1_3);.#endif.
bb80: 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 .break;. }..
bb90: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 ERR_clear_err
bba0: 6f 72 28 29 3b 0a 20 20 20 20 63 74 78 20 3d 20 or();. ctx =
bbb0: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 SSL_CTX_new(meth
bbc0: 6f 64 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 63 od);.. if (!c
bbd0: 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 tx) {..return(NU
bbe0: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 LL);. }..
bbf0: 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 if (getenv(SSLKE
bc00: 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 YLOGFILE)) {..SS
bc10: 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 L_CTX_set_keylog
bc20: 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b _callback(ctx, K
bc30: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a eyLogCallback);.
bc40: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 }..#if !defi
bc50: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 ned(NO_TLS1_3) &
bc60: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
bc70: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
bc80: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 if (proto == T
bc90: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
bca0: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {..SSL_CTX_set_
bcb0: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f min_proto_versio
bcc0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
bcd0: 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 RSION);..SSL_CTX
bce0: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 _set_max_proto_v
bcf0: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
bd00: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 _3_VERSION);.
bd10: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f }.#endif.. /
bd20: 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 * Force cipher s
bd30: 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 election order b
bd40: 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 y server */.
bd50: 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b if (!isServer) {
bd60: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 ..SSL_CTX_set_op
bd70: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f tions(ctx, SSL_O
bd80: 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f P_CIPHER_SERVER_
bd90: 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 PREFERENCE);.
bda0: 20 7d 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f }.. SSL_CTX_
bdb0: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 set_app_data(ctx
bdc0: 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 , (void*)interp)
bdd0: 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 ;./* remember th
bde0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f e interpreter */
bdf0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
be00: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 _options(ctx, SS
be10: 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c L_OP_ALL);./* al
be20: 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 l SSL bug workar
be30: 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c ounds */. SSL
be40: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
be50: 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 (ctx, off);../*
be60: 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c disable protocol
be70: 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 versions */.#if
be80: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
be90: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
bea0: 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 1000L. SSL_CT
beb0: 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 X_set_mode(ctx,
bec0: 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 SSL_MODE_AUTO_RE
bed0: 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 TRY);./* handle
bee0: 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 new handshakes i
bef0: 6e 20 62 61 63 6b 67 72 6f 75 6e 64 20 2a 2f 0a n background */.
bf00: 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 #endif. SSL_C
bf10: 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 TX_sess_set_cach
bf20: 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 e_size(ctx, 128)
bf30: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 ;.. /* Set us
bf40: 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 er defined ciphe
bf50: 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 rs, cipher suite
bf60: 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 s, and security
bf70: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 level */. if
bf80: 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c ((ciphers != NUL
bf90: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 L) && !SSL_CTX_s
bfa0: 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 et_cipher_list(c
bfb0: 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a tx, ciphers)) {.
bfc0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
bfd0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
bfe0: 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 et ciphers faile
bff0: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 d: No valid ciph
c000: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ers", (char *) N
c010: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
c020: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
c030: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
c040: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 }. if ((c
c050: 69 70 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e iphersuites != N
c060: 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 ULL) && !SSL_CTX
c070: 5f 73 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 _set_ciphersuite
c080: 73 28 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 s(ctx, ciphersui
c090: 74 65 73 29 29 20 7b 0a 09 20 20 20 20 54 63 6c tes)) {.. Tcl
c0a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
c0b0: 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 terp, "Set ciphe
c0c0: 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a r suites failed:
c0d0: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 No valid cipher
c0e0: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c s", (char *) NUL
c0f0: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
c100: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
c110: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 return NULL;.
c120: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 }.. /* Set
c130: 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a security level *
c140: 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 /. if (level
c150: 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 > -1 && level <
c160: 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 6) {../* SSL_set
c170: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 _security_level
c180: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f */..SSL_CTX_set_
c190: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 security_level(c
c1a0: 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 tx, level);.
c1b0: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f }.. /* set so
c1c0: 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a me callbacks */.
c1d0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
c1e0: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 default_passwd_c
c1f0: 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 b(ctx, PasswordC
c200: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 allback);. SS
c210: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c L_CTX_set_defaul
c220: 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 t_passwd_cb_user
c230: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 data(ctx, (void
c240: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 *)statePtr);..
c250: 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 /* read a Diff
c260: 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d ie-Hellman param
c270: 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 eters file, or u
c280: 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 se the built-in
c290: 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 one */.#ifdef OP
c2a0: 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 ENSSL_NO_DH.
c2b0: 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 if (DHparams !=
c2c0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
c2d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
c2e0: 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 , "DH parameter
c2f0: 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 support not avai
c300: 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 lable", (char *)
c310: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
c320: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
c330: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
c340: 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a #else. {..DH*
c350: 20 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 dh;..if (DHpara
c360: 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 ms != NULL) {..
c370: 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 BIO *bio;..
c380: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
c390: 74 28 26 64 73 29 3b 0a 09 20 20 20 20 62 69 6f t(&ds);.. bio
c3a0: 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 = BIO_new_file(
c3b0: 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 F2N(DHparams, &d
c3c0: 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 s), "r");.. i
c3d0: 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c f (!bio) {...Tcl
c3e0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
c3f0: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 );...Tcl_AppendR
c400: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 esult(interp, "C
c410: 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 ould not find DH
c420: 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 parameters file
c430: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
c440: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 );...SSL_CTX_fre
c450: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e e(ctx);...return
c460: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 NULL;.. }...
c470: 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 dh = PEM_rea
c480: 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 d_bio_DHparams(b
c490: 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 io, NULL, NULL,
c4a0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f NULL);.. BIO_
c4b0: 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 free(bio);..
c4c0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
c4d0: 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 &ds);.. if (!
c4e0: 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 dh) {...Tcl_Appe
c4f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
c500: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 "Could not read
c510: 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 DH parameters f
c520: 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 rom file", (char
c530: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c *) NULL);...SSL
c540: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
c550: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
c560: 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a }..} else {.
c570: 09 20 20 20 20 64 68 20 3d 20 67 65 74 5f 64 68 . dh = get_dh
c580: 50 61 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 Params();..}..SS
c590: 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 L_CTX_set_tmp_dh
c5a0: 28 63 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 (ctx, dh);..DH_f
c5b0: 72 65 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 ree(dh);. }.#
c5c0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 endif.. /* se
c5d0: 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 t our certificat
c5e0: 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 e */. load_pr
c5f0: 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 ivate_key = 0;.
c600: 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 if (certfile
c610: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 != NULL) {..load
c620: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 _private_key = 1
c630: 3b 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 ;...Tcl_DStringI
c640: 6e 69 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 nit(&ds);...if (
c650: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 SSL_CTX_use_cert
c660: 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 ificate_file(ctx
c670: 2c 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 , F2N(certfile,
c680: 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 &ds), SSL_FILETY
c690: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a PE_PEM) <= 0) {.
c6a0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
c6b0: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 Free(&ds);..
c6c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
c6d0: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
c6e0: 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 to set certific
c6f0: 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 ate file ", cert
c700: 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 file, ": ",....
c710: 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 REASON(), (c
c720: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
c730: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 SSL_CTX_free(
c740: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ctx);.. retur
c750: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d n NULL;..}. }
c760: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 else if (cert !
c770: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f = NULL) {..load_
c780: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b private_key = 1;
c790: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 ..if (SSL_CTX_us
c7a0: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 e_certificate_AS
c7b0: 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e N1(ctx, cert_len
c7c0: 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a , cert) <= 0) {.
c7d0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
c7e0: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 Free(&ds);..
c7f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
c800: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
c810: 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 to set certific
c820: 61 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 ate: ",....
c830: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
c840: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
c850: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
c860: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
c870: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 LL;..}. } els
c880: 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 e {..certfile =
c890: 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f (char*)X509_get_
c8a0: 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c default_cert_fil
c8b0: 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 e();...if (SSL_C
c8c0: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 TX_use_certifica
c8d0: 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 te_file(ctx, cer
c8e0: 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 tfile, SSL_FILET
c8f0: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b YPE_PEM) <= 0) {
c900: 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f .#if 0.. Tcl_
c910: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
c920: 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ;.. Tcl_Appen
c930: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
c940: 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 "unable to use d
c950: 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 efault certifica
c960: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 te file ", certf
c970: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 ile, ": ",....
c980: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 REASON(), (ch
c990: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
c9a0: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
c9b0: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tx);.. return
c9c0: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d NULL;.#endif..}
c9d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 . }.. /* s
c9e0: 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b et our private k
c9f0: 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f ey */. if (lo
ca00: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 ad_private_key)
ca10: 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d {..if (keyfile =
ca20: 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d = NULL && key ==
ca30: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 NULL) {.. ke
ca40: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 yfile = certfile
ca50: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 ;..}...if (keyfi
ca60: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 le != NULL) {..
ca70: 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 /* get the pr
ca80: 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 ivate key associ
ca90: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 ated with this c
caa0: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 ertificate */..
cab0: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d if (keyfile =
cac0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 = NULL) {...keyf
cad0: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a ile = certfile;.
cae0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 . }... if
caf0: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 (SSL_CTX_use_Pri
cb00: 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 vateKey_file(ctx
cb10: 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 , F2N(keyfile, &
cb20: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ds), SSL_FILETYP
cb30: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 E_PEM) <= 0) {..
cb40: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
cb50: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 (&ds);.../* flus
cb60: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 h the passphrase
cb70: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 which might be
cb80: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 left in the resu
cb90: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 lt */...Tcl_SetR
cba0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 esult(interp, NU
cbb0: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b LL, TCL_STATIC);
cbc0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
cbd0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
cbe0: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 ble to set publi
cbf0: 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 c key file ", ke
cc00: 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 yfile, " ",....
cc10: 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 REASON()
cc20: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
cc30: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
cc40: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
cc50: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 NULL;.. }..
cc60: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
cc70: 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 e(&ds);...} else
cc80: 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c if (key != NULL
cc90: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c ) {.. if (SSL
cca0: 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 _CTX_use_Private
ccb0: 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 Key_ASN1(EVP_PKE
ccc0: 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c Y_RSA, ctx, key,
ccd0: 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b key_len) <= 0) {
cce0: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ...Tcl_DStringFr
ccf0: 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c ee(&ds);.../* fl
cd00: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 ush the passphra
cd10: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 se which might b
cd20: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 e left in the re
cd30: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 sult */...Tcl_Se
cd40: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 tResult(interp,
cd50: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 NULL, TCL_STATIC
cd60: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 );...Tcl_AppendR
cd70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
cd80: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 nable to set pub
cd90: 6c 69 63 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 lic key: ", REAS
cda0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
cdb0: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
cdc0: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
cdd0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d urn NULL;.. }
cde0: 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b ..}../* Now we k
cdf0: 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 now that a key a
ce00: 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65 nd cert have bee
ce10: 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 n set against..
ce20: 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 * the SSL contex
ce30: 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 t */..if (!SSL_C
ce40: 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 TX_check_private
ce50: 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 _key(ctx)) {..
ce60: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
ce70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 lt(interp, "priv
ce80: 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 ate key does not
ce90: 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 match the certi
cea0: 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 ficate public ke
ceb0: 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 y",.... (cha
cec0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
ced0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
cee0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
cef0: 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a NULL;..}. }..
cf00: 20 20 20 20 2f 2a 20 53 65 74 20 76 65 72 69 66 /* Set verif
cf10: 69 63 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 ication CAs */.
cf20: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
cf30: 69 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c it(&ds);. Tcl
cf40: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 _DStringInit(&ds
cf50: 31 29 3b 0a 20 20 20 20 69 66 20 28 21 53 53 4c 1);. if (!SSL
cf60: 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 _CTX_load_verify
cf70: 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 _locations(ctx,
cf80: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 F2N(CAfile, &ds)
cf90: 2c 20 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73 , F2N(CAdir, &ds
cfa0: 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 1)) ||..!SSL_CTX
cfb0: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 _set_default_ver
cfc0: 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 ify_paths(ctx))
cfd0: 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 {.#if 0..Tcl_DSt
cfe0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
cff0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
d000: 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 &ds1);../* Don't
d010: 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20 currently care
d020: 69 66 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f if this fails */
d030: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
d040: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 lt(interp, "SSL
d050: 64 65 66 61 75 6c 74 20 76 65 72 69 66 79 20 70 default verify p
d060: 61 74 68 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 aths: ", REASON(
d070: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
d080: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 );..SSL_CTX_free
d090: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e (ctx);..return N
d0a0: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 ULL;.#endif.
d0b0: 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a }.. /* https:
d0c0: 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 //sourceforge.ne
d0d0: 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f t/p/tls/bugs/57/
d0e0: 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 */. /* XXX:T
d0f0: 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 ODO: Let the use
d100: 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 r supply values
d110: 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 here instead of
d120: 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 something that e
d130: 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c xists on the fil
d140: 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 esystem */. i
d150: 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c f (CAfile != NUL
d160: 4c 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 L) {..STACK_OF(X
d170: 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 509_NAME) *certN
d180: 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f ames = SSL_load_
d190: 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 client_CA_file(F
d1a0: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 2N(CAfile, &ds))
d1b0: 3b 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 ;..if (certNames
d1c0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
d1d0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 SSL_CTX_set_cli
d1e0: 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c ent_CA_list(ctx,
d1f0: 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a certNames);..}.
d200: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 }.. Tcl_D
d210: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
d220: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d230: 46 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 Free(&ds1);.
d240: 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a return ctx;.}...
d250: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
d260: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 53 --------. *. * S
d2a0: 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 tatusObjCmd -- r
d2b0: 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 eturn certificat
d2c0: 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 e for connected
d2d0: 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 peer.. *. * Resu
d2e0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
d2f0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
d300: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
d310: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
d320: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
d330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d360: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
d370: 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 int.StatusObjCmd
d380: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
d390: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
d3a0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
d3b0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
d3c0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
d3d0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
d3e0: 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 tr;. X509 *pe
d3f0: 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 er;. Tcl_Obj
d400: 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c *objPtr;. Tcl
d410: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 _Channel chan;.
d420: 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c char *channel
d430: 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a Name, *ciphers;.
d440: 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 int mode;.
d450: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
d460: 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 char *proto;.
d470: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c unsigned int l
d480: 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 en;.. dprintf
d490: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
d4a0: 20 73 77 69 74 63 68 20 28 6f 62 6a 63 29 20 7b switch (objc) {
d4b0: 0a 09 63 61 73 65 20 32 3a 0a 09 20 20 20 20 63 ..case 2:.. c
d4c0: 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c hannelName = Tcl
d4d0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
d4e0: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 j(objv[1], NULL)
d4f0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 ;.. break;...
d500: 63 61 73 65 20 33 3a 0a 09 20 20 20 20 69 66 20 case 3:.. if
d510: 28 21 73 74 72 63 6d 70 20 28 54 63 6c 5f 47 65 (!strcmp (Tcl_Ge
d520: 74 53 74 72 69 6e 67 20 28 6f 62 6a 76 5b 31 5d tString (objv[1]
d530: 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a ), "-local")) {.
d540: 09 09 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 ..channelName =
d550: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
d560: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 mObj(objv[2], NU
d570: 4c 4c 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 LL);...break;..
d580: 20 20 20 7d 0a 09 20 20 20 20 2f 2a 20 65 6c 73 }.. /* els
d590: 65 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2e e fall-through .
d5a0: 2e 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 .. */.#if define
d5b0: 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 20 20 20 d(__GNUC__)..
d5c0: 20 5f 5f 61 74 74 72 69 62 75 74 65 5f 5f 28 28 __attribute__((
d5d0: 66 61 6c 6c 74 68 72 6f 75 67 68 29 29 3b 0a 23 fallthrough));.#
d5e0: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a endif..default:.
d5f0: 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 . Tcl_WrongNu
d600: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
d610: 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f objv, "?-local?
d620: 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 20 20 20 channel");..
d630: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
d640: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 R;. }.. ch
d650: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
d660: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e nel(interp, chan
d670: 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b nelName, &mode);
d680: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
d690: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
d6a0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
d6b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
d6c0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
d6d0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
d6e0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
d6f0: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
d700: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
d710: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 el(chan);. if
d720: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
d730: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
d740: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
d750: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
d760: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
d770: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
d780: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
d790: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 e(chan),..."\":
d7a0: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
d7b0: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 l", NULL);..retu
d7c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
d7d0: 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 }. statePtr
d7e0: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c = (State *) Tcl
d7f0: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
d800: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 nceData(chan);.
d810: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 if (objc == 2
d820: 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f ) {..peer = SSL_
d830: 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 get_peer_certifi
d840: 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 cate(statePtr->s
d850: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 sl);. } else
d860: 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 {..peer = SSL_ge
d870: 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 t_certificate(st
d880: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
d890: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 65 65 72 }. if (peer
d8a0: 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c ) {..objPtr = Tl
d8b0: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 s_NewX509Obj(int
d8c0: 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 erp, peer);..if
d8d0: 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 20 58 35 (objc == 2) { X5
d8e0: 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 20 7d 09_free(peer); }
d8f0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f . } else {..o
d900: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c bjPtr = Tcl_NewL
d910: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
d920: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 . }.. /* P
d930: 65 65 72 20 63 65 72 74 20 63 68 61 69 6e 20 28 eer cert chain (
d940: 63 6c 69 65 6e 74 20 6f 6e 6c 79 29 20 2a 2f 0a client only) */.
d950: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 STACK_OF(X50
d960: 39 29 2a 20 73 73 6c 5f 63 65 72 74 73 20 3d 20 9)* ssl_certs =
d970: 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 SSL_get_peer_cer
d980: 74 5f 63 68 61 69 6e 28 73 74 61 74 65 50 74 72 t_chain(statePtr
d990: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 ->ssl);. if (
d9a0: 21 70 65 65 72 20 26 26 20 28 73 73 6c 5f 63 65 !peer && (ssl_ce
d9b0: 72 74 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 rts == NULL || s
d9c0: 6b 5f 58 35 30 39 5f 6e 75 6d 28 73 73 6c 5f 63 k_X509_num(ssl_c
d9d0: 65 72 74 73 29 20 3d 3d 20 30 29 29 20 7b 0a 09 erts) == 0)) {..
d9e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
d9f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
da00: 50 65 65 72 20 6e 61 6d 65 20 66 72 6f 6d 20 63 Peer name from c
da10: 65 72 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c ert */. Tcl_L
da20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
da30: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
da40: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
da50: 67 4f 62 6a 28 22 70 65 65 72 6e 61 6d 65 22 2c gObj("peername",
da60: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
da70: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
da80: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
da90: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
daa0: 67 4f 62 6a 28 53 53 4c 5f 67 65 74 30 5f 70 65 gObj(SSL_get0_pe
dab0: 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d ername(statePtr-
dac0: 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 >ssl), -1));..
dad0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
dae0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
daf0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
db00: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 62 69 ewStringObj("sbi
db10: 74 73 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 ts", -1));. T
db20: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
db30: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
db40: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 objPtr, Tcl_NewI
db50: 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 63 69 ntObj(SSL_get_ci
db60: 70 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 pher_bits(stateP
db70: 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 29 tr->ssl, NULL)))
db80: 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d ;.. ciphers =
db90: 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f (char*)SSL_get_
dba0: 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d cipher(statePtr-
dbb0: 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 28 >ssl);. if ((
dbc0: 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 ciphers != NULL)
dbd0: 20 26 26 20 28 73 74 72 63 6d 70 28 63 69 70 68 && (strcmp(ciph
dbe0: 65 72 73 2c 20 22 28 4e 4f 4e 45 29 22 29 20 21 ers, "(NONE)") !
dbf0: 3d 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 = 0)) {..Tcl_Lis
dc00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
dc10: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
dc20: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
dc30: 62 6a 28 22 63 69 70 68 65 72 22 2c 20 2d 31 29 bj("cipher", -1)
dc40: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
dc50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
dc60: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
dc70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
dc80: 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 L_get_cipher(sta
dc90: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 tePtr->ssl), -1)
dca0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
dcb0: 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30 39 Verify the X509
dcc0: 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72 65 certificate pre
dcd0: 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 sented by the pe
dce0: 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 er */. Tcl_Li
dcf0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
dd00: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
dd10: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
dd20: 4f 62 6a 28 22 76 61 6c 69 64 61 74 69 6f 6e 22 Obj("validation"
dd30: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 , -1));. if (
dd40: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 SSL_get_verify_r
dd50: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e esult(statePtr->
dd60: 73 73 6c 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f ssl) != X509_V_O
dd70: 4b 29 20 7b 0a 09 2f 2a 20 70 72 6f 74 6f 20 3d K) {../* proto =
dd80: 20 22 66 61 69 6c 65 64 22 3b 20 2a 2f 0a 09 70 "failed"; */..p
dd90: 72 6f 74 6f 20 3d 20 52 45 41 53 4f 4e 28 29 3b roto = REASON();
dda0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 . } else {..p
ddb0: 72 6f 74 6f 20 3d 20 22 6f 6b 22 3b 0a 20 20 20 roto = "ok";.
ddc0: 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f }. Tcl_ListO
ddd0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
dde0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
ddf0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
de00: 28 70 72 6f 74 6f 2c 20 2d 31 29 29 3b 0a 0a 20 (proto, -1));..
de10: 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 /* Report the
de20: 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 selected protoc
de30: 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f ol as a result o
de40: 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f f the negotiatio
de50: 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 n */. SSL_get
de60: 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 0_alpn_selected(
de70: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 statePtr->ssl, &
de80: 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 proto, &len);.
de90: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
dea0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
deb0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
dec0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 ewStringObj("alp
ded0: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 n", -1));. Tc
dee0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
def0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
df00: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
df10: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 ringObj((char *)
df20: 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e proto, (int) len
df30: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
df40: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
df50: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
df60: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
df70: 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31 j("protocol", -1
df80: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
df90: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
dfa0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
dfb0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
dfc0: 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f j(SSL_get_versio
dfd0: 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 n(statePtr->ssl)
dfe0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c , -1));.. Tcl
dff0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
e000: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 terp, objPtr);.
e010: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
e020: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
e030: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
e040: 2f 2a 0a 20 2a 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 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
e090: 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a onnectionInfoObj
e0a0: 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f Cmd -- return co
e0b0: 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 nnection info fr
e0c0: 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 om OpenSSL.. *.
e0d0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
e0e0: 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 list of connecti
e0f0: 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d on info. *. *--
e100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e140: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e -. */..static in
e150: 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f t ConnectionInfo
e160: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
e170: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
e180: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
e190: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
e1a0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
e1b0: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
e1c0: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 nnel chan;../* T
e1d0: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 he channel to se
e1e0: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a t a mode on. */.
e1f0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
e200: 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 Ptr;../* client
e210: 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f state for ssl so
e220: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f cket */. Tcl_
e230: 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 Obj *objPtr;.
e240: 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b const SSL *ssl;
e250: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 . const SSL_C
e260: 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 IPHER *cipher;.
e270: 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 const SSL_SES
e280: 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 SION *session;.
e290: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 const unsigne
e2a0: 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 d char *proto;.
e2b0: 20 20 20 6c 6f 6e 67 20 6d 6f 64 65 3b 0a 0a 20 long mode;..
e2c0: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 if (objc != 2
e2d0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
e2e0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
e2f0: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 objv, "channel"
e300: 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 );..return(TCL_E
e310: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 RROR);. }..
e320: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
e330: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
e340: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
e350: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 mObj(objv[1], NU
e360: 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 LL), NULL);.
e370: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
e380: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
e390: 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 {..return(TCL_ER
e3a0: 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ROR);. }..
e3b0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f /* Make sure to
e3c0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
e3d0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
e3e0: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
e3f0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
e400: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 chan);. if (T
e410: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
e420: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
e430: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
e440: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
e450: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
e460: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
e470: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
e480: 68 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 han), "\": not a
e490: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e TLS channel", N
e4a0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 ULL);..return(TC
e4b0: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a L_ERROR);. }.
e4c0: 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 . objPtr = Tc
e4d0: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
e4e0: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 NULL);.. /* C
e4f0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a onnection info *
e500: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d /. statePtr =
e510: 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 (State *)Tcl_Ge
e520: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 tChannelInstance
e530: 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 Data(chan);.
e540: 73 73 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e ssl = statePtr->
e550: 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c ssl;. if (ssl
e560: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 != NULL) {../*
e570: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 connection state
e580: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
e590: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
e5a0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
e5b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
e5c0: 73 74 61 74 65 22 2c 20 2d 31 29 29 3b 0a 09 54 state", -1));..T
e5d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
e5e0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
e5f0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
e600: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 tringObj(SSL_sta
e610: 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 te_string_long(s
e620: 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 sl), -1));.../*
e630: 47 65 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 Get SNI requeste
e640: 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f d server name */
e650: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
e660: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
e670: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
e680: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 72 ewStringObj("ser
e690: 76 65 72 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a vername", -1));.
e6a0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
e6b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
e6c0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
e6d0: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 wStringObj(SSL_g
e6e0: 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 et_servername(ss
e6f0: 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 l, TLSEXT_NAMETY
e700: 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d PE_host_name), -
e710: 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 1));.../* Get pr
e720: 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 54 63 6c 5f 4c otocol */..Tcl_L
e730: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
e740: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
e750: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
e760: 67 4f 62 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c gObj("protocol",
e770: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
e780: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
e790: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
e7a0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
e7b0: 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f j(SSL_get_versio
e7c0: 6e 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 09 n(ssl), -1));...
e7d0: 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e /* Renegotiation
e7e0: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 54 63 6c allowed */..Tcl
e7f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
e800: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
e810: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
e820: 69 6e 67 4f 62 6a 28 22 72 65 6e 65 67 6f 74 69 ingObj("renegoti
e830: 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 ation", -1));..T
e840: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
e850: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
e860: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
e870: 74 72 69 6e 67 4f 62 6a 28 0a 09 20 20 20 20 53 tringObj(.. S
e880: 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 SL_get_secure_re
e890: 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 negotiation_supp
e8a0: 6f 72 74 28 73 73 6c 29 20 3f 20 22 73 75 70 70 ort(ssl) ? "supp
e8b0: 6f 72 74 65 64 22 20 3a 20 22 6e 6f 74 20 73 75 orted" : "not su
e8c0: 70 70 6f 72 74 65 64 22 2c 20 2d 31 29 29 3b 0a pported", -1));.
e8d0: 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 ../* Get securit
e8e0: 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 54 63 6c 5f y level */..Tcl_
e8f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
e900: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
e910: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
e920: 6e 67 4f 62 6a 28 22 73 65 63 75 72 69 74 79 6c ngObj("securityl
e930: 65 76 65 6c 22 2c 20 2d 31 29 29 3b 0a 09 54 63 evel", -1));..Tc
e940: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
e950: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
e960: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e bjPtr, Tcl_NewIn
e970: 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 63 tObj(SSL_get_sec
e980: 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 urity_level(ssl)
e990: 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e ));.../* Session
e9a0: 20 69 6e 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c 69 info */..Tcl_Li
e9b0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
e9c0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
e9d0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
e9e0: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 72 65 75 Obj("session_reu
e9f0: 73 65 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c sed", -1));..Tcl
ea00: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
ea10: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
ea20: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f jPtr, Tcl_NewBoo
ea30: 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f 73 65 73 73 leanObj(SSL_sess
ea40: 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 ion_reused(ssl))
ea50: 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 );.../* Is serve
ea60: 72 20 69 6e 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c r info */..Tcl_L
ea70: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
ea80: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
ea90: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
eaa0: 67 4f 62 6a 28 22 69 73 5f 73 65 72 76 65 72 22 gObj("is_server"
eab0: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
eac0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
ead0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
eae0: 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e , Tcl_NewBoolean
eaf0: 4f 62 6a 28 53 53 4c 5f 69 73 5f 73 65 72 76 65 Obj(SSL_is_serve
eb00: 72 28 73 73 6c 29 29 29 3b 0a 20 20 20 20 7d 0a r(ssl)));. }.
eb10: 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 . /* Cipher i
eb20: 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 nfo */. ciphe
eb30: 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 r = SSL_get_curr
eb40: 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b ent_cipher(ssl);
eb50: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 20 . if (cipher
eb60: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 != NULL) {..char
eb70: 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b buf[BUFSIZ] = {
eb80: 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 0};..int bits, a
eb90: 6c 67 5f 62 69 74 73 3b 0a 0a 09 54 63 6c 5f 4c lg_bits;...Tcl_L
eba0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
ebb0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
ebc0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
ebd0: 67 4f 62 6a 28 22 63 69 70 68 65 72 22 2c 20 2d gObj("cipher", -
ebe0: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
ebf0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
ec00: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
ec10: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
ec20: 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e SSL_CIPHER_get_n
ec30: 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 ame(cipher), -1)
ec40: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
ec50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
ec60: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
ec70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 _NewStringObj("s
ec80: 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 2d tandard_name", -
ec90: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
eca0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
ecb0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
ecc0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
ecd0: 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 SSL_CIPHER_stand
ece0: 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 ard_name(cipher)
ecf0: 2c 20 2d 31 29 29 3b 0a 0a 09 62 69 74 73 20 3d , -1));...bits =
ed00: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
ed10: 62 69 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c bits(cipher, &al
ed20: 67 5f 62 69 74 73 29 3b 0a 09 54 63 6c 5f 4c 69 g_bits);..Tcl_Li
ed30: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
ed40: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
ed50: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
ed60: 4f 62 6a 28 22 62 69 74 73 22 2c 20 2d 31 29 29 Obj("bits", -1))
ed70: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
ed80: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
ed90: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
eda0: 4e 65 77 49 6e 74 4f 62 6a 28 62 69 74 73 29 29 NewIntObj(bits))
edb0: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
edc0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
edd0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
ede0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 NewStringObj("se
edf0: 63 72 65 74 5f 62 69 74 73 22 2c 20 2d 31 29 29 cret_bits", -1))
ee00: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
ee10: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
ee20: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
ee30: 4e 65 77 49 6e 74 4f 62 6a 28 61 6c 67 5f 62 69 NewIntObj(alg_bi
ee40: 74 73 29 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 ts));../* alg_bi
ee50: 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 ts is actual key
ee60: 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 secret bits. If
ee70: 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 use bits and se
ee80: 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 cret (algorithm)
ee90: 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a 20 20 bits differ,.
eea0: 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73 the res
eeb0: 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 t of the bits ar
eec0: 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f e fixed, i.e. fo
eed0: 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 r limited export
eee0: 20 63 69 70 68 65 72 73 20 28 62 69 74 73 20 3c ciphers (bits <
eef0: 20 35 36 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 56) */..Tcl_Lis
ef00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
ef10: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
ef20: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
ef30: 62 6a 28 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 bj("min_version"
ef40: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
ef50: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
ef60: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
ef70: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
ef80: 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 bj(SSL_CIPHER_ge
ef90: 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 t_version(cipher
efa0: 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 ), -1));.../* Ge
efb0: 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 t OpenSSL-specif
efc0: 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 ic ID, not IANA
efd0: 49 44 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f ID */..Tcl_ListO
efe0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
eff0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f000: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
f010: 28 22 69 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 ("id", -1));..Tc
f020: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
f030: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
f040: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e bjPtr, Tcl_NewIn
f050: 74 4f 62 6a 28 28 69 6e 74 29 20 53 53 4c 5f 43 tObj((int) SSL_C
f060: 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 IPHER_get_id(cip
f070: 68 65 72 29 29 29 3b 0a 0a 09 69 66 20 28 53 53 her)));...if (SS
f080: 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 L_CIPHER_descrip
f090: 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 tion(cipher, buf
f0a0: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 , sizeof(buf)) !
f0b0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 = NULL) {.. T
f0c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
f0d0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
f0e0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
f0f0: 74 72 69 6e 67 4f 62 6a 28 22 64 65 73 63 72 69 tringObj("descri
f100: 70 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 20 ption", -1));..
f110: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
f120: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
f130: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
f140: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 NewStringObj(buf
f150: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d , -1));..}. }
f160: 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e .. /* Session
f170: 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 info */. ses
f180: 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 sion = SSL_get_s
f190: 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 ession(ssl);.
f1a0: 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 if (session !=
f1b0: 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 NULL) {..const u
f1c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 nsigned char *ti
f1d0: 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 cket;..size_t le
f1e0: 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e n2;..unsigned in
f1f0: 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 t ulen;..const u
f200: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 nsigned char *se
f210: 73 73 69 6f 6e 5f 69 64 3b 0a 09 63 68 61 72 20 ssion_id;..char
f220: 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d buffer[SSL_MAX_M
f230: 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 ASTER_KEY_LENGTH
f240: 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 ];.../* Report t
f250: 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 he selected prot
f260: 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 ocol as a result
f270: 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 of the ALPN neg
f280: 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c otiation */..SSL
f290: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c _SESSION_get0_al
f2a0: 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 pn_selected(sess
f2b0: 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 ion, &proto, &le
f2c0: 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 n2);..Tcl_ListOb
f2d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
f2e0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
f2f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
f300: 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 "alpn", -1));..T
f310: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
f320: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
f330: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
f340: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a tringObj((char *
f350: 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 )proto, (int) le
f360: 6e 32 29 29 3b 0a 0a 09 2f 2a 20 52 65 73 75 6d n2));.../* Resum
f370: 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a able session */.
f380: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
f390: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f3a0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
f3b0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 73 75 wStringObj("resu
f3c0: 6d 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 09 54 mable", -1));..T
f3d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
f3e0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
f3f0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 objPtr, Tcl_NewI
f400: 6e 74 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f ntObj(SSL_SESSIO
f410: 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 N_is_resumable(s
f420: 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 ession)));.../*
f430: 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 Session start ti
f440: 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 me (seconds sinc
f450: 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 54 63 6c e epoch) */..Tcl
f460: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
f470: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
f480: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
f490: 69 6e 67 4f 62 6a 28 22 73 74 61 72 74 5f 74 69 ingObj("start_ti
f4a0: 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f me", -1));..Tcl_
f4b0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
f4c0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
f4d0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 Ptr, Tcl_NewLong
f4e0: 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f Obj(SSL_SESSION_
f4f0: 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e get_time(session
f500: 29 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 )));.../* Timeou
f510: 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 t value - SSL_CT
f520: 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 X_get_timeout (i
f530: 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 54 n seconds) */..T
f540: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
f550: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
f560: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
f570: 74 72 69 6e 67 4f 62 6a 28 22 74 69 6d 65 6f 75 tringObj("timeou
f580: 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c t", -1));..Tcl_L
f590: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f5a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
f5b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f tr, Tcl_NewLongO
f5c0: 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 bj(SSL_SESSION_g
f5d0: 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 et_timeout(sessi
f5e0: 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 on)));.../* Sess
f5f0: 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 ion ticket lifet
f600: 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 ime hint (in sec
f610: 6f 6e 64 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 onds) */..Tcl_Li
f620: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f630: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
f640: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
f650: 4f 62 6a 28 22 6c 69 66 65 74 69 6d 65 22 2c 20 Obj("lifetime",
f660: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
f670: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
f680: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f690: 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 Tcl_NewLongObj(S
f6a0: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 SL_SESSION_get_t
f6b0: 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 icket_lifetime_h
f6c0: 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a int(session)));.
f6d0: 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 ../* Session id
f6e0: 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d */..session_id =
f6f0: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
f700: 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c _id(session, &ul
f710: 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 en);..Tcl_ListOb
f720: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
f730: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
f740: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
f750: 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 2d 31 "session_id", -1
f760: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
f770: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
f780: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
f790: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 l_NewByteArrayOb
f7a0: 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 j(session_id, (i
f7b0: 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 09 2f 2a nt) ulen));.../*
f7c0: 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 Session ticket
f7d0: 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f - client only */
f7e0: 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 ..SSL_SESSION_ge
f7f0: 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f t0_ticket(sessio
f800: 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e n, &ticket, &len
f810: 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 2);..Tcl_ListObj
f820: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
f830: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
f840: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
f850: 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c session_ticket",
f860: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
f870: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
f880: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f890: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 Tcl_NewByteArra
f8a0: 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e yObj(ticket, (in
f8b0: 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 t) len2));.../*
f8c0: 54 69 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 Ticket app data
f8d0: 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f */..SSL_SESSION_
f8e0: 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 get0_ticket_appd
f8f0: 61 74 61 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 ata(session, &ti
f900: 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 cket, &len2);..T
f910: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
f920: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
f930: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
f940: 74 72 69 6e 67 4f 62 6a 28 22 74 69 63 6b 65 74 tringObj("ticket
f950: 5f 61 70 70 5f 64 61 74 61 22 2c 20 2d 31 29 29 _app_data", -1))
f960: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
f970: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
f980: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
f990: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 NewByteArrayObj(
f9a0: 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 ticket, (int) le
f9b0: 6e 32 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d n2));.../* Get m
f9c0: 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 aster key */..le
f9d0: 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e n2 = SSL_SESSION
f9e0: 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 _get_master_key(
f9f0: 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c session, buffer,
fa00: 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f SSL_MAX_MASTER_
fa10: 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 54 63 KEY_LENGTH);..Tc
fa20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
fa30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
fa40: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
fa50: 72 69 6e 67 4f 62 6a 28 22 6d 61 73 74 65 72 5f ringObj("master_
fa60: 6b 65 79 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c key", -1));..Tcl
fa70: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
fa80: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
fa90: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 jPtr, Tcl_NewByt
faa0: 65 41 72 72 61 79 4f 62 6a 28 62 75 66 66 65 72 eArrayObj(buffer
fab0: 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a , (int) len2));.
fac0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f }.. /* Co
fad0: 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a mpression info *
fae0: 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d /. if (ssl !=
faf0: 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 NULL) {.#ifdef
fb00: 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 HAVE_SSL_COMPRES
fb10: 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 SION..const COMP
fb20: 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a _METHOD *comp, *
fb30: 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 expn;..comp = SS
fb40: 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f L_get_current_co
fb50: 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a mpression(ssl);.
fb60: 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f .expn = SSL_get_
fb70: 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f current_expansio
fb80: 6e 28 73 73 6c 29 3b 0a 0a 09 54 63 6c 5f 4c 69 n(ssl);...Tcl_Li
fb90: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
fba0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
fbb0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
fbc0: 4f 62 6a 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e Obj("compression
fbd0: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
fbe0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
fbf0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
fc00: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
fc10: 4f 62 6a 28 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 Obj(comp ? SSL_C
fc20: 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d OMP_get_name(com
fc30: 70 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 p) : "NONE", -1)
fc40: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
fc50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
fc60: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
fc70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 _NewStringObj("e
fc80: 78 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b xpansion", -1));
fc90: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
fca0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
fcb0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
fcc0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 65 78 70 6e ewStringObj(expn
fcd0: 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f ? SSL_COMP_get_
fce0: 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 4e 4f name(expn) : "NO
fcf0: 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 65 6c 73 65 NE", -1));.#else
fd00: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
fd10: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
fd20: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
fd30: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d ewStringObj("com
fd40: 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b pression", -1));
fd50: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
fd60: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
fd70: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
fd80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e ewStringObj("NON
fd90: 45 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c E", -1));..Tcl_L
fda0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
fdb0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
fdc0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
fdd0: 67 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 gObj("expansion"
fde0: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
fdf0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
fe00: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
fe10: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
fe20: 62 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b bj("NONE", -1));
fe30: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 .#endif. }..
fe40: 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 /* Server inf
fe50: 6f 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 o */. mode =
fe60: 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 SSL_CTX_get_sess
fe70: 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 ion_cache_mode(s
fe80: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 tatePtr->ctx);.
fe90: 20 20 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 if (mode & SS
fea0: 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 L_SESS_CACHE_OFF
feb0: 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 6f 66 ) {..proto = "of
fec0: 66 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 f";. } else i
fed0: 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 f (mode & SSL_SE
fee0: 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 SS_CACHE_CLIENT)
fef0: 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 63 6c 69 {..proto = "cli
ff00: 65 6e 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ent";. } else
ff10: 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f if (mode & SSL_
ff20: 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45 SESS_CACHE_SERVE
ff30: 52 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 73 R) {..proto = "s
ff40: 65 72 76 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c erver";. } el
ff50: 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 se if (mode & SS
ff60: 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 L_SESS_CACHE_BOT
ff70: 48 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 62 H) {..proto = "b
ff80: 6f 74 68 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 oth";. } else
ff90: 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 75 6e 6b {..proto = "unk
ffa0: 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 20 20 20 nown";. }.
ffb0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
ffc0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
ffd0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
ffe0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 wStringObj("sess
fff0: 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c ion_cache_mode",
10000 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
10010 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10020 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
10030 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
10040 67 4f 62 6a 28 70 72 6f 74 6f 2c 20 2d 31 29 29 gObj(proto, -1))
10050 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 ;.. Tcl_SetOb
10060 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
10070 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 objPtr);. ret
10080 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
10090 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
100a0 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Data;.}.../*. *-
100b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
100c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
100d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
100e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
100f0 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e --. *. * Version
10100 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e ObjCmd -- return
10110 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 version string
10120 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a from OpenSSL.. *
10130 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
10140 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
10150 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
10160 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
10170 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
10180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
101a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
101b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
101c0 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 .static int.Vers
101d0 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 ionObjCmd(Client
101e0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
101f0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
10200 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
10210 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
10220 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f jv[]) {. Tcl_
10230 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 Obj *objPtr;..
10240 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
10250 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 d");.. objPtr
10260 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 = Tcl_NewString
10270 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 Obj(OPENSSL_VERS
10280 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 ION_TEXT, -1);.
10290 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
102a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ult(interp, objP
102b0 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e tr);.. return
102c0 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
102d0 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
102e0 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b a;..objc = objc;
102f0 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d ..objv = objv;.}
10300 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
10310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
10350 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 * MiscObjCmd --
10360 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a misc commands. *
10370 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
10380 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
10390 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
103a0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
103b0 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
103c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
103d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
103e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
103f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
10400 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 .static int.Misc
10410 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
10420 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
10430 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
10440 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
10450 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
10460 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 ]) {. static
10470 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d const char *comm
10480 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 ands [] = { "req
10490 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c ", "strreq", NUL
104a0 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f L };. enum co
104b0 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 mmand { C_REQ, C
104c0 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 _STRREQ, C_DUMMY
104d0 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d 64 2c };. int cmd,
104e0 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 isStr;. char
104f0 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a buffer[16384];.
10500 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
10510 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
10520 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 (objc < 2) {..Tc
10530 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
10540 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
10550 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 "subcommand ?arg
10560 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 s?");..return TC
10570 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
10580 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e if (Tcl_GetIn
10590 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
105a0 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d p, objv[1], comm
105b0 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c ands, "command",
105c0 20 30 2c 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 0,&cmd) != TCL_
105d0 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
105e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
105f0 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64 isStr = (cmd
10600 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 == C_STRREQ);.
10610 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d switch ((enum
10620 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b command) cmd) {
10630 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 ..case C_REQ:..c
10640 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a ase C_STRREQ: {.
10650 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 . EVP_PKEY *p
10660 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 key=NULL;.. X
10670 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 509 *cert=NULL;.
10680 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a . X509_NAME *
10690 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 name=NULL;..
106a0 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b Tcl_Obj **listv;
106b0 0a 09 20 20 20 20 69 6e 74 20 6c 69 73 74 63 2c .. int listc,
106c0 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 i;... BIO *ou
106d0 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 t=NULL;... ch
106e0 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 ar *k_C="",*k_ST
106f0 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f ="",*k_L="",*k_O
10700 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f ="",*k_OU="",*k_
10710 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 CN="",*k_Email="
10720 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65 ";.. char *ke
10730 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 yout,*pemout,*st
10740 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73 r;.. int keys
10750 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 ize,serial=0,day
10760 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e s=365;..#if OPEN
10770 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
10780 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
10790 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e .. BIGNUM *bn
107a0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 e = NULL;.. R
107b0 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a SA *rsa = NULL;.
107c0 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50 #else.. EVP_P
107d0 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e KEY_CTX *ctx = N
107e0 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 ULL;.#endif...
107f0 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c if ((objc<5) |
10800 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 | (objc>6)) {...
10810 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
10820 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 (interp, 2, objv
10830 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 , "keysize keyfi
10840 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 le certfile ?inf
10850 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 o?");...return T
10860 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
10870 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47 ... if (Tcl_G
10880 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 etIntFromObj(int
10890 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b erp, objv[2], &k
108a0 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f eysize) != TCL_O
108b0 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 K) {...return TC
108c0 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a L_ERROR;.. }.
108d0 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f . keyout=Tcl_
108e0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 GetString(objv[3
108f0 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d ]);.. pemout=
10900 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
10910 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 jv[4]);.. if
10920 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f (isStr) {...Tcl_
10930 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 SetVar(interp,ke
10940 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 yout,"",0);...Tc
10950 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
10960 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 pemout,"",0);..
10970 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f }... if (o
10980 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 bjc>=6) {...if (
10990 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c Tcl_ListObjGetEl
109a0 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f ements(interp, o
109b0 62 6a 76 5b 35 5d 2c 0a 09 09 09 26 6c 69 73 74 bjv[5],....&list
109c0 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54 43 c, &listv) != TC
109d0 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 L_OK) {... re
109e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
109f0 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 ..}....if ((list
10a00 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 c%2) != 0) {...
10a10 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 Tcl_SetResult
10a20 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 (interp,"Informa
10a30 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 tion list must h
10a40 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 ave even number
10a50 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 of arguments",NU
10a60 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 LL);... retur
10a70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
10a80 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c ...for (i=0; i<l
10a90 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 istc; i+=2) {...
10aa0 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 str=Tcl_GetS
10ab0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b tring(listv[i]);
10ac0 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 63 6d ... if (strcm
10ad0 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 p(str,"days")==0
10ae0 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 ) {....if (Tcl_G
10af0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 etIntFromObj(int
10b00 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 erp,listv[i+1],&
10b10 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 days)!=TCL_OK)..
10b20 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
10b30 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 _ERROR;... }
10b40 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
10b50 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 str,"serial")==0
10b60 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 ) {....if (Tcl_G
10b70 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 etIntFromObj(int
10b80 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 erp,listv[i+1],&
10b90 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 serial)!=TCL_OK)
10ba0 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 .... return T
10bb0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 CL_ERROR;...
10bc0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
10bd0 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b p(str,"C")==0) {
10be0 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 ....k_C=Tcl_GetS
10bf0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
10c00 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
10c10 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
10c20 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f ST")==0) {....k_
10c30 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 ST=Tcl_GetString
10c40 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
10c50 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
10c60 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d trcmp(str,"L")==
10c70 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 0) {....k_L=Tcl_
10c80 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
10c90 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
10ca0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
10cb0 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 tr,"O")==0) {...
10cc0 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 .k_O=Tcl_GetStri
10cd0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
10ce0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
10cf0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 (strcmp(str,"OU"
10d00 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d )==0) {....k_OU=
10d10 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
10d20 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
10d30 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
10d40 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 mp(str,"CN")==0)
10d50 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 {....k_CN=Tcl_G
10d60 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
10d70 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
10d80 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
10d90 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b r,"Email")==0) {
10da0 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f ....k_Email=Tcl_
10db0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
10dc0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
10dd0 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 lse {....Tcl_Set
10de0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 Result(interp,"U
10df0 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 nknown parameter
10e00 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 ",NULL);....retu
10e10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
10e20 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d }...}.. }
10e30 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
10e40 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
10e50 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 x30000000L..
10e60 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a bne = BN_new();.
10e70 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f 6e . rsa = RSA_n
10e80 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 ew();.. pkey
10e90 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 = EVP_PKEY_new()
10ea0 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20 3d ;.. if (bne =
10eb0 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d = NULL || rsa ==
10ec0 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d NULL || pkey ==
10ed0 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 NULL || !BN_set
10ee0 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 _word(bne,RSA_F4
10ef0 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 ) ||...!RSA_gene
10f00 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c rate_key_ex(rsa,
10f10 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e keysize, bne, N
10f20 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 ULL) || !EVP_PKE
10f30 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 Y_assign_RSA(pke
10f40 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 50 y, rsa)) {...EVP
10f50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
10f60 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 ;.../* RSA_free(
10f70 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 45 rsa); freed by E
10f80 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a VP_PKEY_free */.
10f90 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a ..BN_free(bne);.
10fa0 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 20 #else.. pkey
10fb0 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 = EVP_RSA_gen((u
10fc0 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 nsigned int) key
10fd0 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 20 size);.. ctx
10fe0 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e = EVP_PKEY_CTX_n
10ff0 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 ew(pkey,NULL);..
11000 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 if (pkey ==
11010 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e NULL || ctx == N
11020 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 ULL || !EVP_PKEY
11030 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 _keygen_init(ctx
11040 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 ) ||...!EVP_PKEY
11050 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 _CTX_set_rsa_key
11060 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 gen_bits(ctx, ke
11070 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 ysize) || !EVP_P
11080 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 KEY_keygen(ctx,
11090 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 5f &pkey)) {...EVP_
110a0 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
110b0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f ...EVP_PKEY_CTX_
110c0 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 free(ctx);.#endi
110d0 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c f...Tcl_SetResul
110e0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
110f0 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 generating priva
11100 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 te key",NULL);..
11110 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
11120 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b R;.. } else {
11130 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a ...if (isStr) {.
11140 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 .. out=BIO_ne
11150 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a w(BIO_s_mem());.
11160 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
11170 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f bio_PrivateKey(o
11180 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c ut,pkey,NULL,NUL
11190 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a L,0,NULL,NULL);.
111a0 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 .. i=BIO_read
111b0 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 (out,buffer,size
111c0 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 of(buffer)-1);..
111d0 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 . i=(i<0) ? 0
111e0 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 : i;... buff
111f0 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 er[i]='\0';...
11200 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 Tcl_SetVar(int
11210 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 erp,keyout,buffe
11220 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f r,0);... BIO_
11230 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 flush(out);...
11240 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b BIO_free(out);
11250 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 ...} else {...
11260 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 out=BIO_new(BI
11270 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 O_s_file());...
11280 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c BIO_write_fil
11290 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 ename(out,keyout
112a0 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 );... PEM_wri
112b0 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 te_bio_PrivateKe
112c0 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c y(out,pkey,NULL,
112d0 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c NULL,0,NULL,NULL
112e0 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f );... /* PEM_
112f0 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 write_bio_RSAPri
11300 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 vateKey(out, rsa
11310 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c , NULL, NULL, 0,
11320 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f NULL, NULL); */
11330 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f ... BIO_free_
11340 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a all(out);.. .}..
11350 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 30 39 ..if ((cert=X509
11360 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b _new())==NULL) {
11370 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 ... Tcl_SetRe
11380 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 sult(interp,"Err
11390 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63 65 or generating ce
113a0 72 74 69 66 69 63 61 74 65 20 72 65 71 75 65 73 rtificate reques
113b0 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 t",NULL);...
113c0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
113d0 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c ey);.#if OPENSSL
113e0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
113f0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 < 0x30000000L...
11400 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 BN_free(bne)
11410 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 72 ;.#endif... r
11420 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
11430 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 ;...}....X509_se
11440 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 t_version(cert,2
11450 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 );...ASN1_INTEGE
11460 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73 R_set(X509_get_s
11470 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 erialNumber(cert
11480 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 ),serial);...X50
11490 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 9_gmtime_adj(X50
114a0 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 9_getm_notBefore
114b0 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 (cert),0);...X50
114c0 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 9_gmtime_adj(X50
114d0 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 9_getm_notAfter(
114e0 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 cert),(long)60*6
114f0 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 0*24*days);...X5
11500 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65 09_set_pubkey(ce
11510 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d rt,pkey);....nam
11520 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 e=X509_get_subje
11530 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a ct_name(cert);..
11540 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
11550 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
11560 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f e,"C", MBSTRING_
11570 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
11580 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 gned char *) k_C
11590 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
115a0 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
115b0 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
115c0 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 "ST", MBSTRING_A
115d0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
115e0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 ned char *) k_ST
115f0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
11600 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
11610 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
11620 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 "L", MBSTRING_AS
11630 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
11640 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 ed char *) k_L,
11650 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 -1, -1, 0);...X5
11660 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
11670 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f y_by_txt(name,"O
11680 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
11690 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
116a0 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 char *) k_O, -1
116b0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
116c0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
116d0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 by_txt(name,"OU"
116e0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
116f0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
11700 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 char *) k_OU, -1
11710 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
11720 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
11730 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 by_txt(name,"CN"
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 43 4e 2c 20 2d 31 char *) k_CN, -1
11770 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
11780 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
11790 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 by_txt(name,"Ema
117a0 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 il", MBSTRING_AS
117b0 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
117c0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 ed char *) k_Ema
117d0 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a il, -1, -1, 0);.
117e0 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a ...X509_set_subj
117f0 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 ect_name(cert,na
11800 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 me);....if (!X50
11810 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 9_sign(cert,pkey
11820 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 20 ,EVP_sha256()))
11830 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 65 {... X509_fre
11840 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45 e(cert);... E
11850 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 VP_PKEY_free(pke
11860 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f y);.#if OPENSSL_
11870 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
11880 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 0x30000000L...
11890 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b BN_free(bne);
118a0 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63 .#endif... Tc
118b0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
118c0 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e rp,"Error signin
118d0 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e g certificate",N
118e0 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 ULL);... retu
118f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
11900 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 }....if (isStr)
11910 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f {... out=BIO_
11920 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 new(BIO_s_mem())
11930 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 ;... PEM_writ
11940 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 e_bio_X509(out,c
11950 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 ert);... i=BI
11960 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 O_read(out,buffe
11970 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 r,sizeof(buffer)
11980 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c -1);... i=(i<
11990 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 0) ? 0 : i;...
119a0 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 buffer[i]='\0'
119b0 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 ;... Tcl_SetV
119c0 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 ar(interp,pemout
119d0 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 ,buffer,0);...
119e0 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 BIO_flush(out)
119f0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 ;... BIO_free
11a00 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 (out);...} else
11a10 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f {... out=BIO_
11a20 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 new(BIO_s_file()
11a30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 );... BIO_wri
11a40 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c te_filename(out,
11a50 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 pemout);... P
11a60 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 EM_write_bio_X50
11a70 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 9(out,cert);...
11a80 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 BIO_free_all(
11a90 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 out);...}....X50
11aa0 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 9_free(cert);...
11ab0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
11ac0 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c ey);.#if OPENSSL
11ad0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
11ae0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 < 0x30000000L...
11af0 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
11b00 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 ndif.. }..}..
11b10 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 break;. defau
11b20 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 lt:..break;.
11b30 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c }. return TCL
11b40 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 _OK;..clientData
11b50 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d = clientData;.}
11b60 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .../************
11b70 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 ********/./* Ini
11b80 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f t */
11b90 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
11ba0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d ******/../*. *--
11bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11bf0 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 -. *. * Tls_Free
11c00 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 --. *. *.This p
11c10 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 rocedure cleans
11c20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f up when a SSL so
11c30 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e cket based chann
11c40 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 el. *.is closed
11c50 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 and its referenc
11c60 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 e count falls be
11c70 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 low 1. *. * Resu
11c80 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a lts:. *.none. *.
11c90 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
11ca0 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 . *.Frees all th
11cb0 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d e state. *. *---
11cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d00 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 . */.void.Tls_Fr
11d10 65 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 ee(char *blockPt
11d20 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a r) {. State *
11d30 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
11d40 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 e *)blockPtr;..
11d50 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
11d60 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 ed");.. Tls_C
11d70 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a lean(statePtr);.
11d80 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b ckfree(block
11d90 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Ptr);.}.../*. *-
11da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11de0 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 --. *. * Tls_Cle
11df0 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 an --. *. *.This
11e00 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e procedure clean
11e10 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 s up when a SSL
11e20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 socket based cha
11e30 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 nnel. *.is close
11e40 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 d and its refere
11e50 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 nce count falls
11e60 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 below 1. This s
11e70 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c hould. *.be call
11e80 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 ed synchronously
11e90 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f by the ClosePro
11ea0 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a c, not in the. *
11eb0 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 .EventuallyFree
11ec0 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 callback.. *. *
11ed0 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 Results:. *.none
11ee0 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
11ef0 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c cts:. *.Frees al
11f00 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 l the state. *.
11f10 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
11f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11f50 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c ----. */.void Tl
11f60 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 s_Clean(State *s
11f70 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 tatePtr) {. d
11f80 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
11f90 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
11fa0 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 we're assuming
11fb0 68 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20 here that we're
11fc0 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a single-threaded.
11fd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 */. if (
11fe0 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
11ff0 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b != (Tcl_TimerTok
12000 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c en) NULL) {..Tcl
12010 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 _DeleteTimerHand
12020 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 ler(statePtr->ti
12030 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d mer);..statePtr-
12040 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 >timer = NULL;.
12050 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 }.. if (st
12060 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 atePtr->protos)
12070 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65 50 {..ckfree(stateP
12080 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 tr->protos);..st
12090 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d atePtr->protos =
120a0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
120b0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62 if (statePtr->b
120c0 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 io) {../* This w
120d0 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 ill call SSL_shu
120e0 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30 tdown. Bug 14140
120f0 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 45 */..dprintf("
12100 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 BIO_free_all(%p)
12110 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ", statePtr->bio
12120 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c );..BIO_free_all
12130 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b (statePtr->bio);
12140 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 ..statePtr->bio
12150 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
12160 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
12170 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 ssl) {..dprintf(
12180 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 "SSL_free(%p)",
12190 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
121a0 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 .SSL_free(stateP
121b0 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 tr->ssl);..state
121c0 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b Ptr->ssl = NULL;
121d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
121e0 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a tatePtr->ctx) {.
121f0 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 .SSL_CTX_free(st
12200 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 atePtr->ctx);..s
12210 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e tatePtr->ctx = N
12220 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
12230 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
12240 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 lback) {..Tcl_De
12250 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
12260 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
12270 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 .statePtr->callb
12280 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ack = NULL;.
12290 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
122a0 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a tr->password) {.
122b0 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
122c0 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 t(statePtr->pass
122d0 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 word);..statePtr
122e0 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c ->password = NUL
122f0 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 L;. }.. dp
12300 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 rintf("Returning
12310 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ");.}.../*. *---
12320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12360 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 . *. * Tls_Init
12370 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 --. *. *.This is
12380 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 a package initi
12390 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 alization proced
123a0 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 ure, which is ca
123b0 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 lled. *.by Tcl w
123c0 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 hen this package
123d0 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 is to be added
123e0 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 to an interprete
123f0 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 r.. *. * Results
12400 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 : Ssl configure
12410 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a d and loaded. *.
12420 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
12430 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 . *. create the
12440 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 ssl command, ini
12450 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 tialize ssl cont
12460 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ext. *. *-------
12470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
124a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
124b0 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 .DLLEXPORT int T
124c0 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 ls_Init(Tcl_Inte
124d0 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 rp *interp) {.
124e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 const char tls
124f0 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 TclInitScript[]
12500 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c = {.#include "tl
12510 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 s.tcl.h"..0x00.
12520 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e };.. dprin
12530 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
12540 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 /*. * We
12550 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 54 63 6c only support Tcl
12560 20 38 2e 34 20 6f 72 20 6e 65 77 65 72 0a 20 20 8.4 or newer.
12570 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 0a 23 */. if (.#
12580 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 ifdef USE_TCL_ST
12590 55 42 53 0a 09 54 63 6c 5f 49 6e 69 74 53 74 75 UBS..Tcl_InitStu
125a0 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 bs(interp, "8.4"
125b0 2c 20 30 29 0a 23 65 6c 73 65 0a 09 54 63 6c 5f , 0).#else..Tcl_
125c0 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 PkgRequire(inter
125d0 70 2c 20 22 54 63 6c 22 2c 20 22 38 2e 34 2d 22 p, "Tcl", "8.4-"
125e0 2c 20 30 29 0a 23 65 6e 64 69 66 0a 09 20 3d 3d , 0).#endif.. ==
125f0 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
12600 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
12610 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 }.. if (TlsLi
12620 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f bInit(0) != TCL_
12630 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e OK) {..Tcl_Appen
12640 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
12650 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 "could not initi
12660 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 alize SSL librar
12670 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 y", NULL);..retu
12680 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
12690 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 }.. Tcl_Cre
126a0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
126b0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 terp, "tls::ciph
126c0 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a ers", CiphersObj
126d0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
126e0 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
126f0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
12700 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
12710 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
12720 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 p, "tls::connect
12730 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e ion", Connection
12740 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 InfoObjCmd, (Cli
12750 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
12760 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
12770 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
12780 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
12790 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
127a0 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 handshake", Hand
127b0 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c shakeObjCmd, (Cl
127c0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
127d0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
127e0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
127f0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
12800 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
12810 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 :import", Import
12820 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
12830 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
12840 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
12850 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
12860 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
12870 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d terp, "tls::unim
12880 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f port", UnimportO
12890 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
128a0 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
128b0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
128c0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
128d0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
128e0 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 erp, "tls::statu
128f0 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 s", StatusObjCmd
12900 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
12910 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
12920 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
12930 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
12940 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
12950 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 "tls::version",
12960 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 VersionObjCmd, (
12970 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
12980 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
12990 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
129a0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
129b0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
129c0 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 s::misc", MiscOb
129d0 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
129e0 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
129f0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
12a00 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
12a10 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
12a20 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 rp, "tls::protoc
12a30 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f ols", ProtocolsO
12a40 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
12a50 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
12a60 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
12a70 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 L);.. if (int
12a80 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c erp) {..Tcl_Eval
12a90 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 (interp, tlsTclI
12aa0 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20 20 20 nitScript);.
12ab0 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 54 63 }.. return(Tc
12ac0 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 l_PkgProvide(int
12ad0 65 72 70 2c 20 22 74 6c 73 22 2c 20 50 41 43 4b erp, "tls", PACK
12ae0 41 47 45 5f 56 45 52 53 49 4f 4e 29 29 3b 0a 7d AGE_VERSION));.}
12af0 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
12b30 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 *. *.Tls_SafeIni
12b40 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d t --. *. *.-----
12b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 -----------*. *.
12b80 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 Standard procedu
12b90 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20 27 re required by '
12ba0 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 load'.. *.Initia
12bb0 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e lizes this exten
12bc0 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 sion for a safe
12bd0 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 interpreter.. *.
12be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c10 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 *. *. *.Side eff
12c20 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 ects:. *..As of
12c30 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 'Tls_Init'. *. *
12c40 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 .Result:. *..A s
12c50 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f tandard Tcl erro
12c60 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d r code.. *. *---
12c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ca0 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f ---*. */.DLLEXPO
12cb0 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 RT int Tls_SafeI
12cc0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a nit(Tcl_Interp *
12cd0 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 interp) {. dp
12ce0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
12cf0 0a 20 20 20 20 72 65 74 75 72 6e 28 54 6c 73 5f . return(Tls_
12d00 49 6e 69 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d Init(interp));.}
12d10 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
12d50 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 *. *.TlsLibInit
12d60 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d --. *. *.-------
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 2a 0a 20 2a 09 49 6e ---------*. *.In
12da0 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 itializes SSL li
12db0 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 brary once per a
12dc0 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d pplication. *.--
12dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
12e00 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 *. *.Side effec
12e10 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 ts:. *..initiali
12e20 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a zes SSL library.
12e30 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a *. *.Result:. *
12e40 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d ..none. *. *----
12e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e80 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 --*. */.static i
12e90 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e nt TlsLibInit(in
12ea0 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 t uninitialize)
12eb0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 {. static int
12ec0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 initialized = 0
12ed0 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 ;. int status
12ee0 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 = TCL_OK;.#if d
12ef0 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
12f00 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
12f10 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
12f20 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c size_t num_l
12f30 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 ocks;.#endif..
12f40 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 if (uninitiali
12f50 7a 65 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 ze) {. if
12f60 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 (!initialized)
12f70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 70 {. dp
12f80 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 rintf("Asked to
12f90 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 uninitialize, bu
12fa0 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 t we are not ini
12fb0 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 20 20 20 tialized");..
12fc0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 28 return(
12fd0 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 TCL_OK);.
12fe0 20 7d 0a 0a 20 20 20 20 20 20 20 20 64 70 72 69 }.. dpri
12ff0 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e ntf("Asked to un
13000 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 initialize");..#
13010 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
13020 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
13030 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
13040 44 53 29 0a 20 20 20 20 20 20 20 20 54 63 6c 5f DS). Tcl_
13050 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f MutexLock(&init_
13060 6d 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 mx);.. if
13070 20 28 6c 6f 63 6b 73 29 20 7b 0a 20 20 20 20 20 (locks) {.
13080 20 20 20 20 20 20 20 66 72 65 65 28 6c 6f 63 6b free(lock
13090 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 s);.
130a0 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 locks = NULL;.
130b0 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 73 43 locksC
130c0 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 ount = 0;.
130d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 }.#endif.
130e0 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d initialized =
130f0 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 0;..#if defined
13100 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
13110 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
13120 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 20 20 _THREADS).
13130 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 Tcl_MutexUnloc
13140 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e k(&init_mx);.#en
13150 64 69 66 0a 0a 20 20 20 20 20 20 20 20 72 65 74 dif.. ret
13160 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 urn(TCL_OK);.
13170 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 }.. if (init
13180 69 61 6c 69 7a 65 64 29 20 7b 0a 20 20 20 20 20 ialized) {.
13190 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
131a0 65 64 2c 20 62 75 74 20 75 73 69 6e 67 20 63 61 ed, but using ca
131b0 63 68 65 64 20 76 61 6c 75 65 22 29 3b 0a 20 20 ched value");.
131c0 20 20 20 20 20 20 72 65 74 75 72 6e 28 73 74 61 return(sta
131d0 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 tus);. }..
131e0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
131f0 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 ");..#if defined
13200 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
13210 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
13220 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 _THREADS). Tc
13230 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 l_MutexLock(&ini
13240 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 t_mx);.#endif.
13250 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 initialized =
13260 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 1;..#if defined(
13270 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
13280 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
13290 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d THREADS). num
132a0 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 _locks = 1;.
132b0 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e locksCount = (in
132c0 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 t) num_locks;.
132d0 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 locks = malloc
132e0 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 (sizeof(*locks)
132f0 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 * num_locks);.
13300 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 memset(locks,
13310 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 0, sizeof(*locks
13320 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a ) * num_locks);.
13330 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 #endif.. /* I
13340 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c nitialize BOTH l
13350 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 ibcrypto and lib
13360 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e ssl. */. OPEN
13370 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 SSL_init_ssl(OPE
13380 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 NSSL_INIT_LOAD_S
13390 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 SL_STRINGS | OPE
133a0 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 NSSL_INIT_LOAD_C
133b0 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c RYPTO_STRINGS..|
133c0 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 OPENSSL_INIT_AD
133d0 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 D_ALL_CIPHERS |
133e0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 OPENSSL_INIT_ADD
133f0 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 _ALL_DIGESTS, NU
13400 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 LL);.. BIO_ne
13410 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a w_tcl(NULL, 0);.
13420 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 .#if 0. /*.
13430 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 * XXX:TODO: R
13440 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 emove this code
13450 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 and replace it w
13460 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 ith a check.
13470 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e * for enough en
13480 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 tropy and do not
13490 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f try to create o
134a0 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 ur own. * te
134b0 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 rrible entropy.
134c0 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 */. /*.
134d0 20 20 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 * Seed the ra
134e0 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 ndom number gene
134f0 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c rator in the SSL
13500 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a library,. *
13510 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 using the do/wh
13520 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 ile construct be
13530 63 61 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 cause of the bug
13540 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 note in the.
13550 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 * OpenSSL FAQ
13560 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 at http://www.op
13570 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 enssl.org/suppor
13580 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 t/faq.html#USER1
13590 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 . *. * T
135a0 68 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 he crux of the p
135b0 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 roblem is that S
135c0 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f olaris 7 does no
135d0 74 20 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 t have a. *
135e0 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f /dev/random or /
135f0 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 dev/urandom devi
13600 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 ce so it cannot
13610 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 gather enough.
13620 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f * entropy fro
13630 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 m the RAND_seed(
13640 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 ) when TLS initi
13650 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 alizes and refus
13660 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 es. * to go
13670 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 further. Earlier
13680 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 versions of Ope
13690 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 nSSL carried on
136a0 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 regardless..
136b0 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 */. srand((u
136c0 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d nsigned int) tim
136d0 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c e((time_t *) NUL
136e0 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 L));. do {..f
136f0 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 or (i = 0; i < 1
13700 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6; i++) {.. r
13710 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b nd_seed[i] = 1 +
13720 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a (char) (255.0 *
13730 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 rand()/(RAND_MA
13740 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e X+1.0));..}..RAN
13750 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c D_seed(rnd_seed,
13760 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 sizeof(rnd_seed
13770 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 ));. } while
13780 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 (RAND_status() !
13790 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 = 1);.#endif..#i
137a0 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 f defined(OPENSS
137b0 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 L_THREADS) && de
137c0 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 fined(TCL_THREAD
137d0 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c S)..Tcl_MutexUnl
137e0 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 ock(&init_mx);.#
137f0 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 73 endif...return(s
13800 74 61 74 75 73 29 3b 0a 7d 0a tatus);.}.