0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61 (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69 some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68 ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32 pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72 ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79 poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53 right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29 *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61 2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 ka SSL) Channel
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64 - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63 on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50 uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68 st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65 based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70 rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64 * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61 dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64 .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74 ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 full fileevent
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 Also work done
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68 ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 e impetus to do
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64 cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 pts.h".#include
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 rsa.h>.#include
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61 <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72 10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76 "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69 1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72 dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a (key), (dsp))).
04e0: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29 #define REASON()
04f0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f .ERR_reason_erro
0500: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74 r_string(ERR_get
0510: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69 _error())..stati
0520: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 c SSL_CTX *CTX_I
0530: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 nit(State *state
0540: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 Ptr, int isServe
0550: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 r, int proto, ch
0560: 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 ar *key,...char
0570: 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 *certfile, unsig
0580: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 ned char *key_as
0590: 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 n1, unsigned cha
05a0: 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 r *cert_asn1,...
05b0: 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e int key_asn1_len
05c0: 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f , int cert_asn1_
05d0: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72 len, char *CAdir
05e0: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a , char *CAfile,.
05f0: 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c ..char *ciphers,
0600: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 char *ciphersui
0610: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 tes, int level,
0620: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b char *DHparams);
0630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 ..static int.Tls
0640: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e LibInit(int unin
0650: 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66 itialize);..#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 ine TLS_PROTO_SS
0670: 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 L2..0x01.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 TLS_PROTO_SSL3.
0690: 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c .0x02.#define TL
06a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 S_PROTO_TLS1..0x
06b0: 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 04.#define TLS_P
06c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 ROTO_TLS1_1.0x08
06d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f .#define TLS_PRO
06e0: 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 TO_TLS1_2.0x10.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f define TLS_PROTO
0700: 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 _TLS1_3.0x20.#de
0710: 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 fine ENABLED(fla
0720: 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 g, mask).(((flag
0730: 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 ) & (mask)) == (
0740: 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20 mask))..#define
0750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22 SSLKEYLOGFILE.."
0760: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a SSLKEYLOGFILE"..
0770: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74 /*. * Static dat
0780: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f a structures. */
0790: 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 ..#ifndef OPENSS
07a0: 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 65 L_NO_DH.#include
07b0: 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a 23 "dh_params.h".#
07c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72 endif../*. * Thr
07d0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64 ead-Safe TLS Cod
07e0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 e. */..#ifdef TC
07f0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e L_THREADS.#defin
0800: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 e OPENSSL_THREAD
0810: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64 _DEFINES.#includ
0820: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 e <openssl/opens
0830: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65 slconf.h>..#ifde
0840: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 f OPENSSL_THREAD
0850: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e S.#include <open
0860: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69 ssl/crypto.h>.#i
0870: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0880: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 ssl.h>../*. * Th
0890: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e readed operation
08a0: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e requires lockin
08b0: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42 g callbacks. * B
08c0: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74 ased from /crypt
08d0: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20 o/cryptlib.c of
08e0: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70 OpenSSL and NSOp
08f0: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74 enSSL.. */..stat
0900: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f ic Tcl_Mutex *lo
0910: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 cks = NULL;.stat
0920: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e ic int locksCoun
0930: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63 t = 0;.static Tc
0940: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b l_Mutex init_mx;
0950: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53 .#endif /* OPENS
0960: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65 SL_THREADS */.#e
0970: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45 ndif /* TCL_THRE
0980: 41 44 53 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a ADS */../*******
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f *************/./
09a0: 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 * Callbacks
09b0: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a */./*********
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0c 0a ***********/....
09d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 --------. *. * I
0a20: 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 nfoCallback --.
0a30: 2a 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53 *. *.monitors SS
0a40: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f L connection pro
0a50: 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c cess. *. * Resul
0a60: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
0a70: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
0a80: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
0a90: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
0aa0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ae0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
0af0: 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 void.InfoCallbac
0b00: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
0b10: 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 , int where, int
0b20: 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 ret) {. Stat
0b30: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
0b40: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 tate*)SSL_get_ap
0b50: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 p_data((SSL *)ss
0b60: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 l);. Tcl_Inte
0b70: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
0b80: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
0b90: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
0ba0: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 tr;. char *ma
0bb0: 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 jor; char *minor
0bc0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
0bd0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
0be0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
0bf0: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
0c00: 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e j*)NULL)..return
0c10: 3b 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 ;.. cmdPtr =
0c20: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
0c30: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
0c40: 61 63 6b 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 ack);..#if 0.
0c50: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c if (where & SSL
0c60: 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 73 65 _CB_ALERT) {..se
0c70: 76 20 3d 20 53 53 4c 5f 61 6c 65 72 74 5f 74 79 v = SSL_alert_ty
0c80: 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 pe_string_long(r
0c90: 65 74 29 3b 0a 09 69 66 20 28 73 74 72 63 6d 70 et);..if (strcmp
0ca0: 28 73 65 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d (sev, "fatal")==
0cb0: 30 29 20 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65 0) {./* Map to e
0cc0: 72 72 6f 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73 rror */.. Tls
0cd0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
0ce0: 20 53 53 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20 SSL_ERROR(ssl,
0cf0: 30 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 0));.. return
0d00: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ;..}. }.#endi
0d10: 66 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 f. if (where
0d20: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 & SSL_CB_HANDSHA
0d30: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a KE_START) {..maj
0d40: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 or = "handshake"
0d50: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 ;..minor = "star
0d60: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 t";. } else i
0d70: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0d80: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 B_HANDSHAKE_DONE
0d90: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 ) {..major = "ha
0da0: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 ndshake";..minor
0db0: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d = "done";. }
0dc0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 else {..if (whe
0dd0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 re & SSL_CB_ALER
0de0: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 T)..major = "ale
0df0: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 rt";..else if (w
0e00: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f here & SSL_ST_CO
0e10: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 NNECT).major = "
0e20: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 connect";..else
0e30: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
0e40: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f ST_ACCEPT)..majo
0e50: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 r = "accept";..e
0e60: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 lse.....major =
0e70: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 "unknown";...if
0e80: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
0e90: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 READ)..minor = "
0ea0: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 read";..else if
0eb0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
0ec0: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 WRITE)..minor =
0ed0: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 "write";..else i
0ee0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0ef0: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d B_LOOP)..minor =
0f00: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 "loop";..else i
0f10: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0f20: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d B_EXIT)..minor =
0f30: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 "exit";..else..
0f40: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e ...minor = "unkn
0f50: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 own";. }..
0f60: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
0f70: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
0f80: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
0f90: 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f wStringObj("info
0fa0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
0fb0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
0fc0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
0fd0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
0fe0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
0ff0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
1000: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
1010: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
1020: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1030: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1040: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
1050: 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b Obj(major, -1));
1060: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1070: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1080: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
1090: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
10a0: 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 inor, -1));..
10b0: 20 69 66 20 28 77 68 65 72 65 20 26 20 28 53 53 if (where & (SS
10c0: 4c 5f 43 42 5f 4c 4f 4f 50 7c 53 53 4c 5f 43 42 L_CB_LOOP|SSL_CB
10d0: 5f 45 58 49 54 29 29 20 7b 0a 09 54 63 6c 5f 4c _EXIT)) {..Tcl_L
10e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1100: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
1110: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 StringObj(SSL_st
1120: 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 ate_string_long(
1130: 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ssl), -1));.
1140: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 } else if (where
1150: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 & SSL_CB_ALERT)
1160: 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a {..const char *
1170: 63 70 20 3d 20 28 63 68 61 72 20 2a 29 20 53 53 cp = (char *) SS
1180: 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 L_alert_desc_str
1190: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a 0a ing_long(ret);..
11a0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11c0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
11d0: 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d wStringObj(cp, -
11e0: 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 1));. } else
11f0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
1200: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
1210: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
1220: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1230: 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 j(SSL_state_stri
1240: 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 ng_long(ssl), -1
1250: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 ));. }. Tc
1260: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 l_Preserve((Clie
1270: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
1280: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 . Tcl_Preserv
1290: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
12a0: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 tatePtr);.. T
12b0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
12c0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 28 76 6f cmdPtr);. (vo
12d0: 69 64 29 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 id) Tcl_EvalObjE
12e0: 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 x(interp, cmdPtr
12f0: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 , TCL_EVAL_GLOBA
1300: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 L);. Tcl_Decr
1310: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
1320: 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 ;.. Tcl_Relea
1330: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
1340: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 statePtr);. T
1350: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
1360: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
1370: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
1380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
13c0: 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 . * VerifyCallba
13d0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 ck --. *. *.Moni
13e0: 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 tors SSL certifi
13f0: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 cate validation
1400: 70 72 6f 63 65 73 73 2e 0a 20 2a 09 54 68 69 73 process.. *.This
1410: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 is called whene
1420: 76 65 72 20 61 20 63 65 72 74 69 66 69 63 61 74 ver a certificat
1430: 65 20 69 73 20 69 6e 73 70 65 63 74 65 64 0a 20 e is inspected.
1440: 2a 09 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 *.or decided inv
1450: 61 6c 69 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 alid.. *. * Resu
1460: 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 lts:. *.A callba
1470: 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 ck bound to the
1480: 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72 socket may retur
1490: 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 n one of:. *.
14a0: 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 0...- the certi
14b0: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 ficate is deemed
14c0: 20 69 6e 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 invalid. *.
14d0: 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 1...- the certif
14e0: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 icate is deemed
14f0: 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 65 6d 70 valid. *. emp
1500: 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 ty string.- no c
1510: 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 hange to certifi
1520: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a cate validation.
1530: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
1540: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 ts:. *.The err f
1550: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 ield of the curr
1560: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 ently operative
1570: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 State is set. *.
1580: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 to a string de
1590: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c scribing the SSL
15a0: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 negotiation fai
15b0: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d lure reason. *--
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1600: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
1610: 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 .VerifyCallback(
1620: 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f int ok, X509_STO
1630: 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 RE_CTX *ctx) {.
1640: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
1650: 74 72 2c 20 2a 72 65 73 75 6c 74 3b 0a 20 20 20 tr, *result;.
1660: 20 63 68 61 72 20 2a 65 72 72 53 74 72 2c 20 2a char *errStr, *
1670: 73 74 72 69 6e 67 3b 0a 20 20 20 20 69 6e 74 20 string;. int
1680: 6c 65 6e 67 74 68 3b 0a 20 20 20 20 53 53 4c 20 length;. SSL
1690: 20 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 *ssl..= (SSL*)
16a0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 X509_STORE_CTX_g
16b0: 65 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20 et_ex_data(ctx,
16c0: 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f SSL_get_ex_data_
16d0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 X509_STORE_CTX_i
16e0: 64 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20 dx());. X509
16f0: 20 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53 *cert..= X509_S
1700: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 TORE_CTX_get_cur
1710: 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a rent_cert(ctx);.
1720: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
1730: 50 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53 Ptr.= (State*)SS
1740: 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73 L_get_app_data(s
1750: 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 sl);. Tcl_Int
1760: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
1770: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
1780: 20 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d int depth..=
1790: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f X509_STORE_CTX_
17a0: 67 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 get_error_depth(
17b0: 63 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 ctx);. int er
17c0: 72 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f r..= X509_STORE_
17d0: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 CTX_get_error(ct
17e0: 78 29 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 x);. int code
17f0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
1800: 56 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b 29 Verify: %d", ok)
1810: 3b 0a 0a 20 20 20 20 69 66 20 28 21 6f 6b 29 20 ;.. if (!ok)
1820: 7b 0a 09 65 72 72 53 74 72 20 3d 20 28 63 68 61 {..errStr = (cha
1830: 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 r*)X509_verify_c
1840: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 ert_error_string
1850: 28 65 72 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 (err);. } els
1860: 65 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 28 63 e {..errStr = (c
1870: 68 61 72 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a har *)0;. }..
1880: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
1890: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 ->callback == (T
18a0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
18b0: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 .if (statePtr->v
18c0: 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 flags & SSL_VERI
18d0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
18e0: 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 ER_CERT) {..
18f0: 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c return ok;..} el
1900: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e se {.. return
1910: 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 1;..}. }.
1920: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
1930: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
1940: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
1950: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1960: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1970: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
1980: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
1990: 76 65 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20 verify", -1));.
19a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
19b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
19c0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c rp, cmdPtr,..Tcl
19d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
19e0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
19f0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
1a00: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
1a10: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1a20: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1a30: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
1a40: 62 6a 28 64 65 70 74 68 29 29 3b 0a 20 20 20 20 bj(depth));.
1a50: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1a60: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1a70: 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f 4e 65 77 cmdPtr, Tls_New
1a80: 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 X509Obj(interp,
1a90: 63 65 72 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f cert));. Tcl_
1aa0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1ab0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1ac0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
1ad0: 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20 54 63 6c bj(ok));. Tcl
1ae0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1af0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
1b00: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
1b10: 69 6e 67 4f 62 6a 28 65 72 72 53 74 72 20 3f 20 ingObj(errStr ?
1b20: 65 72 72 53 74 72 20 3a 20 22 22 2c 20 2d 31 29 errStr : "", -1)
1b30: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 );.. Tcl_Pres
1b40: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 erve((ClientData
1b50: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 ) interp);. T
1b60: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
1b70: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
1b80: 72 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 r);.. statePt
1b90: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f r->flags |= TLS_
1ba0: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20 TCL_CALLBACK;..
1bb0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
1bc0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
1bd0: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c code = Tcl_Eval
1be0: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d ObjEx(interp, cm
1bf0: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 dPtr, TCL_EVAL_G
1c00: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 LOBAL);. if (
1c10: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 code != TCL_OK)
1c20: 7b 0a 09 2f 2a 20 49 74 20 67 6f 74 20 61 6e 20 {../* It got an
1c30: 65 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 error - reject t
1c40: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 2e 09 he certificate..
1c50: 09 2a 2f 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a .*/.#if (TCL_MAJ
1c60: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
1c70: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
1c80: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
1c90: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
1ca0: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
1cb0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
1cc0: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
1cd0: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 09 code);.#endif..
1ce0: 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c ok = 0;. } el
1cf0: 73 65 20 7b 0a 09 72 65 73 75 6c 74 20 3d 20 54 se {..result = T
1d00: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_GetObjResult(
1d10: 69 6e 74 65 72 70 29 3b 0a 09 73 74 72 69 6e 67 interp);..string
1d20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
1d30: 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 2c 20 FromObj(result,
1d40: 26 6c 65 6e 67 74 68 29 3b 0a 09 2f 2a 20 41 6e &length);../* An
1d50: 20 65 6d 70 74 79 20 72 65 73 75 6c 74 20 6c 65 empty result le
1d60: 61 76 65 73 20 76 65 72 69 66 69 63 61 74 69 6f aves verificatio
1d70: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f 0a n unchanged..*/.
1d80: 09 69 66 20 28 73 74 72 69 6e 67 20 21 3d 20 4e .if (string != N
1d90: 55 4c 4c 20 26 26 20 6c 65 6e 67 74 68 20 3e 20 ULL && length >
1da0: 30 29 20 7b 0a 09 20 20 20 20 63 6f 64 65 20 3d 0) {.. code =
1db0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f Tcl_GetIntFromO
1dc0: 62 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c bj(interp, resul
1dd0: 74 2c 20 26 6f 6b 29 3b 0a 09 20 20 20 20 69 66 t, &ok);.. if
1de0: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b (code != TCL_OK
1df0: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a ) {.#if (TCL_MAJ
1e00: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
1e10: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
1e20: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 09 54 63 ERSION < 6)...Tc
1e30: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f l_BackgroundErro
1e40: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 r(interp);.#else
1e50: 0a 09 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e ...Tcl_Backgroun
1e60: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 dException(inter
1e70: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 p, code);.#endif
1e80: 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 20 20 20 20 ...ok = 0;..
1e90: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 }..}. }. T
1ea0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
1eb0: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 73 74 cmdPtr);.. st
1ec0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d atePtr->flags &=
1ed0: 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 ~(TLS_TCL_CALLB
1ee0: 41 43 4b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 ACK);.. Tcl_R
1ef0: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
1f00: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 ta) statePtr);.
1f10: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
1f20: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
1f30: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 rp);. return(
1f40: 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 ok);./* By defau
1f50: 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 lt, leave verifi
1f60: 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 cation unchanged
1f70: 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ..*/.}.../*. *--
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fc0: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f -. *. * Tls_Erro
1fd0: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 r --. *. *.Calls
1fe0: 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 24 callback with $
1ff0: 66 64 20 61 6e 64 20 24 6d 73 67 20 2d 20 73 6f fd and $msg - so
2000: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 63 61 the callback ca
2010: 6e 20 64 65 63 69 64 65 0a 20 2a 09 77 68 61 74 n decide. *.what
2020: 20 74 6f 20 64 6f 20 77 69 74 68 20 65 72 72 6f to do with erro
2030: 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 rs.. *. * Side e
2040: 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 ffects:. *.The e
2050: 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 rr field of the
2060: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 currently operat
2070: 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 ive State is set
2080: 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e . *. to a strin
2090: 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 g describing the
20a0: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e SSL negotiation
20b0: 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a failure reason.
20c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2100: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 -----. */.void.T
2110: 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 2a ls_Error(State *
2120: 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 2a statePtr, char *
2130: 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 msg) {. Tcl_I
2140: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
2150: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
2160: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
2170: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 mdPtr;. int c
2180: 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ode;.. dprint
2190: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
21a0: 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a 6d 73 if (msg && *ms
21b0: 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 g) {..Tcl_SetErr
21c0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
21d0: 53 53 4c 22 2c 20 6d 73 67 2c 20 28 63 68 61 72 SSL", msg, (char
21e0: 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 *)NULL);. }
21f0: 65 6c 73 65 20 7b 0a 09 6d 73 67 20 3d 20 54 63 else {..msg = Tc
2200: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
2210: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 bj(Tcl_GetObjRes
2220: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55 4c ult(interp), NUL
2230: 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 L);. }. st
2240: 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 atePtr->err = ms
2250: 67 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 g;.. if (stat
2260: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
2270: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
2280: 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 ) {..char buf[BU
2290: 46 53 49 5a 5d 3b 0a 09 73 70 72 69 6e 74 66 28 FSIZ];..sprintf(
22a0: 62 75 66 2c 20 22 53 53 4c 20 63 68 61 6e 6e 65 buf, "SSL channe
22b0: 6c 20 5c 22 25 73 5c 22 3a 20 65 72 72 6f 72 3a l \"%s\": error:
22c0: 20 25 73 22 2c 0a 09 20 20 20 20 54 63 6c 5f 47 %s",.. Tcl_G
22d0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
22e0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 6d atePtr->self), m
22f0: 73 67 29 3b 0a 09 54 63 6c 5f 53 65 74 52 65 73 sg);..Tcl_SetRes
2300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 62 75 66 2c ult(interp, buf,
2310: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a TCL_VOLATILE);.
2320: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 #if (TCL_MAJOR_V
2330: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 ERSION == 8) &&
2340: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 (TCL_MINOR_VERSI
2350: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 ON < 6)..Tcl_Bac
2360: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 kgroundError(int
2370: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c erp);.#else..Tcl
2380: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 _BackgroundExcep
2390: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 54 43 4c tion(interp, TCL
23a0: 5f 45 52 52 4f 52 29 3b 0a 23 65 6e 64 69 66 0a _ERROR);.#endif.
23b0: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 .return;. }.
23c0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
23d0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
23e0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
23f0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f ;.. Tcl_ListO
2400: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2410: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2420: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2430: 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a ("error", -1));.
2440: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2450: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2460: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
2470: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
2480: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
2490: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
24a0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
24b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
24c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
24d0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
24e0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 wStringObj(msg,
24f0: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 -1));.. Tcl_P
2500: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
2510: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
2520: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
2530: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
2540: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ePtr);.. Tcl_
2550: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
2560: 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d Ptr);. code =
2570: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 Tcl_EvalObjEx(i
2580: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
2590: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b CL_EVAL_GLOBAL);
25a0: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d . if (code !=
25b0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 TCL_OK) {.#if (
25c0: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
25d0: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f N == 8) && (TCL_
25e0: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 MINOR_VERSION <
25f0: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6)..Tcl_Backgrou
2600: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b ndError(interp);
2610: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b .#else..Tcl_Back
2620: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 groundException(
2630: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 interp, code);.#
2640: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 endif. }.
2650: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
2660: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 (cmdPtr);. Tc
2670: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
2680: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
2690: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 ;. Tcl_Releas
26a0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
26b0: 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 nterp);.}.../*.
26c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2700: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f ----. *. * KeyLo
2710: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a gCallback --. *.
2720: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65 *.Write receive
2730: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f d key data to lo
2740: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 g file.. *. * Si
2750: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e de effects:. *.n
2760: 6f 6e 65 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d one. *----------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
27b0: 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 id KeyLogCallbac
27c0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
27d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 , const char *li
27e0: 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a ne) {. char *
27f0: 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c str = getenv(SSL
2800: 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 KEYLOGFILE);.
2810: 20 46 49 4c 45 20 2a 66 64 3b 0a 20 20 20 20 69 FILE *fd;. i
2820: 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 f (str) {..fd =
2830: 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b fopen(str, "a");
2840: 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25 ..fprintf(fd, "%
2850: 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c s\n",line);..fcl
2860: 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d ose(fd);. }.}
2870: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
28c0: 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 * Password Callb
28d0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c ack --. *. *.Cal
28e0: 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 77 led when a passw
28f0: 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 74 6f ord is needed to
2900: 20 75 6e 70 61 63 6b 20 52 53 41 20 61 6e 64 20 unpack RSA and
2910: 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 45 76 61 PEM keys.. *.Eva
2920: 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 70 61 73 ls any bound pas
2930: 73 77 6f 72 64 20 73 63 72 69 70 74 20 61 6e 64 sword script and
2940: 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65 73 returns the res
2950: 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 20 70 61 ult as. *.the pa
2960: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 2e 0a 20 ssword string..
2970: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29b0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
29c0: 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c int.PasswordCall
29d0: 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 back(char *buf,
29e0: 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76 65 int size, int ve
29f0: 72 69 66 79 2c 20 76 6f 69 64 20 2a 75 64 61 74 rify, void *udat
2a00: 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a a) {. State *
2a10: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 statePtr.= (Stat
2a20: 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 e *) udata;.
2a30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
2a40: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
2a50: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
2a60: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
2a70: 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 int code;.. d
2a80: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
2a90: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
2aa0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d Ptr->password ==
2ab0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 NULL) {..if (Tc
2ac0: 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c l_EvalEx(interp,
2ad0: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 "tls::password"
2ae0: 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 , -1, TCL_EVAL_G
2af0: 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b LOBAL) == TCL_OK
2b00: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 ) {.. char *r
2b10: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 et = (char *) Tc
2b20: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c l_GetStringResul
2b30: 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 t(interp);..
2b40: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 strncpy(buf, ret
2b50: 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 , (size_t) size)
2b60: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 ;.. return (i
2b70: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a nt)strlen(ret);.
2b80: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 .} else {.. r
2b90: 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 eturn -1;..}.
2ba0: 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d }.. cmdPtr =
2bb0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
2bc0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 j(statePtr->pass
2bd0: 77 6f 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f word);.. Tcl_
2be0: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
2bf0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
2c00: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
2c10: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
2c20: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c tePtr);.. Tcl
2c30: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
2c40: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 dPtr);. code
2c50: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 = Tcl_EvalObjEx(
2c60: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2c70: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
2c80: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 ;. if (code !
2c90: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 = TCL_OK) {.#if
2ca0: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 (TCL_MAJOR_VERSI
2cb0: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c ON == 8) && (TCL
2cc0: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c _MINOR_VERSION <
2cd0: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 6)..Tcl_Backgro
2ce0: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 undError(interp)
2cf0: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 ;.#else..Tcl_Bac
2d00: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e kgroundException
2d10: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a (interp, code);.
2d20: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 #endif. }.
2d30: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
2d40: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 t(cmdPtr);..
2d50: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
2d60: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
2d70: 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 63 6f 64 r);.. if (cod
2d80: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 e == TCL_OK) {..
2d90: 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 char *ret = (cha
2da0: 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 r *) Tcl_GetStri
2db0: 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 ngResult(interp)
2dc0: 3b 0a 09 69 66 20 28 73 74 72 6c 65 6e 28 72 65 ;..if (strlen(re
2dd0: 74 29 20 3c 20 73 69 7a 65 20 2d 20 31 29 20 7b t) < size - 1) {
2de0: 0a 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 .. strncpy(bu
2df0: 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 f, ret, (size_t)
2e00: 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 54 63 6c size);.. Tcl
2e10: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
2e20: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 Data) interp);..
2e30: 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 return (int)
2e40: 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 0a strlen(ret);..}.
2e50: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 }. Tcl_Re
2e60: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 lease((ClientDat
2e70: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 a) interp);.
2e80: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 76 65 72 69 return -1;..veri
2e90: 66 79 20 3d 20 76 65 72 69 66 79 3b 0a 7d 0a 0c fy = verify;.}..
2ea0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
2ef0: 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b Session Callback
2f00: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a for Clients --.
2f10: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 *. *.Called whe
2f20: 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 n a new session
2f30: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 is added to the
2f40: 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e cache. In TLS 1.
2f50: 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 3. *.this may be
2f60: 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 received multip
2f70: 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 le times after t
2f80: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f he handshake. Fo
2f90: 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 r. *.earlier ver
2fa0: 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c sions, this will
2fb0: 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72 be received dur
2fc0: 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b ing the handshak
2fd0: 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68 e.. *.This is th
2fe0: 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20 e preferred way
2ff0: 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75 to obtain a resu
3000: 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 mable session..
3010: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
3020: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
3030: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
3040: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
3050: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 defined). *. * R
3060: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 eturn codes:. *.
3070: 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20 0 = error where
3080: 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 session will be
3090: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f immediately remo
30a0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 ved from the int
30b0: 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 ernal cache.. *.
30c0: 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72 1 = success wher
30d0: 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65 e app retains se
30e0: 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e ssion in session
30f0: 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 cache, and must
3100: 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f call SSL_SESSIO
3110: 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f N_free() when do
3120: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
3170: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73 .static int.Sess
3180: 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 ionCallback(cons
3190: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f t SSL *ssl, SSL_
31a0: 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e SESSION *session
31b0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
31c0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
31d0: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 *)SSL_get_app_da
31e0: 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a ta((SSL *)ssl);.
31f0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
3200: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
3210: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
3220: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
3230: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
3240: 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b ed char *ticket;
3250: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
3260: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f ned char *sessio
3270: 6e 5f 69 64 3b 0a 20 20 20 20 69 6e 74 20 63 6f n_id;. int co
3280: 64 65 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c de;. size_t l
3290: 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 en2;. unsigne
32a0: 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 d int ulen;..
32b0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
32c0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ");.. if (sta
32d0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
32e0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
32f0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
3300: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a _TLSEXT_ERR_OK;.
3310: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
3320: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 sl == NULL) {..r
3330: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
3340: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
3350: 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 }.. cmdPtr =
3360: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
3370: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
3380: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 ack);. Tcl_Li
3390: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
33a0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
33b0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
33c0: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d Obj("session", -
33d0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 1));.. /* Ses
33e0: 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 sion id */. s
33f0: 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f ession_id = SSL_
3400: 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 SESSION_get_id(s
3410: 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a ession, &ulen);.
3420: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
3430: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3440: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
3450: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a _NewByteArrayObj
3460: 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e (session_id, (in
3470: 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 t) ulen));..
3480: 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 /* Session ticke
3490: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 t */. SSL_SES
34a0: 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 SION_get0_ticket
34b0: 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 (session, &ticke
34c0: 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 t, &len2);. T
34d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
34e0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
34f0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 cmdPtr, Tcl_NewB
3500: 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b yteArrayObj(tick
3510: 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 et, (int) len2))
3520: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74 69 ;.. /* Lifeti
3530: 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73 me - number of s
3540: 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63 econds */. Tc
3550: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3560: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
3570: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c mdPtr,..Tcl_NewL
3580: 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53 ongObj((long) SS
3590: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
35a0: 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 cket_lifetime_hi
35b0: 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a nt(session)));..
35c0: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
35d0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
35e0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 terp);. Tcl_P
35f0: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
3600: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
3610: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
3620: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
3630: 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 code = Tcl_Ev
3640: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 alObjEx(interp,
3650: 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c cmdPtr, TCL_EVAL
3660: 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 _GLOBAL);. if
3670: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b (code != TCL_OK
3680: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a ) {.#if (TCL_MAJ
3690: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
36a0: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
36b0: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
36c0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
36d0: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
36e0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
36f0: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
3700: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 code);.#endif.
3710: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
3720: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
3730: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 );.. Tcl_Rele
3740: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
3750: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 statePtr);.
3760: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
3770: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
3780: 3b 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d ; return 0;.}
3790: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
37e0: 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 * ALPN Callback
37f0: 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 for Servers --.
3800: 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 *. *.Perform ser
3810: 76 65 72 2d 73 69 64 65 20 70 72 6f 74 6f 63 6f ver-side protoco
3820: 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c l (http/1.1, h2,
3830: 20 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 h3, etc.) selec
3840: 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 tion for the. *.
3850: 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 incoming connect
3860: 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 ion. Called afte
3870: 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 r Hello and serv
3880: 65 72 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 0a er callbacks. *.
3890: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
38a0: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
38b0: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
38c0: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
38d0: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 fined). *. * Ret
38e0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
38f0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a L_TLSEXT_ERR_OK:
3900: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 ALPN protocol s
3910: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e elected. The con
3920: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
3930: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s.. *.SSL_TLSEXT
3940: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
3950: 3a 20 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f : There was no o
3960: 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74 verlap between t
3970: 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20 he client's. *.
3980: 20 20 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 supplied list
3990: 20 61 6e 64 20 74 68 65 20 73 65 72 76 65 72 20 and the server
39a0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 configuration. T
39b0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 he connection wi
39c0: 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20 ll be aborted..
39d0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
39e0: 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f _NOACK: ALPN pro
39f0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 tocol not select
3a00: 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73 ed, e.g., becaus
3a10: 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20 e no ALPN. *.
3a20: 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63 protocols are c
3a30: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 onfigured for th
3a40: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 is connection. T
3a50: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
3a60: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d ntinues.. *. *--
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ab0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
3ac0: 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f .ALPNCallback(co
3ad0: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f nst SSL *ssl, co
3ae0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
3af0: 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 r **out, unsigne
3b00: 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a d char *outlen,.
3b10: 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 .const unsigned
3b20: 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e char *in, unsign
3b30: 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f ed int inlen, vo
3b40: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
3b50: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
3b60: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 (State*)arg;.
3b70: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
3b80: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
3b90: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
3ba0: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
3bb0: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b int code, res;
3bc0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
3bd0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
3be0: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
3bf0: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
3c00: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 *)NULL) {..retur
3c10: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
3c20: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 _OK;. } else
3c30: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 if (ssl == NULL)
3c40: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
3c50: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
3c60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
3c70: 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a elect protocol *
3c80: 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65 /. if (SSL_se
3c90: 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 lect_next_proto(
3ca0: 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 out, outlen, sta
3cb0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 tePtr->protos, s
3cc0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f tatePtr->protos_
3cd0: 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 len,..in, inlen)
3ce0: 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f == OPENSSL_NPN_
3cf0: 4e 45 47 4f 54 49 41 54 45 44 29 20 7b 0a 09 72 NEGOTIATED) {..r
3d00: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
3d10: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c ERR_OK;. } el
3d20: 73 65 20 7b 0a 09 2f 2a 20 4e 6f 20 6f 76 65 72 se {../* No over
3d30: 6c 61 70 2c 20 73 6f 20 66 69 72 73 74 20 63 6c lap, so first cl
3d40: 69 65 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 75 73 ient protocol us
3d50: 65 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c ed */..res = SSL
3d60: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
3d70: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d K;. }.. cm
3d80: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
3d90: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
3da0: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 ->callback);.
3db0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
3dc0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3dd0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
3de0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e wStringObj("alpn
3df0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
3e00: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3e10: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3e20: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
3e30: 69 6e 67 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 ingObj(*out, -1)
3e40: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 );.. Tcl_Pres
3e50: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 erve((ClientData
3e60: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 ) interp);. T
3e70: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
3e80: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
3e90: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 r);.. Tcl_Inc
3ea0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
3eb0: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 );. code = Tc
3ec0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 l_EvalObjEx(inte
3ed0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f rp, cmdPtr, TCL_
3ee0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 EVAL_GLOBAL);.
3ef0: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 if (code != TC
3f00: 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c L_OK) {.#if (TCL
3f10: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d _MAJOR_VERSION =
3f20: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e = 8) && (TCL_MIN
3f30: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a OR_VERSION < 6).
3f40: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
3f50: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 rror(interp);.#e
3f60: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f lse..Tcl_Backgro
3f70: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 undException(int
3f80: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 erp, code);.#end
3f90: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c if. }. Tcl
3fa0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
3fb0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f dPtr);.. Tcl_
3fc0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
3fd0: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
3fe0: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
3ff0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 (ClientData) int
4000: 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e erp);. return
4010: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d res;.}.../*. *-
4020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4060: 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c --. *. * SNI Cal
4070: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 lback for Server
4080: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f s --. *. *.Perfo
4090: 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 rm server-side S
40a0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 NI hostname sele
40b0: 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 ction after rece
40c0: 69 76 69 6e 67 20 53 4e 49 20 68 65 61 64 65 72 iving SNI header
40d0: 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 61 66 74 65 .. *.Called afte
40e0: 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b r hello callback
40f0: 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c 50 4e but before ALPN
4100: 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a callback.. *. *
4110: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
4120: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
4130: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 ects:. *.Calls c
4140: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 allback (if defi
4150: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ned). *. * Retur
4160: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f n codes:. *.SSL_
4170: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 TLSEXT_ERR_OK: S
4180: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 NI hostname is a
4190: 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e ccepted. The con
41a0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
41b0: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s.. *.SSL_TLSEXT
41c0: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
41d0: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 : SNI hostname i
41e0: 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2e 20 s not accepted.
41f0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 The connection.
4200: 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74 65 64 *. is aborted
4210: 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20 61 6c . Default for al
4220: 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f 55 4e ert is SSL_AD_UN
4230: 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e RECOGNIZED_NAME.
4240: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
4250: 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 RR_ALERT_WARNING
4260: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 : SNI hostname i
4270: 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2c 20 s not accepted,
4280: 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a 20 2a warning alert. *
4290: 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 20 69 . sent (not i
42a0: 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 n TLSv1.3). The
42b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
42c0: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 nues.. *.SSL_TLS
42d0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 EXT_ERR_NOACK: S
42e0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e NI hostname is n
42f0: 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e 64 20 ot accepted and
4300: 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 not acknowledged
4310: 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 ,. *. e.g. if
4320: 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 65 SNI has not bee
4330: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 n configured. Th
4340: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
4350: 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d tinues.. *. *---
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43a0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
43b0: 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 SNICallback(cons
43c0: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 t SSL *ssl, int
43d0: 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 *alert, void *ar
43e0: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a g) {. State *
43f0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
4400: 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f e*)arg;. Tcl_
4410: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d Interp *interp.=
4420: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
4430: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a p;. Tcl_Obj *
4440: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 cmdPtr;. int
4450: 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a code;. char *
4460: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c servername = NUL
4470: 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 L;.. dprintf(
4480: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
4490: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 if (statePtr->ca
44a0: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f llback == (Tcl_O
44b0: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 bj*)NULL) {..ret
44c0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
44d0: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 RR_OK;. } els
44e0: 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c e if (ssl == NUL
44f0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
4500: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
4510: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 K;. }.. se
4520: 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 rvername = SSL_g
4530: 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 et_servername(ss
4540: 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 l, TLSEXT_NAMETY
4550: 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 PE_host_name);.
4560: 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e 61 if (!serverna
4570: 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 me || servername
4580: 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 20 [0] == '\0') {.
4590: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 53 return SS
45a0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
45b0: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 CK;. }.. c
45c0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c mdPtr = Tcl_Dupl
45d0: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 icateObj(statePt
45e0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 r->callback);.
45f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
4600: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
4610: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
4620: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 ewStringObj("sni
4630: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
4640: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
4650: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
4660: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
4670: 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d ingObj(servernam
4680: 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 e , -1));.. T
4690: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
46a0: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
46b0: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 ;. Tcl_Preser
46c0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
46d0: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
46e0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
46f0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
4700: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
4710: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
4720: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
4730: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
4740: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
4750: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
4760: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
4770: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
4780: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
4790: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
47a0: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
47b0: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
47c0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
47d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
47e0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
47f0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
4800: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
4810: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
4820: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 ePtr);. Tcl_R
4830: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
4840: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 ta) interp);.
4850: 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 return SSL_TLSE
4860: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f XT_ERR_OK;.}.../
4870: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
4880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 65 -------. *. * He
48c0: 6c 6c 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 llo Handshake Ca
48d0: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 llback for Serve
48e0: 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 rs --. *. *.Used
48f0: 20 62 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 by server to ex
4900: 61 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 amine the server
4910: 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e name indication
4920: 20 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e (SNI) extension
4930: 0a 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 . *.provided by
4940: 74 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 the client in or
4950: 64 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e der to select an
4960: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 appropriate cer
4970: 74 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 tificate to. *.p
4980: 72 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 resent, and make
4990: 20 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 other configura
49a0: 74 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 tion adjustments
49b0: 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 relevant to tha
49c0: 74 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 t server. *.name
49d0: 20 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 and its configu
49e0: 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 ration. This inc
49f0: 6c 75 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f ludes swapping o
4a00: 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 ut the associate
4a10: 64 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 d. *.SSL_CTX poi
4a20: 6e 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 nter, modifying
4a30: 74 68 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 the server's lis
4a40: 74 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 t of permitted T
4a50: 4c 53 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 LS versions,. *.
4a60: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 changing the ser
4a70: 76 65 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 ver's cipher lis
4a80: 74 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f t in response to
4a90: 20 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 the client's ci
4aa0: 70 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a pher list, etc..
4ab0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
4ac0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
4ad0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 e effects:. *.Ca
4ae0: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 lls callback (if
4af0: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 defined). *. *
4b00: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a Return codes:. *
4b10: 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c .SSL_CLIENT_HELL
4b20: 4f 5f 52 45 54 52 59 20 3d 20 73 75 73 70 65 6e O_RETRY = suspen
4b30: 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c d the handshake,
4b40: 20 61 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 and the handsha
4b50: 6b 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c ke function will
4b60: 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 return immediat
4b70: 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e ely. *.SSL_CLIEN
4b80: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 20 3d 20 T_HELLO_ERROR =
4b90: 66 61 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 failure, termina
4ba0: 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 te connection. S
4bb0: 65 74 20 61 6c 65 72 74 20 74 6f 20 65 72 72 6f et alert to erro
4bc0: 72 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 r code.. *.SSL_C
4bd0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 LIENT_HELLO_SUCC
4be0: 45 53 53 20 3d 20 73 75 63 63 65 73 73 0a 20 2a ESS = success. *
4bf0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c30: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
4c40: 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 c int.HelloCallb
4c50: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 ack(const SSL *s
4c60: 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 sl, int *alert,
4c70: 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 void *arg) {.
4c80: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
4c90: 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a = (State*)arg;.
4ca0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
4cb0: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
4cc0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
4cd0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
4ce0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 int code;.
4cf0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 const char *se
4d00: 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f rvername;. co
4d10: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
4d20: 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74 r *p;. size_t
4d30: 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b len, remaining;
4d40: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
4d50: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
4d60: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
4d70: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
4d80: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 *)NULL) {..retur
4d90: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
4da0: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 _OK;. } else
4db0: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 if (ssl == NULL)
4dc0: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
4dd0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
4de0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 . }.. /* G
4df0: 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 et names */.
4e00: 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74 5f if (!SSL_client_
4e10: 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28 73 hello_get0_ext(s
4e20: 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 45 5f sl, TLSEXT_TYPE_
4e30: 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70 2c server_name, &p,
4e40: 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 &remaining) ||
4e50: 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 remaining <= 2)
4e60: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e {. return
4e70: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
4e80: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a O_ERROR;. }..
4e90: 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 /* Extract t
4ea0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 he length of the
4eb0: 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 6f supplied list o
4ec0: 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 f names. */.
4ed0: 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c len = (*(p++) <<
4ee0: 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 8);. len +=
4ef0: 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 *(p++);. if (
4f00: 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d 61 69 len + 2 != remai
4f10: 6e 69 6e 67 29 20 7b 0a 20 20 20 20 20 20 20 20 ning) {.
4f20: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
4f30: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
4f40: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
4f50: 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f ng = len;.. /
4f60: 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 70 72 * The list in pr
4f70: 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 73 20 actice only has
4f80: 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 a single element
4f90: 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f 6e , so we only con
4fa0: 73 69 64 65 72 20 74 68 65 20 66 69 72 73 74 20 sider the first
4fb0: 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 one. */. if (
4fc0: 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20 7c remaining == 0 |
4fd0: 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58 54 | *p++ != TLSEXT
4fe0: 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e _NAMETYPE_host_n
4ff0: 61 6d 65 29 20 7b 0a 20 20 20 20 20 20 20 20 72 ame) {. r
5000: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
5010: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
5020: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e }. remainin
5030: 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 g--;.. /* Now
5040: 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 we can finally
5050: 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74 pull out the byt
5060: 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 e array with the
5070: 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 actual hostname
5080: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d . */. if (rem
5090: 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 20 aining <= 2) {.
50a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 53 return SS
50b0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
50c0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
50d0: 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c len = (*(p++) <<
50e0: 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 8);. len +=
50f0: 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 *(p++);. if (
5100: 6c 65 6e 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e len + 2 > remain
5110: 69 6e 67 29 20 7b 0a 20 20 20 20 20 20 20 20 72 ing) {. r
5120: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
5130: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
5140: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e }. remainin
5150: 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72 g = len;. ser
5160: 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 vername = (const
5170: 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20 char *)p;..
5180: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
5190: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
51a0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 tr->callback);.
51b0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
51c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
51d0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
51e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 NewStringObj("he
51f0: 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 llo", -1));.
5200: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
5210: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
5220: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
5230: 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 StringObj(server
5240: 6e 61 6d 65 2c 20 28 69 6e 74 29 20 6c 65 6e 29 name, (int) len)
5250: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 );.. Tcl_Pres
5260: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 erve((ClientData
5270: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 ) interp);. T
5280: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
5290: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
52a0: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 r);.. Tcl_Inc
52b0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
52c0: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 );. code = Tc
52d0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 l_EvalObjEx(inte
52e0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f rp, cmdPtr, TCL_
52f0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 EVAL_GLOBAL);.
5300: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 if (code != TC
5310: 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c L_OK) {.#if (TCL
5320: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d _MAJOR_VERSION =
5330: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e = 8) && (TCL_MIN
5340: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a OR_VERSION < 6).
5350: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
5360: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 rror(interp);.#e
5370: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f lse..Tcl_Backgro
5380: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 undException(int
5390: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 erp, code);.#end
53a0: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c if. }. Tcl
53b0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
53c0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f dPtr);.. Tcl_
53d0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
53e0: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
53f0: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
5400: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 (ClientData) int
5410: 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e erp);. return
5420: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
5430: 4f 5f 53 55 43 43 45 53 53 3b 0a 7d 0a 0c 0a 2f O_SUCCESS;.}.../
5440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5450: 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 ****/./* Command
5460: 73 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a s */./**
5470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5480: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d **/../*. *------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
54d0: 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d . * CiphersObjCm
54e0: 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 d -- list availa
54f0: 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 ble ciphers. *.
5500: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
5510: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 is invoked to p
5520: 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a rocess the "tls:
5530: 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e :ciphers" comman
5540: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 d. *.to list ava
5550: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 ilable ciphers,
5560: 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f based upon proto
5570: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a col selected.. *
5580: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
5590: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
55a0: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 esult list.. *.
55b0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
55c0: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e *.constructs an
55d0: 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 d destroys SSL c
55e0: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a ontext (CTX). *.
55f0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5630: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
5640: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f const char *pro
5650: 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 tocols[] = {.."s
5660: 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 sl2", "ssl3", "t
5670: 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 ls1", "tls1.1",
5680: 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e "tls1.2", "tls1.
5690: 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 3", NULL.};.enum
56a0: 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 protocol {.
56b0: 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 TLS_SSL2, TLS_SS
56c0: 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c L3, TLS_TLS1, TL
56d0: 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c S_TLS1_1, TLS_TL
56e0: 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 S1_2, TLS_TLS1_3
56f0: 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 , TLS_NONE.};..s
5700: 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 tatic int.Cipher
5710: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 sObjCmd(ClientDa
5720: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
5730: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
5740: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
5750: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
5760: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []) {. Tcl_Ob
5770: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c j *objPtr = NULL
5780: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 ;. SSL_CTX *c
5790: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 tx = NULL;. S
57a0: 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a SL *ssl = NULL;.
57b0: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c STACK_OF(SSL
57c0: 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 _CIPHER) *sk;.
57d0: 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 5b char *cp, buf[
57e0: 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 BUFSIZ];. int
57f0: 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20 index, verbose
5800: 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 = 0, use_support
5810: 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 ed = 0;.. dpr
5820: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
5830: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c . if ((objc <
5840: 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 2) || (objc > 4
5850: 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e )) {..Tcl_WrongN
5860: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
5870: 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f , objv, "protoco
5880: 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 l ?verbose? ?sup
5890: 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 ported?");..retu
58a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
58b0: 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f }. if (Tcl_
58c0: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 GetIndexFromObj(
58d0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c interp, objv[1],
58e0: 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f protocols, "pro
58f0: 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 tocol", 0, &inde
5900: 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a x) != TCL_OK) {.
5910: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
5920: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
5930: 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 ((objc > 2) && T
5940: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f cl_GetBooleanFro
5950: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
5960: 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 v[2], &verbose)
5970: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 != TCL_OK) {..re
5980: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
5990: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f }. if ((o
59a0: 62 6a 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f bjc > 3) && Tcl_
59b0: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 GetBooleanFromOb
59c0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 j(interp, objv[3
59d0: 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 ], &use_supporte
59e0: 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a d) != TCL_OK) {.
59f0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
5a00: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 R;. }.. ER
5a10: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b R_clear_error();
5a20: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 .. switch ((e
5a30: 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 num protocol)ind
5a40: 65 78 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f ex) {..case TLS_
5a50: 53 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 SSL2:.#if OPENSS
5a60: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
5a70: 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 >= 0x10100000L
5a80: 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 || defined(NO_SS
5a90: 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f L2) || defined(O
5aa0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a PENSSL_NO_SSL2).
5ab0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
5ac0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
5ad0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
5ae0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
5af0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
5b00: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
5b10: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
5b20: 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 . ctx = SSL_C
5b30: 54 58 5f 6e 65 77 28 53 53 4c 76 32 5f 6d 65 74 TX_new(SSLv2_met
5b40: 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 hod()); break;.#
5b50: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
5b60: 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 SSL3:.#if define
5b70: 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 d(NO_SSL3) || de
5b80: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
5b90: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL3) || define
5ba0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
5bb0: 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 3_METHOD).. T
5bc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
5bd0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
5be0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
5bf0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
5c00: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
5c10: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
5c20: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 OR;.#else.. c
5c30: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
5c40: 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 29 (SSLv3_method())
5c50: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ; break;.#endif.
5c60: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a .case TLS_TLS1:.
5c70: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
5c80: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
5c90: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
5ca0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
5cb0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 SSL_NO_TLS1_METH
5cc0: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 OD).. Tcl_App
5cd0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
5ce0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
5cf0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
5d00: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
5d10: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
5d20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
5d30: 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 lse.. ctx = S
5d40: 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 SL_CTX_new(TLSv1
5d50: 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 _method()); brea
5d60: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 k;.#endif..case
5d70: 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 TLS_TLS1_1:.#if
5d80: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
5d90: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
5da0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
5db0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
5dc0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 SSL_NO_TLS1_1_ME
5dd0: 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 THOD).. Tcl_A
5de0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
5df0: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e rp, protocols[in
5e00: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f dex], ": protoco
5e10: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
5e20: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 , NULL);.. re
5e30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
5e40: 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d #else.. ctx =
5e50: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 SSL_CTX_new(TLS
5e60: 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 v1_1_method());
5e70: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 break;.#endif..c
5e80: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a ase TLS_TLS1_2:.
5e90: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
5ea0: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
5eb0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
5ec0: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
5ed0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
5ee0: 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 2_METHOD).. T
5ef0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
5f00: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
5f10: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
5f20: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
5f30: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
5f40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
5f50: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 OR;.#else.. c
5f60: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
5f70: 28 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 (TLSv1_2_method(
5f80: 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 )); break;.#endi
5f90: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 f..case TLS_TLS1
5fa0: 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 _3:.#if defined(
5fb0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
5fc0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
5fd0: 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 54 63 _TLS1_3).. Tc
5fe0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
5ff0: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
6000: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
6010: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
6020: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
6030: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
6040: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 R;.#else.. ct
6050: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 x = SSL_CTX_new(
6060: 54 4c 53 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 20 TLS_method());.
6070: 20 20 20 20 20 20 20 20 20 20 20 53 53 4c 5f 43 SSL_C
6080: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f TX_set_min_proto
6090: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c _version(ctx, TL
60a0: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 S1_3_VERSION);..
60b0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
60c0: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f max_proto_versio
60d0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
60e0: 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65 RSION);.. bre
60f0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 ak;.#endif..defa
6100: 75 6c 74 3a 0a 09 20 20 20 20 62 72 65 61 6b 3b ult:.. break;
6110: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 . }. if (c
6120: 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 tx == NULL) {..T
6130: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
6140: 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 interp, REASON()
6150: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
6160: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
6170: 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c }.. ssl = SSL
6180: 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 _new(ctx);. i
6190: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 f (ssl == NULL)
61a0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
61b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 ult(interp, REAS
61c0: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53 ON(), NULL);..SS
61d0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
61e0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
61f0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
6200: 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f * Use list and o
6210: 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 rder as would be
6220: 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e sent in a Clien
6230: 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 tHello or all av
6240: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 ailable ciphers
6250: 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 */. if (use_s
6260: 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 upported) {..sk
6270: 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f = SSL_get1_suppo
6280: 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c rted_ciphers(ssl
6290: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
62a0: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 .sk = SSL_get_ci
62b0: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 phers(ssl);.
62c0: 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d }.. if (sk !=
62d0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 NULL) {..if (!v
62e0: 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f erbose) {.. o
62f0: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c bjPtr = Tcl_NewL
6300: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
6310: 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 .. for (int i
6320: 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c = 0; i < sk_SSL
6330: 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b _CIPHER_num(sk);
6340: 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 i++) {...const
6350: 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 SSL_CIPHER *c =
6360: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 sk_SSL_CIPHER_va
6370: 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 lue(sk, i);...if
6380: 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e (c == NULL) con
6390: 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 tinue;..../* cip
63a0: 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e her name or (NON
63b0: 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c E) */...cp = SSL
63c0: 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 _CIPHER_get_name
63d0: 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d (c);...if (cp ==
63e0: 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 NULL) break;...
63f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
6400: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
6410: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
6420: 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 StringObj(cp, -1
6430: 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 ));.. }...} e
6440: 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 lse {.. objPt
6450: 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e r = Tcl_NewStrin
6460: 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 gObj("",0);..
6470: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b for (int i = 0;
6480: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 i < sk_SSL_CIPH
6490: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 ER_num(sk); i++)
64a0: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 {...const SSL_C
64b0: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 IPHER *c = sk_SS
64c0: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 L_CIPHER_value(s
64d0: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d k, i);...if (c =
64e0: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 = NULL) continue
64f0: 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 ;..../* textual
6500: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 description of t
6510: 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 he cipher */...i
6520: 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 f (SSL_CIPHER_de
6530: 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 scription(c, buf
6540: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 , sizeof(buf)) !
6550: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 = NULL) {...
6560: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 Tcl_AppendToObj(
6570: 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 69 6e objPtr, buf, (in
6580: 74 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b t) strlen(buf));
6590: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 ...} else {...
65a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 Tcl_AppendToOb
65b0: 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f j(objPtr, "UNKNO
65c0: 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 WN\n", 8);...}..
65d0: 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 }..}..if (us
65e0: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 e_supported) {..
65f0: 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 sk_SSL_CIPHE
6600: 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 R_free(sk);..}.
6610: 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 }. SSL_fre
6620: 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f e(ssl);. SSL_
6630: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a CTX_free(ctx);..
6640: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
6650: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
6660: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
6670: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
6680: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
6690: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d a;.}.../*. *----
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 0a ---------------.
66e0: 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f *. * ProtocolsO
66f0: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 bjCmd -- list av
6700: 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c ailable protocol
6710: 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f s. *. *.This pro
6720: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
6730: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 d to process the
6740: 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 "tls::protocols
6750: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 " command. *.to
6760: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 list available p
6770: 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 rotocols.. *. *
6780: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
6790: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
67a0: 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 t list.. *. * Si
67b0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e de effects:. *.n
67c0: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d one. *. *-------
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 0a 20 2a 2f ------------. */
6810: 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 74 .static int.Prot
6820: 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 65 ocolsObjCmd(Clie
6830: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
6840: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
6850: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
6860: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
6870: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
6880: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a l_Obj *objPtr;..
6890: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
68a0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
68b0: 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 objc != 1) {..Tc
68c0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
68d0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
68e0: 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c "");..return TCL
68f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
6900: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
6910: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
6920: 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 LL);..#if OPENSS
6930: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
6940: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 < 0x10100000L &
6950: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 & !defined(NO_SS
6960: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L2) && !defined(
6970: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
6980: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
6990: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
69a0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
69b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
69c0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c rotocols[TLS_SSL
69d0: 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 2], -1));.#endif
69e0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
69f0: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
6a00: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
6a10: 4c 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 L3). Tcl_List
6a20: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
6a30: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
6a40: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
6a50: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f j(protocols[TLS_
6a60: 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e SSL3], -1));.#en
6a70: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
6a80: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 (NO_TLS1) && !de
6a90: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
6aa0: 5f 54 4c 53 31 29 0a 20 20 20 20 54 63 6c 5f 4c _TLS1). Tcl_L
6ab0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
6ac0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
6ad0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
6ae0: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
6af0: 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a LS_TLS1], -1));.
6b00: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
6b10: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 ned(NO_TLS1_1) &
6b20: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
6b30: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 SL_NO_TLS1_1).
6b40: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
6b50: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
6b60: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
6b70: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
6b80: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 ocols[TLS_TLS1_1
6b90: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
6ba0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
6bb0: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
6bc0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
6bd0: 4c 53 31 5f 32 29 0a 20 20 20 20 54 63 6c 5f 4c LS1_2). Tcl_L
6be0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
6bf0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
6c00: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
6c10: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
6c20: 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 LS_TLS1_2], -1))
6c30: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
6c40: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
6c50: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
6c60: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
6c70: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
6c80: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
6c90: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
6ca0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
6cb0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 otocols[TLS_TLS1
6cc0: 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 _3], -1));.#endi
6cd0: 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 f.. Tcl_SetOb
6ce0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
6cf0: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 objPtr);. ret
6d00: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
6d10: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
6d20: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Data;.}.../*. *-
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d70: 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 --. *. * Handsha
6d80: 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 keObjCmd --. *.
6d90: 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 *.This command i
6da0: 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 s used to verify
6db0: 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e whether the han
6dc0: 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 dshake is comple
6dd0: 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a te. *.or not.. *
6de0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
6df0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
6e00: 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 esult. 1 means h
6e10: 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 andshake complet
6e20: 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 e, 0 means pendi
6e30: 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ng.. *. * Side e
6e40: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 ffects:. *.May f
6e50: 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 orce SSL negotia
6e60: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 tion to take pla
6e70: 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ce.. *. *-------
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 0a 20 2a 2f ------------. */
6ec0: 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 .static int Hand
6ed0: 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 shakeObjCmd(Clie
6ee0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
6ef0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
6f00: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
6f10: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
6f20: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
6f30: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 l_Channel chan;
6f40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 /* The ch
6f50: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
6f60: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 ode on. */. S
6f70: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 tate *statePtr;
6f80: 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 /* client
6f90: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 state for ssl s
6fa0: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e ocket */. con
6fb0: 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 st char *errStr
6fc0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 = NULL;. int
6fd0: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 ret = 1;. int
6fe0: 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 err = 0;.. d
6ff0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
7000: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
7010: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
7020: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
7030: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
7040: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 nel");..return(T
7050: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
7060: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c .. chan = Tcl
7070: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
7080: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e rp, Tcl_GetStrin
7090: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d gFromObj(objv[1]
70a0: 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a , NULL), NULL);.
70b0: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
70c0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
70d0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 LL) {..return(TC
70e0: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a L_ERROR);. }.
70f0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
7100: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
7110: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
7120: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
7130: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
7140: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 nel(chan);. i
7150: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
7160: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
7170: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
7180: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
7190: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
71a0: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
71b0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
71c0: 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e me(chan), "\": n
71d0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
71e0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
71f0: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
7200: 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 }. statePtr
7210: 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f = (State *)Tcl_
7220: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
7230: 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 ceData(chan);..
7240: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
7250: 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 ing Tls_WaitForC
7260: 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 onnect");. re
7270: 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 t = Tls_WaitForC
7280: 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c onnect(statePtr,
7290: 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 &err, 1);. d
72a0: 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 printf("Tls_Wait
72b0: 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 ForConnect retur
72c0: 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a ned: %i", ret);.
72d0: 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 . if (ret < 0
72e0: 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e && ((statePtr->
72f0: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f flags & TLS_TCL_
7300: 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d ASYNC) && (err =
7310: 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 = EAGAIN))) {..d
7320: 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 printf("Async se
7330: 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 t and err = EAGA
7340: 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a IN");..ret = 0;.
7350: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 } else if (r
7360: 65 74 20 3c 20 30 29 20 7b 0a 09 65 72 72 53 74 et < 0) {..errSt
7370: 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 r = statePtr->er
7380: 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 r;..Tcl_ResetRes
7390: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 ult(interp);..Tc
73a0: 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b l_SetErrno(err);
73b0: 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c ...if (!errStr |
73c0: 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 | (*errStr == 0)
73d0: 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 ) {.. errStr
73e0: 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 = Tcl_PosixError
73f0: 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 (interp);..}...T
7400: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
7410: 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 interp, "handsha
7420: 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 ke failed: ", er
7430: 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e rStr, (char *) N
7440: 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 ULL);..dprintf("
7450: 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 Returning TCL_ER
7460: 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 ROR with handsha
7470: 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 ke failed: %s",
7480: 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e errStr);..return
7490: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
74a0: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 } else {..if (e
74b0: 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 rr != 0) {..
74c0: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 dprintf("Got an
74d0: 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d error with a com
74e0: 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 pleted handshake
74f0: 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 : err = %i", err
7500: 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a );..}..ret = 1;.
7510: 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
7520: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 tf("Returning TC
7530: 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c L_OK with data \
7540: 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 "%i\"", ret);.
7550: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
7560: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
7570: 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a ewIntObj(ret));.
7580: 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f return(TCL_O
7590: 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 K);..clientData
75a0: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a = clientData;.}.
75b0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
7600: 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a ImportObjCmd --.
7610: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
7620: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
7630: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
7640: 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a ssl" command. *.
7650: 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 *.The ssl comma
7660: 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 nd pushes SSL ov
7670: 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e er a (newly conn
7680: 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 ected) tcp socke
7690: 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a t. *. * Results:
76a0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
76b0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
76c0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
76d0: 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 *.May modify the
76e0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 behavior of an
76f0: 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 IO channel.. *.
7700: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
7710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7740: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
7750: 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 int.ImportObjCmd
7760: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
7770: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
7780: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
7790: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
77a0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
77b0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
77c0: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 han;../* The cha
77d0: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f nnel to set a mo
77e0: 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 de on. */. St
77f0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 ate *statePtr;..
7800: 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 /* client state
7810: 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a for ssl socket *
7820: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 /. SSL_CTX *c
7830: 74 78 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c tx. = NUL
7840: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a L;. Tcl_Obj *
7850: 73 63 72 69 70 74 09 20 20 20 20 20 20 20 20 3d script. =
7860: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f NULL;. Tcl_O
7870: 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 20 20 20 bj *password.
7880: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
7890: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 Tcl_DString upp
78a0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
78b0: 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e tion, upperChann
78c0: 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 elBlocking, uppe
78d0: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
78e0: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f , upperChannelEO
78f0: 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 FChar;. int i
7900: 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 dx, len;. int
7910: 20 66 6c 61 67 73 09 09 20 20 20 20 20 20 20 20 flags..
7920: 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a = TLS_TCL_INIT;.
7930: 20 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 09 int server..
7940: 20 20 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 = 0;./*
7950: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e is connection in
7960: 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 coming or outgoi
7970: 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 ng? */. char
7980: 2a 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 *keyfile.
7990: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
79a0: 72 20 2a 63 65 72 74 66 69 6c 65 09 20 20 20 20 r *certfile.
79b0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
79c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b unsigned char *k
79d0: 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ey .= NULL;.
79e0: 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 20 20 20 int key_len
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 = 0
7a00: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 ;. unsigned c
7a10: 68 61 72 20 2a 63 65 72 74 20 20 20 20 20 20 20 har *cert
7a20: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e = NULL;. in
7a30: 74 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 20 t cert_len
7a40: 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 = 0;.
7a50: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 char *ciphers
7a60: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
7a70: 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 . char *ciphe
7a80: 72 73 75 69 74 65 73 09 20 20 20 20 20 20 20 20 rsuites.
7a90: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
7aa0: 20 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 *CAfile.
7ab0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
7ac0: 72 20 2a 43 41 64 69 72 09 09 20 20 20 20 20 20 r *CAdir..
7ad0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 = NULL;. ch
7ae0: 61 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20 20 ar *DHparams.
7af0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
7b00: 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 20 char *model..
7b10: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
7b20: 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 char *serverna
7b30: 6d 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c me. = NUL
7b40: 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 L;./* hostname f
7b50: 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 or Server Name I
7b60: 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 ndication */.
7b70: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
7b80: 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 char *session_id
7b90: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c = NULL;. Tcl
7ba0: 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 _Obj *alpn..= NU
7bb0: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 LL;. int ssl2
7bc0: 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a = 0, ssl3 = 0;.
7bd0: 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 int tls1 = 1
7be0: 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c , tls1_1 = 1, tl
7bf0: 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 s1_2 = 1, tls1_3
7c00: 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 = 1;. int pr
7c10: 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d oto = 0, level =
7c20: 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 -1;. int ver
7c30: 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 ify = 0, require
7c40: 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 = 0, request =
7c50: 31 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 1;.. dprintf(
7c60: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 "Called");..#if
7c70: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
7c80: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 NUMBER < 0x10100
7c90: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 000L && !defined
7ca0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
7cb0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f ) && !defined(NO
7cc0: 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e 65 _SSL2) && define
7cd0: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64 65 d(NO_SSL3) && de
7ce0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 fined(NO_TLS1) &
7cf0: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 & defined(NO_TLS
7d00: 31 5f 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 1_1) && defined(
7d10: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 64 65 NO_TLS1_2) && de
7d20: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
7d30: 0a 20 20 20 20 73 73 6c 32 20 3d 20 31 3b 0a 23 . ssl2 = 1;.#
7d40: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
7d50: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
7d60: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
7d70: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64 65 66 69 NO_SSL3) && defi
7d80: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 ned(NO_SSL2) &&
7d90: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
7da0: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 && defined(NO_T
7db0: 4c 53 31 5f 31 29 20 26 26 20 64 65 66 69 6e 65 LS1_1) && define
7dc0: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 d(NO_TLS1_2) &&
7dd0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
7de0: 33 29 0a 20 20 20 20 73 73 6c 33 20 3d 20 31 3b 3). ssl3 = 1;
7df0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
7e00: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 ned(NO_TLS1) ||
7e10: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7e20: 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 NO_TLS1). tls
7e30: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 1 = 0;.#endif.#i
7e40: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
7e50: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_1) || defined(
7e60: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
7e70: 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 1). tls1_1 =
7e80: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 0;.#endif.#if de
7e90: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
7ea0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7eb0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 SSL_NO_TLS1_2).
7ec0: 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 tls1_2 = 0;.#
7ed0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
7ee0: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 d(NO_TLS1_3) ||
7ef0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7f00: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 NO_TLS1_3). t
7f10: 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 ls1_3 = 0;.#endi
7f20: 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 f.. if (objc
7f30: 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e < 2) {..Tcl_Wron
7f40: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
7f50: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
7f60: 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a el ?options?");.
7f70: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
7f80: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 R;. }.. ch
7f90: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
7fa0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f nel(interp, Tcl_
7fb0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
7fc0: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c (objv[1], NULL),
7fd0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 NULL);. if (
7fe0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
7ff0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
8000: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8010: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
8020: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
8030: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
8040: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
8050: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
8060: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
8070: 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 ;.. for (idx
8080: 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b = 2; idx < objc;
8090: 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 idx++) {..char
80a0: 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 *opt = Tcl_GetSt
80b0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
80c0: 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 [idx], NULL);...
80d0: 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d if (opt[0] != '-
80e0: 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a ').. break;..
80f0: 09 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 .OPTSTR("-cadir"
8100: 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 , CAdir);..OPTST
8110: 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 R("-cafile", CAf
8120: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ile);..OPTSTR("-
8130: 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 certfile", certf
8140: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ile);..OPTSTR("-
8150: 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 cipher", ciphers
8160: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 );..OPTSTR("-cip
8170: 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b hers", ciphers);
8180: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 ..OPTSTR("-ciphe
8190: 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 rsuites", cipher
81a0: 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a suites);..OPTOBJ
81b0: 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 ("-command", scr
81c0: 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ipt);..OPTSTR("-
81d0: 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 dhparams", DHpar
81e0: 61 6d 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ams);..OPTSTR("-
81f0: 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c keyfile", keyfil
8200: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f e);..OPTSTR("-mo
8210: 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f del", model);..O
8220: 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 PTOBJ("-password
8230: 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f ", password);..O
8240: 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 PTBOOL("-require
8250: 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 ", require);..OP
8260: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 TBOOL("-request"
8270: 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 , request);..OPT
8280: 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79 6c 65 INT("-securityle
8290: 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f vel", level);..O
82a0: 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 PTBOOL("-server"
82b0: 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 , server);..OPTS
82c0: 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 TR("-servername"
82d0: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 , servername);..
82e0: 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e OPTSTR("-session
82f0: 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 _id", session_id
8300: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 );..OPTOBJ("-alp
8310: 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 42 n", alpn);..OPTB
8320: 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c OOL("-ssl2", ssl
8330: 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 2);..OPTBOOL("-s
8340: 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 sl3", ssl3);..OP
8350: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 TBOOL("-tls1", t
8360: 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 ls1);..OPTBOOL("
8370: 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 -tls1.1", tls1_1
8380: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c );..OPTBOOL("-tl
8390: 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a s1.2", tls1_2);.
83a0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e .OPTBOOL("-tls1.
83b0: 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 3", tls1_3);..OP
83c0: 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 TBYTE("-cert", c
83d0: 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a ert, cert_len);.
83e0: 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c .OPTBYTE("-key",
83f0: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a key, key_len);.
8400: 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e ..OPTBAD("option
8410: 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 ", "-alpn, -cadi
8420: 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 r, -cafile, -cer
8430: 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 t, -certfile, -c
8440: 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 ipher, -ciphersu
8450: 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 ites, -command,
8460: 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c -dhparams, -key,
8470: 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 -keyfile, -mode
8480: 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 72 l, -password, -r
8490: 65 71 75 69 72 65 2c 20 2d 72 65 71 75 65 73 74 equire, -request
84a0: 2c 20 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c , -securitylevel
84b0: 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 , -server, -serv
84c0: 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e ername, -session
84d0: 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c _id, -ssl2, -ssl
84e0: 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 3, -tls1, -tls1.
84f0: 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 6f 72 20 2d 1, -tls1.2, or -
8500: 74 6c 73 31 2e 33 22 29 3b 0a 0a 09 72 65 74 75 tls1.3");...retu
8510: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
8520: 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 }. if (requ
8530: 65 73 74 29 09 20 20 20 20 76 65 72 69 66 79 20 est). verify
8540: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c |= SSL_VERIFY_CL
8550: 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f IENT_ONCE | SSL_
8560: 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 VERIFY_PEER;.
8570: 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 if (request &&
8580: 72 65 71 75 69 72 65 29 20 76 65 72 69 66 79 20 require) verify
8590: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 |= SSL_VERIFY_FA
85a0: 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 IL_IF_NO_PEER_CE
85b0: 52 54 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 RT;. if (veri
85c0: 66 79 20 3d 3d 20 30 29 09 76 65 72 69 66 79 20 fy == 0).verify
85d0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e = SSL_VERIFY_NON
85e0: 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d E;.. proto |=
85f0: 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f (ssl2 ? TLS_PRO
8600: 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 TO_SSL2 : 0);.
8610: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 proto |= (ssl3
8620: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c ? TLS_PROTO_SSL
8630: 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 3 : 0);. prot
8640: 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 o |= (tls1 ? TLS
8650: 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 _PROTO_TLS1 : 0)
8660: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
8670: 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f tls1_1 ? TLS_PRO
8680: 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a TO_TLS1_1 : 0);.
8690: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
86a0: 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f s1_2 ? TLS_PROTO
86b0: 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 _TLS1_2 : 0);.
86c0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
86d0: 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 _3 ? TLS_PROTO_T
86e0: 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 LS1_3 : 0);..
86f0: 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c /* reset to NUL
8700: 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e L if blank strin
8710: 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 g provided */.
8720: 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a if (cert && !*
8730: 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63 cert).. c
8740: 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ert. = NU
8750: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 LL;. if (key
8760: 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 && !*key)..
8770: 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d key. =
8780: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
8790: 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 ertfile && !*cer
87a0: 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 tfile) c
87b0: 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a ertfile.= NULL;.
87c0: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 if (keyfile
87d0: 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b && !*keyfile)..k
87e0: 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d eyfile. =
87f0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
8800: 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 iphers && !*ciph
8810: 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70 ers). cip
8820: 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e hers. = N
8830: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 ULL;. if (cip
8840: 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 hersuites && !*c
8850: 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70 iphersuites) cip
8860: 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e hersuites = N
8870: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 ULL;. if (CAf
8880: 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 ile && !*CAfile)
8890: 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 . CAfile.
88a0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
88b0: 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26 26 if (CAdir &&
88c0: 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 20 20 !*CAdir).
88d0: 20 20 43 41 64 69 72 09 20 20 20 20 20 20 20 20 CAdir.
88e0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
88f0: 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 DHparams && !*DH
8900: 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 params).
8910: 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 DHparams
8920: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 = NULL;.. /*
8930: 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f new SSL state */
8940: 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d . statePtr..=
8950: 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c (State *) ckall
8960: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 oc((unsigned) si
8970: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 zeof(State));.
8980: 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 memset(statePt
8990: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 r, 0, sizeof(Sta
89a0: 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 te));.. state
89b0: 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 Ptr->flags.= fla
89c0: 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 gs;. statePtr
89d0: 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 ->interp.= inter
89e0: 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d p;. statePtr-
89f0: 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 >vflags.= verify
8a00: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
8a10: 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f err.= "";.. /
8a20: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 * allocate scrip
8a30: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 t */. if (scr
8a40: 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 ipt) {..(void) T
8a50: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
8a60: 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e Obj(script, &len
8a70: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
8a80: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 statePtr->ca
8a90: 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b llback = script;
8aa0: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
8ab0: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
8ac0: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 >callback);..}.
8ad0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c }.. /* all
8ae0: 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a ocate password *
8af0: 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f /. if (passwo
8b00: 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 rd) {..(void) Tc
8b10: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
8b20: 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 bj(password, &le
8b30: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
8b40: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 . statePtr->p
8b50: 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f assword = passwo
8b60: 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 rd;.. Tcl_Inc
8b70: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
8b80: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 tr->password);..
8b90: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 }. }.. if
8ba0: 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 (model != NULL)
8bb0: 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a {..int mode;../*
8bc0: 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 Get the "model"
8bd0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 context */..cha
8be0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
8bf0: 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c el(interp, model
8c00: 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 , &mode);..if (c
8c10: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
8c20: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 nel) NULL) {..
8c30: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
8c40: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
8c50: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
8c60: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 RROR;..}.../*..
8c70: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
8c80: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
8c90: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 pmost channel..
8ca0: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 */..chan = Tcl_G
8cb0: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
8cc0: 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 n);..if (Tcl_Get
8cd0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
8ce0: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
8cf0: 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 Type()) {.. T
8d00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8d10: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
8d20: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
8d30: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
8d40: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 n),..."\": not a
8d50: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e TLS channel", N
8d60: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
8d70: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
8d80: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
8d90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
8da0: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 }..ctx = ((State
8db0: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *)Tcl_GetChanne
8dc0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
8dd0: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d an))->ctx;. }
8de0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 else {..if ((ct
8df0: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 x = CTX_Init(sta
8e00: 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 tePtr, server, p
8e10: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 roto, keyfile, c
8e20: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 ertfile, key, ce
8e30: 72 74 2c 0a 09 20 20 20 20 6b 65 79 5f 6c 65 6e rt,.. key_len
8e40: 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69 , cert_len, CAdi
8e50: 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 r, CAfile, ciphe
8e60: 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 rs, ciphersuites
8e70: 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d , level, DHparam
8e80: 73 29 29 20 3d 3d 20 28 53 53 4c 5f 43 54 58 2a s)) == (SSL_CTX*
8e90: 29 30 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 )0) {.. Tls_F
8ea0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
8eb0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
8ec0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
8ed0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 }. }.. sta
8ee0: 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 tePtr->ctx = ctx
8ef0: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
8f00: 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 We need to make
8f10: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 sure that the c
8f20: 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 hannel works in
8f30: 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65 0a binary (for the.
8f40: 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69 6f * encryptio
8f50: 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f n not to get goo
8f60: 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 fed up).. *
8f70: 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 We only want to
8f80: 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 66 65 adjust the buffe
8f90: 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 63 ring in pre-v2 c
8fa0: 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 hannels, where.
8fb0: 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e 6e * each chann
8fc0: 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 el in the stack
8fd0: 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20 6f maintained its o
8fe0: 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20 20 wn buffers..
8ff0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 */. Tcl_DStr
9000: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
9010: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
9020: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
9030: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
9040: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 nnelBlocking);.
9050: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
9060: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
9070: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 EOFChar);. Tc
9080: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
9090: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
90a0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 ing);. Tcl_Ge
90b0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
90c0: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 nterp, chan, "-e
90d0: 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 ofchar", &upperC
90e0: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a hannelEOFChar);.
90f0: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e Tcl_GetChann
9100: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
9110: 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e chan, "-encodin
9120: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 g", &upperChanne
9130: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 lEncoding);.
9140: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
9150: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
9160: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
9170: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
9180: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 Translation);.
9190: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c Tcl_GetChannel
91a0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
91b0: 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 han, "-blocking"
91c0: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 , &upperChannelB
91d0: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 locking);. Tc
91e0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
91f0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
9200: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c "-translation",
9210: 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 "binary");.
9220: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
9230: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
9240: 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 n, "-blocking",
9250: 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70 72 "true");. dpr
9260: 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 intf("Consuming
9270: 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c Tcl channel %s",
9280: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
9290: 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 ame(chan));.
92a0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
92b0: 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 Tcl_StackChanne
92c0: 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 l(interp, Tls_Ch
92d0: 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 6c annelType(), (Cl
92e0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
92f0: 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 4c tr, (TCL_READABL
9300: 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 E | TCL_WRITABLE
9310: 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 ), chan);. dp
9320: 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 63 rintf("Created c
9330: 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 hannel named %s"
9340: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
9350: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
9360: 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 73 elf));. if (s
9370: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d tatePtr->self ==
9380: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
9390: 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e ULL) {../*.. * N
93a0: 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 o use of Tcl_Eve
93b0: 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 61 ntuallyFree beca
93c0: 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 use no possible
93d0: 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 Tcl_Preserve...
93e0: 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 */..Tls_Free((ch
93f0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
9400: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
9410: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
9420: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
9430: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ion(interp, stat
9440: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 ePtr->self, "-tr
9450: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f anslation", Tcl_
9460: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 DStringValue(&up
9470: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
9480: 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c ation));. Tcl
9490: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
94a0: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
94b0: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f tr->self, "-enco
94c0: 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 ding", Tcl_DStri
94d0: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
94e0: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b annelEncoding));
94f0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
9500: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
9510: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
9520: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 , "-eofchar", Tc
9530: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
9540: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 upperChannelEOFC
9550: 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 har));. Tcl_S
9560: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
9570: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
9580: 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 ->self, "-blocki
9590: 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 ng", Tcl_DString
95a0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e Value(&upperChan
95b0: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a nelBlocking));..
95c0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 /*. * SS
95d0: 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e L Initialization
95e0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 . */. sta
95f0: 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c tePtr->ssl = SSL
9600: 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 _new(statePtr->c
9610: 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 tx);. if (!st
9620: 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 atePtr->ssl) {..
9630: 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 /* SSL library e
9640: 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 rror */..Tcl_App
9650: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
9660: 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 , "couldn't cons
9670: 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f truct ssl sessio
9680: 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 n: ", REASON(),
9690: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
96a0: 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 .Tls_Free((char
96b0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 *) statePtr);..r
96c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
96d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
96e0: 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e et host server n
96f0: 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 ame */. if (s
9700: 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a ervername) {../*
9710: 20 53 65 74 73 20 74 68 65 20 73 65 72 76 65 72 Sets the server
9720: 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e name indication
9730: 20 28 53 4e 49 29 20 43 6c 69 65 6e 74 48 65 6c (SNI) ClientHel
9740: 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a lo extension */.
9750: 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c .if (!SSL_set_tl
9760: 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 sext_host_name(s
9770: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 tatePtr->ssl, se
9780: 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71 rvername) && req
9790: 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c uire) {.. Tcl
97a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
97b0: 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 54 terp, "setting T
97c0: 4c 53 20 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 LS host name ext
97d0: 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20 ension failed",
97e0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f Tls_
9800: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
9810: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 atePtr);.
9820: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f return TCL_
9830: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d ERROR;. }
9840: 0a 0a 09 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 .../* Configure
9850: 73 65 72 76 65 72 20 68 6f 73 74 20 6e 61 6d 65 server host name
9860: 20 63 68 65 63 6b 73 20 69 6e 20 74 68 65 20 53 checks in the S
9870: 53 4c 20 63 6c 69 65 6e 74 2e 20 53 65 74 20 44 SL client. Set D
9880: 4e 53 20 68 6f 73 74 6e 61 6d 65 20 74 6f 0a 09 NS hostname to..
9890: 20 20 20 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 name for peer
98a0: 20 63 65 72 74 69 66 69 63 61 74 65 20 63 68 65 certificate che
98b0: 63 6b 73 2e 20 53 53 4c 5f 73 65 74 31 5f 68 6f cks. SSL_set1_ho
98c0: 73 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f st has limitatio
98d0: 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c ns. */..if (!SSL
98e0: 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 _add1_host(state
98f0: 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 Ptr->ssl, server
9900: 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 name)) {.. Tc
9910: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
9920: 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 nterp, "setting
9930: 44 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 66 61 DNS host name fa
9940: 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 iled", (char *)
9950: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 NULL);.
9960: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
9970: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
9980: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 retu
9990: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
99a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 . }.. /* R
99b0: 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 esume session id
99c0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 */. if (sess
99d0: 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e ion_id && strlen
99e0: 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 (session_id) <=
99f0: 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f SSL_MAX_SID_CTX_
9a00: 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 LENGTH) {../* SS
9a10: 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 L_set_session()
9a20: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 */..if (!SSL_SES
9a30: 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e SION_set1_id_con
9a40: 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 text(SSL_get_ses
9a50: 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 sion(statePtr->s
9a60: 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c sl), session_id,
9a70: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 (unsigned int)
9a80: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 strlen(session_i
9a90: 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f d))) {.. Tcl_
9aa0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
9ab0: 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73 erp, "Resume ses
9ac0: 73 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 73 69 sion id ", sessi
9ad0: 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 64 22 on_id, " failed"
9ae0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9af0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6c ;. Tl
9b00: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
9b10: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 statePtr);.
9b20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 return TC
9b30: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 L_ERROR;..}.
9b40: 7d 0a 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 }.. if (alpn)
9b50: 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 {../* Convert a
9b60: 20 54 63 6c 20 6c 69 73 74 20 69 6e 74 6f 20 61 Tcl list into a
9b70: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 protocol-list i
9b80: 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f n wire-format */
9b90: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
9ba0: 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e *protos, *p;..un
9bb0: 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f signed int proto
9bc0: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 s_len = 0;..int
9bd0: 69 2c 20 6c 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 i, len, cnt;..Tc
9be0: 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 l_Obj **list;...
9bf0: 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 if (Tcl_ListObjG
9c00: 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 etElements(inter
9c10: 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 p, alpn, &cnt, &
9c20: 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 list) != TCL_OK)
9c30: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 {.. Tls_Free
9c40: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
9c50: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
9c60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a TCL_ERROR;..}..
9c70: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 ./* Determine th
9c80: 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 e memory require
9c90: 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 d for the protoc
9ca0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 ol-list */..for
9cb0: 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b (i = 0; i < cnt;
9cc0: 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c i++) {.. Tcl
9cd0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
9ce0: 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 j(list[i], &len)
9cf0: 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e ;.. if (len >
9d00: 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 255) {...Tcl_Ap
9d10: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
9d20: 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f p, "ALPN protoco
9d30: 6c 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 l name too long"
9d40: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9d50: 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 63 68 ;...Tls_Free((ch
9d60: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
9d70: 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
9d80: 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 ROR;.. }..
9d90: 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 protos_len += 1
9da0: 20 2b 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 + len;..}.../*
9db0: 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 Build the comple
9dc0: 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 te protocol-list
9dd0: 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b */..protos = ck
9de0: 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e alloc(protos_len
9df0: 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d );../* protocol-
9e00: 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 lists consist of
9e10: 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 8-bit length-pr
9e20: 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 efixed, byte str
9e30: 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 69 20 ings */..for (i
9e40: 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b = 0, p = protos;
9e50: 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b i < cnt; i++) {
9e60: 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 .. char *str
9e70: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
9e80: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 romObj(list[i],
9e90: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b &len);.. *p++
9ea0: 20 3d 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d = len;.. mem
9eb0: 63 70 79 28 70 2c 20 73 74 72 2c 20 6c 65 6e 29 cpy(p, str, len)
9ec0: 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b ;.. p += len;
9ed0: 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 ..}.../* SSL_set
9ee0: 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b _alpn_protos mak
9ef0: 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 es a copy of the
9f00: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a protocol-list *
9f10: 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 /../* Note: This
9f20: 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 76 65 72 functions rever
9f30: 73 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 ses the return v
9f40: 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 alue convention
9f50: 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f */..if (SSL_set_
9f60: 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 alpn_protos(stat
9f70: 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f ePtr->ssl, proto
9f80: 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 s, protos_len))
9f90: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
9fa0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
9fb0: 22 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 41 "failed to set A
9fc0: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 LPN protocols",
9fd0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
9fe0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
9ff0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
a000: 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72 ;.. ckfree(pr
a010: 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75 otos);.. retu
a020: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
a030: 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 .../* Store prot
a040: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 ocols list */..s
a050: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
a060: 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 = protos;..state
a070: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 Ptr->protos_len
a080: 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 = protos_len;.
a090: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 } else {..stat
a0a0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e ePtr->protos = N
a0b0: 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e ULL;..statePtr->
a0c0: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a protos_len = 0;.
a0d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
a0e0: 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 * SSL Callbac
a0f0: 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 ks. */. S
a100: 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 SL_set_app_data(
a110: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 statePtr->ssl, (
a120: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
a130: 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 ;./* point back
a140: 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c to us */. SSL
a150: 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74 _set_verify(stat
a160: 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 ePtr->ssl, verif
a170: 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 y, VerifyCallbac
a180: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f k);. SSL_CTX_
a190: 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 set_info_callbac
a1a0: 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c k(statePtr->ctx,
a1b0: 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a InfoCallback);.
a1c0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 . /* Create T
a1d0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 cl_Channel BIO H
a1e0: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 andler */. st
a1f0: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 atePtr->p_bio.=
a200: 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 BIO_new_tcl(stat
a210: 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 ePtr, BIO_NOCLOS
a220: 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 E);. statePtr
a230: 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 ->bio.= BIO_new(
a240: 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 BIO_f_ssl());..
a250: 20 20 20 69 66 20 28 73 65 72 76 65 72 29 20 7b if (server) {
a260: 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c ../* Server call
a270: 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 backs */..SSL_CT
a280: 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 X_set_alpn_selec
a290: 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 t_cb(statePtr->c
a2a0: 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b tx, ALPNCallback
a2b0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
a2c0: 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 tr);..SSL_CTX_se
a2d0: 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e t_tlsext_servern
a2e0: 61 6d 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 ame_arg(statePtr
a2f0: 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 ->ctx, (void *)s
a300: 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 tatePtr);..SSL_C
a310: 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 TX_set_tlsext_se
a320: 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 rvername_callbac
a330: 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c k(statePtr->ctx,
a340: 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 SNICallback);..
a350: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 SSL_CTX_set_clie
a360: 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 nt_hello_cb(stat
a370: 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f ePtr->ctx, Hello
a380: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 Callback, (void
a390: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 09 73 *)statePtr);...s
a3a0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c tatePtr->flags |
a3b0: 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 = TLS_TCL_SERVER
a3c0: 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 ;..SSL_set_accep
a3d0: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 t_state(statePtr
a3e0: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c ->ssl);. } el
a3f0: 73 65 20 7b 0a 09 2f 2a 20 53 65 73 73 69 6f 6e se {../* Session
a400: 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c caching */..SSL
a410: 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e _CTX_set_session
a420: 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 _cache_mode(stat
a430: 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 ePtr->ctx, SSL_S
a440: 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 ESS_CACHE_CLIENT
a450: 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 | SSL_SESS_CACH
a460: 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 E_NO_INTERNAL_ST
a470: 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 ORE);..SSL_CTX_s
a480: 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 ess_set_new_cb(s
a490: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 tatePtr->ctx, Se
a4a0: 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a ssionCallback);.
a4b0: 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 ..SSL_set_connec
a4c0: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 t_state(statePtr
a4d0: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 ->ssl);. }.
a4e0: 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 SSL_set_bio(st
a4f0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 atePtr->ssl, sta
a500: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 tePtr->p_bio, st
a510: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a atePtr->p_bio);.
a520: 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 BIO_set_ssl(
a530: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 statePtr->bio, s
a540: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 tatePtr->ssl, BI
a550: 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 O_NOCLOSE);..
a560: 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f /*. * End o
a570: 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 f SSL Init.
a580: 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 */. dprintf("
a590: 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 Returning %s", T
a5a0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
a5b0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
a5c0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 ));. Tcl_SetR
a5d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 esult(interp, (c
a5e0: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 har *) Tcl_GetCh
a5f0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
a600: 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 tr->self), TCL_V
a610: 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 OLATILE);.. r
a620: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
a630: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
a640: 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ntData;.}.../*.
a650: 2a 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 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 ----. *. * Unimp
a6a0: 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a ortObjCmd --. *.
a6b0: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
a6c0: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 e is invoked to
a6d0: 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f remove the topmo
a6e0: 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 st channel filte
a6f0: 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 r.. *. * Results
a700: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
a710: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
a720: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
a730: 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 *.May modify th
a740: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e e behavior of an
a750: 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a IO channel.. *.
a760: 20 2a 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 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
a7b0: 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a int.UnimportObj
a7c0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
a7d0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
a7e0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
a7f0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
a800: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
a810: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
a820: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 l chan;../* The
a830: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
a840: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 mode on. */..
a850: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
a860: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
a870: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f jc != 2) {..Tcl_
a880: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
a890: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
a8a0: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 hannel");..retur
a8b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
a8c0: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
a8d0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
a8e0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
a8f0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 ing(objv[1]), NU
a900: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 LL);. if (cha
a910: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
a920: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
a930: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
a940: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
a950: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
a960: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
a970: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
a980: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
a990: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a Channel(chan);..
a9a0: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
a9b0: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
a9c0: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
a9d0: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ype()) {..Tcl_Ap
a9e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
a9f0: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
aa00: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
aa10: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
aa20: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 ."\": not a TLS
aa30: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b channel", NULL);
aa40: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
aa50: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
aa60: 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 f (Tcl_UnstackCh
aa70: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 annel(interp, ch
aa80: 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 an) == TCL_ERROR
aa90: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
aaa0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
aab0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
aac0: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
aad0: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
aae0: 2a 0a 20 2a 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 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 -------. *. * CT
ab30: 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 X_Init -- constr
ab40: 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e uct a SSL_CTX in
ab50: 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 stance. *. * Res
ab60: 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 ults:. *.A valid
ab70: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 SSL_CTX instanc
ab80: 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a e or NULL.. *. *
ab90: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
aba0: 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c *.constructs SSL
abb0: 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 context (CTX).
abc0: 2a 0a 20 2a 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 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
ac10: 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 ic SSL_CTX *.CTX
ac20: 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 _Init(State *sta
ac30: 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 tePtr, int isSer
ac40: 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 ver, int proto,
ac50: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 char *keyfile, c
ac60: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 har *certfile,.
ac70: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
ac80: 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 *key, unsigned
ac90: 63 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74 20 char *cert, int
aca0: 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 key_len, int cer
acb0: 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 t_len, char *CAd
acc0: 69 72 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41 ir,. char *CA
acd0: 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70 68 file, char *ciph
ace0: 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70 68 65 ers, char *ciphe
acf0: 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 rsuites, int lev
ad00: 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 72 61 el, char *DHpara
ad10: 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e ms) {. Tcl_In
ad20: 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 terp *interp = s
ad30: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
ad40: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 . SSL_CTX *ct
ad50: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 x = NULL;. Tc
ad60: 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 l_DString ds;.
ad70: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 Tcl_DString ds
ad80: 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 1;. int off =
ad90: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 0;. int load
ada0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 _private_key;.
adb0: 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 const SSL_METH
adc0: 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 OD *method;..
add0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
ade0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 ");.. if (!pr
adf0: 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 oto) {..Tcl_Appe
ae00: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
ae10: 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f "no valid proto
ae20: 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 4e col selected", N
ae30: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 ULL);..return (S
ae40: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 SL_CTX *)0;.
ae50: 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 }.. /* create
ae60: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a SSL context */.
ae70: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
ae80: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 ION_NUMBER >= 0x
ae90: 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 10100000L || def
aea0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c ined(NO_SSL2) ||
aeb0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
aec0: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 _NO_SSL2). if
aed0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
aee0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 TLS_PROTO_SSL2)
aef0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
af00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
af10: 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 SL2 protocol not
af20: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
af30: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c L);..return (SSL
af40: 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a _CTX *)0;. }.
af50: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
af60: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 ed(NO_SSL3) || d
af70: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
af80: 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 O_SSL3). if (
af90: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
afa0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 LS_PROTO_SSL3))
afb0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
afc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c ult(interp, "SSL
afd0: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 3 protocol not s
afe0: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
aff0: 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 ;..return (SSL_C
b000: 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 TX *)0;. }.#e
b010: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
b020: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 (NO_TLS1) || def
b030: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
b040: 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e TLS1). if (EN
b050: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
b060: 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a _PROTO_TLS1)) {.
b070: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
b080: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
b090: 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .0 protocol not
b0a0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
b0b0: 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f );..return (SSL_
b0c0: 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 CTX *)0;. }.#
b0d0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
b0e0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 d(NO_TLS1_1) ||
b0f0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
b100: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 NO_TLS1_1). i
b110: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
b120: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
b130: 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 _1)) {..Tcl_Appe
b140: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
b150: 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 "TLS 1.1 protoc
b160: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
b170: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
b180: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a n (SSL_CTX *)0;.
b190: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
b1a0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
b1b0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _2) || defined(O
b1c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
b1d0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
b1e0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
b1f0: 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 TO_TLS1_2)) {..T
b200: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
b210: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 interp, "TLS 1.2
b220: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
b230: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
b240: 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 ..return (SSL_CT
b250: 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e X *)0;. }.#en
b260: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
b270: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
b280: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
b290: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 _TLS1_3). if
b2a0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
b2b0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
b2c0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
b2d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
b2e0: 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c TLS 1.3 protocol
b2f0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
b300: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
b310: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 (SSL_CTX *)0;.
b320: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 }.#endif..
b330: 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 7b switch (proto) {
b340: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
b350: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
b360: 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 10100000L && !de
b370: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 fined(NO_SSL2) &
b380: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
b390: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 SL_NO_SSL2).
b3a0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 case TLS_PROTO_S
b3b0: 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 53 SL2:..method = S
b3c0: 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 SLv2_method();..
b3d0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
b3e0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 f !defined(NO_SS
b3f0: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
b400: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
b410: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
b420: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 NSSL_NO_SSL3_MET
b430: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c HOD). case TL
b440: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d S_PROTO_SSL3:..m
b450: 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 ethod = SSLv3_me
b460: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a thod();..break;.
b470: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
b480: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 ned(NO_TLS1) &&
b490: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
b4a0: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 _NO_TLS1) && !de
b4b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
b4c0: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 _TLS1_METHOD).
b4d0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
b4e0: 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d _TLS1:..method =
b4f0: 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b TLSv1_method();
b500: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
b510: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
b520: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
b530: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
b540: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
b550: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
b560: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_1_METHOD).
b570: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
b580: 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 TLS1_1:..method
b590: 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 = TLSv1_1_method
b5a0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
b5b0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
b5c0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 NO_TLS1_2) && !d
b5d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
b5e0: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
b5f0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
b600: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a _TLS1_2_METHOD).
b610: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
b620: 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 TO_TLS1_2:..meth
b630: 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 od = TLSv1_2_met
b640: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 hod();..break;.#
b650: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
b660: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 ed(NO_TLS1_3) &&
b670: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
b680: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 L_NO_TLS1_3).
b690: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
b6a0: 54 4c 53 31 5f 33 3a 0a 09 2f 2a 0a 09 20 2a 20 TLS1_3:../*.. *
b6b0: 54 68 65 20 76 65 72 73 69 6f 6e 20 72 61 6e 67 The version rang
b6c0: 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 e is constrained
b6d0: 20 62 65 6c 6f 77 2c 0a 09 20 2a 20 61 66 74 65 below,.. * afte
b6e0: 72 20 74 68 65 20 63 6f 6e 74 65 78 74 20 69 73 r the context is
b6f0: 20 63 72 65 61 74 65 64 2e 20 20 55 73 65 20 74 created. Use t
b700: 68 65 0a 09 20 2a 20 67 65 6e 65 72 69 63 20 6d he.. * generic m
b710: 65 74 68 6f 64 20 68 65 72 65 2e 0a 09 20 2a 2f ethod here... */
b720: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
b730: 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 ver ? TLS_server
b740: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f _method() : TLS_
b750: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
b760: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
b770: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a default:../*
b780: 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 Negotiate highe
b790: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c st available SSL
b7a0: 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a /TLS version */.
b7b0: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
b7c0: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f er ? TLS_server_
b7d0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 method() : TLS_c
b7e0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
b7f0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
b800: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
b810: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 0100000L && !def
b820: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 ined(NO_SSL2) &&
b830: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
b840: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 L_NO_SSL2)..off
b850: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 |= (ENABLED(prot
b860: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c o, TLS_PROTO_SSL
b870: 32 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 2) ? 0 : SSL_O
b880: 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e P_NO_SSLv2);.#en
b890: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
b8a0: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 (NO_SSL3) && !de
b8b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
b8c0: 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 _SSL3)..off |= (
b8d0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
b8e0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 LS_PROTO_SSL3)
b8f0: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
b900: 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a _SSLv3);.#endif.
b910: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
b920: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 TLS1) && !define
b930: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
b940: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 1)..off |= (ENAB
b950: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
b960: 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 ROTO_TLS1) ? 0
b970: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
b980: 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 v1);.#endif.#if
b990: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
b9a0: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _1) && !defined(
b9b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
b9c0: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 1)..off |= (ENAB
b9d0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
b9e0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 ROTO_TLS1_1) ? 0
b9f0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
ba00: 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 v1_1);.#endif.#i
ba10: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
ba20: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
ba30: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
ba40: 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 1_2)..off |= (EN
ba50: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
ba60: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f _PROTO_TLS1_2) ?
ba70: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
ba80: 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a LSv1_2);.#endif.
ba90: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
baa0: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 TLS1_3) && !defi
bab0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
bac0: 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 LS1_3)..off |= (
bad0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
bae0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
baf0: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
bb00: 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 _TLSv1_3);.#endi
bb10: 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a f..break;. }.
bb20: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
bb30: 72 72 6f 72 28 29 3b 0a 20 20 20 20 63 74 78 20 rror();. ctx
bb40: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 = SSL_CTX_new(me
bb50: 74 68 6f 64 29 3b 0a 0a 20 20 20 20 69 66 20 28 thod);.. if (
bb60: 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 !ctx) {..return(
bb70: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL);. }..
bb80: 20 20 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c if (getenv(SSL
bb90: 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 KEYLOGFILE)) {..
bba0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c SSL_CTX_set_keyl
bbb0: 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c og_callback(ctx,
bbc0: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 KeyLogCallback)
bbd0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 ;. }..#if !de
bbe0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
bbf0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
bc00: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
bc10: 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d if (proto ==
bc20: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
bc30: 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 3) {..SSL_CTX_se
bc40: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 t_min_proto_vers
bc50: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
bc60: 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 VERSION);..SSL_C
bc70: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f TX_set_max_proto
bc80: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c _version(ctx, TL
bc90: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 S1_3_VERSION);.
bca0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 }.#endif..
bcb0: 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 /* Force cipher
bcc0: 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 selection order
bcd0: 20 62 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 by server */.
bce0: 20 20 69 66 20 28 21 69 73 53 65 72 76 65 72 29 if (!isServer)
bcf0: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {..SSL_CTX_set_
bd00: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c options(ctx, SSL
bd10: 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 _OP_CIPHER_SERVE
bd20: 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 R_PREFERENCE);.
bd30: 20 20 20 7d 0a 0a 20 20 20 20 53 53 4c 5f 43 54 }.. SSL_CT
bd40: 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 X_set_app_data(c
bd50: 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 tx, (void*)inter
bd60: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 p);./* remember
bd70: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 the interpreter
bd80: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
bd90: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
bda0: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 SSL_OP_ALL);./*
bdb0: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b all SSL bug work
bdc0: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 arounds */. S
bdd0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
bde0: 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f ns(ctx, off);../
bdf0: 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 * disable protoc
be00: 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 ol versions */.#
be10: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
be20: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
be30: 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 101000L. SSL_
be40: 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 CTX_set_mode(ctx
be50: 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f , SSL_MODE_AUTO_
be60: 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c RETRY);./* handl
be70: 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 e new handshakes
be80: 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 20 2a in background *
be90: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c /.#endif. SSL
bea0: 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 _CTX_sess_set_ca
beb0: 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 che_size(ctx, 12
bec0: 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 8);.. /* Set
bed0: 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 user defined cip
bee0: 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 hers, cipher sui
bef0: 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 tes, and securit
bf00: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 y level */. i
bf10: 66 20 28 28 28 63 69 70 68 65 72 73 20 21 3d 20 f (((ciphers !=
bf20: 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 NULL) && !SSL_CT
bf30: 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 X_set_cipher_lis
bf40: 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 t(ctx, ciphers))
bf50: 20 7c 7c 20 5c 0a 09 28 28 63 69 70 68 65 72 73 || \..((ciphers
bf60: 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 uites != NULL) &
bf70: 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 & !SSL_CTX_set_c
bf80: 69 70 68 65 72 73 75 69 74 65 73 28 63 74 78 2c iphersuites(ctx,
bf90: 20 63 69 70 68 65 72 73 75 69 74 65 73 29 29 29 ciphersuites)))
bfa0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
bfb0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
bfc0: 20 22 53 65 74 20 63 69 70 68 65 72 73 20 66 61 "Set ciphers fa
bfd0: 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 iled", (char *)
bfe0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
bff0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
c000: 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f return (SSL_
c010: 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a CTX *)0;. }..
c020: 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 /* Set secur
c030: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 ity level */.
c040: 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 if (level > -1
c050: 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a && level < 6) {.
c060: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 ./* SSL_set_secu
c070: 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 rity_level */..S
c080: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 SL_CTX_set_secur
c090: 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c ity_level(ctx, l
c0a0: 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 evel);. }..
c0b0: 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 /* set some ca
c0c0: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 llbacks */. S
c0d0: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 SL_CTX_set_defau
c0e0: 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 lt_passwd_cb(ctx
c0f0: 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 , PasswordCallba
c100: 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 ck);. SSL_CTX
c110: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 _set_default_pas
c120: 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 swd_cb_userdata(
c130: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ctx, (void *)sta
c140: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 tePtr);.. /*
c150: 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 read a Diffie-He
c160: 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 llman parameters
c170: 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 file, or use th
c180: 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a e built-in one *
c190: 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c /.#ifdef OPENSSL
c1a0: 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 _NO_DH. if (D
c1b0: 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 Hparams != NULL)
c1c0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
c1d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 sult(interp, "DH
c1e0: 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f parameter suppo
c1f0: 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 rt not available
c200: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
c210: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 );..SSL_CTX_free
c220: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 28 (ctx);..return (
c230: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 SSL_CTX *)0;.
c240: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 }.#else. {..
c250: 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 DH* dh;..if (DHp
c260: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b arams != NULL) {
c270: 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a .. BIO *bio;.
c280: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
c290: 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 20 20 Init(&ds);..
c2a0: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 bio = BIO_new_fi
c2b0: 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c le(F2N(DHparams,
c2c0: 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 &ds), "r");..
c2d0: 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 if (!bio) {...
c2e0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
c2f0: 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 &ds);...Tcl_Appe
c300: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
c310: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 "Could not find
c320: 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 DH parameters f
c330: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ile", (char *) N
c340: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
c350: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
c360: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
c370: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 ;.. }... d
c380: 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f h = PEM_read_bio
c390: 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e _DHparams(bio, N
c3a0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 ULL, NULL, NULL)
c3b0: 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 ;.. BIO_free(
c3c0: 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 bio);.. Tcl_D
c3d0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
c3e0: 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b .. if (!dh) {
c3f0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
c400: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 ult(interp, "Cou
c410: 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 ld not read DH p
c420: 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 arameters from f
c430: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ile", (char *) N
c440: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
c450: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
c460: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
c470: 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 ;.. }..} else
c480: 20 7b 0a 09 20 20 20 20 64 68 20 3d 20 67 65 74 {.. dh = get
c490: 5f 64 68 50 61 72 61 6d 73 28 29 3b 0a 09 7d 0a _dhParams();..}.
c4a0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 .SSL_CTX_set_tmp
c4b0: 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 44 _dh(ctx, dh);..D
c4c0: 48 5f 66 72 65 65 28 64 68 29 3b 0a 20 20 20 20 H_free(dh);.
c4d0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a }.#endif.. /*
c4e0: 20 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 set our certifi
c4f0: 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 cate */. load
c500: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 _private_key = 0
c510: 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 ;. if (certfi
c520: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c le != NULL) {..l
c530: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 oad_private_key
c540: 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44 53 74 72 69 = 1;...Tcl_DStri
c550: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 0a 09 69 ngInit(&ds);...i
c560: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 f (SSL_CTX_use_c
c570: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 ertificate_file(
c580: 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c ctx, F2N(certfil
c590: 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c e, &ds), SSL_FIL
c5a0: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 ETYPE_PEM) <= 0)
c5b0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 {.. Tcl_DStr
c5c0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
c5d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
c5e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
c5f0: 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 ble to set certi
c600: 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 ficate file ", c
c610: 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 ertfile, ": ",..
c620: 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c .. REASON(),
c630: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
c640: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 .. SSL_CTX_fr
c650: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 ee(ctx);.. re
c660: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 turn (SSL_CTX *)
c670: 30 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 0;..}. } else
c680: 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c if (cert != NUL
c690: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 L) {..load_priva
c6a0: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 te_key = 1;..if
c6b0: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 (SSL_CTX_use_cer
c6c0: 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 tificate_ASN1(ct
c6d0: 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 x, cert_len, cer
c6e0: 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 t) <= 0) {..
c6f0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
c700: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 &ds);.. Tcl_A
c710: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
c720: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
c730: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 et certificate:
c740: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f ",.... REASO
c750: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
c760: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
c770: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
c780: 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 return (SSL_CT
c790: 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 7d 20 X *)0;..}. }
c7a0: 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 else {..certfile
c7b0: 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 = (char*)X509_g
c7c0: 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f et_default_cert_
c7d0: 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 file();...if (SS
c7e0: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 L_CTX_use_certif
c7f0: 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 icate_file(ctx,
c800: 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 certfile, SSL_FI
c810: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 LETYPE_PEM) <= 0
c820: 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 ) {.#if 0.. T
c830: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
c840: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 ds);.. Tcl_Ap
c850: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
c860: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 p, "unable to us
c870: 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 e default certif
c880: 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 icate file ", ce
c890: 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 rtfile, ": ",...
c8a0: 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 . REASON(),
c8b0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
c8c0: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 . SSL_CTX_fre
c8d0: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 e(ctx);.. ret
c8e0: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
c8f0: 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 ;.#endif..}.
c900: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 }.. /* set ou
c910: 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f r private key */
c920: 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 . if (load_pr
c930: 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 ivate_key) {..if
c940: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c (keyfile == NUL
c950: 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c L && key == NULL
c960: 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 ) {.. keyfile
c970: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a = certfile;..}.
c980: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d ..if (keyfile !=
c990: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a NULL) {.. /*
c9a0: 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65 get the private
c9b0: 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 key associated
c9c0: 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66 with this certif
c9d0: 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 icate */.. if
c9e0: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c (keyfile == NUL
c9f0: 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d L) {...keyfile =
ca00: 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 certfile;..
ca10: 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f }... if (SSL_
ca20: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b CTX_use_PrivateK
ca30: 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e ey_file(ctx, F2N
ca40: 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 (keyfile, &ds),
ca50: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d SSL_FILETYPE_PEM
ca60: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f ) <= 0) {...Tcl_
ca70: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
ca80: 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 ;.../* flush the
ca90: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 passphrase whic
caa0: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 h might be left
cab0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f in the result */
cac0: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
cad0: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 (interp, NULL, T
cae0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 CL_STATIC);...Tc
caf0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
cb00: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
cb10: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 o set public key
cb20: 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 file ", keyfile
cb30: 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20 20 , " ",....
cb40: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 REASON(), (ch
cb50: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 ar *) NULL);...S
cb60: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
cb70: 3b 0a 09 09 72 65 74 75 72 6e 20 28 53 53 4c 5f ;...return (SSL_
cb80: 43 54 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a CTX *)0;.. }.
cb90: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
cba0: 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 Free(&ds);...} e
cbb0: 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e lse if (key != N
cbc0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 ULL) {.. if (
cbd0: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 SSL_CTX_use_Priv
cbe0: 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f ateKey_ASN1(EVP_
cbf0: 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b PKEY_RSA, ctx, k
cc00: 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 ey,key_len) <= 0
cc10: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ) {...Tcl_DStrin
cc20: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a gFree(&ds);.../*
cc30: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 flush the passp
cc40: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 hrase which migh
cc50: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 t be left in the
cc60: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c result */...Tcl
cc70: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
cc80: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 p, NULL, TCL_STA
cc90: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 TIC);...Tcl_Appe
cca0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
ccb0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
ccc0: 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 52 public key: ", R
ccd0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
cce0: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 ) NULL);...SSL_C
ccf0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 TX_free(ctx);...
cd00: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
cd10: 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 *)0;.. }..}..
cd20: 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 /* Now we know t
cd30: 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 hat a key and ce
cd40: 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 rt have been set
cd50: 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 against.. * the
cd60: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a SSL context */.
cd70: 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 .if (!SSL_CTX_ch
cd80: 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 eck_private_key(
cd90: 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c ctx)) {.. Tcl
cda0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
cdb0: 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b terp, "private k
cdc0: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 ey does not matc
cdd0: 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 h the certificat
cde0: 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 e public key",..
cdf0: 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 .. (char *)
ce00: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
ce10: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
ce20: 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f return (SSL_
ce30: 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 CTX *)0;..}.
ce40: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 76 65 }.. /* Set ve
ce50: 72 69 66 69 63 61 74 69 6f 6e 20 43 41 73 20 2a rification CAs *
ce60: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e /. Tcl_DStrin
ce70: 67 49 6e 69 74 28 26 64 73 29 3b 0a 20 20 20 20 gInit(&ds);.
ce80: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
ce90: 26 64 73 31 29 3b 0a 20 20 20 20 69 66 20 28 21 &ds1);. if (!
cea0: 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 SSL_CTX_load_ver
ceb0: 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 ify_locations(ct
cec0: 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 x, F2N(CAfile, &
ced0: 64 73 29 2c 20 46 32 4e 28 43 41 64 69 72 2c 20 ds), F2N(CAdir,
cee0: 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f &ds1)) ||..!SSL_
cef0: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
cf00: 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 verify_paths(ctx
cf10: 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f )) {.#if 0..Tcl_
cf20: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
cf30: 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ;..Tcl_DStringFr
cf40: 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f ee(&ds1);../* Do
cf50: 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 20 63 61 n't currently ca
cf60: 72 65 20 69 66 20 74 68 69 73 20 66 61 69 6c 73 re if this fails
cf70: 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 */..Tcl_AppendR
cf80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
cf90: 53 4c 20 64 65 66 61 75 6c 74 20 76 65 72 69 66 SL default verif
cfa0: 79 20 70 61 74 68 73 3a 20 22 2c 20 52 45 41 53 y paths: ", REAS
cfb0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
cfc0: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
cfd0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
cfe0: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a n (SSL_CTX *)0;.
cff0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
d000: 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 /* https://sou
d010: 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 rceforge.net/p/t
d020: 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 ls/bugs/57/ */.
d030: 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 /* XXX:TODO:
d040: 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75 70 Let the user sup
d050: 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 ply values here
d060: 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 instead of somet
d070: 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 hing that exists
d080: 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 on the filesyst
d090: 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28 43 41 em */. if (CA
d0a0: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
d0b0: 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e .STACK_OF(X509_N
d0c0: 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 AME) *certNames
d0d0: 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e = SSL_load_clien
d0e0: 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 t_CA_file(F2N(CA
d0f0: 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69 66 file, &ds));..if
d100: 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e (certNames != N
d110: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f ULL) {.. SSL_
d120: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 CTX_set_client_C
d130: 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 A_list(ctx, cert
d140: 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d Names);..}. }
d150: 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
d160: 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 gFree(&ds);.
d170: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
d180: 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72 &ds1);. retur
d190: 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a n ctx;.}.../*. *
d1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d1e0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 ---. *. * Status
d1f0: 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e ObjCmd -- return
d200: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 certificate for
d210: 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e connected peer.
d220: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
d230: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
d240: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
d250: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
d260: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
d270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
d2b0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 */.static int.S
d2c0: 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 tatusObjCmd(Clie
d2d0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
d2e0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
d2f0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
d300: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
d310: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 objv[]) {. St
d320: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 ate *statePtr;.
d330: 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 X509 *peer;.
d340: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
d350: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e tr;. Tcl_Chan
d360: 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 nel chan;. ch
d370: 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c ar *channelName,
d380: 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 *ciphers;. i
d390: 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e nt mode;. con
d3a0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
d3b0: 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 *proto;. uns
d3c0: 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 0a igned int len;..
d3d0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
d3e0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 77 69 74 led");.. swit
d3f0: 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61 73 ch (objc) {..cas
d400: 65 20 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e 65 e 2:.. channe
d410: 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 lName = Tcl_GetS
d420: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
d430: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 v[1], NULL);..
d440: 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 break;...case
d450: 33 3a 0a 09 20 20 20 20 69 66 20 28 21 73 74 72 3:.. if (!str
d460: 63 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 72 69 cmp (Tcl_GetStri
d470: 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d ng (objv[1]), "-
d480: 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 68 61 local")) {...cha
d490: 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 nnelName = Tcl_G
d4a0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
d4b0: 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b 0a objv[2], NULL);.
d4c0: 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a ..break;.. }.
d4d0: 09 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c . /* else fal
d4e0: 6c 2d 74 68 72 6f 75 67 68 20 2e 2e 2e 20 2a 2f l-through ... */
d4f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 47 .#if defined(__G
d500: 4e 55 43 5f 5f 29 0a 09 20 20 20 20 5f 5f 61 74 NUC__).. __at
d510: 74 72 69 62 75 74 65 5f 5f 28 28 66 61 6c 6c 74 tribute__((fallt
d520: 68 72 6f 75 67 68 29 29 3b 0a 23 65 6e 64 69 66 hrough));.#endif
d530: 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 ..default:..
d540: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
d550: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
d560: 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e , "?-local? chan
d570: 6e 65 6c 22 29 3b 0a 09 20 20 20 20 72 65 74 75 nel");.. retu
d580: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
d590: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 }.. chan =
d5a0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
d5b0: 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 nterp, channelNa
d5c0: 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 me, &mode);.
d5d0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
d5e0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
d5f0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
d600: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f ROR;. }. /
d610: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
d620: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
d630: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
d640: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
d650: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
d660: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c an);. if (Tcl
d670: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
d680: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
d690: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 nnelType()) {..T
d6a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
d6b0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
d6c0: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
d6d0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
d6e0: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 n),..."\": not a
d6f0: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e TLS channel", N
d700: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
d710: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
d720: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 statePtr = (S
d730: 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 tate *) Tcl_GetC
d740: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
d750: 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 ta(chan);. if
d760: 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 (objc == 2) {..
d770: 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 peer = SSL_get_p
d780: 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 eer_certificate(
d790: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
d7a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 } else {..pe
d7b0: 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 er = SSL_get_cer
d7c0: 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 tificate(statePt
d7d0: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 r->ssl);. }.
d7e0: 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 if (peer) {..
d7f0: 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 objPtr = Tls_New
d800: 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 X509Obj(interp,
d810: 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 peer);..if (objc
d820: 20 3d 3d 20 32 29 20 7b 20 58 35 30 39 5f 66 72 == 2) { X509_fr
d830: 65 65 28 70 65 65 72 29 3b 20 7d 0a 20 20 20 20 ee(peer); }.
d840: 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 } else {..objPtr
d850: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
d860: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 j(0, NULL);.
d870: 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 63 }.. /* Peer c
d880: 65 72 74 20 63 68 61 69 6e 20 28 63 6c 69 65 6e ert chain (clien
d890: 74 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 20 20 53 t only) */. S
d8a0: 54 41 43 4b 5f 4f 46 28 58 35 30 39 29 2a 20 73 TACK_OF(X509)* s
d8b0: 73 6c 5f 63 65 72 74 73 20 3d 20 53 53 4c 5f 67 sl_certs = SSL_g
d8c0: 65 74 5f 70 65 65 72 5f 63 65 72 74 5f 63 68 61 et_peer_cert_cha
d8d0: 69 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c in(statePtr->ssl
d8e0: 29 3b 0a 20 20 20 20 69 66 20 28 21 70 65 65 72 );. if (!peer
d8f0: 20 26 26 20 28 73 73 6c 5f 63 65 72 74 73 20 3d && (ssl_certs =
d900: 3d 20 4e 55 4c 4c 20 7c 7c 20 73 6b 5f 58 35 30 = NULL || sk_X50
d910: 39 5f 6e 75 6d 28 73 73 6c 5f 63 65 72 74 73 29 9_num(ssl_certs)
d920: 20 3d 3d 20 30 29 29 20 7b 0a 09 72 65 74 75 72 == 0)) {..retur
d930: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
d940: 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 }.. /* Peer
d950: 6e 61 6d 65 20 66 72 6f 6d 20 63 65 72 74 20 2a name from cert *
d960: 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 /. Tcl_ListOb
d970: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
d980: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
d990: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
d9a0: 22 70 65 65 72 6e 61 6d 65 22 2c 20 2d 31 29 29 "peername", -1))
d9b0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
d9c0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
d9d0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
d9e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
d9f0: 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d SSL_get0_peernam
da00: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
da10: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c , -1));.. Tcl
da20: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
da30: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
da40: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
da50: 69 6e 67 4f 62 6a 28 22 73 62 69 74 73 22 2c 20 ingObj("sbits",
da60: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
da70: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
da80: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
da90: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a r, Tcl_NewIntObj
daa0: 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f (SSL_get_cipher_
dab0: 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 bits(statePtr->s
dac0: 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 sl, NULL)));..
dad0: 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 ciphers = (cha
dae0: 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 r*)SSL_get_ciphe
daf0: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 r(statePtr->ssl)
db00: 3b 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 ;. if ((ciphe
db10: 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 28 rs != NULL) && (
db20: 73 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c 20 strcmp(ciphers,
db30: 22 28 4e 4f 4e 45 29 22 29 20 21 3d 20 30 29 29 "(NONE)") != 0))
db40: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
db50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
db60: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
db70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 _NewStringObj("c
db80: 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 ipher", -1));..T
db90: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
dba0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
dbb0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
dbc0: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 tringObj(SSL_get
dbd0: 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 _cipher(statePtr
dbe0: 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 ->ssl), -1));.
dbf0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 }.. /* Veri
dc00: 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 fy the X509 cert
dc10: 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 ificate presente
dc20: 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f d by the peer */
dc30: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
dc40: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
dc50: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
dc60: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
dc70: 76 61 6c 69 64 61 74 69 6f 6e 22 2c 20 2d 31 29 validation", -1)
dc80: 29 3b 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 67 );. if (SSL_g
dc90: 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 et_verify_result
dca0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 (statePtr->ssl)
dcb0: 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a != X509_V_OK) {.
dcc0: 09 2f 2a 20 70 72 6f 74 6f 20 3d 20 22 66 61 69 ./* proto = "fai
dcd0: 6c 65 64 22 3b 20 2a 2f 0a 09 70 72 6f 74 6f 20 led"; */..proto
dce0: 3d 20 52 45 41 53 4f 4e 28 29 3b 0a 20 20 20 20 = REASON();.
dcf0: 7d 20 65 6c 73 65 20 7b 0a 09 70 72 6f 74 6f 20 } else {..proto
dd00: 3d 20 22 6f 6b 22 3b 0a 20 20 20 20 7d 0a 20 20 = "ok";. }.
dd10: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
dd20: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
dd30: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
dd40: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
dd50: 6f 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a o, -1));.. /*
dd60: 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 Report the sele
dd70: 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 cted protocol as
dd80: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 a result of the
dd90: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a negotiation */.
dda0: 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 SSL_get0_alp
ddb0: 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 n_selected(state
ddc0: 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f Ptr->ssl, &proto
ddd0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c , &len);. Tcl
dde0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
ddf0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
de00: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
de10: 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d ingObj("alpn", -
de20: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
de30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
de40: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
de50: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
de60: 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f bj((char *)proto
de70: 2c 20 28 69 6e 74 29 20 6c 65 6e 29 29 3b 0a 20 , (int) len));.
de80: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
de90: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
dea0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
deb0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 NewStringObj("pr
dec0: 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 20 otocol", -1));.
ded0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
dee0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
def0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
df00: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c NewStringObj(SSL
df10: 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 _get_version(sta
df20: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 tePtr->ssl), -1)
df30: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f );.. Tcl_SetO
df40: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
df50: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 objPtr);. re
df60: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c turn TCL_OK;..cl
df70: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
df80: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a tData;.}.../*. *
df90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dfa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dfd0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 ---. *. * Connec
dfe0: 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d tionInfoObjCmd -
dff0: 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 - return connect
e000: 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 ion info from Op
e010: 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 enSSL.. *. * Res
e020: 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 ults:. *.A list
e030: 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e of connection in
e040: 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d fo. *. *-------
e050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
e090: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e ..static int Con
e0a0: 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d nectionInfoObjCm
e0b0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
e0c0: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
e0d0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
e0e0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
e0f0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
e100: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
e110: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 chan;../* The ch
e120: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
e130: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 ode on. */. S
e140: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 tate *statePtr;.
e150: 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 ./* client state
e160: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 for ssl socket
e170: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a */. Tcl_Obj *
e180: 6f 62 6a 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 objPtr;. cons
e190: 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 t SSL *ssl;.
e1a0: 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 const SSL_CIPHER
e1b0: 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63 6f *cipher;. co
e1c0: 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 nst SSL_SESSION
e1d0: 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f *session;. co
e1e0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
e1f0: 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 6c 6f r *proto;. lo
e200: 6e 67 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 69 66 ng mode;.. if
e210: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 (objc != 2) {..
e220: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
e230: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
e240: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 , "channel");..r
e250: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
e260: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 ;. }.. cha
e270: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
e280: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 el(interp, Tcl_G
e290: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
e2a0: 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 objv[1], NULL),
e2b0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
e2c0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
e2d0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
e2e0: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
e2f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
e300: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
e310: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
e320: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
e330: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
e340: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
e350: 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 ;. if (Tcl_Ge
e360: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 tChannelType(cha
e370: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 n) != Tls_Channe
e380: 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f lType()) {..Tcl_
e390: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
e3a0: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
e3b0: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
e3c0: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
e3d0: 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 "\": not a TLS
e3e0: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b channel", NULL);
e3f0: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
e400: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
e410: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
e420: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
e430: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 ;.. /* Connec
e440: 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 tion info */.
e450: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
e460: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e te *)Tcl_GetChan
e470: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
e480: 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d chan);. ssl =
e490: 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a statePtr->ssl;.
e4a0: 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e if (ssl != N
e4b0: 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 ULL) {../* conne
e4c0: 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 ction state */..
e4d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
e4e0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
e4f0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
e500: 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 74 65 StringObj("state
e510: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
e520: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
e530: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
e540: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
e550: 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 Obj(SSL_state_st
e560: 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 ring_long(ssl),
e570: 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 -1));.../* Get S
e580: 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 65 72 NI requested ser
e590: 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 54 63 6c ver name */..Tcl
e5a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
e5b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
e5c0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
e5d0: 69 6e 67 4f 62 6a 28 22 73 65 72 76 65 72 6e 61 ingObj("serverna
e5e0: 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f me", -1));..Tcl_
e5f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
e600: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
e610: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
e620: 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 ngObj(SSL_get_se
e630: 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c rvername(ssl, TL
e640: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f SEXT_NAMETYPE_ho
e650: 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 29 3b 0a st_name), -1));.
e660: 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f ../* Get protoco
e670: 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 l */..Tcl_ListOb
e680: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
e690: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
e6a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
e6b0: 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 "protocol", -1))
e6c0: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
e6d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
e6e0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
e6f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c NewStringObj(SSL
e700: 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c _get_version(ssl
e710: 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 52 65 ), -1));.../* Re
e720: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f negotiation allo
e730: 77 65 64 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 wed */..Tcl_List
e740: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
e750: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
e760: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
e770: 6a 28 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e j("renegotiation
e780: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
e790: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
e7a0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
e7b0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
e7c0: 4f 62 6a 28 0a 09 20 20 20 20 53 53 4c 5f 67 65 Obj(.. SSL_ge
e7d0: 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 t_secure_renegot
e7e0: 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73 iation_support(s
e7f0: 73 6c 29 20 3f 20 22 73 75 70 70 6f 72 74 65 64 sl) ? "supported
e800: 22 20 3a 20 22 6e 6f 74 20 73 75 70 70 6f 72 74 " : "not support
e810: 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 ed", -1));.../*
e820: 47 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 Get security lev
e830: 65 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f el */..Tcl_ListO
e840: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
e850: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
e860: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
e870: 28 22 73 65 63 75 72 69 74 79 6c 65 76 65 6c 22 ("securitylevel"
e880: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
e890: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
e8a0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
e8b0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
e8c0: 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 SSL_get_security
e8d0: 5f 6c 65 76 65 6c 28 73 73 6c 29 29 29 3b 0a 0a _level(ssl)));..
e8e0: 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f ./* Session info
e8f0: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
e900: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
e910: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
e920: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
e930: 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c session_reused",
e940: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
e950: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
e960: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
e970: 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f Tcl_NewBooleanO
e980: 62 6a 28 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 bj(SSL_session_r
e990: 65 75 73 65 64 28 73 73 6c 29 29 29 3b 0a 0a 09 eused(ssl)));...
e9a0: 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 /* Is server inf
e9b0: 6f 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 o */..Tcl_ListOb
e9c0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
e9d0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
e9e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
e9f0: 22 69 73 5f 73 65 72 76 65 72 22 2c 20 2d 31 29 "is_server", -1)
ea00: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
ea10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
ea20: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
ea30: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 _NewBooleanObj(S
ea40: 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c SL_is_server(ssl
ea50: 29 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 )));. }..
ea60: 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a /* Cipher info *
ea70: 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 /. cipher = S
ea80: 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 SL_get_current_c
ea90: 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 ipher(ssl);.
eaa0: 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 if (cipher != NU
eab0: 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b LL) {..char buf[
eac0: 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 BUFSIZ] = {0};..
ead0: 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 int bits, alg_bi
eae0: 74 73 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 ts;...Tcl_ListOb
eaf0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
eb00: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
eb10: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
eb20: 22 63 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a "cipher", -1));.
eb30: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
eb40: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
eb50: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
eb60: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 wStringObj(SSL_C
eb70: 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 IPHER_get_name(c
eb80: 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 09 54 ipher), -1));..T
eb90: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
eba0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
ebb0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
ebc0: 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 6e 64 61 tringObj("standa
ebd0: 72 64 5f 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a rd_name", -1));.
ebe0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
ebf0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
ec00: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
ec10: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 wStringObj(SSL_C
ec20: 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e IPHER_standard_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 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f );...bits = SSL_
ec50: 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73 28 CIPHER_get_bits(
ec60: 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 cipher, &alg_bit
ec70: 73 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a s);..Tcl_ListObj
ec80: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
ec90: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
eca0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
ecb0: 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 bits", -1));..Tc
ecc0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
ecd0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
ece0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e bjPtr, Tcl_NewIn
ecf0: 74 4f 62 6a 28 62 69 74 73 29 29 3b 0a 09 54 63 tObj(bits));..Tc
ed00: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
ed10: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
ed20: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
ed30: 72 69 6e 67 4f 62 6a 28 22 73 65 63 72 65 74 5f ringObj("secret_
ed40: 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 bits", -1));..Tc
ed50: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
ed60: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
ed70: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e bjPtr, Tcl_NewIn
ed80: 74 4f 62 6a 28 61 6c 67 5f 62 69 74 73 29 29 3b tObj(alg_bits));
ed90: 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 ../* alg_bits is
eda0: 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63 72 actual key secr
edb0: 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65 20 et bits. If use
edc0: 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74 20 bits and secret
edd0: 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 73 (algorithm) bits
ede0: 20 64 69 66 66 65 72 2c 0a 20 20 20 20 20 20 20 differ,.
edf0: 20 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 the rest of
ee00: 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78 the bits are fix
ee10: 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d ed, i.e. for lim
ee20: 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 ited export ciph
ee30: 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 ers (bits < 56)
ee40: 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 */..Tcl_ListObjA
ee50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
ee60: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
ee70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d _NewStringObj("m
ee80: 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 2d 31 29 in_version", -1)
ee90: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
eea0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
eeb0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
eec0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
eed0: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 L_CIPHER_get_ver
eee0: 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 sion(cipher), -1
eef0: 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 ));.../* Get Ope
ef00: 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 nSSL-specific ID
ef10: 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f , not IANA ID */
ef20: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
ef30: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
ef40: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
ef50: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 64 22 ewStringObj("id"
ef60: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
ef70: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
ef80: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
ef90: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
efa0: 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 (int) SSL_CIPHER
efb0: 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 _get_id(cipher))
efc0: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 );...if (SSL_CIP
efd0: 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 HER_description(
efe0: 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a cipher, buf, siz
eff0: 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c eof(buf)) != NUL
f000: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 L) {.. Tcl_Li
f010: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f020: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
f030: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
f040: 4f 62 6a 28 22 64 65 73 63 72 69 70 74 69 6f 6e Obj("description
f050: 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 54 63 ", -1));.. Tc
f060: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
f070: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
f080: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
f090: 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d 31 29 ringObj(buf, -1)
f0a0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
f0b0: 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f /* Session info
f0c0: 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 */. session
f0d0: 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f = SSL_get_sessio
f0e0: 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 n(ssl);. if (
f0f0: 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 session != NULL)
f100: 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e {..const unsign
f110: 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b ed char *ticket;
f120: 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 ..size_t len2;..
f130: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 unsigned int ule
f140: 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e n;..const unsign
f150: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e ed char *session
f160: 5f 69 64 3b 0a 09 63 68 61 72 20 62 75 66 66 65 _id;..char buffe
f170: 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 r[SSL_MAX_MASTER
f180: 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 _KEY_LENGTH];...
f190: 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 /* Report the se
f1a0: 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
f1b0: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 as a result of t
f1c0: 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 he ALPN negotiat
f1d0: 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 ion */..SSL_SESS
f1e0: 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 ION_get0_alpn_se
f1f0: 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 lected(session,
f200: 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a &proto, &len2);.
f210: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
f220: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f230: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
f240: 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e wStringObj("alpn
f250: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
f260: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f270: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
f280: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
f290: 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 Obj((char *)prot
f2a0: 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b o, (int) len2));
f2b0: 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 .../* Resumable
f2c0: 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 54 63 6c 5f session */..Tcl_
f2d0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
f2e0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
f2f0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
f300: 6e 67 4f 62 6a 28 22 72 65 73 75 6d 61 62 6c 65 ngObj("resumable
f310: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
f320: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f330: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
f340: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a r, Tcl_NewIntObj
f350: 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f (SSL_SESSION_is_
f360: 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f resumable(sessio
f370: 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 n)));.../* Sessi
f380: 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 on start time (s
f390: 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f econds since epo
f3a0: 63 68 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 ch) */..Tcl_List
f3b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
f3c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f3d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
f3e0: 6a 28 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 j("start_time",
f3f0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
f400: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
f410: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f420: 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 Tcl_NewLongObj(S
f430: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 SL_SESSION_get_t
f440: 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a ime(session)));.
f450: 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c ../* Timeout val
f460: 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 ue - SSL_CTX_get
f470: 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 _timeout (in sec
f480: 6f 6e 64 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 onds) */..Tcl_Li
f490: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f4a0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
f4b0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
f4c0: 4f 62 6a 28 22 74 69 6d 65 6f 75 74 22 2c 20 2d Obj("timeout", -
f4d0: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
f4e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
f4f0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
f500: 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 cl_NewLongObj(SS
f510: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
f520: 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 29 meout(session)))
f530: 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 ;.../* Session t
f540: 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68 icket lifetime h
f550: 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 int (in seconds)
f560: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
f570: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
f580: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
f590: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
f5a0: 6c 69 66 65 74 69 6d 65 22 2c 20 2d 31 29 29 3b lifetime", -1));
f5b0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
f5c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
f5d0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
f5e0: 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 ewLongObj(SSL_SE
f5f0: 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 SSION_get_ticket
f600: 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 _lifetime_hint(s
f610: 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 ession)));.../*
f620: 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 73 Session id */..s
f630: 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f ession_id = SSL_
f640: 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 SESSION_get_id(s
f650: 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a ession, &ulen);.
f660: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
f670: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f680: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
f690: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 wStringObj("sess
f6a0: 69 6f 6e 5f 69 64 22 2c 20 2d 31 29 29 3b 0a 09 ion_id", -1));..
f6b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
f6c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
f6d0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
f6e0: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 ByteArrayObj(ses
f6f0: 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 sion_id, (int) u
f700: 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 len));.../* Sess
f710: 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 ion ticket - cli
f720: 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c ent only */..SSL
f730: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 _SESSION_get0_ti
f740: 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 cket(session, &t
f750: 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 icket, &len2);..
f760: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
f770: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
f780: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
f790: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 StringObj("sessi
f7a0: 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 2d 31 29 29 on_ticket", -1))
f7b0: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
f7c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
f7d0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
f7e0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 NewByteArrayObj(
f7f0: 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 ticket, (int) le
f800: 6e 32 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 n2));.../* Ticke
f810: 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a 09 53 t app data */..S
f820: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f SL_SESSION_get0_
f830: 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28 73 ticket_appdata(s
f840: 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c ession, &ticket,
f850: 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 &len2);..Tcl_Li
f860: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f870: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
f880: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
f890: 4f 62 6a 28 22 74 69 63 6b 65 74 5f 61 70 70 5f Obj("ticket_app_
f8a0: 64 61 74 61 22 2c 20 2d 31 29 29 3b 0a 09 54 63 data", -1));..Tc
f8b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
f8c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
f8d0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 bjPtr, Tcl_NewBy
f8e0: 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 teArrayObj(ticke
f8f0: 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b t, (int) len2));
f900: 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 .../* Get master
f910: 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 key */..len2 =
f920: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
f930: 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69 master_key(sessi
f940: 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f on, buffer, SSL_
f950: 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c MAX_MASTER_KEY_L
f960: 45 4e 47 54 48 29 3b 0a 09 54 63 6c 5f 4c 69 73 ENGTH);..Tcl_Lis
f970: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
f980: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
f990: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
f9a0: 62 6a 28 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c bj("master_key",
f9b0: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
f9c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
f9d0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f9e0: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 Tcl_NewByteArra
f9f0: 79 4f 62 6a 28 62 75 66 66 65 72 2c 20 28 69 6e yObj(buffer, (in
fa00: 74 29 20 6c 65 6e 32 29 29 3b 0a 20 20 20 20 7d t) len2));. }
fa10: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 .. /* Compres
fa20: 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 sion info */.
fa30: 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c if (ssl != NULL
fa40: 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f ) {.#ifdef HAVE_
fa50: 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a SSL_COMPRESSION.
fa60: 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 .const COMP_METH
fa70: 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b OD *comp, *expn;
fa80: 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 ..comp = SSL_get
fa90: 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 _current_compres
faa0: 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e sion(ssl);..expn
fab0: 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 = SSL_get_curre
fac0: 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c nt_expansion(ssl
fad0: 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a );...Tcl_ListObj
fae0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
faf0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
fb00: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
fb10: 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 compression", -1
fb20: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
fb30: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
fb40: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
fb50: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 l_NewStringObj(c
fb60: 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 omp ? SSL_COMP_g
fb70: 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 et_name(comp) :
fb80: 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 09 54 "NONE", -1));..T
fb90: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
fba0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
fbb0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
fbc0: 74 72 69 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73 tringObj("expans
fbd0: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ion", -1));..Tcl
fbe0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
fbf0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
fc00: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
fc10: 69 6e 67 4f 62 6a 28 65 78 70 6e 20 3f 20 53 53 ingObj(expn ? SS
fc20: 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 L_COMP_get_name(
fc30: 65 78 70 6e 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 expn) : "NONE",
fc40: 2d 31 29 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c -1));.#else..Tcl
fc50: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
fc60: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
fc70: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
fc80: 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65 73 73 ingObj("compress
fc90: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ion", -1));..Tcl
fca0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
fcb0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
fcc0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
fcd0: 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20 2d ingObj("NONE", -
fce0: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
fcf0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
fd00: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
fd10: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
fd20: 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 "expansion", -1)
fd30: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
fd40: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
fd50: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
fd60: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e _NewStringObj("N
fd70: 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 ONE", -1));.#end
fd80: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a if. }.. /*
fd90: 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a Server info */.
fda0: 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 mode = SSL_C
fdb0: 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 TX_get_session_c
fdc0: 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 ache_mode(stateP
fdd0: 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 tr->ctx);. if
fde0: 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 (mode & SSL_SES
fdf0: 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 S_CACHE_OFF) {..
fe00: 70 72 6f 74 6f 20 3d 20 22 6f 66 66 22 3b 0a 20 proto = "off";.
fe10: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f } else if (mo
fe20: 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 de & SSL_SESS_CA
fe30: 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 70 CHE_CLIENT) {..p
fe40: 72 6f 74 6f 20 3d 20 22 63 6c 69 65 6e 74 22 3b roto = "client";
fe50: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
fe60: 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f mode & SSL_SESS_
fe70: 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a CACHE_SERVER) {.
fe80: 09 70 72 6f 74 6f 20 3d 20 22 73 65 72 76 65 72 .proto = "server
fe90: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ";. } else if
fea0: 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 (mode & SSL_SES
feb0: 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a S_CACHE_BOTH) {.
fec0: 09 70 72 6f 74 6f 20 3d 20 22 62 6f 74 68 22 3b .proto = "both";
fed0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 . } else {..p
fee0: 72 6f 74 6f 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 roto = "unknown"
fef0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
ff00: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
ff10: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
ff20: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
ff30: 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 63 ngObj("session_c
ff40: 61 63 68 65 5f 6d 6f 64 65 22 2c 20 2d 31 29 29 ache_mode", -1))
ff50: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
ff60: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
ff70: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
ff80: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
ff90: 70 72 6f 74 6f 2c 20 2d 31 29 29 3b 0a 0a 20 20 proto, -1));..
ffa0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
ffb0: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
ffc0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
ffd0: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 CL_OK;..clientDa
ffe0: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
fff0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
10000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
10040 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d . * VersionObjCm
10050 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 d -- return vers
10060 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 ion string from
10070 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 OpenSSL.. *. * R
10080 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
10090 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
100a0 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
100b0 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
100c0 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10100 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
10110 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 ic int.VersionOb
10120 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
10130 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
10140 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
10150 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
10160 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
10170 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
10180 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 objPtr;.. dpr
10190 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
101a0 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 . objPtr = Tc
101b0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f l_NewStringObj(O
101c0 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 PENSSL_VERSION_T
101d0 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 EXT, -1);. Tc
101e0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
101f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a nterp, objPtr);.
10200 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
10210 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 OK;..clientData
10220 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 09 6f = clientData;..o
10230 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 6f 62 6a bjc = objc;..obj
10240 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a v = objv;.}.../*
10250 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
10260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10290 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 ------. *. * Mis
102a0 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 cObjCmd -- misc
102b0 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 commands. *. * R
102c0 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
102d0 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
102e0 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
102f0 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
10300 2a 0a 20 2a 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
10350 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d ic int.MiscObjCm
10360 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
10370 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
10380 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
10390 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
103a0 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
103b0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 static const
103c0 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 char *commands
103d0 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 [] = { "req", "s
103e0 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a trreq", NULL };.
103f0 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 enum command
10400 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 { C_REQ, C_STRR
10410 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 EQ, C_DUMMY };.
10420 20 20 20 69 6e 74 20 63 6d 64 2c 20 69 73 53 74 int cmd, isSt
10430 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 r;. char buff
10440 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 20 20 er[16384];..
10450 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
10460 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
10470 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f < 2) {..Tcl_Wro
10480 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
10490 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 , 1, objv, "subc
104a0 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b ommand ?args?");
104b0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
104c0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
104d0 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 (Tcl_GetIndexFr
104e0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
104f0 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c jv[1], commands,
10500 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 26 63 "command", 0,&c
10510 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b md) != TCL_OK) {
10520 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
10530 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
10540 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 sStr = (cmd == C
10550 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 _STRREQ);. sw
10560 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d itch ((enum comm
10570 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 and) cmd) {..cas
10580 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 e C_REQ:..case C
10590 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 _STRREQ: {..
105a0 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e EVP_PKEY *pkey=N
105b0 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a ULL;.. X509 *
105c0 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 cert=NULL;..
105d0 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d X509_NAME *name=
105e0 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f NULL;.. Tcl_O
105f0 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 bj **listv;..
10600 20 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 int listc,i;...
10610 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c BIO *out=NUL
10620 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b L;... char *k
10630 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a _C="",*k_ST="",*
10640 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a k_L="",*k_O="",*
10650 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 k_OU="",*k_CN=""
10660 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 ,*k_Email="";..
10670 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c char *keyout,
10680 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 *pemout,*str;..
10690 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 int keysize,s
106a0 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 erial=0,days=365
106b0 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 ;..#if OPENSSL_V
106c0 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
106d0 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 0x30000000L..
106e0 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e BIGNUM *bne = N
106f0 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 ULL;.. RSA *r
10700 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 sa = NULL;.#else
10710 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 .. EVP_PKEY_C
10720 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a TX *ctx = NULL;.
10730 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 #endif... if
10740 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 ((objc<5) || (ob
10750 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 jc>6)) {...Tcl_W
10760 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
10770 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 rp, 2, objv, "ke
10780 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 ysize keyfile ce
10790 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b rtfile ?info?");
107a0 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
107b0 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ROR;.. }...
107c0 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 if (Tcl_GetInt
107d0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
107e0 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a objv[2], &keysiz
107f0 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a e) != TCL_OK) {.
10800 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
10810 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 OR;.. }..
10820 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 keyout=Tcl_GetSt
10830 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 ring(objv[3]);..
10840 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 pemout=Tcl_G
10850 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d etString(objv[4]
10860 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 );.. if (isSt
10870 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 r) {...Tcl_SetVa
10880 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c r(interp,keyout,
10890 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 "",0);...Tcl_Set
108a0 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 Var(interp,pemou
108b0 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a t,"",0);.. }.
108c0 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d .. if (objc>=
108d0 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 6) {...if (Tcl_L
108e0 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 istObjGetElement
108f0 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 s(interp, objv[5
10900 5d 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20 26 6c ],....&listc, &l
10910 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 istv) != TCL_OK)
10920 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 {... return
10930 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a TCL_ERROR;...}..
10940 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 20 ..if ((listc%2)
10950 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 63 != 0) {... Tc
10960 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
10970 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 rp,"Information
10980 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 65 list must have e
10990 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 ven number of ar
109a0 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a guments",NULL);.
109b0 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
109c0 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f _ERROR;...}...fo
109d0 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b r (i=0; i<listc;
109e0 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 i+=2) {... s
109f0 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 tr=Tcl_GetString
10a00 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 (listv[i]);...
10a10 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 if (strcmp(str
10a20 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 ,"days")==0) {..
10a30 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 ..if (Tcl_GetInt
10a40 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c FromObj(interp,l
10a50 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 istv[i+1],&days)
10a60 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 !=TCL_OK)....
10a70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
10a80 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 R;... } else
10a90 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
10aa0 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 serial")==0) {..
10ab0 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 ..if (Tcl_GetInt
10ac0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c FromObj(interp,l
10ad0 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 istv[i+1],&seria
10ae0 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 l)!=TCL_OK)....
10af0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
10b00 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 ROR;... } els
10b10 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
10b20 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ,"C")==0) {....k
10b30 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 _C=Tcl_GetString
10b40 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
10b50 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
10b60 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d trcmp(str,"ST")=
10b70 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 =0) {....k_ST=Tc
10b80 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
10b90 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
10ba0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
10bb0 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a (str,"L")==0) {.
10bc0 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 ...k_L=Tcl_GetSt
10bd0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
10be0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
10bf0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f f (strcmp(str,"O
10c00 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d ")==0) {....k_O=
10c10 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
10c20 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
10c30 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
10c40 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 mp(str,"OU")==0)
10c50 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 {....k_OU=Tcl_G
10c60 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
10c70 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
10c80 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
10c90 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 r,"CN")==0) {...
10ca0 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 .k_CN=Tcl_GetStr
10cb0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
10cc0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
10cd0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d (strcmp(str,"Em
10ce0 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ail")==0) {....k
10cf0 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 _Email=Tcl_GetSt
10d00 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
10d10 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b ;... } else {
10d20 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c ....Tcl_SetResul
10d30 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 t(interp,"Unknow
10d40 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c n parameter",NUL
10d50 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43 L);....return TC
10d60 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d L_ERROR;... }
10d70 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 ...}.. }..#if
10d80 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
10d90 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
10da0 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 0000L.. bne =
10db0 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 BN_new();..
10dc0 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b rsa = RSA_new();
10dd0 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 .. pkey = EVP
10de0 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 _PKEY_new();..
10df0 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c if (bne == NUL
10e00 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c L || rsa == NULL
10e10 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c || pkey == NULL
10e20 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 || !BN_set_word
10e30 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a (bne,RSA_F4) ||.
10e40 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 5f ..!RSA_generate_
10e50 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 key_ex(rsa, keys
10e60 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 ize, bne, NULL)
10e70 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 || !EVP_PKEY_ass
10e80 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 ign_RSA(pkey, rs
10e90 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 a)) {...EVP_PKEY
10ea0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f _free(pkey);.../
10eb0 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 3b * RSA_free(rsa);
10ec0 20 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 4b freed by EVP_PK
10ed0 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f EY_free */...BN_
10ee0 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 free(bne);.#else
10ef0 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 .. pkey = EVP
10f00 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e _RSA_gen((unsign
10f10 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 ed int) keysize)
10f20 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 50 ;.. ctx = EVP
10f30 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b _PKEY_CTX_new(pk
10f40 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 ey,NULL);.. i
10f50 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 f (pkey == NULL
10f60 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c || ctx == NULL |
10f70 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 | !EVP_PKEY_keyg
10f80 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a en_init(ctx) ||.
10f90 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f ..!EVP_PKEY_CTX_
10fa0 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 set_rsa_keygen_b
10fb0 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 its(ctx, keysize
10fc0 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b ) || !EVP_PKEY_k
10fd0 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 eygen(ctx, &pkey
10fe0 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f )) {...EVP_PKEY_
10ff0 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 free(pkey);...EV
11000 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 P_PKEY_CTX_free(
11010 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 ctx);.#endif...T
11020 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
11030 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 erp,"Error gener
11040 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b 65 ating private ke
11050 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 y",NULL);...retu
11060 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
11070 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 } else {...if
11080 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 (isStr) {...
11090 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f out=BIO_new(BIO
110a0 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 _s_mem());...
110b0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 PEM_write_bio_P
110c0 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b rivateKey(out,pk
110d0 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e ey,NULL,NULL,0,N
110e0 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 ULL,NULL);...
110f0 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c i=BIO_read(out,
11100 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 buffer,sizeof(bu
11110 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 ffer)-1);...
11120 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b i=(i<0) ? 0 : i;
11130 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d ... buffer[i]
11140 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c ='\0';... Tcl
11150 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b _SetVar(interp,k
11160 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b eyout,buffer,0);
11170 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 ... BIO_flush
11180 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f (out);... BIO
11190 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 _free(out);...}
111a0 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 else {... out
111b0 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 =BIO_new(BIO_s_f
111c0 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 ile());... BI
111d0 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 O_write_filename
111e0 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 (out,keyout);...
111f0 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 PEM_write_bi
11200 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 o_PrivateKey(out
11210 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c ,pkey,NULL,NULL,
11220 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 0,NULL,NULL);...
11230 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 /* PEM_write
11240 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 4b _bio_RSAPrivateK
11250 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c ey(out, rsa, NUL
11260 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c L, NULL, 0, NULL
11270 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 , NULL); */...
11280 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f BIO_free_all(o
11290 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 ut);.. .}....if
112a0 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 ((cert=X509_new(
112b0 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 ))==NULL) {...
112c0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 Tcl_SetResult(
112d0 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 interp,"Error ge
112e0 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 69 nerating certifi
112f0 63 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55 cate request",NU
11300 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 LL);... EVP_P
11310 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
11320 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
11330 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
11340 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 0000000L... B
11350 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e N_free(bne);.#en
11360 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 6e dif... return
11370 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d (TCL_ERROR);...}
11380 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72 ....X509_set_ver
11390 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 sion(cert,2);...
113a0 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 ASN1_INTEGER_set
113b0 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c (X509_get_serial
113c0 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72 Number(cert),ser
113d0 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 ial);...X509_gmt
113e0 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 ime_adj(X509_get
113f0 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 m_notBefore(cert
11400 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 ),0);...X509_gmt
11410 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 ime_adj(X509_get
11420 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 m_notAfter(cert)
11430 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a ,(long)60*60*24*
11440 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 days);...X509_se
11450 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b t_pubkey(cert,pk
11460 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 ey);....name=X50
11470 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 9_get_subject_na
11480 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 me(cert);....X50
11490 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
114a0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 _by_txt(name,"C"
114b0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
114c0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
114d0 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c char *) k_C, -1,
114e0 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
114f0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
11500 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c y_txt(name,"ST",
11510 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
11520 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
11530 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c har *) k_ST, -1,
11540 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
11550 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
11560 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 y_txt(name,"L",
11570 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
11580 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
11590 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d ar *) k_L, -1, -
115a0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
115b0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
115c0 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 txt(name,"O", MB
115d0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
115e0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
115f0 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c *) k_O, -1, -1,
11600 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
11610 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
11620 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 t(name,"OU", MBS
11630 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
11640 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
11650 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c *) k_OU, -1, -1,
11660 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
11670 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
11680 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 t(name,"CN", MBS
11690 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
116a0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
116b0 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c *) k_CN, -1, -1,
116c0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
116d0 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
116e0 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 t(name,"Email",
116f0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
11700 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
11710 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d ar *) k_Email, -
11720 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 1, -1, 0);....X5
11730 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 09_set_subject_n
11740 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a ame(cert,name);.
11750 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 67 ...if (!X509_sig
11760 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f n(cert,pkey,EVP_
11770 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20 sha256())) {...
11780 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 72 X509_free(cer
11790 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b t);... EVP_PK
117a0 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 EY_free(pkey);.#
117b0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
117c0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
117d0 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 000000L... BN
117e0 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 _free(bne);.#end
117f0 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 if... Tcl_Set
11800 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 Result(interp,"E
11810 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72 rror signing cer
11820 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b tificate",NULL);
11830 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
11840 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 L_ERROR;...}....
11850 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 if (isStr) {...
11860 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
11870 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 IO_s_mem());...
11880 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
11890 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b _X509(out,cert);
118a0 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 ... i=BIO_rea
118b0 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a d(out,buffer,siz
118c0 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a eof(buffer)-1);.
118d0 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 .. i=(i<0) ?
118e0 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 0 : i;... buf
118f0 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 fer[i]='\0';...
11900 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e Tcl_SetVar(in
11910 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 terp,pemout,buff
11920 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f er,0);... BIO
11930 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 _flush(out);...
11940 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 BIO_free(out)
11950 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 ;...} else {...
11960 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
11970 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 IO_s_file());...
11980 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 BIO_write_fi
11990 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 lename(out,pemou
119a0 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 t);... PEM_wr
119b0 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 ite_bio_X509(out
119c0 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49 ,cert);... BI
119d0 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b O_free_all(out);
119e0 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 ...}....X509_fre
119f0 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 e(cert);...EVP_P
11a00 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
11a10 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
11a20 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
11a30 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 0000000L...BN_fr
11a40 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a ee(bne);.#endif.
11a50 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b . }..}..break
11a60 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 ;. default:..
11a70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 break;. }.
11a80 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
11a90 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
11aa0 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
11ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11ac0 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 ***/./* Init
11ad0 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a */./***
11ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11af0 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d */../*. *-------
11b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
11b40 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 * Tls_Free --.
11b50 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
11b60 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 ure cleans up wh
11b70 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 en a SSL socket
11b80 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a based channel. *
11b90 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 .is closed and i
11ba0 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 ts reference cou
11bb0 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 nt falls below 1
11bc0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
11bd0 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.none. *. * Si
11be0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 de effects:. *.F
11bf0 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 rees all the sta
11c00 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d te. *. *--------
11c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
11c50 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 void.Tls_Free(ch
11c60 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a ar *blockPtr) {.
11c70 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
11c80 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 Ptr = (State *)b
11c90 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 lockPtr;.. dp
11ca0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
11cb0 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 .. Tls_Clean(
11cc0 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 statePtr);. c
11cd0 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b kfree(blockPtr);
11ce0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
11cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
11d30 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d . * Tls_Clean --
11d40 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
11d50 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 edure cleans up
11d60 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 when a SSL socke
11d70 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a t based channel.
11d80 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 *.is closed and
11d90 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 its reference c
11da0 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 ount falls below
11db0 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 1. This should
11dc0 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 . *.be called sy
11dd0 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 nchronously by t
11de0 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f he CloseProc, no
11df0 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e t in the. *.Even
11e00 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 tuallyFree callb
11e10 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ack.. *. * Resul
11e20 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 ts:. *.none. *.
11e30 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
11e40 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 *.Frees all the
11e50 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d state. *. *----
11e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
11ea0 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 */.void Tls_Cle
11eb0 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 an(State *stateP
11ec0 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 tr) {. dprint
11ed0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
11ee0 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 /*. * we'r
11ef0 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 e assuming here
11f00 74 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c that we're singl
11f10 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 e-threaded.
11f20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
11f30 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 Ptr->timer != (T
11f40 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e cl_TimerToken) N
11f50 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 ULL) {..Tcl_Dele
11f60 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 teTimerHandler(s
11f70 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b tatePtr->timer);
11f80 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 ..statePtr->time
11f90 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a r = NULL;. }.
11fa0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
11fb0 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b r->protos) {..ck
11fc0 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 free(statePtr->p
11fd0 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 rotos);..statePt
11fe0 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c r->protos = NULL
11ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
12000 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b statePtr->bio) {
12010 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 ../* This will c
12020 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e all SSL_shutdown
12030 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f . Bug 1414045 */
12040 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 ..dprintf("BIO_f
12050 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 ree_all(%p)", st
12060 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 atePtr->bio);..B
12070 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 IO_free_all(stat
12080 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 ePtr->bio);..sta
12090 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c tePtr->bio = NUL
120a0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
120b0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 (statePtr->ssl)
120c0 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f {..dprintf("SSL_
120d0 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 free(%p)", state
120e0 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f Ptr->ssl);..SSL_
120f0 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 free(statePtr->s
12100 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e sl);..statePtr->
12110 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ssl = NULL;.
12120 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
12130 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f tr->ctx) {..SSL_
12140 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 CTX_free(statePt
12150 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 r->ctx);..stateP
12160 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a tr->ctx = NULL;.
12170 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
12180 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
12190 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 ) {..Tcl_DecrRef
121a0 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
121b0 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 callback);..stat
121c0 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
121d0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
121e0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
121f0 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f assword) {..Tcl_
12200 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 DecrRefCount(sta
12210 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 tePtr->password)
12220 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 ;..statePtr->pas
12230 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 sword = NULL;.
12240 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 }.. dprintf
12250 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d ("Returning");.}
12260 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
12270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
122a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
122b0 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a * Tls_Init --. *
122c0 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 . *.This is a pa
122d0 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 ckage initializa
122e0 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 tion procedure,
122f0 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a which is called.
12300 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20 74 *.by Tcl when t
12310 68 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 his package is t
12320 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e o be added to an
12330 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a interpreter.. *
12340 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 73 . * Results: Ss
12350 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 l configured and
12360 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 loaded. *. * Si
12370 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 de effects:. *.
12380 63 72 65 61 74 65 20 74 68 65 20 73 73 6c 20 63 create the ssl c
12390 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 ommand, initiali
123a0 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 ze ssl context.
123b0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
123c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
123d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
123e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
123f0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 -------. */.DLLE
12400 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e XPORT int Tls_In
12410 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 it(Tcl_Interp *i
12420 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 63 6f 6e nterp) {. con
12430 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e st char tlsTclIn
12440 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 itScript[] = {.#
12450 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c include "tls.tcl
12460 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b .h"..0x00. };
12470 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
12480 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a alled");.. /*
12490 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 . * We only
124a0 73 75 70 70 6f 72 74 20 54 63 6c 20 38 2e 34 20 support Tcl 8.4
124b0 6f 72 20 6e 65 77 65 72 0a 20 20 20 20 20 2a 2f or newer. */
124c0 0a 20 20 20 20 69 66 20 28 0a 23 69 66 64 65 66 . if (.#ifdef
124d0 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 09 USE_TCL_STUBS..
124e0 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e Tcl_InitStubs(in
124f0 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 0a terp, "8.4", 0).
12500 23 65 6c 73 65 0a 09 54 63 6c 5f 50 6b 67 52 65 #else..Tcl_PkgRe
12510 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 54 quire(interp, "T
12520 63 6c 22 2c 20 22 38 2e 34 2d 22 2c 20 30 29 0a cl", "8.4-", 0).
12530 23 65 6e 64 69 66 0a 09 20 3d 3d 20 4e 55 4c 4c #endif.. == NULL
12540 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
12550 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
12560 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 if (TlsLibInit
12570 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b (0) != TCL_OK) {
12580 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
12590 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c lt(interp, "coul
125a0 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 d not initialize
125b0 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 4e SSL library", N
125c0 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
125d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
125e0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
125f0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
12600 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c "tls::ciphers",
12610 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 CiphersObjCmd,
12620 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
12630 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
12640 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
12650 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
12660 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
12670 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c ls::connection",
12680 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f ConnectionInfoO
12690 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
126a0 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
126b0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
126c0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
126d0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
126e0 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 erp, "tls::hands
126f0 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 hake", Handshake
12700 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
12710 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
12720 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
12730 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
12740 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
12750 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f terp, "tls::impo
12760 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d rt", ImportObjCm
12770 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
12780 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
12790 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
127a0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
127b0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
127c0 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 "tls::unimport"
127d0 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 , UnimportObjCmd
127e0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
127f0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
12800 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
12810 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
12820 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
12830 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 "tls::status", S
12840 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c tatusObjCmd, (Cl
12850 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
12860 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
12870 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
12880 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
12890 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
128a0 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 :version", Versi
128b0 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e onObjCmd, (Clien
128c0 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
128d0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
128e0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
128f0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
12900 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 interp, "tls::mi
12910 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c sc", MiscObjCmd,
12920 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
12930 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
12940 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
12950 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
12960 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
12970 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c tls::protocols",
12980 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 ProtocolsObjCmd
12990 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
129a0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
129b0 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a Proc *) NULL);..
129c0 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 29 20 if (interp)
129d0 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 {..Tcl_Eval(inte
129e0 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 rp, tlsTclInitSc
129f0 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 ript);. }..
12a00 20 20 72 65 74 75 72 6e 28 54 63 6c 5f 50 6b 67 return(Tcl_Pkg
12a10 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 Provide(interp,
12a20 22 74 6c 73 22 2c 20 50 41 43 4b 41 47 45 5f 56 "tls", PACKAGE_V
12a30 45 52 53 49 4f 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a ERSION));.}../*.
12a40 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
12a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a70 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
12a80 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a Tls_SafeInit --.
12a90 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *.----------
12aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ac0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 ------*. *.Stand
12ad0 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 72 65 ard procedure re
12ae0 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64 27 quired by 'load'
12af0 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 .. *.Initializes
12b00 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 this extension
12b10 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65 72 for a safe inter
12b20 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d preter.. *.-----
12b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a -----------*. *.
12b60 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a *.Side effects:
12b70 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 5f . *..As of 'Tls_
12b80 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 Init'. *. *.Resu
12b90 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 lt:. *..A standa
12ba0 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 rd Tcl error cod
12bb0 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
12bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
12bf0 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e */.DLLEXPORT in
12c00 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 t Tls_SafeInit(T
12c10 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
12c20 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 p) {. dprintf
12c30 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 ("Called");.
12c40 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28 return(Tls_Init(
12c50 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a interp));.}../*.
12c60 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
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 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
12ca0 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a TlsLibInit --. *
12cb0 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.------------
12cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ce0 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c ----*. *.Initial
12cf0 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 izes SSL library
12d00 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63 once per applic
12d10 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d ation. *.-------
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 2a 0a 20 2a 0a 20 2a ---------*. *. *
12d50 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 .Side effects:.
12d60 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 *..initializes S
12d70 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a SL library. *. *
12d80 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e .Result:. *..non
12d90 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
12da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
12dd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c */.static int Tl
12de0 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 sLibInit(int uni
12df0 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 nitialize) {.
12e00 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 static int init
12e10 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 ialized = 0;.
12e20 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20 54 43 int status = TC
12e30 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 L_OK;.#if define
12e40 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
12e50 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
12e60 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 73 L_THREADS). s
12e70 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b ize_t num_locks;
12e80 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 .#endif.. if
12e90 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b (uninitialize) {
12ea0 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 69 6e . if (!in
12eb0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 20 20 20 itialized) {.
12ec0 20 20 20 20 20 20 20 20 20 64 70 72 69 6e 74 66 dprintf
12ed0 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 ("Asked to unini
12ee0 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 tialize, but we
12ef0 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 are not initiali
12f00 7a 65 64 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 zed");..
12f10 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f return(TCL_O
12f20 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 K);. }..
12f30 20 20 20 20 20 20 20 64 70 72 69 6e 74 66 28 22 dprintf("
12f40 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 Asked to uniniti
12f50 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 alize");..#if de
12f60 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
12f70 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
12f80 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 d(TCL_THREADS).
12f90 20 20 20 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 Tcl_Mutex
12fa0 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a Lock(&init_mx);.
12fb0 0a 20 20 20 20 20 20 20 20 69 66 20 28 6c 6f 63 . if (loc
12fc0 6b 73 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 ks) {.
12fd0 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 20 free(locks);.
12fe0 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 73 locks
12ff0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 = NULL;.
13000 20 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 locksCount
13010 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 = 0;. }.#
13020 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e endif. in
13030 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a itialized = 0;..
13040 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
13050 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
13060 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
13070 41 44 53 29 0a 20 20 20 20 20 20 20 20 54 63 6c ADS). Tcl
13080 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e _MutexUnlock(&in
13090 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a it_mx);.#endif..
130a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 28 54 return(T
130b0 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 CL_OK);. }..
130c0 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a if (initializ
130d0 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 64 70 ed) {. dp
130e0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 rintf("Called, b
130f0 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 ut using cached
13100 76 61 6c 75 65 22 29 3b 0a 20 20 20 20 20 20 20 value");.
13110 20 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b return(status);
13120 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 . }.. dpri
13130 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
13140 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
13150 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
13160 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
13170 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 ADS). Tcl_Mut
13180 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 exLock(&init_mx)
13190 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 ;.#endif. ini
131a0 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 tialized = 1;..#
131b0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
131c0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
131d0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
131e0 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b DS). num_lock
131f0 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 s = 1;. locks
13200 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75 Count = (int) nu
13210 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 m_locks;. loc
13220 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 ks = malloc(size
13230 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d of(*locks) * num
13240 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d _locks);. mem
13250 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 set(locks, 0, si
13260 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e zeof(*locks) * n
13270 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 um_locks);.#endi
13280 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 f.. /* Initia
13290 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79 lize BOTH libcry
132a0 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 pto and libssl.
132b0 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 */. OPENSSL_i
132c0 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f nit_ssl(OPENSSL_
132d0 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 INIT_LOAD_SSL_ST
132e0 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f RINGS | OPENSSL_
132f0 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f INIT_LOAD_CRYPTO
13300 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e _STRINGS..| OPEN
13310 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c SSL_INIT_ADD_ALL
13320 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 _CIPHERS | OPENS
13330 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f SL_INIT_ADD_ALL_
13340 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a DIGESTS, NULL);.
13350 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c . BIO_new_tcl
13360 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 (NULL, 0);..#if
13370 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 0. /*. *
13380 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 XXX:TODO: Remove
13390 20 74 68 69 73 20 63 6f 64 65 20 61 6e 64 20 72 this code and r
133a0 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 eplace it with a
133b0 20 63 68 65 63 6b 0a 20 20 20 20 20 2a 20 66 6f check. * fo
133c0 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f 70 79 r enough entropy
133d0 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72 79 20 and do not try
133e0 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 to create our ow
133f0 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 69 62 6c n. * terribl
13400 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 20 20 2a e entropy. *
13410 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 /. /*. *
13420 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 Seed the random
13430 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 number generator
13440 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72 in the SSL libr
13450 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 69 6e ary,. * usin
13460 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 20 63 g the do/while c
13470 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75 73 65 onstruct because
13480 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f 74 65 of the bug note
13490 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20 4f in the. * O
134a0 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20 68 74 penSSL FAQ at ht
134b0 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 73 6c tp://www.openssl
134c0 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 61 71 .org/support/faq
134d0 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 20 20 .html#USER1.
134e0 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 63 72 *. * The cr
134f0 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62 6c 65 ux of the proble
13500 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61 72 69 m is that Solari
13510 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 s 7 does not hav
13520 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 65 76 2f e a. * /dev/
13530 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 random or /dev/u
13540 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 73 6f random device so
13550 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 68 65 it cannot gathe
13560 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 2a 20 r enough. *
13570 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 68 65 entropy from the
13580 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77 68 65 RAND_seed() whe
13590 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 7a 65 n TLS initialize
135a0 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a 20 20 s and refuses.
135b0 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 * to go furth
135c0 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65 72 73 er. Earlier vers
135d0 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 4c 20 ions of OpenSSL
135e0 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67 61 72 carried on regar
135f0 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 dless.. */.
13600 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69 67 6e srand((unsign
13610 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28 74 69 ed int) time((ti
13620 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a me_t *) NULL));.
13630 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 28 69 do {..for (i
13640 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 69 2b = 0; i < 16; i+
13650 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f 73 65 +) {.. rnd_se
13660 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 68 61 ed[i] = 1 + (cha
13670 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61 6e 64 r) (255.0 * rand
13680 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 ()/(RAND_MAX+1.0
13690 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 65 65 ));..}..RAND_see
136a0 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65 d(rnd_seed, size
136b0 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b 0a 20 of(rnd_seed));.
136c0 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41 4e 44 } while (RAND
136d0 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31 29 3b _status() != 1);
136e0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 .#endif..#if def
136f0 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 ined(OPENSSL_THR
13700 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 EADS) && defined
13710 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 (TCL_THREADS)..T
13720 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 cl_MutexUnlock(&
13730 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 init_mx);.#endif
13740 0a 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75 73 ...return(status
13750 29 3b 0a 7d 0a );.}.