0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61 (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69 some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68 ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32 pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72 ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79 poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53 right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29 *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61 2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 ka SSL) Channel
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64 - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63 on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50 uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68 st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65 based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70 rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64 * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61 dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64 .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74 ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 full fileevent
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 Also work done
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68 ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 e impetus to do
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64 cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 pts.h".#include
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 rsa.h>.#include
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61 <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72 10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76 "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69 1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72 dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a (key), (dsp))).
04e0: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29 #define REASON()
04f0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f .ERR_reason_erro
0500: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74 r_string(ERR_get
0510: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69 _error())..stati
0520: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 c SSL_CTX *CTX_I
0530: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 nit(State *state
0540: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 Ptr, int isServe
0550: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 r, int proto, ch
0560: 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 ar *key,...char
0570: 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 *certfile, unsig
0580: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 ned char *key_as
0590: 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 n1, unsigned cha
05a0: 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 r *cert_asn1,...
05b0: 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e int key_asn1_len
05c0: 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f , int cert_asn1_
05d0: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72 len, char *CAdir
05e0: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a , char *CAfile,.
05f0: 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c ..char *ciphers,
0600: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 char *ciphersui
0610: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 tes, int level,
0620: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b char *DHparams);
0630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 ..static int.Tls
0640: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e LibInit(int unin
0650: 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66 itialize);..#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 ine TLS_PROTO_SS
0670: 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 L2..0x01.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 TLS_PROTO_SSL3.
0690: 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c .0x02.#define TL
06a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 S_PROTO_TLS1..0x
06b0: 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 04.#define TLS_P
06c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 ROTO_TLS1_1.0x08
06d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f .#define TLS_PRO
06e0: 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 TO_TLS1_2.0x10.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f define TLS_PROTO
0700: 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 _TLS1_3.0x20.#de
0710: 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 fine ENABLED(fla
0720: 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 g, mask).(((flag
0730: 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 ) & (mask)) == (
0740: 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20 mask))..#define
0750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22 SSLKEYLOGFILE.."
0760: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a SSLKEYLOGFILE"..
0770: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74 /*. * Static dat
0780: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f a structures. */
0790: 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 ..#ifndef OPENSS
07a0: 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 65 L_NO_DH.#include
07b0: 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a 23 "dh_params.h".#
07c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72 endif../*. * Thr
07d0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64 ead-Safe TLS Cod
07e0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 e. */..#ifdef TC
07f0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e L_THREADS.#defin
0800: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 e OPENSSL_THREAD
0810: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64 _DEFINES.#includ
0820: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 e <openssl/opens
0830: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65 slconf.h>..#ifde
0840: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 f OPENSSL_THREAD
0850: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e S.#include <open
0860: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69 ssl/crypto.h>.#i
0870: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0880: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 ssl.h>../*. * Th
0890: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e readed operation
08a0: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e requires lockin
08b0: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42 g callbacks. * B
08c0: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74 ased from /crypt
08d0: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20 o/cryptlib.c of
08e0: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70 OpenSSL and NSOp
08f0: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74 enSSL.. */..stat
0900: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f ic Tcl_Mutex *lo
0910: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 cks = NULL;.stat
0920: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e ic int locksCoun
0930: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63 t = 0;.static Tc
0940: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b l_Mutex init_mx;
0950: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53 .#endif /* OPENS
0960: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65 SL_THREADS */.#e
0970: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45 ndif /* TCL_THRE
0980: 41 44 53 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a ADS */../*******
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f *************/./
09a0: 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 * Callbacks
09b0: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a */./*********
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0c 0a ***********/....
09d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 --------. *. * I
0a20: 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 nfoCallback --.
0a30: 2a 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53 *. *.monitors SS
0a40: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f L connection pro
0a50: 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c cess. *. * Resul
0a60: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
0a70: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
0a80: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
0a90: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
0aa0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ae0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
0af0: 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 void.InfoCallbac
0b00: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
0b10: 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 , int where, int
0b20: 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 ret) {. Stat
0b30: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
0b40: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 tate*)SSL_get_ap
0b50: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 p_data((SSL *)ss
0b60: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 l);. Tcl_Inte
0b70: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
0b80: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
0b90: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
0ba0: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 tr;. char *ma
0bb0: 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 jor; char *minor
0bc0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
0bd0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
0be0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
0bf0: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
0c00: 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e j*)NULL)..return
0c10: 3b 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 ;.. cmdPtr =
0c20: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
0c30: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
0c40: 61 63 6b 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 ack);..#if 0.
0c50: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c if (where & SSL
0c60: 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 73 65 _CB_ALERT) {..se
0c70: 76 20 3d 20 53 53 4c 5f 61 6c 65 72 74 5f 74 79 v = SSL_alert_ty
0c80: 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 pe_string_long(r
0c90: 65 74 29 3b 0a 09 69 66 20 28 73 74 72 63 6d 70 et);..if (strcmp
0ca0: 28 73 65 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d (sev, "fatal")==
0cb0: 30 29 20 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65 0) {./* Map to e
0cc0: 72 72 6f 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73 rror */.. Tls
0cd0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
0ce0: 20 53 53 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20 SSL_ERROR(ssl,
0cf0: 30 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 0));.. return
0d00: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ;..}. }.#endi
0d10: 66 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 f. if (where
0d20: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 & SSL_CB_HANDSHA
0d30: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a KE_START) {..maj
0d40: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 or = "handshake"
0d50: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 ;..minor = "star
0d60: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 t";. } else i
0d70: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0d80: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 B_HANDSHAKE_DONE
0d90: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 ) {..major = "ha
0da0: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 ndshake";..minor
0db0: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d = "done";. }
0dc0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 else {..if (whe
0dd0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 re & SSL_CB_ALER
0de0: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 T)..major = "ale
0df0: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 rt";..else if (w
0e00: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f here & SSL_ST_CO
0e10: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 NNECT).major = "
0e20: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 connect";..else
0e30: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
0e40: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f ST_ACCEPT)..majo
0e50: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 r = "accept";..e
0e60: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 lse.....major =
0e70: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 "unknown";...if
0e80: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
0e90: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 READ)..minor = "
0ea0: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 read";..else if
0eb0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
0ec0: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 WRITE)..minor =
0ed0: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 "write";..else i
0ee0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0ef0: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d B_LOOP)..minor =
0f00: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 "loop";..else i
0f10: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0f20: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d B_EXIT)..minor =
0f30: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 "exit";..else..
0f40: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e ...minor = "unkn
0f50: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 own";. }..
0f60: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
0f70: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
0f80: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
0f90: 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f wStringObj("info
0fa0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
0fb0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
0fc0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
0fd0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
0fe0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
0ff0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
1000: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
1010: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
1020: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1030: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1040: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
1050: 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b Obj(major, -1));
1060: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1070: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1080: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
1090: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
10a0: 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 inor, -1));..
10b0: 20 69 66 20 28 77 68 65 72 65 20 26 20 28 53 53 if (where & (SS
10c0: 4c 5f 43 42 5f 4c 4f 4f 50 7c 53 53 4c 5f 43 42 L_CB_LOOP|SSL_CB
10d0: 5f 45 58 49 54 29 29 20 7b 0a 09 54 63 6c 5f 4c _EXIT)) {..Tcl_L
10e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1100: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
1110: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 StringObj(SSL_st
1120: 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 ate_string_long(
1130: 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ssl), -1));.
1140: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 } else if (where
1150: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 & SSL_CB_ALERT)
1160: 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a {..const char *
1170: 63 70 20 3d 20 28 63 68 61 72 20 2a 29 20 53 53 cp = (char *) SS
1180: 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 L_alert_desc_str
1190: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a 0a ing_long(ret);..
11a0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11c0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
11d0: 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d wStringObj(cp, -
11e0: 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 1));. } else
11f0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
1200: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
1210: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
1220: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1230: 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 j(SSL_state_stri
1240: 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 ng_long(ssl), -1
1250: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 ));. }. Tc
1260: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 l_Preserve((Clie
1270: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
1280: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 . Tcl_Preserv
1290: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
12a0: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 tatePtr);.. T
12b0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
12c0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 28 76 6f cmdPtr);. (vo
12d0: 69 64 29 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 id) Tcl_EvalObjE
12e0: 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 x(interp, cmdPtr
12f0: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 , TCL_EVAL_GLOBA
1300: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 L);. Tcl_Decr
1310: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
1320: 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 ;.. Tcl_Relea
1330: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
1340: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 statePtr);. T
1350: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
1360: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
1370: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
1380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
13c0: 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 . * VerifyCallba
13d0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 ck --. *. *.Moni
13e0: 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 tors SSL certifi
13f0: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 cate validation
1400: 70 72 6f 63 65 73 73 2e 0a 20 2a 09 54 68 69 73 process.. *.This
1410: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 is called whene
1420: 76 65 72 20 61 20 63 65 72 74 69 66 69 63 61 74 ver a certificat
1430: 65 20 69 73 20 69 6e 73 70 65 63 74 65 64 0a 20 e is inspected.
1440: 2a 09 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 *.or decided inv
1450: 61 6c 69 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 alid.. *. * Resu
1460: 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 lts:. *.A callba
1470: 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 ck bound to the
1480: 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72 socket may retur
1490: 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 n one of:. *.
14a0: 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 0...- the certi
14b0: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 ficate is deemed
14c0: 20 69 6e 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 invalid. *.
14d0: 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 1...- the certif
14e0: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 icate is deemed
14f0: 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 65 6d 70 valid. *. emp
1500: 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 ty string.- no c
1510: 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 hange to certifi
1520: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a cate validation.
1530: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
1540: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 ts:. *.The err f
1550: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 ield of the curr
1560: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 ently operative
1570: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 State is set. *.
1580: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 to a string de
1590: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c scribing the SSL
15a0: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 negotiation fai
15b0: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d lure reason. *--
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1600: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
1610: 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 .VerifyCallback(
1620: 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f int ok, X509_STO
1630: 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 RE_CTX *ctx) {.
1640: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
1650: 74 72 2c 20 2a 72 65 73 75 6c 74 3b 0a 20 20 20 tr, *result;.
1660: 20 63 68 61 72 20 2a 65 72 72 53 74 72 2c 20 2a char *errStr, *
1670: 73 74 72 69 6e 67 3b 0a 20 20 20 20 69 6e 74 20 string;. int
1680: 6c 65 6e 67 74 68 3b 0a 20 20 20 20 53 53 4c 20 length;. SSL
1690: 20 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 *ssl..= (SSL*)
16a0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 X509_STORE_CTX_g
16b0: 65 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20 et_ex_data(ctx,
16c0: 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f SSL_get_ex_data_
16d0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 X509_STORE_CTX_i
16e0: 64 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20 dx());. X509
16f0: 20 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53 *cert..= X509_S
1700: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 TORE_CTX_get_cur
1710: 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a rent_cert(ctx);.
1720: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
1730: 50 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53 Ptr.= (State*)SS
1740: 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73 L_get_app_data(s
1750: 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 sl);. Tcl_Int
1760: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
1770: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
1780: 20 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d int depth..=
1790: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f X509_STORE_CTX_
17a0: 67 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 get_error_depth(
17b0: 63 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 ctx);. int er
17c0: 72 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f r..= X509_STORE_
17d0: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 CTX_get_error(ct
17e0: 78 29 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 x);. int code
17f0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
1800: 56 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b 29 Verify: %d", ok)
1810: 3b 0a 0a 20 20 20 20 69 66 20 28 21 6f 6b 29 20 ;.. if (!ok)
1820: 7b 0a 09 65 72 72 53 74 72 20 3d 20 28 63 68 61 {..errStr = (cha
1830: 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 r*)X509_verify_c
1840: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 ert_error_string
1850: 28 65 72 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 (err);. } els
1860: 65 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 28 63 e {..errStr = (c
1870: 68 61 72 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a har *)0;. }..
1880: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
1890: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 ->callback == (T
18a0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
18b0: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 .if (statePtr->v
18c0: 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 flags & SSL_VERI
18d0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
18e0: 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 ER_CERT) {..
18f0: 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c return ok;..} el
1900: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e se {.. return
1910: 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 1;..}. }.
1920: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
1930: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
1940: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
1950: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1960: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1970: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
1980: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
1990: 76 65 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20 verify", -1));.
19a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
19b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
19c0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c rp, cmdPtr,..Tcl
19d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
19e0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
19f0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
1a00: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
1a10: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1a20: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1a30: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
1a40: 62 6a 28 64 65 70 74 68 29 29 3b 0a 20 20 20 20 bj(depth));.
1a50: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1a60: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1a70: 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f 4e 65 77 cmdPtr, Tls_New
1a80: 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 X509Obj(interp,
1a90: 63 65 72 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f cert));. Tcl_
1aa0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1ab0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1ac0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
1ad0: 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20 54 63 6c bj(ok));. Tcl
1ae0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1af0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
1b00: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
1b10: 69 6e 67 4f 62 6a 28 65 72 72 53 74 72 20 3f 20 ingObj(errStr ?
1b20: 65 72 72 53 74 72 20 3a 20 22 22 2c 20 2d 31 29 errStr : "", -1)
1b30: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 );.. Tcl_Pres
1b40: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 erve((ClientData
1b50: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 ) interp);. T
1b60: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
1b70: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
1b80: 72 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 r);.. statePt
1b90: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f r->flags |= TLS_
1ba0: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20 TCL_CALLBACK;..
1bb0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
1bc0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
1bd0: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c code = Tcl_Eval
1be0: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d ObjEx(interp, cm
1bf0: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 dPtr, TCL_EVAL_G
1c00: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 LOBAL);. if (
1c10: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 code != TCL_OK)
1c20: 7b 0a 09 2f 2a 20 49 74 20 67 6f 74 20 61 6e 20 {../* It got an
1c30: 65 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 error - reject t
1c40: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 2e 09 he certificate..
1c50: 09 2a 2f 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a .*/.#if (TCL_MAJ
1c60: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
1c70: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
1c80: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
1c90: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
1ca0: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
1cb0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
1cc0: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
1cd0: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 09 code);.#endif..
1ce0: 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c ok = 0;. } el
1cf0: 73 65 20 7b 0a 09 72 65 73 75 6c 74 20 3d 20 54 se {..result = T
1d00: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_GetObjResult(
1d10: 69 6e 74 65 72 70 29 3b 0a 09 73 74 72 69 6e 67 interp);..string
1d20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
1d30: 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 2c 20 FromObj(result,
1d40: 26 6c 65 6e 67 74 68 29 3b 0a 09 2f 2a 20 41 6e &length);../* An
1d50: 20 65 6d 70 74 79 20 72 65 73 75 6c 74 20 6c 65 empty result le
1d60: 61 76 65 73 20 76 65 72 69 66 69 63 61 74 69 6f aves verificatio
1d70: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f 0a n unchanged..*/.
1d80: 09 69 66 20 28 73 74 72 69 6e 67 20 21 3d 20 4e .if (string != N
1d90: 55 4c 4c 20 26 26 20 6c 65 6e 67 74 68 20 3e 20 ULL && length >
1da0: 30 29 20 7b 0a 09 20 20 20 20 63 6f 64 65 20 3d 0) {.. code =
1db0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f Tcl_GetIntFromO
1dc0: 62 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c bj(interp, resul
1dd0: 74 2c 20 26 6f 6b 29 3b 0a 09 20 20 20 20 69 66 t, &ok);.. if
1de0: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b (code != TCL_OK
1df0: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a ) {.#if (TCL_MAJ
1e00: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
1e10: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
1e20: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 09 54 63 ERSION < 6)...Tc
1e30: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f l_BackgroundErro
1e40: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 r(interp);.#else
1e50: 0a 09 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e ...Tcl_Backgroun
1e60: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 dException(inter
1e70: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 p, code);.#endif
1e80: 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 20 20 20 20 ...ok = 0;..
1e90: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 }..}. }. T
1ea0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
1eb0: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 73 74 cmdPtr);.. st
1ec0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d atePtr->flags &=
1ed0: 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 ~(TLS_TCL_CALLB
1ee0: 41 43 4b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 ACK);.. Tcl_R
1ef0: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
1f00: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 ta) statePtr);.
1f10: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
1f20: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
1f30: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 rp);. return(
1f40: 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 ok);./* By defau
1f50: 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 lt, leave verifi
1f60: 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 cation unchanged
1f70: 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ..*/.}.../*. *--
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fc0: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f -. *. * Tls_Erro
1fd0: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 r --. *. *.Calls
1fe0: 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 24 callback with $
1ff0: 66 64 20 61 6e 64 20 24 6d 73 67 20 2d 20 73 6f fd and $msg - so
2000: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 63 61 the callback ca
2010: 6e 20 64 65 63 69 64 65 0a 20 2a 09 77 68 61 74 n decide. *.what
2020: 20 74 6f 20 64 6f 20 77 69 74 68 20 65 72 72 6f to do with erro
2030: 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 rs.. *. * Side e
2040: 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 ffects:. *.The e
2050: 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 rr field of the
2060: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 currently operat
2070: 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 ive State is set
2080: 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e . *. to a strin
2090: 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 g describing the
20a0: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e SSL negotiation
20b0: 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a failure reason.
20c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2100: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 -----. */.void.T
2110: 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 2a ls_Error(State *
2120: 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 2a statePtr, char *
2130: 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 msg) {. Tcl_I
2140: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
2150: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
2160: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
2170: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 mdPtr;. int c
2180: 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ode;.. dprint
2190: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
21a0: 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a 6d 73 if (msg && *ms
21b0: 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 g) {..Tcl_SetErr
21c0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
21d0: 53 53 4c 22 2c 20 6d 73 67 2c 20 28 63 68 61 72 SSL", msg, (char
21e0: 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 *)NULL);. }
21f0: 65 6c 73 65 20 7b 0a 09 6d 73 67 20 3d 20 54 63 else {..msg = Tc
2200: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
2210: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 bj(Tcl_GetObjRes
2220: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55 4c ult(interp), NUL
2230: 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 L);. }. st
2240: 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 atePtr->err = ms
2250: 67 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 g;.. if (stat
2260: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
2270: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
2280: 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 ) {..char buf[BU
2290: 46 53 49 5a 5d 3b 0a 09 73 70 72 69 6e 74 66 28 FSIZ];..sprintf(
22a0: 62 75 66 2c 20 22 53 53 4c 20 63 68 61 6e 6e 65 buf, "SSL channe
22b0: 6c 20 5c 22 25 73 5c 22 3a 20 65 72 72 6f 72 3a l \"%s\": error:
22c0: 20 25 73 22 2c 0a 09 20 20 20 20 54 63 6c 5f 47 %s",.. Tcl_G
22d0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
22e0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 6d atePtr->self), m
22f0: 73 67 29 3b 0a 09 54 63 6c 5f 53 65 74 52 65 73 sg);..Tcl_SetRes
2300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 62 75 66 2c ult(interp, buf,
2310: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a TCL_VOLATILE);.
2320: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 #if (TCL_MAJOR_V
2330: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 ERSION == 8) &&
2340: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 (TCL_MINOR_VERSI
2350: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 ON < 6)..Tcl_Bac
2360: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 kgroundError(int
2370: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c erp);.#else..Tcl
2380: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 _BackgroundExcep
2390: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 54 43 4c tion(interp, TCL
23a0: 5f 45 52 52 4f 52 29 3b 0a 23 65 6e 64 69 66 0a _ERROR);.#endif.
23b0: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 .return;. }.
23c0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
23d0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
23e0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
23f0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f ;.. Tcl_ListO
2400: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2410: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2420: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2430: 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a ("error", -1));.
2440: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2450: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2460: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
2470: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
2480: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
2490: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
24a0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
24b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
24c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
24d0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
24e0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 wStringObj(msg,
24f0: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 -1));.. Tcl_P
2500: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
2510: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
2520: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
2530: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
2540: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ePtr);.. Tcl_
2550: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
2560: 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d Ptr);. code =
2570: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 Tcl_EvalObjEx(i
2580: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
2590: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b CL_EVAL_GLOBAL);
25a0: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d . if (code !=
25b0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 TCL_OK) {.#if (
25c0: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
25d0: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f N == 8) && (TCL_
25e0: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 MINOR_VERSION <
25f0: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6)..Tcl_Backgrou
2600: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b ndError(interp);
2610: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b .#else..Tcl_Back
2620: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 groundException(
2630: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 interp, code);.#
2640: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 endif. }.
2650: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
2660: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 (cmdPtr);. Tc
2670: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
2680: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
2690: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 ;. Tcl_Releas
26a0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
26b0: 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 nterp);.}.../*.
26c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2700: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f ----. *. * KeyLo
2710: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a gCallback --. *.
2720: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65 *.Write receive
2730: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f d key data to lo
2740: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 g file.. *. * Si
2750: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e de effects:. *.n
2760: 6f 6e 65 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d one. *----------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
27b0: 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 id KeyLogCallbac
27c0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
27d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 , const char *li
27e0: 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a ne) {. char *
27f0: 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c str = getenv(SSL
2800: 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 KEYLOGFILE);.
2810: 20 46 49 4c 45 20 2a 66 64 3b 0a 20 20 20 20 69 FILE *fd;. i
2820: 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 f (str) {..fd =
2830: 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b fopen(str, "a");
2840: 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25 ..fprintf(fd, "%
2850: 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c s\n",line);..fcl
2860: 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d ose(fd);. }.}
2870: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
28c0: 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 * Password Callb
28d0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c ack --. *. *.Cal
28e0: 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 77 led when a passw
28f0: 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 74 6f ord is needed to
2900: 20 75 6e 70 61 63 6b 20 52 53 41 20 61 6e 64 20 unpack RSA and
2910: 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 45 76 61 PEM keys.. *.Eva
2920: 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 70 61 73 ls any bound pas
2930: 73 77 6f 72 64 20 73 63 72 69 70 74 20 61 6e 64 sword script and
2940: 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65 73 returns the res
2950: 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 20 70 61 ult as. *.the pa
2960: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 2e 0a 20 ssword string..
2970: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29b0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
29c0: 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c int.PasswordCall
29d0: 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 back(char *buf,
29e0: 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76 65 int size, int ve
29f0: 72 69 66 79 2c 20 76 6f 69 64 20 2a 75 64 61 74 rify, void *udat
2a00: 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a a) {. State *
2a10: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 statePtr.= (Stat
2a20: 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 e *) udata;.
2a30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
2a40: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
2a50: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
2a60: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
2a70: 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 int code;.. d
2a80: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
2a90: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
2aa0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d Ptr->password ==
2ab0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 NULL) {..if (Tc
2ac0: 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c l_EvalEx(interp,
2ad0: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 "tls::password"
2ae0: 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 , -1, TCL_EVAL_G
2af0: 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b LOBAL) == TCL_OK
2b00: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 ) {.. char *r
2b10: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 et = (char *) Tc
2b20: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c l_GetStringResul
2b30: 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 t(interp);..
2b40: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 strncpy(buf, ret
2b50: 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 , (size_t) size)
2b60: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 ;.. return (i
2b70: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a nt)strlen(ret);.
2b80: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 .} else {.. r
2b90: 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 eturn -1;..}.
2ba0: 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d }.. cmdPtr =
2bb0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
2bc0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 j(statePtr->pass
2bd0: 77 6f 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f word);.. Tcl_
2be0: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
2bf0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
2c00: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
2c10: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
2c20: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c tePtr);.. Tcl
2c30: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
2c40: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 dPtr);. code
2c50: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 = Tcl_EvalObjEx(
2c60: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2c70: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
2c80: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 ;. if (code !
2c90: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 = TCL_OK) {.#if
2ca0: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 (TCL_MAJOR_VERSI
2cb0: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c ON == 8) && (TCL
2cc0: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c _MINOR_VERSION <
2cd0: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 6)..Tcl_Backgro
2ce0: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 undError(interp)
2cf0: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 ;.#else..Tcl_Bac
2d00: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e kgroundException
2d10: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a (interp, code);.
2d20: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 #endif. }.
2d30: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
2d40: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 t(cmdPtr);..
2d50: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
2d60: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
2d70: 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 63 6f 64 r);.. if (cod
2d80: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 e == TCL_OK) {..
2d90: 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 char *ret = (cha
2da0: 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 r *) Tcl_GetStri
2db0: 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 ngResult(interp)
2dc0: 3b 0a 09 69 66 20 28 73 74 72 6c 65 6e 28 72 65 ;..if (strlen(re
2dd0: 74 29 20 3c 20 73 69 7a 65 20 2d 20 31 29 20 7b t) < size - 1) {
2de0: 0a 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 .. strncpy(bu
2df0: 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 f, ret, (size_t)
2e00: 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 54 63 6c size);.. Tcl
2e10: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
2e20: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 Data) interp);..
2e30: 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 return (int)
2e40: 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 0a strlen(ret);..}.
2e50: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 }. Tcl_Re
2e60: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 lease((ClientDat
2e70: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 a) interp);.
2e80: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 76 65 72 69 return -1;..veri
2e90: 66 79 20 3d 20 76 65 72 69 66 79 3b 0a 7d 0a 0c fy = verify;.}..
2ea0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
2ef0: 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b Session Callback
2f00: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a for Clients --.
2f10: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 *. *.Called whe
2f20: 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 n a new session
2f30: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 is added to the
2f40: 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e cache. In TLS 1.
2f50: 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 3. *.this may be
2f60: 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 received multip
2f70: 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 le times after t
2f80: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f he handshake. Fo
2f90: 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 r. *.earlier ver
2fa0: 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c sions, this will
2fb0: 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72 be received dur
2fc0: 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b ing the handshak
2fd0: 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68 e.. *.This is th
2fe0: 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20 e preferred way
2ff0: 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75 to obtain a resu
3000: 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 mable session..
3010: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
3020: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
3030: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
3040: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
3050: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 defined). *. * R
3060: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 eturn codes:. *.
3070: 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20 0 = error where
3080: 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 session will be
3090: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f immediately remo
30a0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 ved from the int
30b0: 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 ernal cache.. *.
30c0: 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72 1 = success wher
30d0: 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65 e app retains se
30e0: 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e ssion in session
30f0: 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 cache, and must
3100: 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f call SSL_SESSIO
3110: 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f N_free() when do
3120: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
3170: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73 .static int.Sess
3180: 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 ionCallback(cons
3190: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f t SSL *ssl, SSL_
31a0: 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e SESSION *session
31b0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
31c0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
31d0: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 *)SSL_get_app_da
31e0: 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a ta((SSL *)ssl);.
31f0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
3200: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
3210: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
3220: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
3230: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
3240: 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b ed char *ticket;
3250: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
3260: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f ned char *sessio
3270: 6e 5f 69 64 3b 0a 20 20 20 20 69 6e 74 20 63 6f n_id;. int co
3280: 64 65 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c de;. size_t l
3290: 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 en2;. unsigne
32a0: 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 d int ulen;..
32b0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
32c0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ");.. if (sta
32d0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
32e0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
32f0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
3300: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a _TLSEXT_ERR_OK;.
3310: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
3320: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 sl == NULL) {..r
3330: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
3340: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
3350: 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 }.. cmdPtr =
3360: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
3370: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
3380: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 ack);. Tcl_Li
3390: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
33a0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
33b0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
33c0: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d Obj("session", -
33d0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 1));.. /* Ses
33e0: 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 sion id */. s
33f0: 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f ession_id = SSL_
3400: 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 SESSION_get_id(s
3410: 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a ession, &ulen);.
3420: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
3430: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3440: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
3450: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a _NewByteArrayObj
3460: 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e (session_id, (in
3470: 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 t) ulen));..
3480: 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 /* Session ticke
3490: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 t */. SSL_SES
34a0: 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 SION_get0_ticket
34b0: 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 (session, &ticke
34c0: 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 t, &len2);. T
34d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
34e0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
34f0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
3500: 74 72 69 6e 67 4f 62 6a 28 74 69 63 6b 65 74 2c tringObj(ticket,
3510: 20 28 69 6e 74 29 6c 65 6e 32 29 29 3b 0a 0a 20 (int)len2));..
3520: 20 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d /* Lifetime -
3530: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e number of secon
3540: 64 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 ds */. Tcl_Li
3550: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
3560: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
3570: 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f r,..Tcl_NewLongO
3580: 62 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 bj((long) SSL_SE
3590: 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 SSION_get_ticket
35a0: 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 _lifetime_hint(s
35b0: 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 ession)));..
35c0: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c Tcl_Preserve((Cl
35d0: 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 ientData) interp
35e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 );. Tcl_Prese
35f0: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 rve((ClientData)
3600: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 statePtr);..
3610: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
3620: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 t(cmdPtr);. c
3630: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 ode = Tcl_EvalOb
3640: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 jEx(interp, cmdP
3650: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f tr, TCL_EVAL_GLO
3660: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f BAL);. if (co
3670: 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a de != TCL_OK) {.
3680: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 #if (TCL_MAJOR_V
3690: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 ERSION == 8) &&
36a0: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 (TCL_MINOR_VERSI
36b0: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 ON < 6)..Tcl_Bac
36c0: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 kgroundError(int
36d0: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c erp);.#else..Tcl
36e0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 _BackgroundExcep
36f0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 tion(interp, cod
3700: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d e);.#endif. }
3710: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
3720: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a Count(cmdPtr);..
3730: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
3740: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
3750: 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f tePtr);. Tcl_
3760: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
3770: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 20 20 20 ata) interp);
3780: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f return 0;.}.../
3790: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c -------. *. * AL
37e0: 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 PN Callback for
37f0: 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a Servers --. *. *
3800: 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d .Perform server-
3810: 73 69 64 65 20 70 72 6f 74 6f 63 6f 6c 20 28 68 side protocol (h
3820: 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c ttp/1.1, h2, h3,
3830: 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e etc.) selection
3840: 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f for the. *.inco
3850: 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e ming connection.
3860: 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 Called after He
3870: 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 llo and server c
3880: 61 6c 6c 62 61 63 6b 73 0a 20 2a 0a 20 2a 20 52 allbacks. *. * R
3890: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
38a0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
38b0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
38c0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
38d0: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 d). *. * Return
38e0: 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c codes:. *.SSL_TL
38f0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 SEXT_ERR_OK: ALP
3900: 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 N protocol selec
3910: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
3920: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
3930: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
3940: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 _ALERT_FATAL: Th
3950: 65 72 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c ere was no overl
3960: 61 70 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 ap between the c
3970: 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 lient's. *. s
3980: 75 70 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 upplied list and
3990: 20 74 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 the server conf
39a0: 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 iguration. The c
39b0: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 onnection will b
39c0: 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 e aborted.. *.SS
39d0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
39e0: 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f CK: ALPN protoco
39f0: 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 l not selected,
3a00: 65 2e 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f e.g., because no
3a10: 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f ALPN. *. pro
3a20: 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 tocols are confi
3a30: 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 gured for this c
3a40: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 onnection. The c
3a50: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
3a60: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ues.. *. *------
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
3ab0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 /.static int.ALP
3ac0: 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 NCallback(const
3ad0: 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 SSL *ssl, const
3ae0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a unsigned char **
3af0: 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 out, unsigned ch
3b00: 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e ar *outlen,..con
3b10: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
3b20: 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 *in, unsigned i
3b30: 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a nt inlen, void *
3b40: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 arg) {. State
3b50: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
3b60: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 ate*)arg;. Tc
3b70: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
3b80: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
3b90: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
3ba0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e *cmdPtr;. in
3bb0: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 t code, res;..
3bc0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
3bd0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
3be0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
3bf0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
3c00: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
3c10: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
3c20: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
3c30: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ssl == NULL) {..
3c40: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
3c50: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
3c60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 }.. /* Selec
3c70: 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 t protocol */.
3c80: 20 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 if (SSL_select
3c90: 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74 2c _next_proto(out,
3ca0: 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 outlen, statePt
3cb0: 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 r->protos, state
3cc0: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c Ptr->protos_len,
3cd0: 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 ..in, inlen) ==
3ce0: 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f OPENSSL_NPN_NEGO
3cf0: 54 49 41 54 45 44 29 20 7b 0a 09 72 65 73 20 3d TIATED) {..res =
3d00: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
3d10: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b OK;. } else {
3d20: 0a 09 2f 2a 20 4e 6f 20 6f 76 65 72 6c 61 70 2c ../* No overlap,
3d30: 20 73 6f 20 66 69 72 73 74 20 63 6c 69 65 6e 74 so first client
3d40: 20 70 72 6f 74 6f 63 6f 6c 20 75 73 65 64 20 2a protocol used *
3d50: 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 /..res = SSL_TLS
3d60: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
3d70: 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 }.. cmdPtr
3d80: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
3d90: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 Obj(statePtr->ca
3da0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c llback);. Tcl
3db0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3dc0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3dd0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
3de0: 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d ingObj("alpn", -
3df0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
3e00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3e10: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3e20: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
3e30: 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a 0a bj(*out, -1));..
3e40: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
3e50: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
3e60: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 terp);. Tcl_P
3e70: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
3e80: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
3e90: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
3ea0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
3eb0: 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 code = Tcl_Ev
3ec0: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 alObjEx(interp,
3ed0: 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c cmdPtr, TCL_EVAL
3ee0: 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 _GLOBAL);. if
3ef0: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b (code != TCL_OK
3f00: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a ) {.#if (TCL_MAJ
3f10: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
3f20: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
3f30: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
3f40: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
3f50: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
3f60: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
3f70: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
3f80: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 code);.#endif.
3f90: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
3fa0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
3fb0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 );.. Tcl_Rele
3fc0: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
3fd0: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 statePtr);.
3fe0: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
3ff0: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
4000: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 ;. return res
4010: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
4020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
4060: 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 *. * SNI Callbac
4070: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d k for Servers --
4080: 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 . *. *.Perform s
4090: 65 72 76 65 72 2d 73 69 64 65 20 53 4e 49 20 68 erver-side SNI h
40a0: 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f ostname selectio
40b0: 6e 20 61 66 74 65 72 20 72 65 63 65 69 76 69 6e n after receivin
40c0: 67 20 53 4e 49 20 68 65 61 64 65 72 2e 0a 20 2a g SNI header.. *
40d0: 09 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 .Called after he
40e0: 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 llo callback but
40f0: 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c before ALPN cal
4100: 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 lback.. *. * Res
4110: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
4120: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
4130: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
4140: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
4150: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
4160: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 des:. *.SSL_TLSE
4170: 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 XT_ERR_OK: SNI h
4180: 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 ostname is accep
4190: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
41a0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
41b0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
41c0: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e _ALERT_FATAL: SN
41d0: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f I hostname is no
41e0: 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 t accepted. The
41f0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 connection. *.
4200: 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 is aborted. De
4210: 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 fault for alert
4220: 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f is SSL_AD_UNRECO
4230: 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 GNIZED_NAME.. *.
4240: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
4250: 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e LERT_WARNING: SN
4260: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f I hostname is no
4270: 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e t accepted, warn
4280: 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 ing alert. *.
4290: 20 73 65 6e 74 20 28 6e 6f 74 20 69 6e 20 54 4c sent (not in TL
42a0: 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e Sv1.3). The conn
42b0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
42c0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
42d0: 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 ERR_NOACK: SNI h
42e0: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 ostname is not a
42f0: 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 ccepted and not
4300: 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a acknowledged,. *
4310: 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 . e.g. if SNI
4320: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f has not been co
4330: 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f nfigured. The co
4340: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
4350: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d es.. *. *-------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
43a0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 .static int.SNIC
43b0: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
43c0: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
43d0: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
43e0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
43f0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
4400: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
4410: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
4420: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
4430: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
4440: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
4450: 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 ;. char *serv
4460: 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a ername = NULL;..
4470: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
4480: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
4490: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
44a0: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 ck == (Tcl_Obj*)
44b0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
44c0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
44d0: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 K;. } else if
44e0: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b (ssl == NULL) {
44f0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
4500: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
4510: 20 20 20 7d 0a 0a 20 20 20 20 73 65 72 76 65 72 }.. server
4520: 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 name = SSL_get_s
4530: 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 ervername(ssl, T
4540: 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 LSEXT_NAMETYPE_h
4550: 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 ost_name);. i
4560: 66 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c f (!servername |
4570: 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 | servername[0]
4580: 3d 3d 20 27 5c 30 27 29 20 7b 0a 20 20 20 20 20 == '\0') {.
4590: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c return SSL_TL
45a0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
45b0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 }.. cmdPt
45c0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
45d0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 eObj(statePtr->c
45e0: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 allback);. Tc
45f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
4600: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
4610: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
4620: 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d ringObj("sni", -
4630: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
4640: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4650: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
4660: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
4670: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 bj(servername ,
4680: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 -1));.. Tcl_P
4690: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
46a0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
46b0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
46c0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
46d0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ePtr);.. Tcl_
46e0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
46f0: 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d Ptr);. code =
4700: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 Tcl_EvalObjEx(i
4710: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
4720: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b CL_EVAL_GLOBAL);
4730: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d . if (code !=
4740: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 TCL_OK) {.#if (
4750: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
4760: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f N == 8) && (TCL_
4770: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 MINOR_VERSION <
4780: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6)..Tcl_Backgrou
4790: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b ndError(interp);
47a0: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b .#else..Tcl_Back
47b0: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 groundException(
47c0: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 interp, code);.#
47d0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 endif. }.
47e0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
47f0: 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 (cmdPtr);.. T
4800: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
4810: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
4820: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 );. Tcl_Relea
4830: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
4840: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 interp);. ret
4850: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
4860: 52 52 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a RR_OK;.}.../*. *
4870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48b0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 65 6c 6c 6f 20 ---. *. * Hello
48c0: 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62 61 Handshake Callba
48d0: 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d ck for Servers -
48e0: 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79 20 -. *. *.Used by
48f0: 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69 6e server to examin
4900: 65 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d e the server nam
4910: 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e e indication (SN
4920: 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 I) extension. *.
4930: 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 provided by the
4940: 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 client in order
4950: 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70 70 to select an app
4960: 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 66 69 ropriate certifi
4970: 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73 65 cate to. *.prese
4980: 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68 nt, and make oth
4990: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e er configuration
49a0: 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c adjustments rel
49b0: 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73 65 evant to that se
49c0: 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 rver. *.name and
49d0: 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74 69 its configurati
49e0: 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 65 on. This include
49f0: 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20 74 s swapping out t
4a00: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 2a he associated. *
4a10: 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72 .SSL_CTX pointer
4a20: 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 , modifying the
4a30: 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f 66 server's list of
4a40: 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20 76 permitted TLS v
4a50: 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e ersions,. *.chan
4a60: 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 ging the server'
4a70: 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 69 6e s cipher list in
4a80: 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 response to the
4a90: 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65 72 client's cipher
4aa0: 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 0a 20 list, etc.. *.
4ab0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
4ac0: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
4ad0: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 fects:. *.Calls
4ae0: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 callback (if def
4af0: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 ined). *. * Retu
4b00: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c rn codes:. *.SSL
4b10: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 _CLIENT_HELLO_RE
4b20: 54 52 59 20 3d 20 73 75 73 70 65 6e 64 20 74 68 TRY = suspend th
4b30: 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 e handshake, and
4b40: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 the handshake f
4b50: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 unction will ret
4b60: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a urn immediately.
4b70: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 *.SSL_CLIENT_HE
4b80: 4c 4c 4f 5f 45 52 52 4f 52 20 3d 20 66 61 69 6c LLO_ERROR = fail
4b90: 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 ure, terminate c
4ba0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 onnection. Set a
4bb0: 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f lert to error co
4bc0: 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e de.. *.SSL_CLIEN
4bd0: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 20 T_HELLO_SUCCESS
4be0: 3d 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d = success. *. *-
4bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c30: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
4c40: 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 t.HelloCallback(
4c50: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 const SSL *ssl,
4c60: 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 int *alert, void
4c70: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 *arg) {. Sta
4c80: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
4c90: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 State*)arg;.
4ca0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
4cb0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
4cc0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
4cd0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
4ce0: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f int code;. co
4cf0: 6e 73 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 nst char *server
4d00: 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 name;. const
4d10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 unsigned char *p
4d20: 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e ;. size_t len
4d30: 2c 20 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 , remaining;..
4d40: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
4d50: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
4d60: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
4d70: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
4d80: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
4d90: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
4da0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
4db0: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ssl == NULL) {..
4dc0: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
4dd0: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
4de0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e }.. /* Get n
4df0: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 ames */. if (
4e00: 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c !SSL_client_hell
4e10: 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 o_get0_ext(ssl,
4e20: 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 TLSEXT_TYPE_serv
4e30: 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 er_name, &p, &re
4e40: 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 maining) || rema
4e50: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 20 20 ining <= 2) {.
4e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c return SSL
4e70: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
4e80: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
4e90: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 6c /* Extract the l
4ea0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 ength of the sup
4eb0: 70 6c 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 plied list of na
4ec0: 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 mes. */. len
4ed0: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b = (*(p++) << 8);
4ee0: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b . len += *(p+
4ef0: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 +);. if (len
4f00: 2b 20 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 + 2 != remaining
4f10: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 ) {. retu
4f20: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
4f30: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d LLO_ERROR;. }
4f40: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d . remaining =
4f50: 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 len;.. /* Th
4f60: 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 e list in practi
4f70: 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 ce only has a si
4f80: 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f ngle element, so
4f90: 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 we only conside
4fa0: 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e r the first one.
4fb0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 */. if (rema
4fc0: 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 ining == 0 || *p
4fd0: 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d ++ != TLSEXT_NAM
4fe0: 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 ETYPE_host_name)
4ff0: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 {. retur
5000: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
5010: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
5020: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b remaining--;
5030: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 77 65 20 .. /* Now we
5040: 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70 75 6c 6c can finally pull
5050: 20 6f 75 74 20 74 68 65 20 62 79 74 65 20 61 72 out the byte ar
5060: 72 61 79 20 77 69 74 68 20 74 68 65 20 61 63 74 ray with the act
5070: 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f ual hostname. */
5080: 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69 . if (remaini
5090: 6e 67 20 3c 3d 20 32 29 20 7b 0a 20 20 20 20 20 ng <= 2) {.
50a0: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c return SSL_CL
50b0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
50c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 ;. }. len
50d0: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b = (*(p++) << 8);
50e0: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b . len += *(p+
50f0: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 +);. if (len
5100: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 + 2 > remaining)
5110: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 {. retur
5120: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
5130: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
5140: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 remaining =
5150: 6c 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e len;. servern
5160: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 ame = (const cha
5170: 72 20 2a 29 70 3b 0a 0a 20 20 20 20 63 6d 64 50 r *)p;.. cmdP
5180: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
5190: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
51a0: 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 callback);. T
51b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
51c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
51d0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
51e0: 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22 tringObj("hello"
51f0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
5200: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5210: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
5220: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
5230: 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 ngObj(servername
5240: 2c 20 28 69 6e 74 29 6c 65 6e 29 29 3b 0a 0a 20 , (int)len));..
5250: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
5260: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 (ClientData) int
5270: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 erp);. Tcl_Pr
5280: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
5290: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a ta) statePtr);..
52a0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
52b0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
52c0: 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 code = Tcl_Eva
52d0: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 lObjEx(interp, c
52e0: 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f mdPtr, TCL_EVAL_
52f0: 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 GLOBAL);. if
5300: 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 (code != TCL_OK)
5310: 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f {.#if (TCL_MAJO
5320: 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 R_VERSION == 8)
5330: 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 && (TCL_MINOR_VE
5340: 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f RSION < 6)..Tcl_
5350: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 BackgroundError(
5360: 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 interp);.#else..
5370: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 Tcl_BackgroundEx
5380: 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 ception(interp,
5390: 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 code);.#endif.
53a0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 }. Tcl_Decr
53b0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
53c0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 ;.. Tcl_Relea
53d0: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
53e0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 statePtr);. T
53f0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
5400: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
5410: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f . return SSL_
5420: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 CLIENT_HELLO_SUC
5430: 43 45 53 53 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a CESS;.}.../*****
5440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
5450: 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 ./* Commands
5460: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a */./*******
5470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
5480: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
54d0: 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 iphersObjCmd --
54e0: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 list available c
54f0: 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 iphers. *. *.Thi
5500: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
5510: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
5520: 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 s the "tls::ciph
5530: 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 ers" command. *.
5540: 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c to list availabl
5550: 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 e ciphers, based
5560: 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 upon protocol s
5570: 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 elected.. *. * R
5580: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
5590: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
55a0: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 list.. *. * Sid
55b0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f e effects:. *.co
55c0: 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 nstructs and des
55d0: 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 troys SSL contex
55e0: 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d t (CTX). *. *---
55f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5630: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 . */.static cons
5640: 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c t char *protocol
5650: 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c s[] = {.."ssl2",
5660: 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c "ssl3", "tls1",
5670: 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 "tls1.1", "tls1
5680: 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e .2", "tls1.3", N
5690: 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 ULL.};.enum prot
56a0: 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 ocol {. TLS_S
56b0: 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 SL2, TLS_SSL3, T
56c0: 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 LS_TLS1, TLS_TLS
56d0: 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 1_1, TLS_TLS1_2,
56e0: 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 TLS_TLS1_3, TLS
56f0: 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 _NONE.};..static
5700: 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 int.CiphersObjC
5710: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
5720: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
5730: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
5740: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
5750: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
5760: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
5770: 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 jPtr = NULL;.
5780: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 SSL_CTX *ctx =
5790: 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 NULL;. SSL *s
57a0: 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 sl = NULL;. S
57b0: 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 TACK_OF(SSL_CIPH
57c0: 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 ER) *sk;. cha
57d0: 72 20 2a 63 70 2c 20 62 75 66 5b 42 55 46 53 49 r *cp, buf[BUFSI
57e0: 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 Z];. int inde
57f0: 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 x, verbose = 0,
5800: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 use_supported =
5810: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 0;.. dprintf(
5820: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
5830: 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c if ((objc < 2) |
5840: 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a | (objc > 4)) {.
5850: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
5860: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
5870: 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 v, "protocol ?ve
5880: 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 rbose? ?supporte
5890: 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 d?");..return TC
58a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
58b0: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e if (Tcl_GetIn
58c0: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
58d0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 p, objv[1], prot
58e0: 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c ocols, "protocol
58f0: 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d ", 0, &index) !=
5900: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
5910: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
5920: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a }. if ((obj
5930: 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 c > 2) && Tcl_Ge
5940: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 tBooleanFromObj(
5950: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c interp, objv[2],
5960: 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 &verbose) != TC
5970: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
5980: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
5990: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e . if ((objc >
59a0: 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 3) && Tcl_GetBo
59b0: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 oleanFromObj(int
59c0: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 erp, objv[3], &u
59d0: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d se_supported) !=
59e0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
59f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
5a00: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
5a10: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
5a20: 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 switch ((enum p
5a30: 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b rotocol)index) {
5a40: 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a ..case TLS_SSL2:
5a50: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
5a60: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 SION_NUMBER >= 0
5a70: 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 x10100000L || de
5a80: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c fined(NO_SSL2) |
5a90: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
5aa0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 L_NO_SSL2)..
5ab0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
5ac0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
5ad0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
5ae0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
5af0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 rted", NULL);..
5b00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
5b10: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
5b20: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
5b30: 77 28 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 w(SSLv2_method()
5b40: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ); break;.#endif
5b50: 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a ..case TLS_SSL3:
5b60: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
5b70: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL3) || defined
5b80: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
5b90: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
5ba0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 NSSL_NO_SSL3_MET
5bb0: 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 HOD).. Tcl_Ap
5bc0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
5bd0: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 p, protocols[ind
5be0: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c ex], ": protocol
5bf0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
5c00: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
5c10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
5c20: 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 else.. ctx =
5c30: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 SSL_CTX_new(SSLv
5c40: 33 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 3_method()); bre
5c50: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 ak;.#endif..case
5c60: 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 TLS_TLS1:.#if d
5c70: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
5c80: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
5c90: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 SL_NO_TLS1) || d
5ca0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
5cb0: 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09 O_TLS1_METHOD)..
5cc0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
5cd0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
5ce0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
5cf0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
5d00: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
5d10: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
5d20: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
5d30: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 ctx = SSL_CT
5d40: 58 5f 6e 65 77 28 54 4c 53 76 31 5f 6d 65 74 68 X_new(TLSv1_meth
5d50: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 od()); break;.#e
5d60: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
5d70: 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e LS1_1:.#if defin
5d80: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c ed(NO_TLS1_1) ||
5d90: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
5da0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 _NO_TLS1_1) || d
5db0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
5dc0: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 O_TLS1_1_METHOD)
5dd0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
5de0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
5df0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
5e00: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
5e10: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
5e20: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
5e30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
5e40: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f .. ctx = SSL_
5e50: 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 31 5f CTX_new(TLSv1_1_
5e60: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b method()); break
5e70: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 ;.#endif..case T
5e80: 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 LS_TLS1_2:.#if d
5e90: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
5ea0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
5eb0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 NSSL_NO_TLS1_2)
5ec0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
5ed0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 SL_NO_TLS1_2_MET
5ee0: 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 HOD).. Tcl_Ap
5ef0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
5f00: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 p, protocols[ind
5f10: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c ex], ": protocol
5f20: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
5f30: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
5f40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
5f50: 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 else.. ctx =
5f60: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 SSL_CTX_new(TLSv
5f70: 31 5f 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 1_2_method()); b
5f80: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 reak;.#endif..ca
5f90: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 se TLS_TLS1_3:.#
5fa0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
5fb0: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_3) || defined
5fc0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
5fd0: 5f 33 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 _3).. Tcl_App
5fe0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
5ff0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
6000: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
6010: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
6020: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
6030: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
6040: 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 lse.. ctx = S
6050: 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 5f 6d SL_CTX_new(TLS_m
6060: 65 74 68 6f 64 28 29 29 3b 0a 20 20 20 20 20 20 ethod());.
6070: 20 20 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 SSL_CTX_se
6080: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 t_min_proto_vers
6090: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
60a0: 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 VERSION);.. S
60b0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 SL_CTX_set_max_p
60c0: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
60d0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
60e0: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 );.. break;.#
60f0: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a endif..default:.
6100: 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 . break;.
6110: 7d 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d }. if (ctx ==
6120: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 NULL) {..Tcl_Ap
6130: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
6140: 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c p, REASON(), NUL
6150: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
6160: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
6170: 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 ssl = SSL_new(
6180: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73 ctx);. if (ss
6190: 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 l == NULL) {..Tc
61a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
61b0: 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c nterp, REASON(),
61c0: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
61d0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
61e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
61f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 }.. /* Use
6200: 20 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 list and order
6210: 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 as would be sent
6220: 20 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c in a ClientHell
6230: 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 o or all availab
6240: 6c 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 le ciphers */.
6250: 20 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 if (use_suppor
6260: 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c ted) {..sk = SSL
6270: 5f 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f _get1_supported_
6280: 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 ciphers(ssl);.
6290: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d } else {..sk =
62a0: 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 SSL_get_ciphers
62b0: 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 (ssl);. }..
62c0: 20 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c if (sk != NULL
62d0: 29 20 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 ) {..if (!verbos
62e0: 65 29 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 e) {.. objPtr
62f0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
6300: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 j(0, NULL);..
6310: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b for (int i = 0;
6320: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 i < sk_SSL_CIPH
6330: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 ER_num(sk); i++)
6340: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 {...const SSL_C
6350: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 IPHER *c = sk_SS
6360: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 L_CIPHER_value(s
6370: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d k, i);...if (c =
6380: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 = NULL) continue
6390: 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 6e ;..../* cipher n
63a0: 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f ame or (NONE) */
63b0: 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 ...cp = SSL_CIPH
63c0: 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a ER_get_name(c);.
63d0: 09 09 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c ..if (cp == NULL
63e0: 29 20 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c ) break;...Tcl_L
63f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
6400: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
6410: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
6420: 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 gObj(cp, -1));..
6430: 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b }...} else {
6440: 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
6450: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
6460: 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 "",0);.. for
6470: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 (int i = 0; i <
6480: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 sk_SSL_CIPHER_nu
6490: 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 m(sk); i++) {...
64a0: 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 const SSL_CIPHER
64b0: 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 *c = sk_SSL_CIP
64c0: 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 HER_value(sk, i)
64d0: 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c ;...if (c == NUL
64e0: 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 L) continue;....
64f0: 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 /* textual descr
6500: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 iption of the ci
6510: 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 pher */...if (SS
6520: 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 L_CIPHER_descrip
6530: 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a tion(c, buf, siz
6540: 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c eof(buf)) != NUL
6550: 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 L) {... Tcl_A
6560: 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 ppendToObj(objPt
6570: 72 2c 20 62 75 66 2c 20 28 69 6e 74 29 20 73 74 r, buf, (int) st
6580: 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d 20 rlen(buf));...}
6590: 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 6c else {... Tcl
65a0: 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a _AppendToObj(obj
65b0: 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 Ptr, "UNKNOWN\n"
65c0: 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d , 8);...}.. }
65d0: 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 70 ..}..if (use_sup
65e0: 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20 73 ported) {.. s
65f0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 65 k_SSL_CIPHER_fre
6600: 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a e(sk);..}. }.
6610: 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 6c SSL_free(ssl
6620: 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 );. SSL_CTX_f
6630: 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 ree(ctx);.. T
6640: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
6650: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
6660: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
6670: 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 OK;..clientData
6680: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a = clientData;.}.
6690: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
66a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
66e0: 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 ProtocolsObjCmd
66f0: 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 -- list availab
6700: 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a le protocols. *.
6710: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
6720: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 e is invoked to
6730: 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 process the "tls
6740: 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d ::protocols" com
6750: 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 mand. *.to list
6760: 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 available protoc
6770: 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ols.. *. * Resul
6780: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
6790: 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 d Tcl result lis
67a0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
67b0: 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 fects:. *.none.
67c0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
67d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6800: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
6810: 69 63 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 ic int.Protocols
6820: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
6830: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
6840: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
6850: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
6860: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
6870: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ]) {. Tcl_Obj
6880: 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 *objPtr;.. d
6890: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
68a0: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
68b0: 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 1) {..Tcl_Wro
68c0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
68d0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a , 1, objv, "");.
68e0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
68f0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 R;. }.. ob
6900: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
6910: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
6920: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
6930: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
6940: 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 10100000L && !de
6950: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 fined(NO_SSL2) &
6960: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
6970: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 SL_NO_SSL2).
6980: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
6990: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
69a0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
69b0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 StringObj(protoc
69c0: 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d ols[TLS_SSL2], -
69d0: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 1));.#endif.#if
69e0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 !defined(NO_SSL3
69f0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
6a00: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 ENSSL_NO_SSL3).
6a10: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
6a20: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
6a30: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
6a40: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
6a50: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d tocols[TLS_SSL3]
6a60: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
6a70: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
6a80: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
6a90: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
6aa0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
6ab0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
6ac0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
6ad0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
6ae0: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c protocols[TLS_TL
6af0: 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 S1], -1));.#endi
6b00: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
6b10: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 O_TLS1_1) && !de
6b20: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
6b30: 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 54 63 6c _TLS1_1). Tcl
6b40: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
6b50: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
6b60: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
6b70: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
6b80: 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 [TLS_TLS1_1], -1
6b90: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
6ba0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
6bb0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
6bc0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
6bd0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
6be0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
6bf0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
6c00: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
6c10: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c protocols[TLS_TL
6c20: 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e S1_2], -1));.#en
6c30: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
6c40: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 (NO_TLS1_3) && !
6c50: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
6c60: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 NO_TLS1_3). T
6c70: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
6c80: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
6c90: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
6ca0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
6cb0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 ls[TLS_TLS1_3],
6cc0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 -1));.#endif..
6cd0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
6ce0: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
6cf0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
6d00: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 CL_OK;..clientDa
6d10: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
6d20: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
6d70: 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a . * HandshakeObj
6d80: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
6d90: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 s command is use
6da0: 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74 d to verify whet
6db0: 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b her the handshak
6dc0: 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a e is complete. *
6dd0: 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 .or not.. *. * R
6de0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
6df0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
6e00: 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 . 1 means handsh
6e10: 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 ake complete, 0
6e20: 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 means pending..
6e30: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
6e40: 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 s:. *.May force
6e50: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 SSL negotiation
6e60: 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 to take place..
6e70: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
6e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
6ec0: 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 ic int Handshake
6ed0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
6ee0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
6ef0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
6f00: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
6f10: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
6f20: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
6f30: 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 nnel chan;
6f40: 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c /* The channel
6f50: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f to set a mode o
6f60: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 n. */. State
6f70: 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20 *statePtr;
6f80: 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 /* client stat
6f90: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 e for ssl socket
6fa0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 */. const ch
6fb0: 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c ar *errStr = NUL
6fc0: 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d L;. int ret =
6fd0: 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 1;. int err
6fe0: 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 = 0;.. dprint
6ff0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
7000: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 if (objc != 2)
7010: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
7020: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
7030: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 objv, "channel")
7040: 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 ;..return(TCL_ER
7050: 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ROR);. }..
7060: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
7070: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
7080: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
7090: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c Obj(objv[1], NUL
70a0: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 L), NULL);. i
70b0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
70c0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
70d0: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
70e0: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
70f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
7100: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
7110: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
7120: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
7130: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
7140: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 han);. if (Tc
7150: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
7160: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
7170: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
7180: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
7190: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
71a0: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
71b0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
71c0: 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 20 an), "\": not a
71d0: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 TLS channel", NU
71e0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c LL);..return(TCL
71f0: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 _ERROR);. }.
7200: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 statePtr = (S
7210: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 tate *)Tcl_GetCh
7220: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
7230: 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 a(chan);.. dp
7240: 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 rintf("Calling T
7250: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 ls_WaitForConnec
7260: 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 t");. ret = T
7270: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 ls_WaitForConnec
7280: 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 t(statePtr, &err
7290: 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 , 1);. dprint
72a0: 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f f("Tls_WaitForCo
72b0: 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20 nnect returned:
72c0: 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 %i", ret);..
72d0: 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 20 28 if (ret < 0 && (
72e0: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 (statePtr->flags
72f0: 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 & TLS_TCL_ASYNC
7300: 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41 47 ) && (err == EAG
7310: 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 AIN))) {..dprint
7320: 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e 64 f("Async set and
7330: 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29 3b err = EAGAIN");
7340: 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d ..ret = 0;. }
7350: 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c 20 else if (ret <
7360: 30 29 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 73 0) {..errStr = s
7370: 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 tatePtr->err;..T
7380: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 cl_ResetResult(i
7390: 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 nterp);..Tcl_Set
73a0: 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 Errno(err);...if
73b0: 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 (!errStr || (*e
73c0: 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 rrStr == 0)) {..
73d0: 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c errStr = Tcl
73e0: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 _PosixError(inte
73f0: 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 rp);..}...Tcl_Ap
7400: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
7410: 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 p, "handshake fa
7420: 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c iled: ", errStr,
7430: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
7440: 0a 09 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 ..dprintf("Retur
7450: 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 ning TCL_ERROR w
7460: 69 74 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 ith handshake fa
7470: 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 iled: %s", errSt
7480: 72 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f r);..return(TCL_
7490: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 20 65 6c ERROR);. } el
74a0: 73 65 20 7b 0a 09 69 66 20 28 65 72 72 20 21 3d se {..if (err !=
74b0: 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 0) {.. dprin
74c0: 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 tf("Got an error
74d0: 20 77 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 with a complete
74e0: 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 d handshake: err
74f0: 20 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d = %i", err);..}
7500: 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d ..ret = 1;. }
7510: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 .. dprintf("R
7520: 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 eturning TCL_OK
7530: 77 69 74 68 20 64 61 74 61 20 5c 22 25 69 5c 22 with data \"%i\"
7540: 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 54 63 6c ", ret);. Tcl
7550: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
7560: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 terp, Tcl_NewInt
7570: 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 72 Obj(ret));. r
7580: 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 eturn(TCL_OK);..
7590: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
75a0: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 20 entData;.}../*.
75b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75f0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 ----. *. * Impor
7600: 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a tObjCmd --. *. *
7610: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
7620: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 is invoked to pr
7630: 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 ocess the "ssl"
7640: 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 command. *. *.Th
7650: 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 e ssl command pu
7660: 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 shes SSL over a
7670: 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 (newly connected
7680: 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a ) tcp socket. *.
7690: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
76a0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
76b0: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
76c0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 effects:. *.May
76d0: 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 modify the beha
76e0: 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 vior of an IO ch
76f0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d annel.. *. *----
7700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
7740: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 */.static int.I
7750: 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 mportObjCmd(Clie
7760: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
7770: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
7780: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
7790: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
77a0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
77b0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 l_Channel chan;.
77c0: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 ./* The channel
77d0: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e to set a mode on
77e0: 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a . */. State *
77f0: 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c statePtr;../* cl
7800: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 ient state for s
7810: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 sl socket */.
7820: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 20 20 SSL_CTX *ctx.
7830: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
7840: 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 Tcl_Obj *scrip
7850: 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c t. = NULL
7860: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 ;. Tcl_Obj *p
7870: 61 73 73 77 6f 72 64 09 20 20 20 20 20 20 20 20 assword.
7880: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
7890: 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 DString upperCha
78a0: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c nnelTranslation,
78b0: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f upperChannelBlo
78c0: 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e cking, upperChan
78d0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 nelEncoding, upp
78e0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
78f0: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c ;. int idx, l
7900: 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 en;. int flag
7910: 73 09 09 20 20 20 20 20 20 20 20 3d 20 54 4c 53 s.. = TLS
7920: 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 _TCL_INIT;. i
7930: 6e 74 20 73 65 72 76 65 72 09 09 20 20 20 20 20 nt server..
7940: 20 20 20 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f = 0;./* is co
7950: 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e nnection incomin
7960: 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a g or outgoing? *
7970: 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66 /. char *keyf
7980: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ile. = NU
7990: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 LL;. char *ce
79a0: 72 74 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d rtfile. =
79b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 NULL;. unsig
79c0: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20 20 09 ned char *key .
79d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 = NULL;. int
79e0: 6b 65 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 key_len
79f0: 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 = 0;.
7a00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
7a10: 63 65 72 74 20 20 20 20 20 20 20 20 20 3d 20 4e cert = N
7a20: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 63 65 72 ULL;. int cer
7a30: 74 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 t_len
7a40: 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 68 = 0;. ch
7a50: 61 72 20 2a 63 69 70 68 65 72 73 09 20 20 20 20 ar *ciphers.
7a60: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
7a70: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 char *ciphersuit
7a80: 65 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c es. = NUL
7a90: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 L;. char *CAf
7aa0: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ile. = NU
7ab0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 LL;. char *CA
7ac0: 64 69 72 09 09 20 20 20 20 20 20 20 20 3d 20 4e dir.. = N
7ad0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 ULL;. char *D
7ae0: 48 70 61 72 61 6d 73 09 20 20 20 20 20 20 20 20 Hparams.
7af0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
7b00: 20 2a 6d 6f 64 65 6c 09 09 20 20 20 20 20 20 20 *model..
7b10: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
7b20: 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 20 20 r *servername.
7b30: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a = NULL;./*
7b40: 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 hostname for Se
7b50: 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 rver Name Indica
7b60: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 tion */. cons
7b70: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
7b80: 2a 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 *session_id = NU
7b90: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 LL;. Tcl_Obj
7ba0: 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 *alpn..= NULL;.
7bb0: 20 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c int ssl2 = 0,
7bc0: 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 ssl3 = 0;. i
7bd0: 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 nt tls1 = 1, tls
7be0: 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 1_1 = 1, tls1_2
7bf0: 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b = 1, tls1_3 = 1;
7c00: 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d . int proto =
7c10: 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 0, level = -1;.
7c20: 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d int verify =
7c30: 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 0, require = 0,
7c40: 20 72 65 71 75 65 73 74 20 3d 20 31 3b 0a 0a 20 request = 1;..
7c50: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
7c60: 65 64 22 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 ed");..#if OPENS
7c70: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
7c80: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 R < 0x10100000L
7c90: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
7ca0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 20 26 26 20 SSL_NO_SSL2) &&
7cb0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 !defined(NO_SSL2
7cc0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f ) && defined(NO_
7cd0: 53 53 4c 33 29 20 26 26 20 64 65 66 69 6e 65 64 SSL3) && defined
7ce0: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66 (NO_TLS1) && def
7cf0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
7d00: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c && defined(NO_TL
7d10: 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64 S1_2) && defined
7d20: 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 (NO_TLS1_3).
7d30: 73 73 6c 32 20 3d 20 31 3b 0a 23 65 6e 64 69 66 ssl2 = 1;.#endif
7d40: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4f 50 .#if !defined(OP
7d50: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 ENSSL_NO_SSL3) &
7d60: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 & !defined(NO_SS
7d70: 4c 33 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e L3) && defined(N
7d80: 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e O_SSL2) && defin
7d90: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 ed(NO_TLS1) && d
7da0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
7db0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f ) && defined(NO_
7dc0: 54 4c 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e TLS1_2) && defin
7dd0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 ed(NO_TLS1_3).
7de0: 20 20 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e 64 ssl3 = 1;.#end
7df0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
7e00: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e O_TLS1) || defin
7e10: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7e20: 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 S1). tls1 = 0
7e30: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ;.#endif.#if def
7e40: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
7e50: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
7e60: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 SL_NO_TLS1_1).
7e70: 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 tls1_1 = 0;.#e
7e80: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
7e90: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 (NO_TLS1_2) || d
7ea0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7eb0: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c O_TLS1_2). tl
7ec0: 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 s1_2 = 0;.#endif
7ed0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
7ee0: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e TLS1_3) || defin
7ef0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7f00: 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 S1_3). tls1_3
7f10: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 = 0;.#endif..
7f20: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 if (objc < 2)
7f30: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
7f40: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
7f50: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f bjv, "channel ?o
7f60: 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 ptions?");..retu
7f70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7f80: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 }.. chan =
7f90: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
7fa0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 nterp, Tcl_GetSt
7fb0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
7fc0: 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c [1], NULL), NULL
7fd0: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 );. if (chan
7fe0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
7ff0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
8000: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
8010: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 }.. /* Make s
8020: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f ure to operate o
8030: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 n the topmost ch
8040: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 annel */. cha
8050: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
8060: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 annel(chan);..
8070: 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 for (idx = 2;
8080: 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b idx < objc; idx+
8090: 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 +) {..char *opt
80a0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
80b0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d romObj(objv[idx]
80c0: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f , NULL);...if (o
80d0: 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20 pt[0] != '-')..
80e0: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 53 break;...OPTS
80f0: 54 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 64 TR("-cadir", CAd
8100: 69 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 ir);..OPTSTR("-c
8110: 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b afile", CAfile);
8120: 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66 ..OPTSTR("-certf
8130: 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b ile", certfile);
8140: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 ..OPTSTR("-ciphe
8150: 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f r", ciphers);..O
8160: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 22 PTSTR("-ciphers"
8170: 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 , ciphers);..OPT
8180: 53 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 74 STR("-ciphersuit
8190: 65 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 65 es", ciphersuite
81a0: 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f s);..OPTOBJ("-co
81b0: 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b mmand", script);
81c0: 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72 ..OPTSTR("-dhpar
81d0: 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b ams", DHparams);
81e0: 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69 ..OPTSTR("-keyfi
81f0: 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 le", keyfile);..
8200: 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c OPTSTR("-model",
8210: 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a model);..OPTOBJ
8220: 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 ("-password", pa
8230: 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f ssword);..OPTBOO
8240: 4c 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 L("-require", re
8250: 71 75 69 72 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c quire);..OPTBOOL
8260: 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 ("-request", req
8270: 75 65 73 74 29 3b 0a 09 4f 50 54 49 4e 54 28 22 uest);..OPTINT("
8280: 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c -securitylevel",
8290: 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f level);..OPTBOO
82a0: 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 L("-server", ser
82b0: 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ver);..OPTSTR("-
82c0: 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 servername", ser
82d0: 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 vername);..OPTST
82e0: 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c R("-session_id",
82f0: 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f session_id);..O
8300: 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 PTOBJ("-alpn", a
8310: 6c 70 6e 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 lpn);..OPTBOOL("
8320: 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 -ssl2", ssl2);..
8330: 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c OPTBOOL("-ssl3",
8340: 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c ssl3);..OPTBOOL
8350: 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b ("-tls1", tls1);
8360: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 ..OPTBOOL("-tls1
8370: 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f .1", tls1_1);..O
8380: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 PTBOOL("-tls1.2"
8390: 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 , tls1_2);..OPTB
83a0: 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 OOL("-tls1.3", t
83b0: 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 42 59 54 45 ls1_3);..OPTBYTE
83c0: 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c 20 ("-cert", cert,
83d0: 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 42 cert_len);..OPTB
83e0: 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c YTE("-key", key,
83f0: 20 6b 65 79 5f 6c 65 6e 29 3b 0a 0a 09 4f 50 54 key_len);...OPT
8400: 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d BAD("option", "-
8410: 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 alpn, -cadir, -c
8420: 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 afile, -cert, -c
8430: 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 ertfile, -cipher
8440: 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c , -ciphersuites,
8450: 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 -command, -dhpa
8460: 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 rams, -key, -key
8470: 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 file, -model, -p
8480: 61 73 73 77 6f 72 64 2c 20 2d 72 65 71 75 69 72 assword, -requir
8490: 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 73 65 e, -request, -se
84a0: 63 75 72 69 74 79 6c 65 76 65 6c 2c 20 2d 73 65 curitylevel, -se
84b0: 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d rver, -servernam
84c0: 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 e, -session_id,
84d0: 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 -ssl2, -ssl3, -t
84e0: 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 ls1, -tls1.1, -t
84f0: 6c 73 31 2e 32 2c 20 6f 72 20 2d 74 6c 73 31 2e ls1.2, or -tls1.
8500: 33 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 3");...return TC
8510: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
8520: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09 if (request).
8530: 20 20 20 20 76 65 72 69 66 79 20 7c 3d 20 53 53 verify |= SS
8540: 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f L_VERIFY_CLIENT_
8550: 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46 ONCE | SSL_VERIF
8560: 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28 Y_PEER;. if (
8570: 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75 69 request && requi
8580: 72 65 29 20 76 65 72 69 66 79 20 7c 3d 20 53 53 re) verify |= SS
8590: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 L_VERIFY_FAIL_IF
85a0: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20 _NO_PEER_CERT;.
85b0: 20 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d if (verify ==
85c0: 20 30 29 09 76 65 72 69 66 79 20 3d 20 53 53 4c 0).verify = SSL
85d0: 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 _VERIFY_NONE;..
85e0: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c proto |= (ssl
85f0: 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 2 ? TLS_PROTO_SS
8600: 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f L2 : 0);. pro
8610: 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c to |= (ssl3 ? TL
8620: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 S_PROTO_SSL3 : 0
8630: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 );. proto |=
8640: 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 (tls1 ? TLS_PROT
8650: 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 O_TLS1 : 0);.
8660: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f proto |= (tls1_
8670: 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 1 ? TLS_PROTO_TL
8680: 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 S1_1 : 0);. p
8690: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 roto |= (tls1_2
86a0: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 ? TLS_PROTO_TLS1
86b0: 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f _2 : 0);. pro
86c0: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 to |= (tls1_3 ?
86d0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
86e0: 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 : 0);.. /* r
86f0: 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 eset to NULL if
8700: 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f blank string pro
8710: 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 vided */. if
8720: 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 (cert && !*cert)
8730: 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20 .. cert.
8740: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
8750: 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a if (key && !*
8760: 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 key).. ke
8770: 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c y. = NULL
8780: 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 ;. if (certfi
8790: 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 le && !*certfile
87a0: 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69 ) certfi
87b0: 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 le.= NULL;. i
87c0: 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a f (keyfile && !*
87d0: 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c keyfile)..keyfil
87e0: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c e. = NULL
87f0: 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 ;. if (cipher
8800: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 s && !*ciphers).
8810: 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09 ciphers.
8820: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
8830: 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75 if (ciphersu
8840: 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 ites && !*cipher
8850: 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75 suites) ciphersu
8860: 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a ites = NULL;.
8870: 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 if (CAfile &
8880: 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 & !*CAfile).
8890: 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 CAfile.
88a0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
88b0: 66 20 28 43 41 64 69 72 20 26 26 20 21 2a 43 41 f (CAdir && !*CA
88c0: 64 69 72 29 09 20 20 20 20 20 20 20 20 43 41 64 dir). CAd
88d0: 69 72 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c ir. = NUL
88e0: 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 L;. if (DHpar
88f0: 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d ams && !*DHparam
8900: 73 29 09 20 20 20 20 20 20 20 20 44 48 70 61 72 s). DHpar
8910: 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c ams = NUL
8920: 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 L;.. /* new S
8930: 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 SL state */.
8940: 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 statePtr..= (Sta
8950: 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 te *) ckalloc((u
8960: 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 nsigned) sizeof(
8970: 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d State));. mem
8980: 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c set(statePtr, 0,
8990: 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b sizeof(State));
89a0: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
89b0: 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 flags.= flags;.
89c0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 statePtr->int
89d0: 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 erp.= interp;.
89e0: 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 statePtr->vfla
89f0: 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 gs.= verify;.
8a00: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d statePtr->err.=
8a10: 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c "";.. /* all
8a20: 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a ocate script */.
8a30: 20 20 20 20 69 66 20 28 73 63 72 69 70 74 29 20 if (script)
8a40: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 {..(void) Tcl_Ge
8a50: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 tStringFromObj(s
8a60: 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 cript, &len);..i
8a70: 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 f (len) {.. s
8a80: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
8a90: 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20 k = script;..
8aa0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
8ab0: 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c t(statePtr->call
8ac0: 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a back);..}. }.
8ad0: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 . /* allocate
8ae0: 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 password */.
8af0: 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b if (password) {
8b00: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 ..(void) Tcl_Get
8b10: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 StringFromObj(pa
8b20: 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 ssword, &len);..
8b30: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 if (len) {..
8b40: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
8b50: 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 rd = password;..
8b60: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
8b70: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 ount(statePtr->p
8b80: 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 assword);..}.
8b90: 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 }.. if (mode
8ba0: 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e l != NULL) {..in
8bb0: 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 t mode;../* Get
8bc0: 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 the "model" cont
8bd0: 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 ext */..chan = T
8be0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
8bf0: 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f terp, model, &mo
8c00: 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d de);..if (chan =
8c10: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
8c20: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 NULL) {.. Tls
8c30: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
8c40: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
8c50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8c60: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b ..}.../*.. * Mak
8c70: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
8c80: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
8c90: 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 channel.. */..c
8ca0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
8cb0: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 Channel(chan);..
8cc0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
8cd0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
8ce0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
8cf0: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 )) {.. Tcl_Ap
8d00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
8d10: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
8d20: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
8d30: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
8d40: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 ."\": not a TLS
8d50: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b channel", NULL);
8d60: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
8d70: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
8d80: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
8d90: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 CL_ERROR;..}..ct
8da0: 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54 63 x = ((State *)Tc
8db0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
8dc0: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29 2d anceData(chan))-
8dd0: 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 >ctx;. } else
8de0: 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20 43 {..if ((ctx = C
8df0: 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72 TX_Init(statePtr
8e00: 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c , server, proto,
8e10: 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66 69 keyfile, certfi
8e20: 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 0a 09 le, key, cert,..
8e30: 20 20 20 20 6b 65 79 5f 6c 65 6e 2c 20 63 65 72 key_len, cer
8e40: 74 5f 6c 65 6e 2c 20 43 41 64 69 72 2c 20 43 41 t_len, CAdir, CA
8e50: 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 file, ciphers, c
8e60: 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 iphersuites, lev
8e70: 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d el, DHparams)) =
8e80: 3d 20 28 53 53 4c 5f 43 54 58 2a 29 30 29 20 7b = (SSL_CTX*)0) {
8e90: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
8ea0: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
8eb0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
8ec0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 CL_ERROR;..}.
8ed0: 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 }.. statePtr
8ee0: 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 ->ctx = ctx;..
8ef0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e /*. * We n
8f00: 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 eed to make sure
8f10: 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 that the channe
8f20: 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 l works in binar
8f30: 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 y (for the.
8f40: 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 * encryption not
8f50: 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 to get goofed u
8f60: 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e p).. * We on
8f70: 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 ly want to adjus
8f80: 74 20 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 t the buffering
8f90: 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 in pre-v2 channe
8fa0: 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a ls, where. *
8fb0: 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e each channel in
8fc0: 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 the stack maint
8fd0: 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 ained its own bu
8fe0: 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 ffers.. */.
8ff0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
9000: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
9010: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 Translation);.
9020: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
9030: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 t(&upperChannelB
9040: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 locking);. Tc
9050: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
9060: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
9070: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ar);. Tcl_DSt
9080: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
9090: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b hannelEncoding);
90a0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
90b0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
90c0: 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 , chan, "-eofcha
90d0: 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 r", &upperChanne
90e0: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 lEOFChar);. T
90f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
9100: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
9110: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 , "-encoding", &
9120: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
9130: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 ding);. Tcl_G
9140: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
9150: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
9160: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 translation", &u
9170: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
9180: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c lation);. Tcl
9190: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
91a0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
91b0: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 "-blocking", &up
91c0: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 perChannelBlocki
91d0: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 ng);. Tcl_Set
91e0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
91f0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 terp, chan, "-tr
9200: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e anslation", "bin
9210: 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 ary");. Tcl_S
9220: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
9230: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
9240: 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 blocking", "true
9250: 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ");. dprintf(
9260: 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 "Consuming Tcl c
9270: 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f hannel %s", Tcl_
9280: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
9290: 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 han));. state
92a0: 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f Ptr->self = Tcl_
92b0: 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 StackChannel(int
92c0: 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c erp, Tls_Channel
92d0: 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 Type(), (ClientD
92e0: 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 20 28 ata) statePtr, (
92f0: 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 TCL_READABLE | T
9300: 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 CL_WRITABLE), ch
9310: 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 an);. dprintf
9320: 28 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 ("Created channe
9330: 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c l named %s", Tcl
9340: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
9350: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 statePtr->self))
9360: 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 ;. if (stateP
9370: 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c tr->self == (Tcl
9380: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
9390: 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 {../*.. * No use
93a0: 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c of Tcl_Eventual
93b0: 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e lyFree because n
93c0: 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 o possible Tcl_P
93d0: 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 reserve... */..T
93e0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
93f0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 statePtr);..ret
9400: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
9410: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 }.. Tcl_Se
9420: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
9430: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
9440: 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 >self, "-transla
9450: 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 tion", Tcl_DStri
9460: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
9470: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
9480: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ));. Tcl_SetC
9490: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
94a0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
94b0: 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 elf, "-encoding"
94c0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
94d0: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ue(&upperChannel
94e0: 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 Encoding));.
94f0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
9500: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 tion(interp, sta
9510: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 tePtr->self, "-e
9520: 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 ofchar", Tcl_DSt
9530: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
9540: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 ChannelEOFChar))
9550: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
9560: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
9570: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
9580: 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 f, "-blocking",
9590: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
95a0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c (&upperChannelBl
95b0: 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f ocking));.. /
95c0: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 *. * SSL Ini
95d0: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 tialization.
95e0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
95f0: 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 ->ssl = SSL_new(
9600: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a statePtr->ctx);.
9610: 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 if (!statePt
9620: 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 r->ssl) {../* SS
9630: 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 L library error
9640: 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 */..Tcl_AppendRe
9650: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f sult(interp, "co
9660: 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 uldn't construct
9670: 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c ssl session: ",
9680: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
9690: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f *) NULL);..Tls_
96a0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
96b0: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e atePtr);..return
96c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
96d0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f }.. /* Set ho
96e0: 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a st server name *
96f0: 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 /. if (server
9700: 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 name) {../* Sets
9710: 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 the server name
9720: 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 indication (SNI
9730: 29 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78 ) ClientHello ex
9740: 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 tension */..if (
9750: 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f !SSL_set_tlsext_
9760: 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 host_name(stateP
9770: 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e tr->ssl, servern
9780: 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 29 ame) && require)
9790: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
97a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
97b0: 20 22 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f "setting TLS ho
97c0: 73 74 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f st name extensio
97d0: 6e 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 n failed", (char
97e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 *) NULL);.
97f0: 20 20 20 20 20 20 20 54 6c 73 5f 46 72 65 65 28 Tls_Free(
9800: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
9810: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 r);.
9820: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
9830: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 09 2f 2a ;. }.../*
9840: 20 43 6f 6e 66 69 67 75 72 65 20 73 65 72 76 65 Configure serve
9850: 72 20 68 6f 73 74 20 6e 61 6d 65 20 63 68 65 63 r host name chec
9860: 6b 73 20 69 6e 20 74 68 65 20 53 53 4c 20 63 6c ks in the SSL cl
9870: 69 65 6e 74 2e 20 53 65 74 20 44 4e 53 20 68 6f ient. Set DNS ho
9880: 73 74 6e 61 6d 65 20 74 6f 0a 09 20 20 20 6e 61 stname to.. na
9890: 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 me for peer cert
98a0: 69 66 69 63 61 74 65 20 63 68 65 63 6b 73 2e 20 ificate checks.
98b0: 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 68 61 SSL_set1_host ha
98c0: 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a s limitations. *
98d0: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 /..if (!SSL_add1
98e0: 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e _host(statePtr->
98f0: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 ssl, servername)
9900: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
9910: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
9920: 2c 20 22 73 65 74 74 69 6e 67 20 44 4e 53 20 68 , "setting DNS h
9930: 6f 73 74 20 6e 61 6d 65 20 66 61 69 6c 65 64 22 ost name failed"
9940: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9950: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6c ;. Tl
9960: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
9970: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 statePtr);.
9980: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 return TC
9990: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 L_ERROR;..}.
99a0: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 }.. /* Resume
99b0: 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 session id */.
99c0: 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 if (session_i
99d0: 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 d && strlen(sess
99e0: 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d ion_id) <= SSL_M
99f0: 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 AX_SID_CTX_LENGT
9a00: 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 H) {../* SSL_set
9a10: 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 _session() */..i
9a20: 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f f (!SSL_SESSION_
9a30: 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 set1_id_context(
9a40: 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 SSL_get_session(
9a50: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 statePtr->ssl),
9a60: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 session_id, (uns
9a70: 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 igned int) strle
9a80: 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 n(session_id)))
9a90: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
9aa0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
9ab0: 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 "Resume session
9ac0: 69 64 20 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 id ", session_id
9ad0: 2c 20 22 20 66 61 69 6c 65 64 22 2c 20 28 63 68 , " failed", (ch
9ae0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 ar *) NULL);.
9af0: 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72 65 Tls_Fre
9b00: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
9b10: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 Ptr);.
9b20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
9b30: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 OR;..}. }..
9b40: 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f if (alpn) {../
9b50: 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 63 6c 20 * Convert a Tcl
9b60: 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 list into a prot
9b70: 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 ocol-list in wir
9b80: 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 e-format */..uns
9b90: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 igned char *prot
9ba0: 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 os, *p;..unsigne
9bb0: 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e d int protos_len
9bc0: 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c 65 = 0;..int i, le
9bd0: 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a n, cnt;..Tcl_Obj
9be0: 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 **list;...if (T
9bf0: 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 cl_ListObjGetEle
9c00: 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c ments(interp, al
9c10: 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 pn, &cnt, &list)
9c20: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 != TCL_OK) {..
9c30: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
9c40: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
9c50: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
9c60: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 ERROR;..}.../* D
9c70: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d etermine the mem
9c80: 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 ory required for
9c90: 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 the protocol-li
9ca0: 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 st */..for (i =
9cb0: 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 0; i < cnt; i++)
9cc0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 {.. Tcl_GetS
9cd0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 tringFromObj(lis
9ce0: 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 t[i], &len);..
9cf0: 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 if (len > 255)
9d00: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 {...Tcl_AppendR
9d10: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 esult(interp, "A
9d20: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d LPN protocol nam
9d30: 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 e too long", (ch
9d40: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 ar *) NULL);...T
9d50: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
9d60: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 statePtr);...re
9d70: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9d80: 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 . }.. prot
9d90: 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 os_len += 1 + le
9da0: 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 n;..}.../* Build
9db0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 the complete pr
9dc0: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 otocol-list */..
9dd0: 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 protos = ckalloc
9de0: 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f (protos_len);../
9df0: 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 * protocol-lists
9e00: 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 consist of 8-bi
9e10: 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 t length-prefixe
9e20: 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 d, byte strings
9e30: 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c 20 */..for (i = 0,
9e40: 70 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20 p = protos; i <
9e50: 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 cnt; i++) {..
9e60: 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c char *str = Tcl
9e70: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
9e80: 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 j(list[i], &len)
9e90: 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 ;.. *p++ = le
9ea0: 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 n;.. memcpy(p
9eb0: 2c 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 , str, len);..
9ec0: 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a p += len;..}..
9ed0: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e ./* SSL_set_alpn
9ee0: 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 _protos makes a
9ef0: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 copy of the prot
9f00: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a ocol-list */../*
9f10: 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 Note: This func
9f20: 74 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 tions reverses t
9f30: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 he return value
9f40: 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 convention */..i
9f50: 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f f (SSL_set_alpn_
9f60: 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d protos(statePtr-
9f70: 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 >ssl, protos, pr
9f80: 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 otos_len)) {..
9f90: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
9fa0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c lt(interp, "fail
9fb0: 65 64 20 74 6f 20 73 65 74 20 41 4c 50 4e 20 70 ed to set ALPN p
9fc0: 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 rotocols", (char
9fd0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
9fe0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
9ff0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
a000: 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 ckfree(protos)
a010: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
a020: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a L_ERROR;..}.../*
a030: 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 Store protocols
a040: 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 list */..stateP
a050: 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f tr->protos = pro
a060: 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e tos;..statePtr->
a070: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f protos_len = pro
a080: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 tos_len;. } e
a090: 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d lse {..statePtr-
a0a0: 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a >protos = NULL;.
a0b0: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
a0c0: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d s_len = 0;. }
a0d0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
a0e0: 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 SSL Callbacks.
a0f0: 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 */. SSL_se
a100: 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 t_app_data(state
a110: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 Ptr->ssl, (void
a120: 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 *)statePtr);./*
a130: 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 point back to us
a140: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f */. SSL_set_
a150: 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d verify(statePtr-
a160: 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 >ssl, verify, Ve
a170: 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 rifyCallback);.
a180: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 69 SSL_CTX_set_i
a190: 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 nfo_callback(sta
a1a0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 49 6e 66 6f tePtr->ctx, Info
a1b0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 Callback);..
a1c0: 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 /* Create Tcl_Ch
a1d0: 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 annel BIO Handle
a1e0: 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 r */. statePt
a1f0: 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e r->p_bio.= BIO_n
a200: 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c ew_tcl(statePtr,
a210: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 BIO_NOCLOSE);.
a220: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f statePtr->bio
a230: 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 .= BIO_new(BIO_f
a240: 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 _ssl());.. if
a250: 20 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 (server) {../*
a260: 53 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 Server callbacks
a270: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 */..SSL_CTX_set
a280: 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 _alpn_select_cb(
a290: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 statePtr->ctx, A
a2a0: 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f LPNCallback, (vo
a2b0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
a2c0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 .SSL_CTX_set_tls
a2d0: 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 ext_servername_a
a2e0: 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 rg(statePtr->ctx
a2f0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
a300: 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 tr);..SSL_CTX_se
a310: 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e t_tlsext_servern
a320: 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 ame_callback(sta
a330: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 tePtr->ctx, SNIC
a340: 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 allback);..SSL_C
a350: 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 TX_set_client_he
a360: 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d llo_cb(statePtr-
a370: 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 >ctx, HelloCallb
a380: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ack, (void *)sta
a390: 74 65 50 74 72 29 3b 0a 0a 09 73 74 61 74 65 50 tePtr);...stateP
a3a0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 tr->flags |= TLS
a3b0: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 _TCL_SERVER;..SS
a3c0: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 L_set_accept_sta
a3d0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
a3e0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
a3f0: 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68 ./* Session cach
a400: 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f ing */..SSL_CTX_
a410: 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 set_session_cach
a420: 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d e_mode(statePtr-
a430: 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 >ctx, SSL_SESS_C
a440: 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 ACHE_CLIENT | SS
a450: 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f L_SESS_CACHE_NO_
a460: 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b INTERNAL_STORE);
a470: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 ..SSL_CTX_sess_s
a480: 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 et_new_cb(stateP
a490: 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e tr->ctx, Session
a4a0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 53 53 4c Callback);...SSL
a4b0: 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 _set_connect_sta
a4c0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
a4d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c );. }. SSL
a4e0: 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 _set_bio(statePt
a4f0: 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 r->ssl, statePtr
a500: 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 ->p_bio, statePt
a510: 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 r->p_bio);. B
a520: 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 IO_set_ssl(state
a530: 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 Ptr->bio, stateP
a540: 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 tr->ssl, BIO_NOC
a550: 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 LOSE);.. /*.
a560: 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c * End of SSL
a570: 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 Init. */.
a580: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 dprintf("Retur
a590: 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 ning %s", Tcl_Ge
a5a0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
a5b0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 tePtr->self));.
a5c0: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 Tcl_SetResult
a5d0: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a (interp, (char *
a5e0: 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c ) Tcl_GetChannel
a5f0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
a600: 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 elf), TCL_VOLATI
a610: 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e LE);.. return
a620: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
a630: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
a640: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d a;.}.../*. *----
a650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
a690: 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 *. * UnimportOb
a6a0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
a6b0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
a6c0: 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 invoked to remov
a6d0: 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 e the topmost ch
a6e0: 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a annel filter.. *
a6f0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
a700: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
a710: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
a720: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 e effects:. *.Ma
a730: 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 y modify the beh
a740: 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 avior of an IO c
a750: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d hannel.. *. *---
a760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a7a0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
a7b0: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 UnimportObjCmd(C
a7c0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
a7d0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
a7e0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
a7f0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
a800: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
a810: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
a820: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e n;../* The chann
a830: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 el to set a mode
a840: 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72 on. */.. dpr
a850: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
a860: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
a870: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
a880: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
a890: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
a8a0: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c l");..return TCL
a8b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
a8c0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
a8d0: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
a8e0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
a8f0: 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a bjv[1]), NULL);.
a900: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
a910: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
a920: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
a930: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
a940: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
a950: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
a960: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
a970: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
a980: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
a990: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 el(chan);.. i
a9a0: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
a9b0: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
a9c0: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
a9d0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
a9e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
a9f0: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
aa00: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
aa10: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a me(chan),..."\":
aa20: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e not a TLS chann
aa30: 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 el", NULL);..ret
aa40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
aa50: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 }.. if (Tc
aa60: 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c l_UnstackChannel
aa70: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d (interp, chan) =
aa80: 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 = TCL_ERROR) {..
aa90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
aaa0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 ;. }.. ret
aab0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
aac0: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
aad0: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Data;.}.../*. *-
aae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aaf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ab00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ab10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ab20: 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 --. *. * CTX_Ini
ab30: 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 t -- construct a
ab40: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 SSL_CTX instanc
ab50: 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a e. *. * Results:
ab60: 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f . *.A valid SSL_
ab70: 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 CTX instance or
ab80: 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 NULL.. *. * Side
ab90: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e effects:. *.con
aba0: 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 structs SSL cont
abb0: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d ext (CTX). *. *-
abc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
abd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
abe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
abf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ac00: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 --. */.static SS
ac10: 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 L_CTX *.CTX_Init
ac20: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 (State *statePtr
ac30: 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 , int isServer,
ac40: 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 int proto, char
ac50: 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a *keyfile, char *
ac60: 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e certfile,. un
ac70: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 signed char *key
ac80: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
ac90: 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c *cert, int key_l
aca0: 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e en, int cert_len
acb0: 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 , char *CAdir,.
acc0: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c char *CAfile,
acd0: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 char *ciphers,
ace0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 char *ciphersuit
acf0: 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 es, int level, c
ad00: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b har *DHparams) {
ad10: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
ad20: 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 *interp = stateP
ad30: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
ad40: 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e SSL_CTX *ctx = N
ad50: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ULL;. Tcl_DSt
ad60: 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c ring ds;. Tcl
ad70: 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 _DString ds1;.
ad80: 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 int off = 0;.
ad90: 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 int load_priv
ada0: 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e ate_key;. con
adb0: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d st SSL_METHOD *m
adc0: 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 ethod;.. dpri
add0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
ade0: 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 if (!proto)
adf0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
ae00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 ult(interp, "no
ae10: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 valid protocol s
ae20: 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b elected", NULL);
ae30: 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 ..return (SSL_CT
ae40: 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 X *)0;. }..
ae50: 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 /* create SSL
ae60: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f context */.#if O
ae70: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
ae80: 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 UMBER >= 0x10100
ae90: 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 000L || defined(
aea0: 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 NO_SSL2) || defi
aeb0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
aec0: 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 SL2). if (ENA
aed0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
aee0: 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 PROTO_SSL2)) {..
aef0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
af00: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 (interp, "SSL2 p
af10: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
af20: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
af30: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
af40: 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 *)0;. }.#endi
af50: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
af60: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL3) || define
af70: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
af80: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 3). if (ENABL
af90: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
afa0: 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 OTO_SSL3)) {..Tc
afb0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
afc0: 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f nterp, "SSL3 pro
afd0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
afe0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ted", NULL);..re
aff0: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 turn (SSL_CTX *)
b000: 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0;. }.#endif.
b010: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
b020: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
b030: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
b040: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
b050: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
b060: 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f O_TLS1)) {..Tcl_
b070: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
b080: 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 erp, "TLS 1.0 pr
b090: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
b0a0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 rted", NULL);..r
b0b0: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
b0c0: 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 )0;. }.#endif
b0d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
b0e0: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e TLS1_1) || defin
b0f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
b100: 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e S1_1). if (EN
b110: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
b120: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 _PROTO_TLS1_1))
b130: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
b140: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ult(interp, "TLS
b150: 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 1.1 protocol no
b160: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
b170: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 LL);..return (SS
b180: 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d L_CTX *)0;. }
b190: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
b1a0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c ned(NO_TLS1_2) |
b1b0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
b1c0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 L_NO_TLS1_2).
b1d0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
b1e0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
b1f0: 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 S1_2)) {..Tcl_Ap
b200: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
b210: 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 p, "TLS 1.2 prot
b220: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
b230: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ed", NULL);..ret
b240: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
b250: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ;. }.#endif.#
b260: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
b270: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_3) || defined
b280: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
b290: 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 _3). if (ENAB
b2a0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
b2b0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a ROTO_TLS1_3)) {.
b2c0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
b2d0: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
b2e0: 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .3 protocol not
b2f0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
b300: 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f );..return (SSL_
b310: 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 CTX *)0;. }.#
b320: 65 6e 64 69 66 0a 0a 20 20 20 20 73 77 69 74 63 endif.. switc
b330: 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 h (proto) {.#if
b340: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
b350: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 NUMBER < 0x10100
b360: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 000L && !defined
b370: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 (NO_SSL2) && !de
b380: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
b390: 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 _SSL2). case
b3a0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a TLS_PROTO_SSL2:.
b3b0: 09 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 5f .method = SSLv2_
b3c0: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
b3d0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
b3e0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
b3f0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
b400: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 SL_NO_SSL3) && !
b410: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
b420: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a NO_SSL3_METHOD).
b430: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
b440: 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 TO_SSL3:..method
b450: 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 = SSLv3_method(
b460: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
b470: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
b480: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 O_TLS1) && !defi
b490: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
b4a0: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
b4b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
b4c0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 _METHOD). cas
b4d0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
b4e0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 :..method = TLSv
b4f0: 31 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 1_method();..bre
b500: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
b510: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
b520: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
b530: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
b540: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
b550: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f ENSSL_NO_TLS1_1_
b560: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 METHOD). case
b570: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
b580: 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 1:..method = TLS
b590: 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 v1_1_method();..
b5a0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
b5b0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
b5c0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
b5d0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
b5e0: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
b5f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
b600: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 _2_METHOD). c
b610: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
b620: 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 S1_2:..method =
b630: 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29 TLSv1_2_method()
b640: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
b650: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
b660: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 _TLS1_3) && !def
b670: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
b680: 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 TLS1_3). case
b690: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
b6a0: 33 3a 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 76 3:../*.. * The v
b6b0: 65 72 73 69 6f 6e 20 72 61 6e 67 65 20 69 73 20 ersion range is
b6c0: 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 65 6c 6f constrained belo
b6d0: 77 2c 0a 09 20 2a 20 61 66 74 65 72 20 74 68 65 w,.. * after the
b6e0: 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 context is crea
b6f0: 74 65 64 2e 20 20 55 73 65 20 74 68 65 0a 09 20 ted. Use the..
b700: 2a 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 * generic method
b710: 20 68 65 72 65 2e 0a 09 20 2a 2f 0a 09 6d 65 74 here... */..met
b720: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
b730: 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 TLS_server_meth
b740: 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e od() : TLS_clien
b750: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
b760: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 ak;.#endif. d
b770: 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f efault:../* Nego
b780: 74 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 tiate highest av
b790: 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 ailable SSL/TLS
b7a0: 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 version */..meth
b7b0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
b7c0: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f TLS_server_metho
b7d0: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 d() : TLS_client
b7e0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f _method();.#if O
b7f0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
b800: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
b810: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 00L && !defined(
b820: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 NO_SSL2) && !def
b830: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
b840: 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 SSL2)..off |= (E
b850: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
b860: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 S_PROTO_SSL2)
b870: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
b880: 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 SSLv2);.#endif.#
b890: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 if !defined(NO_S
b8a0: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
b8b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
b8c0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
b8d0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
b8e0: 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 OTO_SSL3) ? 0
b8f0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 : SSL_OP_NO_SSLv
b900: 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 3);.#endif.#if !
b910: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
b920: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
b930: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f NSSL_NO_TLS1)..o
b940: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
b950: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
b960: 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 TLS1) ? 0 : SS
b970: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a L_OP_NO_TLSv1);.
b980: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
b990: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 ned(NO_TLS1_1) &
b9a0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
b9b0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f SL_NO_TLS1_1)..o
b9c0: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
b9d0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
b9e0: 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 TLS1_1) ? 0 : SS
b9f0: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 L_OP_NO_TLSv1_1)
ba00: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
ba10: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
ba20: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
ba30: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a NSSL_NO_TLS1_2).
ba40: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
ba50: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
ba60: 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 O_TLS1_2) ? 0 :
ba70: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f SSL_OP_NO_TLSv1_
ba80: 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 2);.#endif.#if !
ba90: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
baa0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
bab0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
bac0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
bad0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
bae0: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 OTO_TLS1_3) ? 0
baf0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
bb00: 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 1_3);.#endif..br
bb10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 eak;. }..
bb20: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
bb30: 29 3b 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c );. ctx = SSL
bb40: 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 _CTX_new(method)
bb50: 3b 0a 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 ;.. if (!ctx)
bb60: 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 {..return(NULL)
bb70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
bb80: 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f (getenv(SSLKEYLO
bb90: 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 GFILE)) {..SSL_C
bba0: 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 TX_set_keylog_ca
bbb0: 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c llback(ctx, KeyL
bbc0: 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 ogCallback);.
bbd0: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 }..#if !defined
bbe0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 (NO_TLS1_3) && !
bbf0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
bc00: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 NO_TLS1_3). i
bc10: 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f f (proto == TLS_
bc20: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a PROTO_TLS1_3) {.
bc30: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e .SSL_CTX_set_min
bc40: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
bc50: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 tx, TLS1_3_VERSI
bc60: 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 ON);..SSL_CTX_se
bc70: 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 t_max_proto_vers
bc80: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
bc90: 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a VERSION);. }.
bca0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 #endif.. /* F
bcb0: 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 orce cipher sele
bcc0: 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 ction order by s
bcd0: 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 erver */. if
bce0: 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 (!isServer) {..S
bcf0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
bd00: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 ns(ctx, SSL_OP_C
bd10: 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 IPHER_SERVER_PRE
bd20: 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a FERENCE);. }.
bd30: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
bd40: 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 _app_data(ctx, (
bd50: 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f void*)interp);./
bd60: 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 * remember the i
bd70: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 nterpreter */.
bd80: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 SSL_CTX_set_op
bd90: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f tions(ctx, SSL_O
bda0: 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 P_ALL);./* all S
bdb0: 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e SL bug workaroun
bdc0: 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 ds */. SSL_CT
bdd0: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 X_set_options(ct
bde0: 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 x, off);../* dis
bdf0: 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 able protocol ve
be00: 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 rsions */.#if OP
be10: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
be20: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 30 MBER < 0x1010100
be30: 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 0L. SSL_CTX_s
be40: 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c et_mode(ctx, SSL
be50: 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 _MODE_AUTO_RETRY
be60: 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 );./* handle new
be70: 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 handshakes in b
be80: 61 63 6b 67 72 6f 75 6e 64 20 2a 2f 0a 23 65 6e ackground */.#en
be90: 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f dif. SSL_CTX_
bea0: 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 sess_set_cache_s
beb0: 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a ize(ctx, 128);..
bec0: 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 /* Set user
bed0: 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c defined ciphers,
bee0: 20 63 69 70 68 65 72 20 73 75 69 74 65 73 2c 20 cipher suites,
bef0: 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c 65 76 and security lev
bf00: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 28 el */. if (((
bf10: 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 ciphers != NULL)
bf20: 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 && !SSL_CTX_set
bf30: 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 _cipher_list(ctx
bf40: 2c 20 63 69 70 68 65 72 73 29 29 20 7c 7c 20 5c , ciphers)) || \
bf50: 0a 09 28 28 63 69 70 68 65 72 73 75 69 74 65 73 ..((ciphersuites
bf60: 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 != NULL) && !SS
bf70: 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 L_CTX_set_cipher
bf80: 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 suites(ctx, ciph
bf90: 65 72 73 75 69 74 65 73 29 29 29 20 7b 0a 09 20 ersuites))) {..
bfa0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
bfb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 ult(interp, "Set
bfc0: 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 22 ciphers failed"
bfd0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
bfe0: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
bff0: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
c000: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
c010: 29 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f )0;. }.. /
c020: 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 20 6c * Set security l
c030: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 evel */. if (
c040: 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 level > -1 && le
c050: 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 vel < 6) {../* S
c060: 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f SL_set_security_
c070: 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 level */..SSL_CT
c080: 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c X_set_security_l
c090: 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 evel(ctx, level)
c0a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
c0b0: 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 set some callbac
c0c0: 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 ks */. SSL_CT
c0d0: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 X_set_default_pa
c0e0: 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73 sswd_cb(ctx, Pas
c0f0: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a swordCallback);.
c100: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
c110: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 default_passwd_c
c120: 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c 20 b_userdata(ctx,
c130: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
c140: 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 );.. /* read
c150: 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e a Diffie-Hellman
c160: 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 parameters file
c170: 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 69 , or use the bui
c180: 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 lt-in one */.#if
c190: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 def OPENSSL_NO_D
c1a0: 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 H. if (DHpara
c1b0: 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 ms != NULL) {..T
c1c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
c1d0: 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 interp, "DH para
c1e0: 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f meter support no
c1f0: 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 t available", (c
c200: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 har *) NULL);..S
c210: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
c220: 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 ;..return (SSL_C
c230: 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 TX *)0;. }.#e
c240: 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 lse. {..DH* d
c250: 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 h;..if (DHparams
c260: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
c270: 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 BIO *bio;..
c280: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
c290: 26 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d &ds);.. bio =
c2a0: 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 BIO_new_file(F2
c2b0: 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 N(DHparams, &ds)
c2c0: 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 , "r");.. if
c2d0: 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 (!bio) {...Tcl_D
c2e0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
c2f0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
c300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 ult(interp, "Cou
c310: 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 ld not find DH p
c320: 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c arameters file",
c330: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
c340: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
c350: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 28 ctx);...return (
c360: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 20 20 SSL_CTX *)0;..
c370: 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 }... dh = P
c380: 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 EM_read_bio_DHpa
c390: 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 rams(bio, NULL,
c3a0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 NULL, NULL);..
c3b0: 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b BIO_free(bio);
c3c0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
c3d0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 gFree(&ds);..
c3e0: 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63 if (!dh) {...Tc
c3f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
c400: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f nterp, "Could no
c410: 74 20 72 65 61 64 20 44 48 20 70 61 72 61 6d 65 t read DH parame
c420: 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c ters from file",
c430: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
c440: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
c450: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 28 ctx);...return (
c460: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 20 20 SSL_CTX *)0;..
c470: 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 }..} else {..
c480: 20 20 20 64 68 20 3d 20 67 65 74 5f 64 68 50 61 dh = get_dhPa
c490: 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f rams();..}..SSL_
c4a0: 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 CTX_set_tmp_dh(c
c4b0: 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 tx, dh);..DH_fre
c4c0: 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e e(dh);. }.#en
c4d0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 dif.. /* set
c4e0: 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20 our certificate
c4f0: 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 */. load_priv
c500: 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 ate_key = 0;.
c510: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d if (certfile !=
c520: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 NULL) {..load_p
c530: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a rivate_key = 1;.
c540: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 ..Tcl_DStringIni
c550: 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 t(&ds);...if (SS
c560: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 L_CTX_use_certif
c570: 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 icate_file(ctx,
c580: 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 F2N(certfile, &d
c590: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 s), SSL_FILETYPE
c5a0: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 _PEM) <= 0) {..
c5b0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
c5c0: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 ee(&ds);.. Tc
c5d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
c5e0: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
c5f0: 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 o set certificat
c600: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 e file ", certfi
c610: 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 le, ": ",....
c620: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 REASON(), (cha
c630: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
c640: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
c650: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
c660: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d (SSL_CTX *)0;..}
c670: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
c680: 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a cert != NULL) {.
c690: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 .load_private_ke
c6a0: 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f y = 1;..if (SSL_
c6b0: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
c6c0: 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 65 ate_ASN1(ctx, ce
c6d0: 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d rt_len, cert) <=
c6e0: 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 0) {.. Tcl_D
c6f0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
c700: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
c710: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
c720: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 unable to set ce
c730: 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 rtificate: ",...
c740: 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 . REASON(),
c750: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
c760: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 . SSL_CTX_fre
c770: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 e(ctx);.. ret
c780: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
c790: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
c7a0: 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 {..certfile = (c
c7b0: 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 har*)X509_get_de
c7c0: 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 fault_cert_file(
c7d0: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 );...if (SSL_CTX
c7e0: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 _use_certificate
c7f0: 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 _file(ctx, certf
c800: 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ile, SSL_FILETYP
c810: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 E_PEM) <= 0) {.#
c820: 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 if 0.. Tcl_DS
c830: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
c840: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
c850: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
c860: 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 nable to use def
c870: 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 ault certificate
c880: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c file ", certfil
c890: 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 e, ": ",....
c8a0: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
c8b0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
c8c0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
c8d0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 );.. return (
c8e0: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 23 65 6e SSL_CTX *)0;.#en
c8f0: 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 dif..}. }..
c900: 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 /* set our pri
c910: 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 vate key */.
c920: 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 if (load_private
c930: 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 _key) {..if (key
c940: 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 file == NULL &&
c950: 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 key == NULL) {..
c960: 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 keyfile = ce
c970: 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 rtfile;..}...if
c980: 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c (keyfile != NULL
c990: 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 ) {.. /* get
c9a0: 74 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 the private key
c9b0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 associated with
c9c0: 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 this certificate
c9d0: 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 */.. if (key
c9e0: 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a file == NULL) {.
c9f0: 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 ..keyfile = cert
ca00: 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 file;.. }...
ca10: 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 if (SSL_CTX_u
ca20: 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69 se_PrivateKey_fi
ca30: 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 le(ctx, F2N(keyf
ca40: 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 ile, &ds), SSL_F
ca50: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 ILETYPE_PEM) <=
ca60: 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 0) {...Tcl_DStri
ca70: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f ngFree(&ds);.../
ca80: 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 * flush the pass
ca90: 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 phrase which mig
caa0: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 ht be left in th
cab0: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 e result */...Tc
cac0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
cad0: 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 rp, NULL, TCL_ST
cae0: 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 ATIC);...Tcl_App
caf0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
cb00: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 , "unable to set
cb10: 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 public key file
cb20: 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 ", keyfile, " "
cb30: 2c 0a 09 09 09 20 20 20 20 20 20 20 20 20 52 45 ,.... RE
cb40: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
cb50: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 NULL);...SSL_CT
cb60: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
cb70: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
cb80: 29 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 )0;.. }..
cb90: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
cba0: 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 &ds);...} else i
cbb0: 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 f (key != NULL)
cbc0: 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 {.. if (SSL_C
cbd0: 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 TX_use_PrivateKe
cbe0: 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f y_ASN1(EVP_PKEY_
cbf0: 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 RSA, ctx, key,ke
cc00: 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 y_len) <= 0) {..
cc10: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
cc20: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 (&ds);.../* flus
cc30: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 h the passphrase
cc40: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 which might be
cc50: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 left in the resu
cc60: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 lt */...Tcl_SetR
cc70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 esult(interp, NU
cc80: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b LL, TCL_STATIC);
cc90: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
cca0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
ccb0: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 ble to set publi
ccc0: 63 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e c key: ", REASON
ccd0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
cce0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
ccf0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
cd00: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a n (SSL_CTX *)0;.
cd10: 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f . }..}../* No
cd20: 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 w we know that a
cd30: 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 61 key and cert ha
cd40: 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 69 ve been set agai
cd50: 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 nst.. * the SSL
cd60: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 context */..if (
cd70: 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 !SSL_CTX_check_p
cd80: 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29 rivate_key(ctx))
cd90: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
cda0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
cdb0: 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 6f "private key do
cdc0: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 es not match the
cdd0: 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75 62 certificate pub
cde0: 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20 20 lic key",....
cdf0: 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 (char *) NULL)
ce00: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
ce10: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
ce20: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
ce30: 29 30 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 )0;..}. }..
ce40: 20 20 2f 2a 20 53 65 74 20 76 65 72 69 66 69 63 /* Set verific
ce50: 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 ation CAs */.
ce60: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
ce70: 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 (&ds);. Tcl_D
ce80: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 StringInit(&ds1)
ce90: 3b 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 ;. if (!SSL_C
cea0: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c TX_load_verify_l
ceb0: 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 ocations(ctx, F2
cec0: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 N(CAfile, &ds),
ced0: 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31 29 F2N(CAdir, &ds1)
cee0: 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73 ) ||..!SSL_CTX_s
cef0: 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 et_default_verif
cf00: 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a y_paths(ctx)) {.
cf10: 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 69 #if 0..Tcl_DStri
cf20: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 54 63 ngFree(&ds);..Tc
cf30: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
cf40: 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 s1);../* Don't c
cf50: 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20 69 66 urrently care if
cf60: 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09 this fails */..
cf70: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
cf80: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 65 (interp, "SSL de
cf90: 66 61 75 6c 74 20 76 65 72 69 66 79 20 70 61 74 fault verify pat
cfa0: 68 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c hs: ", REASON(),
cfb0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
cfc0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
cfd0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 tx);..return (SS
cfe0: 4c 5f 43 54 58 20 2a 29 30 3b 0a 23 65 6e 64 69 L_CTX *)0;.#endi
cff0: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 f. }.. /*
d000: 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f https://sourcefo
d010: 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 rge.net/p/tls/bu
d020: 67 73 2f 35 37 2f 20 2a 2f 0a 20 20 20 20 2f 2a gs/57/ */. /*
d030: 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 XXX:TODO: Let t
d040: 68 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 he user supply v
d050: 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 alues here inste
d060: 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 ad of something
d070: 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 that exists on t
d080: 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f he filesystem */
d090: 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 . if (CAfile
d0a0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 53 54 41 43 != NULL) {..STAC
d0b0: 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 K_OF(X509_NAME)
d0c0: 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c *certNames = SSL
d0d0: 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f _load_client_CA_
d0e0: 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c file(F2N(CAfile,
d0f0: 20 26 64 73 29 29 3b 0a 09 69 66 20 28 63 65 72 &ds));..if (cer
d100: 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 tNames != NULL)
d110: 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 {.. SSL_CTX_s
d120: 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 et_client_CA_lis
d130: 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 t(ctx, certNames
d140: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
d150: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
d160: 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 (&ds);. Tcl_D
d170: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 StringFree(&ds1)
d180: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 ;. return ctx
d190: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
d1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
d1e0: 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d *. * StatusObjCm
d1f0: 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 d -- return cert
d200: 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e ificate for conn
d210: 65 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 ected peer.. *.
d220: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
d230: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
d240: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
d250: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
d260: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
d270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
d2b0: 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 tatic int.Status
d2c0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
d2d0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
d2e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
d2f0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
d300: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
d310: 5d 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a ]) {. State *
d320: 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 statePtr;. X5
d330: 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 09 *peer;. Tc
d340: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 l_Obj *objPtr;.
d350: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
d360: 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 han;. char *c
d370: 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 hannelName, *cip
d380: 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f hers;. int mo
d390: 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e de;. const un
d3a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f signed char *pro
d3b0: 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 to;. unsigned
d3c0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 68 int len;. ch
d3d0: 61 72 20 2a 70 65 65 72 6e 61 6d 65 20 3d 20 4e ar *peername = N
d3e0: 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ULL;.. dprint
d3f0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
d400: 20 20 73 77 69 74 63 68 20 28 6f 62 6a 63 29 20 switch (objc)
d410: 7b 0a 09 63 61 73 65 20 32 3a 0a 09 20 20 20 20 {..case 2:..
d420: 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 channelName = Tc
d430: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
d440: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c bj(objv[1], NULL
d450: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a );.. break;..
d460: 09 63 61 73 65 20 33 3a 0a 09 20 20 20 20 69 66 .case 3:.. if
d470: 20 28 21 73 74 72 63 6d 70 20 28 54 63 6c 5f 47 (!strcmp (Tcl_G
d480: 65 74 53 74 72 69 6e 67 20 28 6f 62 6a 76 5b 31 etString (objv[1
d490: 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 20 7b ]), "-local")) {
d4a0: 0a 09 09 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d ...channelName =
d4b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
d4c0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 4e omObj(objv[2], N
d4d0: 55 4c 4c 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 ULL);...break;..
d4e0: 20 20 20 20 7d 0a 09 20 20 20 20 2f 2a 20 65 6c }.. /* el
d4f0: 73 65 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 se fall-through
d500: 2e 2e 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e ... */.#if defin
d510: 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 20 20 ed(__GNUC__)..
d520: 20 20 5f 5f 61 74 74 72 69 62 75 74 65 5f 5f 28 __attribute__(
d530: 28 66 61 6c 6c 74 68 72 6f 75 67 68 29 29 3b 0a (fallthrough));.
d540: 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a #endif..default:
d550: 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e .. Tcl_WrongN
d560: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
d570: 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c , objv, "?-local
d580: 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 20 20 ? channel");..
d590: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
d5a0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 OR;. }.. c
d5b0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
d5c0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 nnel(interp, cha
d5d0: 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 nnelName, &mode)
d5e0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
d5f0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
d600: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
d610: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
d620: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
d630: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
d640: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
d650: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
d660: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
d670: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 nel(chan);. i
d680: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
d690: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
d6a0: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
d6b0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
d6c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
d6d0: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
d6e0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
d6f0: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a me(chan),..."\":
d700: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e not a TLS chann
d710: 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 el", NULL);..ret
d720: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
d730: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 }. statePt
d740: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 r = (State *) Tc
d750: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
d760: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a anceData(chan);.
d770: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 if (objc ==
d780: 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 2) {..peer = SSL
d790: 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 _get_peer_certif
d7a0: 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e icate(statePtr->
d7b0: 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ssl);. } else
d7c0: 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 {..peer = SSL_g
d7d0: 65 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 et_certificate(s
d7e0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
d7f0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 65 65 }. if (pee
d800: 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 r) {..objPtr = T
d810: 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e ls_NewX509Obj(in
d820: 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 terp, peer);..if
d830: 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 20 58 (objc == 2) { X
d840: 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 20 509_free(peer);
d850: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 }. } else {..
d860: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
d870: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
d880: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
d890: 50 65 65 72 20 63 65 72 74 20 63 68 61 69 6e 20 Peer cert chain
d8a0: 28 63 6c 69 65 6e 74 20 6f 6e 6c 79 29 20 2a 2f (client only) */
d8b0: 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 . STACK_OF(X5
d8c0: 30 39 29 2a 20 73 73 6c 5f 63 65 72 74 73 20 3d 09)* ssl_certs =
d8d0: 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 SSL_get_peer_ce
d8e0: 72 74 5f 63 68 61 69 6e 28 73 74 61 74 65 50 74 rt_chain(statePt
d8f0: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 r->ssl);. if
d900: 28 21 70 65 65 72 20 26 26 20 28 73 73 6c 5f 63 (!peer && (ssl_c
d910: 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 erts == NULL ||
d920: 73 6b 5f 58 35 30 39 5f 6e 75 6d 28 73 73 6c 5f sk_X509_num(ssl_
d930: 63 65 72 74 73 29 20 3d 3d 20 30 29 29 20 7b 0a certs) == 0)) {.
d940: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
d950: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
d960: 20 50 65 65 72 20 6e 61 6d 65 20 66 72 6f 6d 20 Peer name from
d970: 63 65 72 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 cert */. if (
d980: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 SSL_get_verify_r
d990: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e esult(statePtr->
d9a0: 73 73 6c 29 20 3d 3d 20 58 35 30 39 5f 56 5f 4f ssl) == X509_V_O
d9b0: 4b 29 20 7b 0a 09 70 65 65 72 6e 61 6d 65 20 3d K) {..peername =
d9c0: 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 SSL_get0_peerna
d9d0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c me(statePtr->ssl
d9e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c );. }. Tcl
d9f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
da00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
da10: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
da20: 69 6e 67 4f 62 6a 28 22 70 65 65 72 6e 61 6d 65 ingObj("peername
da30: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
da40: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
da50: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
da60: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
da70: 69 6e 67 4f 62 6a 28 70 65 65 72 6e 61 6d 65 2c ingObj(peername,
da80: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f -1));.. Tcl_
da90: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
daa0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
dab0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
dac0: 6e 67 4f 62 6a 28 22 73 62 69 74 73 22 2c 20 2d ngObj("sbits", -
dad0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
dae0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
daf0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
db00: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
db10: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 SSL_get_cipher_b
db20: 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 its(statePtr->ss
db30: 6c 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 20 l, NULL)));..
db40: 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 ciphers = (char
db50: 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 *)SSL_get_cipher
db60: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
db70: 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72 . if ((cipher
db80: 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 28 73 s != NULL) && (s
db90: 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c 20 22 trcmp(ciphers, "
dba0: 28 4e 4f 4e 45 29 22 29 20 21 3d 20 30 29 29 20 (NONE)") != 0))
dbb0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
dbc0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
dbd0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
dbe0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 NewStringObj("ci
dbf0: 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 pher", -1));..Tc
dc00: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
dc10: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
dc20: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
dc30: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f ringObj(SSL_get_
dc40: 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d cipher(statePtr-
dc50: 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 >ssl), -1));.
dc60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 }.. /* Verif
dc70: 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 y the X509 certi
dc80: 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 ficate presented
dc90: 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a by the peer */.
dca0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
dcb0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
dcc0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
dcd0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 _NewStringObj("v
dce0: 61 6c 69 64 61 74 69 6f 6e 22 2c 20 2d 31 29 29 alidation", -1))
dcf0: 3b 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 67 65 ;. if (SSL_ge
dd00: 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 t_verify_result(
dd10: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 21 statePtr->ssl) !
dd20: 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 = X509_V_OK) {..
dd30: 2f 2a 20 70 72 6f 74 6f 20 3d 20 22 66 61 69 6c /* proto = "fail
dd40: 65 64 22 3b 20 2a 2f 0a 09 70 72 6f 74 6f 20 3d ed"; */..proto =
dd50: 20 52 45 41 53 4f 4e 28 29 3b 0a 20 20 20 20 7d REASON();. }
dd60: 20 65 6c 73 65 20 7b 0a 09 70 72 6f 74 6f 20 3d else {..proto =
dd70: 20 22 6f 6b 22 3b 0a 20 20 20 20 7d 0a 20 20 20 "ok";. }.
dd80: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
dd90: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
dda0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
ddb0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
ddc0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 , -1));.. /*
ddd0: 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 Report the selec
dde0: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 ted protocol as
ddf0: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 a result of the
de00: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 negotiation */.
de10: 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e SSL_get0_alpn
de20: 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 _selected(stateP
de30: 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c tr->ssl, &proto,
de40: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f &len);. Tcl_
de50: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
de60: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
de70: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
de80: 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 ngObj("alpn", -1
de90: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
dea0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
deb0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
dec0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
ded0: 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c j((char *)proto,
dee0: 20 28 69 6e 74 29 6c 65 6e 29 29 3b 0a 20 20 20 (int)len));.
def0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
df00: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
df10: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
df20: 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 73 wStringObj("vers
df30: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ion", -1));.
df40: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
df50: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
df60: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
df70: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 StringObj(SSL_ge
df80: 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 t_version(stateP
df90: 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a tr->ssl), -1));.
dfa0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
dfb0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
dfc0: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 jPtr);. retur
dfd0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e n TCL_OK;..clien
dfe0: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 tData = clientDa
dff0: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ta;.}.../*. *---
e000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e040: 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f . *. * Connectio
e050: 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 nInfoObjCmd -- r
e060: 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e eturn connection
e070: 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 info from OpenS
e080: 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 SL.. *. * Result
e090: 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 s:. *.A list of
e0a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a connection info.
e0b0: 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *----------
e0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
e100: 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 tatic int Connec
e110: 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 tionInfoObjCmd(C
e120: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
e130: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
e140: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
e150: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
e160: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
e170: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
e180: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e n;../* The chann
e190: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 el to set a mode
e1a0: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 on. */. Stat
e1b0: 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a e *statePtr;../*
e1c0: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f client state fo
e1d0: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a r ssl socket */.
e1e0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
e1f0: 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 Ptr;. const S
e200: 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e SL *ssl;. con
e210: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 st SSL_CIPHER *c
e220: 69 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 ipher;. const
e230: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 SSL_SESSION *se
e240: 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 ssion;. const
e250: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
e260: 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 proto;. unsig
e270: 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 ned int len;.
e280: 20 6c 6f 6e 67 20 6d 6f 64 65 3b 0a 0a 20 20 20 long mode;..
e290: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 if (objc != 2)
e2a0: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
e2b0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
e2c0: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b bjv, "channel");
e2d0: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
e2e0: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
e2f0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
e300: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 annel(interp, Tc
e310: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
e320: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c bj(objv[1], NULL
e330: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 ), NULL);. if
e340: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
e350: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
e360: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f .return(TCL_ERRO
e370: 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f R);. }.. /
e380: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
e390: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
e3a0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
e3b0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
e3c0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
e3d0: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c an);. if (Tcl
e3e0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
e3f0: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
e400: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 nnelType()) {..T
e410: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
e420: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
e430: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
e440: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
e450: 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 n), "\": not a T
e460: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
e470: 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f L);..return(TCL_
e480: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 ERROR);. }..
e490: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
e4a0: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
e4b0: 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e LL);.. /* Con
e4c0: 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a nection info */.
e4d0: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
e4e0: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 State *)Tcl_GetC
e4f0: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
e500: 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 ta(chan);. ss
e510: 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 l = statePtr->ss
e520: 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 l;. if (ssl !
e530: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f = NULL) {../* co
e540: 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a nnection state *
e550: 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
e560: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
e570: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
e580: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 NewStringObj("st
e590: 61 74 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ate", -1));..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 53 53 4c 5f 73 74 61 74 65 ingObj(SSL_state
e5e0: 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c _string_long(ssl
e5f0: 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 ), -1));.../* Ge
e600: 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f t server name */
e610: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
e620: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
e630: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
e640: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 72 ewStringObj("ser
e650: 76 65 72 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a vername", -1));.
e660: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
e670: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
e680: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
e690: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 wStringObj(SSL_g
e6a0: 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 et_servername(ss
e6b0: 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 l, TLSEXT_NAMETY
e6c0: 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d PE_host_name), -
e6d0: 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 1));.../* Get pr
e6e0: 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 54 63 6c 5f 4c otocol */..Tcl_L
e6f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
e700: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
e710: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
e720: 67 4f 62 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c gObj("protocol",
e730: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..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 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f j(SSL_get_versio
e780: 6e 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 09 n(ssl), -1));...
e790: 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e /* Renegotiation
e7a0: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 54 63 6c allowed */..Tcl
e7b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
e7c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
e7d0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
e7e0: 69 6e 67 4f 62 6a 28 22 72 65 6e 65 67 6f 74 69 ingObj("renegoti
e7f0: 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 ation", -1));..T
e800: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
e810: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
e820: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
e830: 74 72 69 6e 67 4f 62 6a 28 0a 09 20 20 20 20 53 tringObj(.. S
e840: 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 SL_get_secure_re
e850: 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 negotiation_supp
e860: 6f 72 74 28 73 73 6c 29 20 3f 20 22 73 75 70 70 ort(ssl) ? "supp
e870: 6f 72 74 65 64 22 20 3a 20 22 6e 6f 74 20 73 75 orted" : "not su
e880: 70 70 6f 72 74 65 64 22 2c 20 2d 31 29 29 3b 0a pported", -1));.
e890: 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 ../* Report the
e8a0: 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f selected protoco
e8b0: 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 l as a result of
e8c0: 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 the ALPN negoti
e8d0: 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 67 65 ation */..SSL_ge
e8e0: 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 t0_alpn_selected
e8f0: 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c (ssl, &proto, &l
e900: 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 en);..Tcl_ListOb
e910: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
e920: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
e930: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
e940: 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 "alpn", -1));..T
e950: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
e960: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
e970: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
e980: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a tringObj((char *
e990: 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 6c 65 6e )proto, (int)len
e9a0: 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 ));.../* Get sec
e9b0: 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 urity level */..
e9c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
e9d0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
e9e0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
e9f0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 75 72 StringObj("secur
ea00: 69 74 79 6c 65 76 65 6c 22 2c 20 2d 31 29 29 3b itylevel", -1));
ea10: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
ea20: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
ea30: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
ea40: 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 ewIntObj(SSL_get
ea50: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 _security_level(
ea60: 73 73 6c 29 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 ssl)));. }..
ea70: 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 /* Cipher inf
ea80: 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20 o */. cipher
ea90: 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e = SSL_get_curren
eaa0: 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 t_cipher(ssl);.
eab0: 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d if (cipher !=
eac0: 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 NULL) {..char b
ead0: 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d uf[BUFSIZ] = {0}
eae0: 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 ;..int bits, alg
eaf0: 5f 62 69 74 73 3b 0a 0a 09 54 63 6c 5f 4c 69 73 _bits;...Tcl_Lis
eb00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
eb10: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
eb20: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
eb30: 62 6a 28 22 63 69 70 68 65 72 22 2c 20 2d 31 29 bj("cipher", -1)
eb40: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
eb50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
eb60: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
eb70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
eb80: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d L_CIPHER_get_nam
eb90: 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b e(cipher), -1));
eba0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
ebb0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
ebc0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
ebd0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 ewStringObj("sta
ebe0: 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 2d 31 29 ndard_name", -1)
ebf0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
ec00: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
ec10: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
ec20: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
ec30: 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 L_CIPHER_standar
ec40: 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 d_name(cipher),
ec50: 2d 31 29 29 3b 0a 0a 09 62 69 74 73 20 3d 20 53 -1));...bits = S
ec60: 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 SL_CIPHER_get_bi
ec70: 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f ts(cipher, &alg_
ec80: 62 69 74 73 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 bits);..Tcl_List
ec90: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
eca0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
ecb0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
ecc0: 6a 28 22 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a j("bits", -1));.
ecd0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
ece0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
ecf0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
ed00: 77 49 6e 74 4f 62 6a 28 62 69 74 73 29 29 3b 0a wIntObj(bits));.
ed10: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
ed20: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
ed30: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
ed40: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 72 wStringObj("secr
ed50: 65 74 5f 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a et_bits", -1));.
ed60: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
ed70: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
ed80: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
ed90: 77 49 6e 74 4f 62 6a 28 61 6c 67 5f 62 69 74 73 wIntObj(alg_bits
eda0: 29 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 ));../* alg_bits
edb0: 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 is actual key s
edc0: 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 ecret bits. If u
edd0: 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 se bits and secr
ede0: 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 et (algorithm) b
edf0: 69 74 73 20 64 69 66 66 65 72 2c 0a 20 20 20 20 its differ,.
ee00: 20 20 20 20 20 20 20 74 68 65 20 72 65 73 74 20 the rest
ee10: 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 20 of the bits are
ee20: 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 fixed, i.e. for
ee30: 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 limited export c
ee40: 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 iphers (bits < 5
ee50: 36 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 6) */..Tcl_ListO
ee60: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
ee70: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
ee80: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
ee90: 28 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 ("min_version",
eea0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
eeb0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
eec0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
eed0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
eee0: 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f (SSL_CIPHER_get_
eef0: 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c version(cipher),
ef00: 20 2d 31 29 29 3b 0a 0a 09 69 66 20 28 53 53 4c -1));...if (SSL
ef10: 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 _CIPHER_descript
ef20: 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c ion(cipher, buf,
ef30: 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d sizeof(buf)) !=
ef40: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 NULL) {.. Tc
ef50: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
ef60: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
ef70: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
ef80: 72 69 6e 67 4f 62 6a 28 22 64 65 73 63 72 69 70 ringObj("descrip
ef90: 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 20 20 tion", -1));..
efa0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
efb0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
efc0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
efd0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c ewStringObj(buf,
efe0: 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a -1));..}. }.
eff0: 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 . /* Session
f000: 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 info */. sess
f010: 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 ion = SSL_get_se
f020: 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 ssion(ssl);.
f030: 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e if (session != N
f040: 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e ULL) {..const un
f050: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 signed char *tic
f060: 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e ket;..size_t len
f070: 32 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 2;..const unsign
f080: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e ed char *session
f090: 5f 69 64 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f _id;.../* Sessio
f0a0: 6e 20 69 6e 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c n info */..Tcl_L
f0b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f0c0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
f0d0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
f0e0: 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 72 65 gObj("session_re
f0f0: 75 73 65 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 used", -1));..Tc
f100: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
f110: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
f120: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e bjPtr, Tcl_NewIn
f130: 74 4f 62 6a 28 53 53 4c 5f 73 65 73 73 69 6f 6e tObj(SSL_session
f140: 5f 72 65 75 73 65 64 28 73 73 6c 29 29 29 3b 0a _reused(ssl)));.
f150: 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 ../* Session id
f160: 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 */..Tcl_ListObjA
f170: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f180: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f190: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 _NewStringObj("s
f1a0: 65 73 73 69 6f 6e 5f 69 64 22 2c 20 2d 31 29 29 ession_id", -1))
f1b0: 3b 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 ;..session_id =
f1c0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
f1d0: 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 6c 65 6e id(session, &len
f1e0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
f1f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f200: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f210: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 _NewStringObj(se
f220: 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 6c ssion_id, (int)l
f230: 65 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 en));.../* Sessi
f240: 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 on ticket - clie
f250: 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f nt only */..SSL_
f260: 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 SESSION_get0_tic
f270: 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 ket(session, &ti
f280: 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 cket, &len2);..T
f290: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
f2a0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
f2b0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
f2c0: 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f tringObj("sessio
f2d0: 6e 5f 74 69 63 6b 65 74 22 2c 20 2d 31 29 29 3b n_ticket", -1));
f2e0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
f2f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
f300: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
f310: 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 69 63 6b ewStringObj(tick
f320: 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 et, (int) len2))
f330: 3b 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 ;.../* Resumable
f340: 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 54 63 6c session */..Tcl
f350: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
f360: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
f370: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
f380: 69 6e 67 4f 62 6a 28 22 72 65 73 75 6d 61 62 6c ingObj("resumabl
f390: 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c e", -1));..Tcl_L
f3a0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f3b0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
f3c0: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 tr, Tcl_NewIntOb
f3d0: 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 j(SSL_SESSION_is
f3e0: 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 _resumable(sessi
f3f0: 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 74 61 72 on)));.../* Star
f400: 74 20 74 69 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c t time */..Tcl_L
f410: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f420: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
f430: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
f440: 67 4f 62 6a 28 22 73 74 61 72 74 5f 74 69 6d 65 gObj("start_time
f450: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
f460: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f470: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
f480: 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 r, Tcl_NewLongOb
f490: 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 j(SSL_SESSION_ge
f4a0: 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 t_time(session))
f4b0: 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 );.../* Timeout
f4c0: 76 61 6c 75 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 value */..Tcl_Li
f4d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f4e0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
f4f0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
f500: 4f 62 6a 28 22 74 69 6d 65 6f 75 74 22 2c 20 2d Obj("timeout", -
f510: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
f520: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
f530: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
f540: 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 cl_NewLongObj(SS
f550: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
f560: 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 29 meout(session)))
f570: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
f580: 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f Compression info
f590: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 */. if (ssl
f5a0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 != NULL) {.#ifde
f5b0: 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 f HAVE_SSL_COMPR
f5c0: 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f ESSION..const CO
f5d0: 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c MP_METHOD *comp,
f5e0: 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 *expn;..comp =
f5f0: 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f SSL_get_current_
f600: 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 compression(ssl)
f610: 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 ;..expn = SSL_ge
f620: 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 t_current_expans
f630: 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 54 63 6c 5f ion(ssl);...Tcl_
f640: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
f650: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
f660: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
f670: 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65 73 73 69 ngObj("compressi
f680: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f on", -1));..Tcl_
f690: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
f6a0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
f6b0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
f6c0: 6e 67 4f 62 6a 28 63 6f 6d 70 20 3f 20 53 53 4c ngObj(comp ? SSL
f6d0: 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 _COMP_get_name(c
f6e0: 6f 6d 70 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d omp) : "NONE", -
f6f0: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
f700: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
f710: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
f720: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
f730: 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 "expansion", -1)
f740: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
f750: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f760: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f770: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 65 78 _NewStringObj(ex
f780: 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 pn ? SSL_COMP_ge
f790: 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 t_name(expn) : "
f7a0: 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 65 6c NONE", -1));.#el
f7b0: 73 65 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 se..Tcl_ListObjA
f7c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f7d0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f7e0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 _NewStringObj("c
f7f0: 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 ompression", -1)
f800: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
f810: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f820: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f830: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e _NewStringObj("N
f840: 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ONE", -1));..Tcl
f850: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
f860: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
f870: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
f880: 69 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f ingObj("expansio
f890: 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c n", -1));..Tcl_L
f8a0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f8b0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
f8c0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
f8d0: 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 gObj("NONE", -1)
f8e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
f8f0: 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 . /* Server i
f900: 6e 66 6f 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 nfo */. mode
f910: 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 = SSL_CTX_get_se
f920: 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 ssion_cache_mode
f930: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b (statePtr->ctx);
f940: 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 20 . if (mode &
f950: 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f SSL_SESS_CACHE_O
f960: 46 46 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 FF) {..proto = "
f970: 6f 66 66 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 off";. } else
f980: 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f if (mode & SSL_
f990: 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e SESS_CACHE_CLIEN
f9a0: 54 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 63 T) {..proto = "c
f9b0: 6c 69 65 6e 74 22 3b 0a 20 20 20 20 7d 20 65 6c lient";. } el
f9c0: 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 se if (mode & SS
f9d0: 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 L_SESS_CACHE_SER
f9e0: 56 45 52 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 VER) {..proto =
f9f0: 22 73 65 72 76 65 72 22 3b 0a 20 20 20 20 7d 20 "server";. }
fa00: 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 else if (mode &
fa10: 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 SSL_SESS_CACHE_B
fa20: 4f 54 48 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 OTH) {..proto =
fa30: 22 62 6f 74 68 22 3b 0a 20 20 20 20 7d 20 65 6c "both";. } el
fa40: 73 65 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 75 se {..proto = "u
fa50: 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 20 nknown";. }.
fa60: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
fa70: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
fa80: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
fa90: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 NewStringObj("se
faa0: 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 ssion_cache_mode
fab0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
fac0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
fad0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
fae0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
faf0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 2c 20 2d 31 ingObj(proto, -1
fb00: 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 ));.. Tcl_Set
fb10: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
fb20: 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 , objPtr);. r
fb30: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
fb40: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
fb50: 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ntData;.}.../*.
fb60: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
fb70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fba0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 ----. *. * Versi
fbb0: 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 onObjCmd -- retu
fbc0: 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e rn version strin
fbd0: 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a g from OpenSSL..
fbe0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
fbf0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
fc00: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
fc10: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
fc20: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
fc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
fc70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 */.static int.Ve
fc80: 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 rsionObjCmd(Clie
fc90: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
fca0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
fcb0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
fcc0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
fcd0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
fce0: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a l_Obj *objPtr;..
fcf0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
fd00: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 led");.. objP
fd10: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 tr = Tcl_NewStri
fd20: 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 ngObj(OPENSSL_VE
fd30: 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b RSION_TEXT, -1);
fd40: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
fd50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
fd60: 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 jPtr);.. retu
fd70: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
fd80: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
fd90: 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a ata;..objc = obj
fda0: 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b c;..objv = objv;
fdb0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
fdc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
fe00: 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d . * MiscObjCmd -
fe10: 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a - misc commands.
fe20: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
fe30: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
fe40: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
fe50: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
fe60: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
fe70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
feb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 */.static int.Mi
fec0: 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 scObjCmd(ClientD
fed0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
fee0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
fef0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
ff00: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
ff10: 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69 v[]) {. stati
ff20: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f c const char *co
ff30: 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 mmands [] = { "r
ff40: 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e eq", "strreq", N
ff50: 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 ULL };. enum
ff60: 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c command { C_REQ,
ff70: 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d C_STRREQ, C_DUM
ff80: 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d MY };. int cm
ff90: 64 2c 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 d, isStr;. ch
ffa0: 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d ar buffer[16384]
ffb0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
ffc0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
ffd0: 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 f (objc < 2) {..
ffe0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
fff0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
10000 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 , "subcommand ?a
10010 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 rgs?");..return
10020 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
10030 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
10040 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 IndexFromObj(int
10050 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f erp, objv[1], co
10060 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 mmands, "command
10070 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d 20 54 43 ", 0,&cmd) != TC
10080 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
10090 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
100a0 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 .. isStr = (c
100b0 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b md == C_STRREQ);
100c0 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e . switch ((en
100d0 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 um command) cmd)
100e0 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a {..case C_REQ:.
100f0 09 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 .case C_STRREQ:
10100 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 {.. EVP_PKEY
10110 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 *pkey=NULL;..
10120 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c X509 *cert=NULL
10130 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 ;.. X509_NAME
10140 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 *name=NULL;..
10150 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 Tcl_Obj **list
10160 76 3b 0a 09 20 20 20 20 69 6e 74 20 6c 69 73 74 v;.. int list
10170 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a c,i;... BIO *
10180 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 out=NULL;...
10190 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f char *k_C="",*k_
101a0 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b ST="",*k_L="",*k
101b0 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a _O="",*k_OU="",*
101c0 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c k_CN="",*k_Email
101d0 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a ="";.. char *
101e0 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a keyout,*pemout,*
101f0 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 str;.. int ke
10200 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 ysize,serial=0,d
10210 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 ays=365;..#if OP
10220 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
10230 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
10240 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 0L.. BIGNUM *
10250 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 bne = NULL;..
10260 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c RSA *rsa = NULL
10270 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50 ;.#else.. EVP
10280 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d _PKEY_CTX *ctx =
10290 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 NULL;.#endif...
102a0 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 if ((objc<5)
102b0 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a || (objc>6)) {.
102c0 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
102d0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 gs(interp, 2, ob
102e0 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 jv, "keysize key
102f0 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 file certfile ?i
10300 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e nfo?");...return
10310 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 TCL_ERROR;..
10320 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c }... if (Tcl
10330 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 _GetIntFromObj(i
10340 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 nterp, objv[2],
10350 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c &keysize) != TCL
10360 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 _OK) {...return
10370 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 TCL_ERROR;..
10380 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 }.. keyout=Tc
10390 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
103a0 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 [3]);.. pemou
103b0 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 t=Tcl_GetString(
103c0 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 objv[4]);.. i
103d0 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63 f (isStr) {...Tc
103e0 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
103f0 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 keyout,"",0);...
10400 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 Tcl_SetVar(inter
10410 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a p,pemout,"",0);.
10420 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 . }... if
10430 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 (objc>=6) {...if
10440 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 (Tcl_ListObjGet
10450 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c Elements(interp,
10460 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09 26 6c 69 objv[5],....&li
10470 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 stc, &listv) !=
10480 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 TCL_OK) {...
10490 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
104a0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 ;...}....if ((li
104b0 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 stc%2) != 0) {..
104c0 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 . Tcl_SetResu
104d0 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 lt(interp,"Infor
104e0 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 mation list must
104f0 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 have even numbe
10500 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c r of arguments",
10510 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 NULL);... ret
10520 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
10530 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 .}...for (i=0; i
10540 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a <listc; i+=2) {.
10550 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 .. str=Tcl_Ge
10560 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d tString(listv[i]
10570 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 );... if (str
10580 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d cmp(str,"days")=
10590 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c =0) {....if (Tcl
105a0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 _GetIntFromObj(i
105b0 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d nterp,listv[i+1]
105c0 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 ,&days)!=TCL_OK)
105d0 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 .... return T
105e0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 CL_ERROR;...
105f0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
10600 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d p(str,"serial")=
10610 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c =0) {....if (Tcl
10620 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 _GetIntFromObj(i
10630 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d nterp,listv[i+1]
10640 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f ,&serial)!=TCL_O
10650 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e K).... return
10660 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 TCL_ERROR;...
10670 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
10680 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 cmp(str,"C")==0)
10690 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 {....k_C=Tcl_Ge
106a0 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
106b0 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
106c0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
106d0 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 ,"ST")==0) {....
106e0 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 k_ST=Tcl_GetStri
106f0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
10700 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
10710 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 (strcmp(str,"L")
10720 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 ==0) {....k_L=Tc
10730 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
10740 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
10750 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
10760 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a (str,"O")==0) {.
10770 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 ...k_O=Tcl_GetSt
10780 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
10790 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
107a0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f f (strcmp(str,"O
107b0 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f U")==0) {....k_O
107c0 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 U=Tcl_GetString(
107d0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
107e0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
107f0 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d rcmp(str,"CN")==
10800 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 0) {....k_CN=Tcl
10810 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
10820 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
10830 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
10840 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 str,"Email")==0)
10850 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 {....k_Email=Tc
10860 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
10870 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
10880 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 else {....Tcl_S
10890 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
108a0 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 "Unknown paramet
108b0 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 er",NULL);....re
108c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
108d0 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 .. }...}..
108e0 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f }..#if OPENSSL_
108f0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
10900 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 0x30000000L..
10910 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 bne = BN_new()
10920 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 ;.. rsa = RSA
10930 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 _new();.. pke
10940 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 y = EVP_PKEY_new
10950 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 ();.. if (bne
10960 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 == NULL || rsa
10970 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 == NULL || pkey
10980 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 == NULL || !BN_s
10990 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f et_word(bne,RSA_
109a0 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 F4) ||...!RSA_ge
109b0 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 nerate_key_ex(rs
109c0 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c a, keysize, bne,
109d0 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 NULL) || !EVP_P
109e0 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 KEY_assign_RSA(p
109f0 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 key, rsa)) {...E
10a00 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 VP_PKEY_free(pke
10a10 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 y);.../* RSA_fre
10a20 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 e(rsa); freed by
10a30 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a EVP_PKEY_free *
10a40 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 /...BN_free(bne)
10a50 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 ;.#else.. pke
10a60 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 y = EVP_RSA_gen(
10a70 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b (unsigned int) k
10a80 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 eysize);.. ct
10a90 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 x = EVP_PKEY_CTX
10aa0 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b _new(pkey,NULL);
10ab0 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d .. if (pkey =
10ac0 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d = NULL || ctx ==
10ad0 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b NULL || !EVP_PK
10ae0 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 EY_keygen_init(c
10af0 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b tx) ||...!EVP_PK
10b00 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b EY_CTX_set_rsa_k
10b10 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 eygen_bits(ctx,
10b20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 keysize) || !EVP
10b30 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 _PKEY_keygen(ctx
10b40 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 , &pkey)) {...EV
10b50 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 P_PKEY_free(pkey
10b60 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 );...EVP_PKEY_CT
10b70 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e X_free(ctx);.#en
10b80 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 dif...Tcl_SetRes
10b90 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f ult(interp,"Erro
10ba0 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 r generating pri
10bb0 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b vate key",NULL);
10bc0 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
10bd0 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 ROR;.. } else
10be0 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 {...if (isStr)
10bf0 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f {... out=BIO_
10c00 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 new(BIO_s_mem())
10c10 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 ;... PEM_writ
10c20 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 e_bio_PrivateKey
10c30 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e (out,pkey,NULL,N
10c40 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 ULL,0,NULL,NULL)
10c50 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 ;... i=BIO_re
10c60 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 ad(out,buffer,si
10c70 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b zeof(buffer)-1);
10c80 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f ... i=(i<0) ?
10c90 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 0 : i;... bu
10ca0 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 ffer[i]='\0';...
10cb0 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 Tcl_SetVar(i
10cc0 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 nterp,keyout,buf
10cd0 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 fer,0);... BI
10ce0 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 O_flush(out);...
10cf0 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 BIO_free(out
10d00 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 );...} else {...
10d10 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 out=BIO_new(
10d20 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 BIO_s_file());..
10d30 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 . BIO_write_f
10d40 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f ilename(out,keyo
10d50 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ut);... PEM_w
10d60 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 rite_bio_Private
10d70 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c Key(out,pkey,NUL
10d80 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 L,NULL,0,NULL,NU
10d90 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 LL);... /* PE
10da0 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 M_write_bio_RSAP
10db0 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 rivateKey(out, r
10dc0 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 sa, NULL, NULL,
10dd0 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 0, NULL, NULL);
10de0 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 */... BIO_fre
10df0 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d e_all(out);.. .}
10e00 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 ....if ((cert=X5
10e10 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 09_new())==NULL)
10e20 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 {... Tcl_Set
10e30 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 Result(interp,"E
10e40 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 rror generating
10e50 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75 certificate requ
10e60 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 est",NULL);...
10e70 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 EVP_PKEY_free(
10e80 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 pkey);.#if OPENS
10e90 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
10ea0 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
10eb0 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e .. BN_free(bn
10ec0 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 e);.#endif...
10ed0 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f return(TCL_ERRO
10ee0 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f R);...}....X509_
10ef0 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 set_version(cert
10f00 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 ,2);...ASN1_INTE
10f10 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 GER_set(X509_get
10f20 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 _serialNumber(ce
10f30 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 rt),serial);...X
10f40 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 509_gmtime_adj(X
10f50 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 509_getm_notBefo
10f60 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 re(cert),0);...X
10f70 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 509_gmtime_adj(X
10f80 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 509_getm_notAfte
10f90 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 r(cert),(long)60
10fa0 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 *60*24*days);...
10fb0 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 X509_set_pubkey(
10fc0 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e cert,pkey);....n
10fd0 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 ame=X509_get_sub
10fe0 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b ject_name(cert);
10ff0 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ....X509_NAME_ad
11000 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
11010 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e ame,"C", MBSTRIN
11020 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
11030 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
11040 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a _C, -1, -1, 0);.
11050 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
11060 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
11070 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 e,"ST", MBSTRING
11080 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
11090 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
110a0 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a ST, -1, -1, 0);.
110b0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
110c0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
110d0 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f e,"L", MBSTRING_
110e0 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
110f0 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c gned char *) k_L
11100 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
11110 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
11120 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
11130 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 "O", MBSTRING_AS
11140 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
11150 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 ed char *) k_O,
11160 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 -1, -1, 0);...X5
11170 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
11180 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f y_by_txt(name,"O
11190 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 U", MBSTRING_ASC
111a0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
111b0 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 d char *) k_OU,
111c0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 -1, -1, 0);...X5
111d0 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
111e0 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 y_by_txt(name,"C
111f0 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 N", MBSTRING_ASC
11200 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
11210 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 d char *) k_CN,
11220 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 -1, -1, 0);...X5
11230 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
11240 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 y_by_txt(name,"E
11250 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f mail", MBSTRING_
11260 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
11270 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 gned char *) k_E
11280 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 mail, -1, -1, 0)
11290 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 ;....X509_set_su
112a0 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c bject_name(cert,
112b0 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 name);....if (!X
112c0 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 509_sign(cert,pk
112d0 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 ey,EVP_sha256())
112e0 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 ) {... X509_f
112f0 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 ree(cert);...
11300 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 EVP_PKEY_free(p
11310 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 key);.#if OPENSS
11320 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
11330 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
11340 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 . BN_free(bne
11350 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 );.#endif...
11360 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
11370 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e terp,"Error sign
11380 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22 ing certificate"
11390 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 ,NULL);... re
113a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
113b0 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 ..}....if (isStr
113c0 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 ) {... out=BI
113d0 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 O_new(BIO_s_mem(
113e0 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 ));... PEM_wr
113f0 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 ite_bio_X509(out
11400 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d ,cert);... i=
11410 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 BIO_read(out,buf
11420 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 fer,sizeof(buffe
11430 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 r)-1);... i=(
11440 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 i<0) ? 0 : i;...
11450 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c buffer[i]='\
11460 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 0';... Tcl_Se
11470 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f tVar(interp,pemo
11480 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 ut,buffer,0);...
11490 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 BIO_flush(ou
114a0 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 t);... BIO_fr
114b0 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 ee(out);...} els
114c0 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 e {... out=BI
114d0 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 O_new(BIO_s_file
114e0 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 ());... BIO_w
114f0 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 rite_filename(ou
11500 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 t,pemout);...
11510 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 PEM_write_bio_X
11520 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 509(out,cert);..
11530 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c . BIO_free_al
11540 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 l(out);...}....X
11550 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 509_free(cert);.
11560 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 ..EVP_PKEY_free(
11570 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 pkey);.#if OPENS
11580 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
11590 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
115a0 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a ..BN_free(bne);.
115b0 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d #endif.. }..}
115c0 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 ..break;. def
115d0 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 ault:..break;.
115e0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }. return T
115f0 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 CL_OK;..clientDa
11600 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
11610 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .}.../**********
11620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 **********/./* I
11630 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 nit
11640 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./************
11650 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a ********/../*. *
11660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
116a0 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 ---. *. * Tls_Fr
116b0 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 ee --. *. *.This
116c0 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e procedure clean
116d0 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 s up when a SSL
116e0 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 socket based cha
116f0 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 nnel. *.is close
11700 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 d and its refere
11710 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 nce count falls
11720 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 below 1. *. * Re
11730 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 sults:. *.none.
11740 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
11750 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 s:. *.Frees all
11760 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d the state. *. *-
11770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
117a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
117b0 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f --. */.void.Tls_
117c0 46 72 65 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b Free(char *block
117d0 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 Ptr) {. State
117e0 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
117f0 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a ate *)blockPtr;.
11800 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
11810 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 lled");.. Tls
11820 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 _Clean(statePtr)
11830 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f ;. ckfree(blo
11840 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ckPtr);.}.../*.
11850 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
11860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11890 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 ----. *. * Tls_C
118a0 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 lean --. *. *.Th
118b0 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 is procedure cle
118c0 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 ans up when a SS
118d0 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 L socket based c
118e0 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f hannel. *.is clo
118f0 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 sed and its refe
11900 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c rence count fall
11910 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 s below 1. This
11920 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 should. *.be ca
11930 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 lled synchronous
11940 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 ly by the CloseP
11950 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a roc, not in the.
11960 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 *.EventuallyFre
11970 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 e callback.. *.
11980 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f * Results:. *.no
11990 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
119a0 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 fects:. *.Frees
119b0 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a all the state. *
119c0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
119d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
119e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
119f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a00 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 ------. */.void
11a10 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 Tls_Clean(State
11a20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 *statePtr) {.
11a30 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
11a40 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 ");.. /*.
11a50 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e * we're assumin
11a60 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72 g here that we'r
11a70 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 e single-threade
11a80 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 d. */. if
11a90 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 (statePtr->time
11aa0 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 r != (Tcl_TimerT
11ab0 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 oken) NULL) {..T
11ac0 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 cl_DeleteTimerHa
11ad0 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e ndler(statePtr->
11ae0 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 timer);..statePt
11af0 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b r->timer = NULL;
11b00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
11b10 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
11b20 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74 ) {..ckfree(stat
11b30 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 ePtr->protos);..
11b40 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
11b50 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
11b60 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
11b70 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 >bio) {../* This
11b80 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 will call SSL_s
11b90 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 hutdown. Bug 141
11ba0 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 4045 */..dprintf
11bb0 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 ("BIO_free_all(%
11bc0 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 p)", statePtr->b
11bd0 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 io);..BIO_free_a
11be0 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ll(statePtr->bio
11bf0 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 );..statePtr->bi
11c00 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a o = NULL;. }.
11c10 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
11c20 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 ->ssl) {..dprint
11c30 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 f("SSL_free(%p)"
11c40 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 , statePtr->ssl)
11c50 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 ;..SSL_free(stat
11c60 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 ePtr->ssl);..sta
11c70 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c tePtr->ssl = NUL
11c80 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
11c90 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 (statePtr->ctx)
11ca0 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 {..SSL_CTX_free(
11cb0 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a statePtr->ctx);.
11cc0 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d .statePtr->ctx =
11cd0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
11ce0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
11cf0 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f allback) {..Tcl_
11d00 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 DecrRefCount(sta
11d10 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
11d20 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c ;..statePtr->cal
11d30 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 lback = NULL;.
11d40 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
11d50 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 ePtr->password)
11d60 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f {..Tcl_DecrRefCo
11d70 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 unt(statePtr->pa
11d80 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 ssword);..stateP
11d90 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e tr->password = N
11da0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
11db0 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
11dc0 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d ng");.}.../*. *-
11dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11e10 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 --. *. * Tls_Ini
11e20 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 t --. *. *.This
11e30 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 is a package ini
11e40 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 tialization proc
11e50 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 edure, which is
11e60 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c called. *.by Tcl
11e70 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 when this packa
11e80 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 ge is to be adde
11e90 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 d to an interpre
11ea0 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ter.. *. * Resul
11eb0 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 ts: Ssl configu
11ec0 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 red and loaded.
11ed0 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
11ee0 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68 s:. *. create th
11ef0 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 e ssl command, i
11f00 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f nitialize ssl co
11f10 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d ntext. *. *-----
11f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
11f60 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 */.DLLEXPORT int
11f70 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e Tls_Init(Tcl_In
11f80 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a terp *interp) {.
11f90 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 74 const char t
11fa0 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b lsTclInitScript[
11fb0 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 ] = {.#include "
11fc0 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 tls.tcl.h"..0x00
11fd0 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 . };.. dpr
11fe0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
11ff0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 . /*. * W
12000 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 54 e only support T
12010 63 6c 20 38 2e 34 20 6f 72 20 6e 65 77 65 72 0a cl 8.4 or newer.
12020 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 */. if (
12030 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f .#ifdef USE_TCL_
12040 53 54 55 42 53 0a 09 54 63 6c 5f 49 6e 69 74 53 STUBS..Tcl_InitS
12050 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e tubs(interp, "8.
12060 34 22 2c 20 30 29 0a 23 65 6c 73 65 0a 09 54 63 4", 0).#else..Tc
12070 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 l_PkgRequire(int
12080 65 72 70 2c 20 22 54 63 6c 22 2c 20 22 38 2e 34 erp, "Tcl", "8.4
12090 2d 22 2c 20 30 29 0a 23 65 6e 64 69 66 0a 09 20 -", 0).#endif..
120a0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
120b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
120c0 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 }.. if (Tls
120d0 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 LibInit(0) != TC
120e0 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 L_OK) {..Tcl_App
120f0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
12100 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 , "could not ini
12110 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 tialize SSL libr
12120 61 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ary", NULL);..re
12130 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
12140 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 }.. Tcl_C
12150 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
12160 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 interp, "tls::ci
12170 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f phers", CiphersO
12180 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
12190 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
121a0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
121b0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
121c0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
121d0 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 erp, "tls::conne
121e0 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 ction", Connecti
121f0 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 onInfoObjCmd, (C
12200 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
12210 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
12220 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
12230 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
12240 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
12250 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 ::handshake", Ha
12260 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 ndshakeObjCmd, (
12270 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
12280 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
12290 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
122a0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
122b0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
122c0 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f s::import", Impo
122d0 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e rtObjCmd, (Clien
122e0 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
122f0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
12300 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
12310 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
12320 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e interp, "tls::un
12330 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 import", Unimpor
12340 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 tObjCmd, (Client
12350 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
12360 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
12370 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
12380 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
12390 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 nterp, "tls::sta
123a0 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 tus", StatusObjC
123b0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
123c0 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
123d0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
123e0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
123f0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
12400 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 , "tls::version"
12410 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c , VersionObjCmd,
12420 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
12430 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
12440 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
12450 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
12460 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
12470 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 tls::misc", Misc
12480 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
12490 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
124a0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
124b0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
124c0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
124d0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 terp, "tls::prot
124e0 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c ocols", Protocol
124f0 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 sObjCmd, (Client
12500 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
12510 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
12520 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 ULL);.. if (i
12530 6e 74 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 nterp) {..Tcl_Ev
12540 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 al(interp, tlsTc
12550 6c 49 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20 lInitScript);.
12560 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 }.. return(
12570 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 Tcl_PkgProvide(i
12580 6e 74 65 72 70 2c 20 22 74 6c 73 22 2c 20 50 41 nterp, "tls", PA
12590 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 29 3b CKAGE_VERSION));
125a0 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
125b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
125c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
125d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
125e0 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 . *. *.Tls_SafeI
125f0 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d nit --. *. *.---
12600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
12630 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 *.Standard proce
12640 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79 dure required by
12650 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 'load'.. *.Init
12660 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 ializes this ext
12670 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 ension for a saf
12680 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 e interpreter..
12690 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
126a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
126b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
126c0 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 --*. *. *.Side e
126d0 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f ffects:. *..As o
126e0 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a f 'Tls_Init'. *.
126f0 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 *.Result:. *..A
12700 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 standard Tcl er
12710 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d ror code.. *. *-
12720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12750 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 -----*. */.DLLEX
12760 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 PORT int Tls_Saf
12770 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 eInit(Tcl_Interp
12780 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 *interp) {.
12790 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
127a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 6c );. return(Tl
127b0 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 29 3b s_Init(interp));
127c0 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
127d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
127e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
127f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
12800 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 . *. *.TlsLibIni
12810 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d t --. *. *.-----
12820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 -----------*. *.
12850 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 Initializes SSL
12860 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 library once per
12870 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 application. *.
12880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
128a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
128b0 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 *. *. *.Side eff
128c0 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 ects:. *..initia
128d0 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 lizes SSL librar
128e0 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a y. *. *.Result:.
128f0 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d *..none. *. *--
12900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12930 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 ----*. */.static
12940 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 int TlsLibInit(
12950 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 int uninitialize
12960 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 ) {. static i
12970 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d nt initialized =
12980 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 0;. int stat
12990 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 us = TCL_OK;.#if
129a0 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
129b0 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
129c0 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
129d0 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d ). size_t num
129e0 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a _locks;.#endif..
129f0 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61 if (uninitia
12a00 6c 69 7a 65 29 20 7b 0a 20 20 20 20 20 20 20 20 lize) {.
12a10 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 if (!initialized
12a20 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ) {.
12a30 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 dprintf("Asked t
12a40 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 o uninitialize,
12a50 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 but we are not i
12a60 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 20 nitialized");..
12a70 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 retur
12a80 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 20 n(TCL_OK);.
12a90 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 64 70 }.. dp
12aa0 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 rintf("Asked to
12ab0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a uninitialize");.
12ac0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
12ad0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
12ae0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
12af0 45 41 44 53 29 0a 20 20 20 20 20 20 20 20 54 63 EADS). Tc
12b00 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 l_MutexLock(&ini
12b10 74 5f 6d 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 t_mx);..
12b20 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 20 20 20 if (locks) {.
12b30 20 20 20 20 20 20 20 20 20 66 72 65 65 28 6c 6f free(lo
12b40 63 6b 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 cks);.
12b50 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a locks = NULL;.
12b60 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b lock
12b70 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 sCount = 0;.
12b80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 }.#endif.
12b90 20 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 initialized
12ba0 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e = 0;..#if defin
12bb0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
12bc0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
12bd0 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 CL_THREADS).
12be0 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c Tcl_MutexUnl
12bf0 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 ock(&init_mx);.#
12c00 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 72 endif.. r
12c10 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 eturn(TCL_OK);.
12c20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e }.. if (in
12c30 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 20 20 20 itialized) {.
12c40 20 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 dprintf("Ca
12c50 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67 20 lled, but using
12c60 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b 0a cached value");.
12c70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 28 73 return(s
12c80 74 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 tatus);. }..
12c90 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
12ca0 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e ed");..#if defin
12cb0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
12cc0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
12cd0 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 CL_THREADS).
12ce0 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 Tcl_MutexLock(&i
12cf0 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a nit_mx);.#endif.
12d00 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 initialized
12d10 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 = 1;..#if define
12d20 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
12d30 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
12d40 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e L_THREADS). n
12d50 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 um_locks = 1;.
12d60 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 locksCount = (
12d70 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a int) num_locks;.
12d80 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c locks = mall
12d90 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 oc(sizeof(*locks
12da0 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a ) * num_locks);.
12db0 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 memset(locks
12dc0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 , 0, sizeof(*loc
12dd0 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 ks) * num_locks)
12de0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a ;.#endif.. /*
12df0 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 Initialize BOTH
12e00 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c libcrypto and l
12e10 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 ibssl. */. OP
12e20 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f ENSSL_init_ssl(O
12e30 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 PENSSL_INIT_LOAD
12e40 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f _SSL_STRINGS | O
12e50 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 PENSSL_INIT_LOAD
12e60 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a _CRYPTO_STRINGS.
12e70 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f .| OPENSSL_INIT_
12e80 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 ADD_ALL_CIPHERS
12e90 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 | OPENSSL_INIT_A
12ea0 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 DD_ALL_DIGESTS,
12eb0 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f NULL);.. BIO_
12ec0 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 new_tcl(NULL, 0)
12ed0 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a ;..#if 0. /*.
12ee0 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a * XXX:TODO:
12ef0 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 Remove this cod
12f00 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 e and replace it
12f10 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20 with a check.
12f20 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 * for enough
12f30 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e entropy and do n
12f40 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 ot try to create
12f50 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 our own. *
12f60 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 terrible entropy
12f70 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a . */. /*.
12f80 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 20 * Seed the
12f90 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 random number ge
12fa0 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53 nerator in the S
12fb0 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 SL library,.
12fc0 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f * using the do/
12fd0 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 while construct
12fe0 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 62 because of the b
12ff0 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 ug note in the.
13000 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 * OpenSSL FA
13010 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e Q at http://www.
13020 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 openssl.org/supp
13030 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 ort/faq.html#USE
13040 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a R1. *. *
13050 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 65 The crux of the
13060 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 problem is that
13070 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20 Solaris 7 does
13080 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 20 not have a.
13090 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 * /dev/random or
130a0 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 /dev/urandom de
130b0 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f vice so it canno
130c0 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a t gather enough.
130d0 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 * entropy f
130e0 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 rom the RAND_see
130f0 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 d() when TLS ini
13100 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 tializes and ref
13110 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 uses. * to g
13120 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 o further. Earli
13130 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f er versions of O
13140 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f penSSL carried o
13150 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 n regardless..
13160 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 */. srand(
13170 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 (unsigned int) t
13180 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e ime((time_t *) N
13190 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a ULL));. do {.
131a0 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c .for (i = 0; i <
131b0 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 16; i++) {..
131c0 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 rnd_seed[i] = 1
131d0 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 + (char) (255.0
131e0 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f * rand()/(RAND_
131f0 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 MAX+1.0));..}..R
13200 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 AND_seed(rnd_see
13210 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 d, sizeof(rnd_se
13220 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c ed));. } whil
13230 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 e (RAND_status()
13240 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a != 1);.#endif..
13250 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
13260 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
13270 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
13280 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 ADS)..Tcl_MutexU
13290 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b nlock(&init_mx);
132a0 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e .#endif...return
132b0 28 73 74 61 74 75 73 29 3b 0a 7d 0a (status);.}.