0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61 (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69 some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68 ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32 pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72 ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79 poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53 right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29 *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61 2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 ka SSL) Channel
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64 - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63 on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50 uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68 st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65 based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70 rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64 * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61 dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64 .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74 ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 full fileevent
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 Also work done
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68 ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 e impetus to do
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64 cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 pts.h".#include
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 rsa.h>.#include
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61 <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72 10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76 "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69 1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72 dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a (key), (dsp))).
04e0: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29 #define REASON()
04f0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f .ERR_reason_erro
0500: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74 r_string(ERR_get
0510: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69 _error())..stati
0520: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 c SSL_CTX *CTX_I
0530: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 nit(State *state
0540: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 Ptr, int isServe
0550: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 r, int proto, ch
0560: 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 ar *key,...char
0570: 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 *certfile, unsig
0580: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 ned char *key_as
0590: 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 n1, unsigned cha
05a0: 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 r *cert_asn1,...
05b0: 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e int key_asn1_len
05c0: 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f , int cert_asn1_
05d0: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72 len, char *CAdir
05e0: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a , char *CAfile,.
05f0: 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c ..char *ciphers,
0600: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 char *ciphersui
0610: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 tes, int level,
0620: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b char *DHparams);
0630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 ..static int.Tls
0640: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e LibInit(int unin
0650: 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66 itialize);..#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 ine TLS_PROTO_SS
0670: 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 L2..0x01.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 TLS_PROTO_SSL3.
0690: 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c .0x02.#define TL
06a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 S_PROTO_TLS1..0x
06b0: 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 04.#define TLS_P
06c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 ROTO_TLS1_1.0x08
06d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f .#define TLS_PRO
06e0: 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 TO_TLS1_2.0x10.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f define TLS_PROTO
0700: 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 _TLS1_3.0x20.#de
0710: 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 fine ENABLED(fla
0720: 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 g, mask).(((flag
0730: 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 ) & (mask)) == (
0740: 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20 mask))..#define
0750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22 SSLKEYLOGFILE.."
0760: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a SSLKEYLOGFILE"..
0770: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74 /*. * Static dat
0780: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f a structures. */
0790: 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 ..#ifndef OPENSS
07a0: 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 65 L_NO_DH.#include
07b0: 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a 23 "dh_params.h".#
07c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72 endif../*. * Thr
07d0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64 ead-Safe TLS Cod
07e0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 e. */..#ifdef TC
07f0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e L_THREADS.#defin
0800: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 e OPENSSL_THREAD
0810: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64 _DEFINES.#includ
0820: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 e <openssl/opens
0830: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65 slconf.h>..#ifde
0840: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 f OPENSSL_THREAD
0850: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e S.#include <open
0860: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69 ssl/crypto.h>.#i
0870: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0880: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 ssl.h>../*. * Th
0890: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e readed operation
08a0: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e requires lockin
08b0: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42 g callbacks. * B
08c0: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74 ased from /crypt
08d0: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20 o/cryptlib.c of
08e0: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70 OpenSSL and NSOp
08f0: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74 enSSL.. */..stat
0900: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f ic Tcl_Mutex *lo
0910: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 cks = NULL;.stat
0920: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e ic int locksCoun
0930: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63 t = 0;.static Tc
0940: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b l_Mutex init_mx;
0950: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53 .#endif /* OPENS
0960: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65 SL_THREADS */.#e
0970: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45 ndif /* TCL_THRE
0980: 41 44 53 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a ADS */../*******
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f *************/./
09a0: 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 * Callbacks
09b0: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a */./*********
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0c 0a ***********/....
09d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 --------. *. * I
0a20: 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 nfoCallback --.
0a30: 2a 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53 *. *.monitors SS
0a40: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f L connection pro
0a50: 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c cess. *. * Resul
0a60: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
0a70: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
0a80: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
0a90: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
0aa0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ae0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
0af0: 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 void.InfoCallbac
0b00: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
0b10: 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 , int where, int
0b20: 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 ret) {. Stat
0b30: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
0b40: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 tate*)SSL_get_ap
0b50: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 p_data((SSL *)ss
0b60: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 l);. Tcl_Inte
0b70: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
0b80: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
0b90: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
0ba0: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 tr;. char *ma
0bb0: 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 jor; char *minor
0bc0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
0bd0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
0be0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
0bf0: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
0c00: 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e j*)NULL)..return
0c10: 3b 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 ;.. cmdPtr =
0c20: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
0c30: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
0c40: 61 63 6b 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 ack);..#if 0.
0c50: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c if (where & SSL
0c60: 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 73 65 _CB_ALERT) {..se
0c70: 76 20 3d 20 53 53 4c 5f 61 6c 65 72 74 5f 74 79 v = SSL_alert_ty
0c80: 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 pe_string_long(r
0c90: 65 74 29 3b 0a 09 69 66 20 28 73 74 72 63 6d 70 et);..if (strcmp
0ca0: 28 73 65 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d (sev, "fatal")==
0cb0: 30 29 20 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65 0) {./* Map to e
0cc0: 72 72 6f 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73 rror */.. Tls
0cd0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
0ce0: 20 53 53 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20 SSL_ERROR(ssl,
0cf0: 30 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 0));.. return
0d00: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ;..}. }.#endi
0d10: 66 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 f. if (where
0d20: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 & SSL_CB_HANDSHA
0d30: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a KE_START) {..maj
0d40: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 or = "handshake"
0d50: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 ;..minor = "star
0d60: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 t";. } else i
0d70: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0d80: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 B_HANDSHAKE_DONE
0d90: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 ) {..major = "ha
0da0: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 ndshake";..minor
0db0: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d = "done";. }
0dc0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 else {..if (whe
0dd0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 re & SSL_CB_ALER
0de0: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 T)..major = "ale
0df0: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 rt";..else if (w
0e00: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f here & SSL_ST_CO
0e10: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 NNECT).major = "
0e20: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 connect";..else
0e30: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
0e40: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f ST_ACCEPT)..majo
0e50: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 r = "accept";..e
0e60: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 lse.....major =
0e70: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 "unknown";...if
0e80: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
0e90: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 READ)..minor = "
0ea0: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 read";..else if
0eb0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
0ec0: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 WRITE)..minor =
0ed0: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 "write";..else i
0ee0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0ef0: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d B_LOOP)..minor =
0f00: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 "loop";..else i
0f10: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0f20: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d B_EXIT)..minor =
0f30: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 "exit";..else..
0f40: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e ...minor = "unkn
0f50: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 own";. }..
0f60: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
0f70: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
0f80: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
0f90: 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f wStringObj("info
0fa0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
0fb0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
0fc0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
0fd0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
0fe0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
0ff0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
1000: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
1010: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
1020: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1030: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1040: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
1050: 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b Obj(major, -1));
1060: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1070: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1080: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
1090: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
10a0: 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 inor, -1));..
10b0: 20 69 66 20 28 77 68 65 72 65 20 26 20 28 53 53 if (where & (SS
10c0: 4c 5f 43 42 5f 4c 4f 4f 50 7c 53 53 4c 5f 43 42 L_CB_LOOP|SSL_CB
10d0: 5f 45 58 49 54 29 29 20 7b 0a 09 54 63 6c 5f 4c _EXIT)) {..Tcl_L
10e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1100: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
1110: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 StringObj(SSL_st
1120: 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 ate_string_long(
1130: 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ssl), -1));.
1140: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 } else if (where
1150: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 & SSL_CB_ALERT)
1160: 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a {..const char *
1170: 63 70 20 3d 20 28 63 68 61 72 20 2a 29 20 53 53 cp = (char *) SS
1180: 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 L_alert_desc_str
1190: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a 0a ing_long(ret);..
11a0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11c0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
11d0: 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d wStringObj(cp, -
11e0: 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 1));. } else
11f0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
1200: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
1210: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
1220: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1230: 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 j(SSL_state_stri
1240: 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 ng_long(ssl), -1
1250: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 ));. }. Tc
1260: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 l_Preserve((Clie
1270: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
1280: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 . Tcl_Preserv
1290: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
12a0: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 tatePtr);.. T
12b0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
12c0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 28 76 6f cmdPtr);. (vo
12d0: 69 64 29 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 id) Tcl_EvalObjE
12e0: 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 x(interp, cmdPtr
12f0: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 , TCL_EVAL_GLOBA
1300: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 L);. Tcl_Decr
1310: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
1320: 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 ;.. Tcl_Relea
1330: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
1340: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 statePtr);. T
1350: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
1360: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
1370: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
1380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
13c0: 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 . * VerifyCallba
13d0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 ck --. *. *.Moni
13e0: 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 tors SSL certifi
13f0: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 cate validation
1400: 70 72 6f 63 65 73 73 2e 0a 20 2a 09 54 68 69 73 process.. *.This
1410: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 is called whene
1420: 76 65 72 20 61 20 63 65 72 74 69 66 69 63 61 74 ver a certificat
1430: 65 20 69 73 20 69 6e 73 70 65 63 74 65 64 0a 20 e is inspected.
1440: 2a 09 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 *.or decided inv
1450: 61 6c 69 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 alid.. *. * Resu
1460: 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 lts:. *.A callba
1470: 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 ck bound to the
1480: 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72 socket may retur
1490: 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 n one of:. *.
14a0: 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 0...- the certi
14b0: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 ficate is deemed
14c0: 20 69 6e 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 invalid. *.
14d0: 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 1...- the certif
14e0: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 icate is deemed
14f0: 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 65 6d 70 valid. *. emp
1500: 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 ty string.- no c
1510: 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 hange to certifi
1520: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a cate validation.
1530: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
1540: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 ts:. *.The err f
1550: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 ield of the curr
1560: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 ently operative
1570: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 State is set. *.
1580: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 to a string de
1590: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c scribing the SSL
15a0: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 negotiation fai
15b0: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d lure reason. *--
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1600: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
1610: 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 .VerifyCallback(
1620: 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f int ok, X509_STO
1630: 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 RE_CTX *ctx) {.
1640: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
1650: 74 72 2c 20 2a 72 65 73 75 6c 74 3b 0a 20 20 20 tr, *result;.
1660: 20 63 68 61 72 20 2a 65 72 72 53 74 72 2c 20 2a char *errStr, *
1670: 73 74 72 69 6e 67 3b 0a 20 20 20 20 69 6e 74 20 string;. int
1680: 6c 65 6e 67 74 68 3b 0a 20 20 20 20 53 53 4c 20 length;. SSL
1690: 20 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 *ssl..= (SSL*)
16a0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 X509_STORE_CTX_g
16b0: 65 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20 et_ex_data(ctx,
16c0: 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f SSL_get_ex_data_
16d0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 X509_STORE_CTX_i
16e0: 64 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20 dx());. X509
16f0: 20 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53 *cert..= X509_S
1700: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 TORE_CTX_get_cur
1710: 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a rent_cert(ctx);.
1720: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
1730: 50 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53 Ptr.= (State*)SS
1740: 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73 L_get_app_data(s
1750: 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 sl);. Tcl_Int
1760: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
1770: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
1780: 20 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d int depth..=
1790: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f X509_STORE_CTX_
17a0: 67 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 get_error_depth(
17b0: 63 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 ctx);. int er
17c0: 72 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f r..= X509_STORE_
17d0: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 CTX_get_error(ct
17e0: 78 29 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 x);. int code
17f0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
1800: 56 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b 29 Verify: %d", ok)
1810: 3b 0a 0a 20 20 20 20 69 66 20 28 21 6f 6b 29 20 ;.. if (!ok)
1820: 7b 0a 09 65 72 72 53 74 72 20 3d 20 28 63 68 61 {..errStr = (cha
1830: 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 r*)X509_verify_c
1840: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 ert_error_string
1850: 28 65 72 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 (err);. } els
1860: 65 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 28 63 e {..errStr = (c
1870: 68 61 72 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a har *)0;. }..
1880: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
1890: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 ->callback == (T
18a0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
18b0: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 .if (statePtr->v
18c0: 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 flags & SSL_VERI
18d0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
18e0: 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 ER_CERT) {..
18f0: 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c return ok;..} el
1900: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e se {.. return
1910: 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 1;..}. }.
1920: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
1930: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
1940: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
1950: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1960: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1970: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
1980: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
1990: 76 65 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20 verify", -1));.
19a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
19b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
19c0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c rp, cmdPtr,..Tcl
19d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
19e0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
19f0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
1a00: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
1a10: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1a20: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1a30: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
1a40: 62 6a 28 64 65 70 74 68 29 29 3b 0a 20 20 20 20 bj(depth));.
1a50: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1a60: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1a70: 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f 4e 65 77 cmdPtr, Tls_New
1a80: 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 X509Obj(interp,
1a90: 63 65 72 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f cert));. Tcl_
1aa0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1ab0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1ac0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
1ad0: 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20 54 63 6c bj(ok));. Tcl
1ae0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1af0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
1b00: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
1b10: 69 6e 67 4f 62 6a 28 65 72 72 53 74 72 20 3f 20 ingObj(errStr ?
1b20: 65 72 72 53 74 72 20 3a 20 22 22 2c 20 2d 31 29 errStr : "", -1)
1b30: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 );.. Tcl_Pres
1b40: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 erve((ClientData
1b50: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 ) interp);. T
1b60: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
1b70: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
1b80: 72 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 r);.. statePt
1b90: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f r->flags |= TLS_
1ba0: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20 TCL_CALLBACK;..
1bb0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
1bc0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
1bd0: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c code = Tcl_Eval
1be0: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d ObjEx(interp, cm
1bf0: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 dPtr, TCL_EVAL_G
1c00: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 LOBAL);. if (
1c10: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 code != TCL_OK)
1c20: 7b 0a 09 2f 2a 20 49 74 20 67 6f 74 20 61 6e 20 {../* It got an
1c30: 65 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 error - reject t
1c40: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 2e 09 he certificate..
1c50: 09 2a 2f 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a .*/.#if (TCL_MAJ
1c60: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
1c70: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
1c80: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
1c90: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
1ca0: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
1cb0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
1cc0: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
1cd0: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 09 code);.#endif..
1ce0: 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c ok = 0;. } el
1cf0: 73 65 20 7b 0a 09 72 65 73 75 6c 74 20 3d 20 54 se {..result = T
1d00: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_GetObjResult(
1d10: 69 6e 74 65 72 70 29 3b 0a 09 73 74 72 69 6e 67 interp);..string
1d20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
1d30: 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 2c 20 FromObj(result,
1d40: 26 6c 65 6e 67 74 68 29 3b 0a 09 2f 2a 20 41 6e &length);../* An
1d50: 20 65 6d 70 74 79 20 72 65 73 75 6c 74 20 6c 65 empty result le
1d60: 61 76 65 73 20 76 65 72 69 66 69 63 61 74 69 6f aves verificatio
1d70: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f 0a n unchanged..*/.
1d80: 09 69 66 20 28 73 74 72 69 6e 67 20 21 3d 20 4e .if (string != N
1d90: 55 4c 4c 20 26 26 20 6c 65 6e 67 74 68 20 3e 20 ULL && length >
1da0: 30 29 20 7b 0a 09 20 20 20 20 63 6f 64 65 20 3d 0) {.. code =
1db0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f Tcl_GetIntFromO
1dc0: 62 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c bj(interp, resul
1dd0: 74 2c 20 26 6f 6b 29 3b 0a 09 20 20 20 20 69 66 t, &ok);.. if
1de0: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b (code != TCL_OK
1df0: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a ) {.#if (TCL_MAJ
1e00: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
1e10: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
1e20: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 09 54 63 ERSION < 6)...Tc
1e30: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f l_BackgroundErro
1e40: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 r(interp);.#else
1e50: 0a 09 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e ...Tcl_Backgroun
1e60: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 dException(inter
1e70: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 p, code);.#endif
1e80: 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 20 20 20 20 ...ok = 0;..
1e90: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 }..}. }. T
1ea0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
1eb0: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 73 74 cmdPtr);.. st
1ec0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d atePtr->flags &=
1ed0: 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 ~(TLS_TCL_CALLB
1ee0: 41 43 4b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 ACK);.. Tcl_R
1ef0: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
1f00: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 ta) statePtr);.
1f10: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
1f20: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
1f30: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 rp);. return(
1f40: 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 ok);./* By defau
1f50: 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 lt, leave verifi
1f60: 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 cation unchanged
1f70: 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ..*/.}.../*. *--
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fc0: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f -. *. * Tls_Erro
1fd0: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 r --. *. *.Calls
1fe0: 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 24 callback with $
1ff0: 66 64 20 61 6e 64 20 24 6d 73 67 20 2d 20 73 6f fd and $msg - so
2000: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 63 61 the callback ca
2010: 6e 20 64 65 63 69 64 65 0a 20 2a 09 77 68 61 74 n decide. *.what
2020: 20 74 6f 20 64 6f 20 77 69 74 68 20 65 72 72 6f to do with erro
2030: 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 rs.. *. * Side e
2040: 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 ffects:. *.The e
2050: 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 rr field of the
2060: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 currently operat
2070: 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 ive State is set
2080: 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e . *. to a strin
2090: 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 g describing the
20a0: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e SSL negotiation
20b0: 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a failure reason.
20c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2100: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 -----. */.void.T
2110: 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 2a ls_Error(State *
2120: 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 2a statePtr, char *
2130: 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 msg) {. Tcl_I
2140: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
2150: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
2160: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
2170: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 mdPtr;. int c
2180: 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ode;.. dprint
2190: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
21a0: 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a 6d 73 if (msg && *ms
21b0: 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 g) {..Tcl_SetErr
21c0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
21d0: 53 53 4c 22 2c 20 6d 73 67 2c 20 28 63 68 61 72 SSL", msg, (char
21e0: 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 *)NULL);. }
21f0: 65 6c 73 65 20 7b 0a 09 6d 73 67 20 3d 20 54 63 else {..msg = Tc
2200: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
2210: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 bj(Tcl_GetObjRes
2220: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55 4c ult(interp), NUL
2230: 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 L);. }. st
2240: 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 atePtr->err = ms
2250: 67 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 g;.. if (stat
2260: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
2270: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
2280: 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 ) {..char buf[BU
2290: 46 53 49 5a 5d 3b 0a 09 73 70 72 69 6e 74 66 28 FSIZ];..sprintf(
22a0: 62 75 66 2c 20 22 53 53 4c 20 63 68 61 6e 6e 65 buf, "SSL channe
22b0: 6c 20 5c 22 25 73 5c 22 3a 20 65 72 72 6f 72 3a l \"%s\": error:
22c0: 20 25 73 22 2c 0a 09 20 20 20 20 54 63 6c 5f 47 %s",.. Tcl_G
22d0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
22e0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 6d atePtr->self), m
22f0: 73 67 29 3b 0a 09 54 63 6c 5f 53 65 74 52 65 73 sg);..Tcl_SetRes
2300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 62 75 66 2c ult(interp, buf,
2310: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a TCL_VOLATILE);.
2320: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 #if (TCL_MAJOR_V
2330: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 ERSION == 8) &&
2340: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 (TCL_MINOR_VERSI
2350: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 ON < 6)..Tcl_Bac
2360: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 kgroundError(int
2370: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c erp);.#else..Tcl
2380: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 _BackgroundExcep
2390: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 54 43 4c tion(interp, TCL
23a0: 5f 45 52 52 4f 52 29 3b 0a 23 65 6e 64 69 66 0a _ERROR);.#endif.
23b0: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 .return;. }.
23c0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
23d0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
23e0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
23f0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f ;.. Tcl_ListO
2400: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2410: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2420: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2430: 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a ("error", -1));.
2440: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2450: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2460: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
2470: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
2480: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
2490: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
24a0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
24b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
24c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
24d0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
24e0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 wStringObj(msg,
24f0: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 -1));.. Tcl_P
2500: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
2510: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
2520: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
2530: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
2540: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ePtr);.. Tcl_
2550: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
2560: 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d Ptr);. code =
2570: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 Tcl_EvalObjEx(i
2580: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
2590: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b CL_EVAL_GLOBAL);
25a0: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d . if (code !=
25b0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 TCL_OK) {.#if (
25c0: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
25d0: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f N == 8) && (TCL_
25e0: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 MINOR_VERSION <
25f0: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6)..Tcl_Backgrou
2600: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b ndError(interp);
2610: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b .#else..Tcl_Back
2620: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 groundException(
2630: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 interp, code);.#
2640: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 endif. }.
2650: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
2660: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 (cmdPtr);. Tc
2670: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
2680: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
2690: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 ;. Tcl_Releas
26a0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
26b0: 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 nterp);.}.../*.
26c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2700: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f ----. *. * KeyLo
2710: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a gCallback --. *.
2720: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65 *.Write receive
2730: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f d key data to lo
2740: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 g file.. *. * Si
2750: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e de effects:. *.n
2760: 6f 6e 65 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d one. *----------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
27b0: 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 id KeyLogCallbac
27c0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
27d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 , const char *li
27e0: 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a ne) {. char *
27f0: 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c str = getenv(SSL
2800: 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 KEYLOGFILE);.
2810: 20 46 49 4c 45 20 2a 66 64 3b 0a 20 20 20 20 69 FILE *fd;. i
2820: 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 f (str) {..fd =
2830: 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b fopen(str, "a");
2840: 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25 ..fprintf(fd, "%
2850: 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c s\n",line);..fcl
2860: 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d ose(fd);. }.}
2870: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
28c0: 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 * Password Callb
28d0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c ack --. *. *.Cal
28e0: 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 77 led when a passw
28f0: 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 74 6f ord is needed to
2900: 20 75 6e 70 61 63 6b 20 52 53 41 20 61 6e 64 20 unpack RSA and
2910: 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 45 76 61 PEM keys.. *.Eva
2920: 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 70 61 73 ls any bound pas
2930: 73 77 6f 72 64 20 73 63 72 69 70 74 20 61 6e 64 sword script and
2940: 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65 73 returns the res
2950: 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 20 70 61 ult as. *.the pa
2960: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 2e 0a 20 ssword string..
2970: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29b0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
29c0: 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c int.PasswordCall
29d0: 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 back(char *buf,
29e0: 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76 65 int size, int ve
29f0: 72 69 66 79 2c 20 76 6f 69 64 20 2a 75 64 61 74 rify, void *udat
2a00: 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a a) {. State *
2a10: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 statePtr.= (Stat
2a20: 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 e *) udata;.
2a30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
2a40: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
2a50: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
2a60: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
2a70: 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 int code;.. d
2a80: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
2a90: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
2aa0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d Ptr->password ==
2ab0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 NULL) {..if (Tc
2ac0: 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c l_EvalEx(interp,
2ad0: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 "tls::password"
2ae0: 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 , -1, TCL_EVAL_G
2af0: 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b LOBAL) == TCL_OK
2b00: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 ) {.. char *r
2b10: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 et = (char *) Tc
2b20: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c l_GetStringResul
2b30: 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 t(interp);..
2b40: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 strncpy(buf, ret
2b50: 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 , (size_t) size)
2b60: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 ;.. return (i
2b70: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a nt)strlen(ret);.
2b80: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 .} else {.. r
2b90: 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 eturn -1;..}.
2ba0: 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d }.. cmdPtr =
2bb0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
2bc0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 j(statePtr->pass
2bd0: 77 6f 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f word);.. Tcl_
2be0: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
2bf0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
2c00: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
2c10: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
2c20: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c tePtr);.. Tcl
2c30: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
2c40: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 dPtr);. code
2c50: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 = Tcl_EvalObjEx(
2c60: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2c70: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
2c80: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 ;. if (code !
2c90: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 = TCL_OK) {.#if
2ca0: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 (TCL_MAJOR_VERSI
2cb0: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c ON == 8) && (TCL
2cc0: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c _MINOR_VERSION <
2cd0: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 6)..Tcl_Backgro
2ce0: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 undError(interp)
2cf0: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 ;.#else..Tcl_Bac
2d00: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e kgroundException
2d10: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a (interp, code);.
2d20: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 #endif. }.
2d30: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
2d40: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 t(cmdPtr);..
2d50: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
2d60: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
2d70: 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 63 6f 64 r);.. if (cod
2d80: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 e == TCL_OK) {..
2d90: 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 char *ret = (cha
2da0: 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 r *) Tcl_GetStri
2db0: 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 ngResult(interp)
2dc0: 3b 0a 09 69 66 20 28 73 74 72 6c 65 6e 28 72 65 ;..if (strlen(re
2dd0: 74 29 20 3c 20 73 69 7a 65 20 2d 20 31 29 20 7b t) < size - 1) {
2de0: 0a 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 .. strncpy(bu
2df0: 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 f, ret, (size_t)
2e00: 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 54 63 6c size);.. Tcl
2e10: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
2e20: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 Data) interp);..
2e30: 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 return (int)
2e40: 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 0a strlen(ret);..}.
2e50: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 }. Tcl_Re
2e60: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 lease((ClientDat
2e70: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 a) interp);.
2e80: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 76 65 72 69 return -1;..veri
2e90: 66 79 20 3d 20 76 65 72 69 66 79 3b 0a 7d 0a 0c fy = verify;.}..
2ea0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
2ef0: 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b Session Callback
2f00: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a for Clients --.
2f10: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 *. *.Called whe
2f20: 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 n a new session
2f30: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 is added to the
2f40: 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e cache. In TLS 1.
2f50: 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 3. *.this may be
2f60: 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 received multip
2f70: 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 le times after t
2f80: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f he handshake. Fo
2f90: 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 r. *.earlier ver
2fa0: 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c sions, this will
2fb0: 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72 be received dur
2fc0: 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b ing the handshak
2fd0: 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68 e.. *.This is th
2fe0: 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20 e preferred way
2ff0: 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75 to obtain a resu
3000: 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 mable session..
3010: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
3020: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
3030: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
3040: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
3050: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 defined). *. * R
3060: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 eturn codes:. *.
3070: 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20 0 = error where
3080: 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 session will be
3090: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f immediately remo
30a0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 ved from the int
30b0: 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 ernal cache.. *.
30c0: 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72 1 = success wher
30d0: 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65 e app retains se
30e0: 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e ssion in session
30f0: 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 cache, and must
3100: 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f call SSL_SESSIO
3110: 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f N_free() when do
3120: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
3170: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73 .static int.Sess
3180: 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 ionCallback(cons
3190: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f t SSL *ssl, SSL_
31a0: 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e SESSION *session
31b0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
31c0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
31d0: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 *)SSL_get_app_da
31e0: 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a ta((SSL *)ssl);.
31f0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
3200: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
3210: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
3220: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
3230: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
3240: 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b ed char *ticket;
3250: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
3260: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f ned char *sessio
3270: 6e 5f 69 64 3b 0a 20 20 20 20 69 6e 74 20 63 6f n_id;. int co
3280: 64 65 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c de;. size_t l
3290: 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 en2;. unsigne
32a0: 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 d int ulen;..
32b0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
32c0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ");.. if (sta
32d0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
32e0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
32f0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
3300: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a _TLSEXT_ERR_OK;.
3310: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
3320: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 sl == NULL) {..r
3330: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
3340: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
3350: 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 }.. cmdPtr =
3360: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
3370: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
3380: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 ack);. Tcl_Li
3390: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
33a0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
33b0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
33c0: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d Obj("session", -
33d0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 1));.. /* Ses
33e0: 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 sion id */. s
33f0: 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f ession_id = SSL_
3400: 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 SESSION_get_id(s
3410: 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a ession, &ulen);.
3420: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
3430: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3440: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
3450: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a _NewByteArrayObj
3460: 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e (session_id, (in
3470: 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 t) ulen));..
3480: 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 /* Session ticke
3490: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 t */. SSL_SES
34a0: 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 SION_get0_ticket
34b0: 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 (session, &ticke
34c0: 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 t, &len2);. T
34d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
34e0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
34f0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 cmdPtr, Tcl_NewB
3500: 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b yteArrayObj(tick
3510: 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 et, (int) len2))
3520: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74 69 ;.. /* Lifeti
3530: 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73 me - number of s
3540: 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63 econds */. Tc
3550: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3560: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
3570: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c mdPtr,..Tcl_NewL
3580: 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53 ongObj((long) SS
3590: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
35a0: 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 cket_lifetime_hi
35b0: 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a nt(session)));..
35c0: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
35d0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
35e0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 terp);. Tcl_P
35f0: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
3600: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
3610: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
3620: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
3630: 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 code = Tcl_Ev
3640: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 alObjEx(interp,
3650: 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c cmdPtr, TCL_EVAL
3660: 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 _GLOBAL);. if
3670: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b (code != TCL_OK
3680: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a ) {.#if (TCL_MAJ
3690: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
36a0: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
36b0: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
36c0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
36d0: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
36e0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
36f0: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
3700: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 code);.#endif.
3710: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
3720: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
3730: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 );.. Tcl_Rele
3740: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
3750: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 statePtr);.
3760: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
3770: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
3780: 3b 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d ; return 0;.}
3790: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
37e0: 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 * ALPN Callback
37f0: 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 for Servers --.
3800: 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 *. *.Perform ser
3810: 76 65 72 2d 73 69 64 65 20 70 72 6f 74 6f 63 6f ver-side protoco
3820: 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c l (http/1.1, h2,
3830: 20 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 h3, etc.) selec
3840: 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 tion for the. *.
3850: 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 incoming connect
3860: 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 ion. Called afte
3870: 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 r Hello and serv
3880: 65 72 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 0a er callbacks. *.
3890: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
38a0: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
38b0: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
38c0: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
38d0: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 fined). *. * Ret
38e0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
38f0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a L_TLSEXT_ERR_OK:
3900: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 ALPN protocol s
3910: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e elected. The con
3920: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
3930: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s.. *.SSL_TLSEXT
3940: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
3950: 3a 20 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f : There was no o
3960: 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74 verlap between t
3970: 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20 he client's. *.
3980: 20 20 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 supplied list
3990: 20 61 6e 64 20 74 68 65 20 73 65 72 76 65 72 20 and the server
39a0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 configuration. T
39b0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 he connection wi
39c0: 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20 ll be aborted..
39d0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
39e0: 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f _NOACK: ALPN pro
39f0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 tocol not select
3a00: 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73 ed, e.g., becaus
3a10: 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20 e no ALPN. *.
3a20: 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63 protocols are c
3a30: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 onfigured for th
3a40: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 is connection. T
3a50: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
3a60: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d ntinues.. *. *--
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ab0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
3ac0: 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f .ALPNCallback(co
3ad0: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f nst SSL *ssl, co
3ae0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
3af0: 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 r **out, unsigne
3b00: 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a d char *outlen,.
3b10: 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 .const unsigned
3b20: 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e char *in, unsign
3b30: 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f ed int inlen, vo
3b40: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
3b50: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
3b60: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 (State*)arg;.
3b70: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
3b80: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
3b90: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
3ba0: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
3bb0: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b int code, res;
3bc0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
3bd0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
3be0: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
3bf0: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
3c00: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 *)NULL) {..retur
3c10: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
3c20: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 _OK;. } else
3c30: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 if (ssl == NULL)
3c40: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
3c50: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
3c60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
3c70: 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a elect protocol *
3c80: 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65 /. if (SSL_se
3c90: 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 lect_next_proto(
3ca0: 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 out, outlen, sta
3cb0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 tePtr->protos, s
3cc0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f tatePtr->protos_
3cd0: 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 len,..in, inlen)
3ce0: 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f == OPENSSL_NPN_
3cf0: 4e 45 47 4f 54 49 41 54 45 44 29 20 7b 0a 09 72 NEGOTIATED) {..r
3d00: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
3d10: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c ERR_OK;. } el
3d20: 73 65 20 7b 0a 09 2f 2a 20 4e 6f 20 6f 76 65 72 se {../* No over
3d30: 6c 61 70 2c 20 73 6f 20 66 69 72 73 74 20 63 6c lap, so first cl
3d40: 69 65 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 75 73 ient protocol us
3d50: 65 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c ed */..res = SSL
3d60: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
3d70: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d K;. }.. cm
3d80: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
3d90: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
3da0: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 ->callback);.
3db0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
3dc0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3dd0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
3de0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e wStringObj("alpn
3df0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
3e00: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3e10: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3e20: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
3e30: 69 6e 67 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 ingObj(*out, -1)
3e40: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 );.. Tcl_Pres
3e50: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 erve((ClientData
3e60: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 ) interp);. T
3e70: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
3e80: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
3e90: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 r);.. Tcl_Inc
3ea0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
3eb0: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 );. code = Tc
3ec0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 l_EvalObjEx(inte
3ed0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f rp, cmdPtr, TCL_
3ee0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 EVAL_GLOBAL);.
3ef0: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 if (code != TC
3f00: 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c L_OK) {.#if (TCL
3f10: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d _MAJOR_VERSION =
3f20: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e = 8) && (TCL_MIN
3f30: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a OR_VERSION < 6).
3f40: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
3f50: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 rror(interp);.#e
3f60: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f lse..Tcl_Backgro
3f70: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 undException(int
3f80: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 erp, code);.#end
3f90: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c if. }. Tcl
3fa0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
3fb0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f dPtr);.. Tcl_
3fc0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
3fd0: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
3fe0: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
3ff0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 (ClientData) int
4000: 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e erp);. return
4010: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d res;.}.../*. *-
4020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4060: 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c --. *. * SNI Cal
4070: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 lback for Server
4080: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f s --. *. *.Perfo
4090: 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 rm server-side S
40a0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 NI hostname sele
40b0: 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 ction after rece
40c0: 69 76 69 6e 67 20 53 4e 49 20 68 65 61 64 65 72 iving SNI header
40d0: 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 61 66 74 65 .. *.Called afte
40e0: 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b r hello callback
40f0: 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c 50 4e but before ALPN
4100: 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a callback.. *. *
4110: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
4120: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
4130: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 ects:. *.Calls c
4140: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 allback (if defi
4150: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ned). *. * Retur
4160: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f n codes:. *.SSL_
4170: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 TLSEXT_ERR_OK: S
4180: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 NI hostname is a
4190: 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e ccepted. The con
41a0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
41b0: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s.. *.SSL_TLSEXT
41c0: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
41d0: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 : SNI hostname i
41e0: 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2e 20 s not accepted.
41f0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 The connection.
4200: 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74 65 64 *. is aborted
4210: 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20 61 6c . Default for al
4220: 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f 55 4e ert is SSL_AD_UN
4230: 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e RECOGNIZED_NAME.
4240: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
4250: 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 RR_ALERT_WARNING
4260: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 : SNI hostname i
4270: 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2c 20 s not accepted,
4280: 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a 20 2a warning alert. *
4290: 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 20 69 . sent (not i
42a0: 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 n TLSv1.3). The
42b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
42c0: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 nues.. *.SSL_TLS
42d0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 EXT_ERR_NOACK: S
42e0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e NI hostname is n
42f0: 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e 64 20 ot accepted and
4300: 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 not acknowledged
4310: 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 ,. *. e.g. if
4320: 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 65 SNI has not bee
4330: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 n configured. Th
4340: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
4350: 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d tinues.. *. *---
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43a0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
43b0: 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 SNICallback(cons
43c0: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 t SSL *ssl, int
43d0: 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 *alert, void *ar
43e0: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a g) {. State *
43f0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
4400: 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f e*)arg;. Tcl_
4410: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d Interp *interp.=
4420: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
4430: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a p;. Tcl_Obj *
4440: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 cmdPtr;. int
4450: 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a code;. char *
4460: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c servername = NUL
4470: 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 L;.. dprintf(
4480: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
4490: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 if (statePtr->ca
44a0: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f llback == (Tcl_O
44b0: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 bj*)NULL) {..ret
44c0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
44d0: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 RR_OK;. } els
44e0: 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c e if (ssl == NUL
44f0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
4500: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
4510: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 K;. }.. se
4520: 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 rvername = SSL_g
4530: 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 et_servername(ss
4540: 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 l, TLSEXT_NAMETY
4550: 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 PE_host_name);.
4560: 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e 61 if (!serverna
4570: 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 me || servername
4580: 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 20 [0] == '\0') {.
4590: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 53 return SS
45a0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
45b0: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 CK;. }.. c
45c0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c mdPtr = Tcl_Dupl
45d0: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 icateObj(statePt
45e0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 r->callback);.
45f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
4600: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
4610: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
4620: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 ewStringObj("sni
4630: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
4640: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
4650: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
4660: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
4670: 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d ingObj(servernam
4680: 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 e , -1));.. T
4690: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
46a0: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
46b0: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 ;. Tcl_Preser
46c0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
46d0: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
46e0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
46f0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
4700: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
4710: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
4720: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
4730: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
4740: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
4750: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
4760: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
4770: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
4780: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
4790: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
47a0: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
47b0: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
47c0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
47d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
47e0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
47f0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
4800: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
4810: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
4820: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 ePtr);. Tcl_R
4830: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
4840: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 ta) interp);.
4850: 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 return SSL_TLSE
4860: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f XT_ERR_OK;.}.../
4870: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
4880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 65 -------. *. * He
48c0: 6c 6c 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 llo Handshake Ca
48d0: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 llback for Serve
48e0: 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 rs --. *. *.Used
48f0: 20 62 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 by server to ex
4900: 61 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 amine the server
4910: 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e name indication
4920: 20 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e (SNI) extension
4930: 0a 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 . *.provided by
4940: 74 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 the client in or
4950: 64 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e der to select an
4960: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 appropriate cer
4970: 74 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 tificate to. *.p
4980: 72 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 resent, and make
4990: 20 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 other configura
49a0: 74 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 tion adjustments
49b0: 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 relevant to tha
49c0: 74 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 t server. *.name
49d0: 20 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 and its configu
49e0: 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 ration. This inc
49f0: 6c 75 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f ludes swapping o
4a00: 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 ut the associate
4a10: 64 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 d. *.SSL_CTX poi
4a20: 6e 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 nter, modifying
4a30: 74 68 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 the server's lis
4a40: 74 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 t of permitted T
4a50: 4c 53 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 LS versions,. *.
4a60: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 changing the ser
4a70: 76 65 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 ver's cipher lis
4a80: 74 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f t in response to
4a90: 20 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 the client's ci
4aa0: 70 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a pher list, etc..
4ab0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
4ac0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
4ad0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 e effects:. *.Ca
4ae0: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 lls callback (if
4af0: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 defined). *. *
4b00: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a Return codes:. *
4b10: 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c .SSL_CLIENT_HELL
4b20: 4f 5f 52 45 54 52 59 20 3d 20 73 75 73 70 65 6e O_RETRY = suspen
4b30: 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c d the handshake,
4b40: 20 61 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 and the handsha
4b50: 6b 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c ke function will
4b60: 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 return immediat
4b70: 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e ely. *.SSL_CLIEN
4b80: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 20 3d 20 T_HELLO_ERROR =
4b90: 66 61 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 failure, termina
4ba0: 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 te connection. S
4bb0: 65 74 20 61 6c 65 72 74 20 74 6f 20 65 72 72 6f et alert to erro
4bc0: 72 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 r code.. *.SSL_C
4bd0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 LIENT_HELLO_SUCC
4be0: 45 53 53 20 3d 20 73 75 63 63 65 73 73 0a 20 2a ESS = success. *
4bf0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c30: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
4c40: 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 c int.HelloCallb
4c50: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 ack(const SSL *s
4c60: 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 sl, int *alert,
4c70: 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 void *arg) {.
4c80: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
4c90: 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a = (State*)arg;.
4ca0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
4cb0: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
4cc0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
4cd0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
4ce0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 int code;.
4cf0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 const char *se
4d00: 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f rvername;. co
4d10: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
4d20: 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74 r *p;. size_t
4d30: 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b len, remaining;
4d40: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
4d50: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
4d60: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
4d70: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
4d80: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 *)NULL) {..retur
4d90: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
4da0: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 _OK;. } else
4db0: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 if (ssl == NULL)
4dc0: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
4dd0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
4de0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 . }.. /* G
4df0: 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 et names */.
4e00: 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74 5f if (!SSL_client_
4e10: 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28 73 hello_get0_ext(s
4e20: 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 45 5f sl, TLSEXT_TYPE_
4e30: 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70 2c server_name, &p,
4e40: 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 &remaining) ||
4e50: 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 remaining <= 2)
4e60: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e {. return
4e70: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
4e80: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a O_ERROR;. }..
4e90: 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 /* Extract t
4ea0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 he length of the
4eb0: 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 6f supplied list o
4ec0: 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 f names. */.
4ed0: 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c len = (*(p++) <<
4ee0: 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 8);. len +=
4ef0: 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 *(p++);. if (
4f00: 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d 61 69 len + 2 != remai
4f10: 6e 69 6e 67 29 20 7b 0a 20 20 20 20 20 20 20 20 ning) {.
4f20: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
4f30: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
4f40: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
4f50: 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f ng = len;.. /
4f60: 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 70 72 * The list in pr
4f70: 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 73 20 actice only has
4f80: 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 a single element
4f90: 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f 6e , so we only con
4fa0: 73 69 64 65 72 20 74 68 65 20 66 69 72 73 74 20 sider the first
4fb0: 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 one. */. if (
4fc0: 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20 7c remaining == 0 |
4fd0: 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58 54 | *p++ != TLSEXT
4fe0: 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e _NAMETYPE_host_n
4ff0: 61 6d 65 29 20 7b 0a 20 20 20 20 20 20 20 20 72 ame) {. r
5000: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
5010: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
5020: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e }. remainin
5030: 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 g--;.. /* Now
5040: 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 we can finally
5050: 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74 pull out the byt
5060: 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 e array with the
5070: 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 actual hostname
5080: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d . */. if (rem
5090: 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 20 aining <= 2) {.
50a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 53 return SS
50b0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
50c0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
50d0: 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c len = (*(p++) <<
50e0: 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 8);. len +=
50f0: 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 *(p++);. if (
5100: 6c 65 6e 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e len + 2 > remain
5110: 69 6e 67 29 20 7b 0a 20 20 20 20 20 20 20 20 72 ing) {. r
5120: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
5130: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
5140: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e }. remainin
5150: 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72 g = len;. ser
5160: 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 vername = (const
5170: 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20 char *)p;..
5180: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
5190: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
51a0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 tr->callback);.
51b0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
51c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
51d0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
51e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 NewStringObj("he
51f0: 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 llo", -1));.
5200: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
5210: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
5220: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
5230: 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 StringObj(server
5240: 6e 61 6d 65 2c 20 28 69 6e 74 29 20 6c 65 6e 29 name, (int) len)
5250: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 );.. Tcl_Pres
5260: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 erve((ClientData
5270: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 ) interp);. T
5280: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
5290: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
52a0: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 r);.. Tcl_Inc
52b0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
52c0: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 );. code = Tc
52d0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 l_EvalObjEx(inte
52e0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f rp, cmdPtr, TCL_
52f0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 EVAL_GLOBAL);.
5300: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 if (code != TC
5310: 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c L_OK) {.#if (TCL
5320: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d _MAJOR_VERSION =
5330: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e = 8) && (TCL_MIN
5340: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a OR_VERSION < 6).
5350: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
5360: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 rror(interp);.#e
5370: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f lse..Tcl_Backgro
5380: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 undException(int
5390: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 erp, code);.#end
53a0: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c if. }. Tcl
53b0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
53c0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f dPtr);.. Tcl_
53d0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
53e0: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
53f0: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
5400: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 (ClientData) int
5410: 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e erp);. return
5420: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
5430: 4f 5f 53 55 43 43 45 53 53 3b 0a 7d 0a 0c 0a 2f O_SUCCESS;.}.../
5440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5450: 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 ****/./* Command
5460: 73 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a s */./**
5470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5480: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d **/../*. *------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
54d0: 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d . * CiphersObjCm
54e0: 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 d -- list availa
54f0: 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 ble ciphers. *.
5500: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
5510: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 is invoked to p
5520: 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a rocess the "tls:
5530: 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e :ciphers" comman
5540: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 d. *.to list ava
5550: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 ilable ciphers,
5560: 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f based upon proto
5570: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a col selected.. *
5580: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
5590: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
55a0: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 esult list.. *.
55b0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
55c0: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e *.constructs an
55d0: 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 d destroys SSL c
55e0: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a ontext (CTX). *.
55f0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5630: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
5640: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f const char *pro
5650: 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 tocols[] = {.."s
5660: 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 sl2", "ssl3", "t
5670: 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 ls1", "tls1.1",
5680: 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e "tls1.2", "tls1.
5690: 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 3", NULL.};.enum
56a0: 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 protocol {.
56b0: 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 TLS_SSL2, TLS_SS
56c0: 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c L3, TLS_TLS1, TL
56d0: 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c S_TLS1_1, TLS_TL
56e0: 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 S1_2, TLS_TLS1_3
56f0: 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 , TLS_NONE.};..s
5700: 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 tatic int.Cipher
5710: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 sObjCmd(ClientDa
5720: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
5730: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
5740: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
5750: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
5760: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []) {. Tcl_Ob
5770: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c j *objPtr = NULL
5780: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 ;. SSL_CTX *c
5790: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 tx = NULL;. S
57a0: 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a SL *ssl = NULL;.
57b0: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c STACK_OF(SSL
57c0: 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 _CIPHER) *sk;.
57d0: 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 5b char *cp, buf[
57e0: 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 BUFSIZ];. int
57f0: 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20 index, verbose
5800: 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 = 0, use_support
5810: 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 ed = 0;.. dpr
5820: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
5830: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c . if ((objc <
5840: 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 2) || (objc > 4
5850: 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e )) {..Tcl_WrongN
5860: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
5870: 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f , objv, "protoco
5880: 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 l ?verbose? ?sup
5890: 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 ported?");..retu
58a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
58b0: 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f }. if (Tcl_
58c0: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 GetIndexFromObj(
58d0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c interp, objv[1],
58e0: 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f protocols, "pro
58f0: 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 tocol", 0, &inde
5900: 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a x) != TCL_OK) {.
5910: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
5920: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
5930: 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 ((objc > 2) && T
5940: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f cl_GetBooleanFro
5950: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
5960: 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 v[2], &verbose)
5970: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 != TCL_OK) {..re
5980: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
5990: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f }. if ((o
59a0: 62 6a 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f bjc > 3) && Tcl_
59b0: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 GetBooleanFromOb
59c0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 j(interp, objv[3
59d0: 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 ], &use_supporte
59e0: 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a d) != TCL_OK) {.
59f0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
5a00: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 R;. }.. ER
5a10: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b R_clear_error();
5a20: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 .. switch ((e
5a30: 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 num protocol)ind
5a40: 65 78 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f ex) {..case TLS_
5a50: 53 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 SSL2:.#if OPENSS
5a60: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
5a70: 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 >= 0x10100000L
5a80: 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 || defined(NO_SS
5a90: 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f L2) || defined(O
5aa0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a PENSSL_NO_SSL2).
5ab0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
5ac0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
5ad0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
5ae0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
5af0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
5b00: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
5b10: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
5b20: 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 . ctx = SSL_C
5b30: 54 58 5f 6e 65 77 28 53 53 4c 76 32 5f 6d 65 74 TX_new(SSLv2_met
5b40: 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 hod()); break;.#
5b50: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
5b60: 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 SSL3:.#if define
5b70: 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 d(NO_SSL3) || de
5b80: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
5b90: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL3) || define
5ba0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
5bb0: 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 3_METHOD).. T
5bc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
5bd0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
5be0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
5bf0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
5c00: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
5c10: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
5c20: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 OR;.#else.. c
5c30: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
5c40: 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 29 (SSLv3_method())
5c50: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ; break;.#endif.
5c60: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a .case TLS_TLS1:.
5c70: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
5c80: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
5c90: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
5ca0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
5cb0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 SSL_NO_TLS1_METH
5cc0: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 OD).. Tcl_App
5cd0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
5ce0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
5cf0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
5d00: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
5d10: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
5d20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
5d30: 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 lse.. ctx = S
5d40: 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 SL_CTX_new(TLSv1
5d50: 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 _method()); brea
5d60: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 k;.#endif..case
5d70: 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 TLS_TLS1_1:.#if
5d80: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
5d90: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
5da0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
5db0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
5dc0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 SSL_NO_TLS1_1_ME
5dd0: 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 THOD).. Tcl_A
5de0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
5df0: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e rp, protocols[in
5e00: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f dex], ": protoco
5e10: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
5e20: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 , NULL);.. re
5e30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
5e40: 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d #else.. ctx =
5e50: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 SSL_CTX_new(TLS
5e60: 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 v1_1_method());
5e70: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 break;.#endif..c
5e80: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a ase TLS_TLS1_2:.
5e90: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
5ea0: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
5eb0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
5ec0: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
5ed0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
5ee0: 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 2_METHOD).. T
5ef0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
5f00: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
5f10: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
5f20: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
5f30: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
5f40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
5f50: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 OR;.#else.. c
5f60: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
5f70: 28 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 (TLSv1_2_method(
5f80: 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 )); break;.#endi
5f90: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 f..case TLS_TLS1
5fa0: 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 _3:.#if defined(
5fb0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
5fc0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
5fd0: 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 54 63 _TLS1_3).. Tc
5fe0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
5ff0: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
6000: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
6010: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
6020: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
6030: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
6040: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 R;.#else.. ct
6050: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 x = SSL_CTX_new(
6060: 54 4c 53 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 20 TLS_method());.
6070: 20 20 20 20 20 20 20 20 20 20 20 53 53 4c 5f 43 SSL_C
6080: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f TX_set_min_proto
6090: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c _version(ctx, TL
60a0: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 S1_3_VERSION);..
60b0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
60c0: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f max_proto_versio
60d0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
60e0: 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65 RSION);.. bre
60f0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 ak;.#endif..defa
6100: 75 6c 74 3a 0a 09 20 20 20 20 62 72 65 61 6b 3b ult:.. break;
6110: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 . }. if (c
6120: 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 tx == NULL) {..T
6130: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
6140: 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 interp, REASON()
6150: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
6160: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
6170: 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c }.. ssl = SSL
6180: 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 _new(ctx);. i
6190: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 f (ssl == NULL)
61a0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
61b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 ult(interp, REAS
61c0: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53 ON(), NULL);..SS
61d0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
61e0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
61f0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
6200: 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f * Use list and o
6210: 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 rder as would be
6220: 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e sent in a Clien
6230: 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 tHello or all av
6240: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 ailable ciphers
6250: 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 */. if (use_s
6260: 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 upported) {..sk
6270: 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f = SSL_get1_suppo
6280: 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c rted_ciphers(ssl
6290: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
62a0: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 .sk = SSL_get_ci
62b0: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 phers(ssl);.
62c0: 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d }.. if (sk !=
62d0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 NULL) {..if (!v
62e0: 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f erbose) {.. o
62f0: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c bjPtr = Tcl_NewL
6300: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
6310: 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 .. for (int i
6320: 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c = 0; i < sk_SSL
6330: 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b _CIPHER_num(sk);
6340: 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 i++) {...const
6350: 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 SSL_CIPHER *c =
6360: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 sk_SSL_CIPHER_va
6370: 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 lue(sk, i);...if
6380: 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e (c == NULL) con
6390: 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 tinue;..../* cip
63a0: 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e her name or (NON
63b0: 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c E) */...cp = SSL
63c0: 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 _CIPHER_get_name
63d0: 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d (c);...if (cp ==
63e0: 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 NULL) break;...
63f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
6400: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
6410: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
6420: 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 StringObj(cp, -1
6430: 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 ));.. }...} e
6440: 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 lse {.. objPt
6450: 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e r = Tcl_NewStrin
6460: 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 gObj("",0);..
6470: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b for (int i = 0;
6480: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 i < sk_SSL_CIPH
6490: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 ER_num(sk); i++)
64a0: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 {...const SSL_C
64b0: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 IPHER *c = sk_SS
64c0: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 L_CIPHER_value(s
64d0: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d k, i);...if (c =
64e0: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 = NULL) continue
64f0: 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 ;..../* textual
6500: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 description of t
6510: 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 he cipher */...i
6520: 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 f (SSL_CIPHER_de
6530: 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 scription(c, buf
6540: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 , sizeof(buf)) !
6550: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 = NULL) {...
6560: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 Tcl_AppendToObj(
6570: 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 69 6e objPtr, buf, (in
6580: 74 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b t) strlen(buf));
6590: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 ...} else {...
65a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 Tcl_AppendToOb
65b0: 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f j(objPtr, "UNKNO
65c0: 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 WN\n", 8);...}..
65d0: 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 }..}..if (us
65e0: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 e_supported) {..
65f0: 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 sk_SSL_CIPHE
6600: 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 R_free(sk);..}.
6610: 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 }. SSL_fre
6620: 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f e(ssl);. SSL_
6630: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a CTX_free(ctx);..
6640: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
6650: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
6660: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
6670: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
6680: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
6690: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d a;.}.../*. *----
66a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
66e0: 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f *. * ProtocolsO
66f0: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 bjCmd -- list av
6700: 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c ailable protocol
6710: 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f s. *. *.This pro
6720: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
6730: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 d to process the
6740: 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 "tls::protocols
6750: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 " command. *.to
6760: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 list available p
6770: 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 rotocols.. *. *
6780: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
6790: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
67a0: 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 t list.. *. * Si
67b0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e de effects:. *.n
67c0: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d one. *. *-------
67d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
6810: 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 74 .static int.Prot
6820: 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 65 ocolsObjCmd(Clie
6830: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
6840: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
6850: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
6860: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
6870: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
6880: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a l_Obj *objPtr;..
6890: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
68a0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
68b0: 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 objc != 1) {..Tc
68c0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
68d0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
68e0: 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c "");..return TCL
68f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
6900: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
6910: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
6920: 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 LL);..#if OPENSS
6930: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
6940: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 < 0x10100000L &
6950: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 & !defined(NO_SS
6960: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L2) && !defined(
6970: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
6980: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
6990: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
69a0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
69b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
69c0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c rotocols[TLS_SSL
69d0: 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 2], -1));.#endif
69e0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
69f0: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
6a00: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
6a10: 4c 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 L3). Tcl_List
6a20: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
6a30: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
6a40: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
6a50: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f j(protocols[TLS_
6a60: 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e SSL3], -1));.#en
6a70: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
6a80: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 (NO_TLS1) && !de
6a90: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
6aa0: 5f 54 4c 53 31 29 0a 20 20 20 20 54 63 6c 5f 4c _TLS1). Tcl_L
6ab0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
6ac0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
6ad0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
6ae0: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
6af0: 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a LS_TLS1], -1));.
6b00: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
6b10: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 ned(NO_TLS1_1) &
6b20: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
6b30: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 SL_NO_TLS1_1).
6b40: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
6b50: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
6b60: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
6b70: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
6b80: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 ocols[TLS_TLS1_1
6b90: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
6ba0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
6bb0: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
6bc0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
6bd0: 4c 53 31 5f 32 29 0a 20 20 20 20 54 63 6c 5f 4c LS1_2). Tcl_L
6be0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
6bf0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
6c00: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
6c10: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
6c20: 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 LS_TLS1_2], -1))
6c30: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
6c40: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
6c50: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
6c60: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
6c70: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
6c80: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
6c90: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
6ca0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
6cb0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 otocols[TLS_TLS1
6cc0: 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 _3], -1));.#endi
6cd0: 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 f.. Tcl_SetOb
6ce0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
6cf0: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 objPtr);. ret
6d00: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
6d10: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
6d20: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Data;.}.../*. *-
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d70: 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 --. *. * Handsha
6d80: 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 keObjCmd --. *.
6d90: 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 *.This command i
6da0: 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 s used to verify
6db0: 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e whether the han
6dc0: 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 dshake is comple
6dd0: 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a te. *.or not.. *
6de0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
6df0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
6e00: 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 esult. 1 means h
6e10: 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 andshake complet
6e20: 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 e, 0 means pendi
6e30: 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ng.. *. * Side e
6e40: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 ffects:. *.May f
6e50: 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 orce SSL negotia
6e60: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 tion to take pla
6e70: 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ce.. *. *-------
6e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
6ec0: 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 .static int Hand
6ed0: 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 shakeObjCmd(Clie
6ee0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
6ef0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
6f00: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
6f10: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
6f20: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
6f30: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 l_Channel chan;
6f40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 /* The ch
6f50: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
6f60: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 ode on. */. S
6f70: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 tate *statePtr;
6f80: 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 /* client
6f90: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 state for ssl s
6fa0: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e ocket */. con
6fb0: 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 st char *errStr
6fc0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 = NULL;. int
6fd0: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 ret = 1;. int
6fe0: 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 err = 0;.. d
6ff0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
7000: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
7010: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
7020: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
7030: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
7040: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 nel");..return(T
7050: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
7060: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c .. chan = Tcl
7070: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
7080: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e rp, Tcl_GetStrin
7090: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d gFromObj(objv[1]
70a0: 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a , NULL), NULL);.
70b0: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
70c0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
70d0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 LL) {..return(TC
70e0: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a L_ERROR);. }.
70f0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
7100: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
7110: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
7120: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
7130: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
7140: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 nel(chan);. i
7150: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
7160: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
7170: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
7180: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
7190: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
71a0: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
71b0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
71c0: 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e me(chan), "\": n
71d0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
71e0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
71f0: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
7200: 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 }. statePtr
7210: 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f = (State *)Tcl_
7220: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
7230: 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 ceData(chan);..
7240: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
7250: 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 ing Tls_WaitForC
7260: 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 onnect");. re
7270: 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 t = Tls_WaitForC
7280: 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c onnect(statePtr,
7290: 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 &err, 1);. d
72a0: 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 printf("Tls_Wait
72b0: 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 ForConnect retur
72c0: 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a ned: %i", ret);.
72d0: 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 . if (ret < 0
72e0: 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e && ((statePtr->
72f0: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f flags & TLS_TCL_
7300: 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d ASYNC) && (err =
7310: 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 = EAGAIN))) {..d
7320: 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 printf("Async se
7330: 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 t and err = EAGA
7340: 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a IN");..ret = 0;.
7350: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 } else if (r
7360: 65 74 20 3c 20 30 29 20 7b 0a 09 65 72 72 53 74 et < 0) {..errSt
7370: 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 r = statePtr->er
7380: 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 r;..Tcl_ResetRes
7390: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 ult(interp);..Tc
73a0: 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b l_SetErrno(err);
73b0: 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c ...if (!errStr |
73c0: 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 | (*errStr == 0)
73d0: 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 ) {.. errStr
73e0: 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 = Tcl_PosixError
73f0: 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 (interp);..}...T
7400: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
7410: 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 interp, "handsha
7420: 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 ke failed: ", er
7430: 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e rStr, (char *) N
7440: 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 ULL);..dprintf("
7450: 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 Returning TCL_ER
7460: 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 ROR with handsha
7470: 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 ke failed: %s",
7480: 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e errStr);..return
7490: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
74a0: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 } else {..if (e
74b0: 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 rr != 0) {..
74c0: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 dprintf("Got an
74d0: 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d error with a com
74e0: 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 pleted handshake
74f0: 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 : err = %i", err
7500: 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a );..}..ret = 1;.
7510: 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
7520: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 tf("Returning TC
7530: 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c L_OK with data \
7540: 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 "%i\"", ret);.
7550: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
7560: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
7570: 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a ewIntObj(ret));.
7580: 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f return(TCL_O
7590: 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 K);..clientData
75a0: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a = clientData;.}.
75b0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
7600: 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a ImportObjCmd --.
7610: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
7620: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
7630: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
7640: 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a ssl" command. *.
7650: 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 *.The ssl comma
7660: 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 nd pushes SSL ov
7670: 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e er a (newly conn
7680: 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 ected) tcp socke
7690: 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a t. *. * Results:
76a0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
76b0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
76c0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
76d0: 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 *.May modify the
76e0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 behavior of an
76f0: 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 IO channel.. *.
7700: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
7710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7740: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
7750: 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 int.ImportObjCmd
7760: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
7770: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
7780: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
7790: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
77a0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
77b0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
77c0: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 han;../* The cha
77d0: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f nnel to set a mo
77e0: 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 de on. */. St
77f0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 ate *statePtr;..
7800: 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 /* client state
7810: 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a for ssl socket *
7820: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 /. SSL_CTX *c
7830: 74 78 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c tx. = NUL
7840: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a L;. Tcl_Obj *
7850: 73 63 72 69 70 74 09 20 20 20 20 20 20 20 20 3d script. =
7860: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f NULL;. Tcl_O
7870: 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 20 20 20 bj *password.
7880: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
7890: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 Tcl_DString upp
78a0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
78b0: 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e tion, upperChann
78c0: 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 elBlocking, uppe
78d0: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
78e0: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f , upperChannelEO
78f0: 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 FChar;. int i
7900: 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 dx, len;. int
7910: 20 66 6c 61 67 73 09 09 20 20 20 20 20 20 20 20 flags..
7920: 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a = TLS_TCL_INIT;.
7930: 20 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 09 int server..
7940: 20 20 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 = 0;./*
7950: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e is connection in
7960: 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 coming or outgoi
7970: 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 ng? */. char
7980: 2a 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 *keyfile.
7990: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
79a0: 72 20 2a 63 65 72 74 66 69 6c 65 09 20 20 20 20 r *certfile.
79b0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
79c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b unsigned char *k
79d0: 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ey .= NULL;.
79e0: 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 20 20 20 int key_len
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 = 0
7a00: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 ;. unsigned c
7a10: 68 61 72 20 2a 63 65 72 74 20 20 20 20 20 20 20 har *cert
7a20: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e = NULL;. in
7a30: 74 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 20 t cert_len
7a40: 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 = 0;.
7a50: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 char *ciphers
7a60: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
7a70: 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 . char *ciphe
7a80: 72 73 75 69 74 65 73 09 20 20 20 20 20 20 20 20 rsuites.
7a90: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
7aa0: 20 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 *CAfile.
7ab0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
7ac0: 72 20 2a 43 41 64 69 72 09 09 20 20 20 20 20 20 r *CAdir..
7ad0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 = NULL;. ch
7ae0: 61 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20 20 ar *DHparams.
7af0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
7b00: 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 20 char *model..
7b10: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
7b20: 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 char *serverna
7b30: 6d 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c me. = NUL
7b40: 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 L;./* hostname f
7b50: 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 or Server Name I
7b60: 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 ndication */.
7b70: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
7b80: 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 char *session_id
7b90: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c = NULL;. Tcl
7ba0: 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 _Obj *alpn..= NU
7bb0: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 LL;. int ssl2
7bc0: 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a = 0, ssl3 = 0;.
7bd0: 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 int tls1 = 1
7be0: 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c , tls1_1 = 1, tl
7bf0: 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 s1_2 = 1, tls1_3
7c00: 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 = 1;. int pr
7c10: 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d oto = 0, level =
7c20: 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 -1;. int ver
7c30: 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 ify = 0, require
7c40: 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 = 0, request =
7c50: 31 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 1;.. dprintf(
7c60: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 "Called");..#if
7c70: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
7c80: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 NUMBER < 0x10100
7c90: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 000L && !defined
7ca0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
7cb0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f ) && !defined(NO
7cc0: 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e 65 _SSL2) && define
7cd0: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64 65 d(NO_SSL3) && de
7ce0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 fined(NO_TLS1) &
7cf0: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 & defined(NO_TLS
7d00: 31 5f 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 1_1) && defined(
7d10: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 64 65 NO_TLS1_2) && de
7d20: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
7d30: 0a 20 20 20 20 73 73 6c 32 20 3d 20 31 3b 0a 23 . ssl2 = 1;.#
7d40: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
7d50: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
7d60: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
7d70: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64 65 66 69 NO_SSL3) && defi
7d80: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 ned(NO_SSL2) &&
7d90: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
7da0: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 && defined(NO_T
7db0: 4c 53 31 5f 31 29 20 26 26 20 64 65 66 69 6e 65 LS1_1) && define
7dc0: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 d(NO_TLS1_2) &&
7dd0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
7de0: 33 29 0a 20 20 20 20 73 73 6c 33 20 3d 20 31 3b 3). ssl3 = 1;
7df0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
7e00: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 ned(NO_TLS1) ||
7e10: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7e20: 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 NO_TLS1). tls
7e30: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 1 = 0;.#endif.#i
7e40: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
7e50: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_1) || defined(
7e60: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
7e70: 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 1). tls1_1 =
7e80: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 0;.#endif.#if de
7e90: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
7ea0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7eb0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 SSL_NO_TLS1_2).
7ec0: 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 tls1_2 = 0;.#
7ed0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
7ee0: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 d(NO_TLS1_3) ||
7ef0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7f00: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 NO_TLS1_3). t
7f10: 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 ls1_3 = 0;.#endi
7f20: 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 f.. if (objc
7f30: 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e < 2) {..Tcl_Wron
7f40: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
7f50: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
7f60: 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a el ?options?");.
7f70: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
7f80: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 R;. }.. ch
7f90: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
7fa0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f nel(interp, Tcl_
7fb0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
7fc0: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c (objv[1], NULL),
7fd0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 NULL);. if (
7fe0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
7ff0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
8000: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8010: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
8020: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
8030: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
8040: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
8050: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
8060: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
8070: 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 ;.. for (idx
8080: 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b = 2; idx < objc;
8090: 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 idx++) {..char
80a0: 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 *opt = Tcl_GetSt
80b0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
80c0: 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 [idx], NULL);...
80d0: 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d if (opt[0] != '-
80e0: 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a ').. break;..
80f0: 09 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 .OPTSTR("-cadir"
8100: 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 , CAdir);..OPTST
8110: 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 R("-cafile", CAf
8120: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ile);..OPTSTR("-
8130: 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 certfile", certf
8140: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ile);..OPTSTR("-
8150: 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 cipher", ciphers
8160: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 );..OPTSTR("-cip
8170: 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b hers", ciphers);
8180: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 ..OPTSTR("-ciphe
8190: 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 rsuites", cipher
81a0: 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a suites);..OPTOBJ
81b0: 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 ("-command", scr
81c0: 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ipt);..OPTSTR("-
81d0: 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 dhparams", DHpar
81e0: 61 6d 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ams);..OPTSTR("-
81f0: 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c keyfile", keyfil
8200: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f e);..OPTSTR("-mo
8210: 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f del", model);..O
8220: 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 PTOBJ("-password
8230: 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f ", password);..O
8240: 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 PTBOOL("-require
8250: 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 ", require);..OP
8260: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 TBOOL("-request"
8270: 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 , request);..OPT
8280: 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79 6c 65 INT("-securityle
8290: 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f vel", level);..O
82a0: 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 PTBOOL("-server"
82b0: 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 , server);..OPTS
82c0: 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 TR("-servername"
82d0: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 , servername);..
82e0: 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e OPTSTR("-session
82f0: 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 _id", session_id
8300: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 );..OPTOBJ("-alp
8310: 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 42 n", alpn);..OPTB
8320: 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c OOL("-ssl2", ssl
8330: 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 2);..OPTBOOL("-s
8340: 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 sl3", ssl3);..OP
8350: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 TBOOL("-tls1", t
8360: 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 ls1);..OPTBOOL("
8370: 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 -tls1.1", tls1_1
8380: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c );..OPTBOOL("-tl
8390: 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a s1.2", tls1_2);.
83a0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e .OPTBOOL("-tls1.
83b0: 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 3", tls1_3);..OP
83c0: 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 TBYTE("-cert", c
83d0: 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a ert, cert_len);.
83e0: 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c .OPTBYTE("-key",
83f0: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a key, key_len);.
8400: 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e ..OPTBAD("option
8410: 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 ", "-alpn, -cadi
8420: 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 r, -cafile, -cer
8430: 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 t, -certfile, -c
8440: 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 ipher, -ciphersu
8450: 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 ites, -command,
8460: 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c -dhparams, -key,
8470: 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 -keyfile, -mode
8480: 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 72 l, -password, -r
8490: 65 71 75 69 72 65 2c 20 2d 72 65 71 75 65 73 74 equire, -request
84a0: 2c 20 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c , -securitylevel
84b0: 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 , -server, -serv
84c0: 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e ername, -session
84d0: 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c _id, -ssl2, -ssl
84e0: 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 3, -tls1, -tls1.
84f0: 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 6f 72 20 2d 1, -tls1.2, or -
8500: 74 6c 73 31 2e 33 22 29 3b 0a 0a 09 72 65 74 75 tls1.3");...retu
8510: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
8520: 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 }. if (requ
8530: 65 73 74 29 09 20 20 20 20 76 65 72 69 66 79 20 est). verify
8540: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c |= SSL_VERIFY_CL
8550: 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f IENT_ONCE | SSL_
8560: 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 VERIFY_PEER;.
8570: 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 if (request &&
8580: 72 65 71 75 69 72 65 29 20 76 65 72 69 66 79 20 require) verify
8590: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 |= SSL_VERIFY_FA
85a0: 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 IL_IF_NO_PEER_CE
85b0: 52 54 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 RT;. if (veri
85c0: 66 79 20 3d 3d 20 30 29 09 76 65 72 69 66 79 20 fy == 0).verify
85d0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e = SSL_VERIFY_NON
85e0: 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d E;.. proto |=
85f0: 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f (ssl2 ? TLS_PRO
8600: 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 TO_SSL2 : 0);.
8610: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 proto |= (ssl3
8620: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c ? TLS_PROTO_SSL
8630: 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 3 : 0);. prot
8640: 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 o |= (tls1 ? TLS
8650: 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 _PROTO_TLS1 : 0)
8660: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
8670: 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f tls1_1 ? TLS_PRO
8680: 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a TO_TLS1_1 : 0);.
8690: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
86a0: 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f s1_2 ? TLS_PROTO
86b0: 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 _TLS1_2 : 0);.
86c0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
86d0: 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 _3 ? TLS_PROTO_T
86e0: 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 LS1_3 : 0);..
86f0: 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c /* reset to NUL
8700: 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e L if blank strin
8710: 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 g provided */.
8720: 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a if (cert && !*
8730: 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63 cert).. c
8740: 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ert. = NU
8750: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 LL;. if (key
8760: 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 && !*key)..
8770: 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d key. =
8780: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
8790: 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 ertfile && !*cer
87a0: 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 tfile) c
87b0: 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a ertfile.= NULL;.
87c0: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 if (keyfile
87d0: 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b && !*keyfile)..k
87e0: 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d eyfile. =
87f0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
8800: 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 iphers && !*ciph
8810: 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70 ers). cip
8820: 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e hers. = N
8830: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 ULL;. if (cip
8840: 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 hersuites && !*c
8850: 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70 iphersuites) cip
8860: 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e hersuites = N
8870: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 ULL;. if (CAf
8880: 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 ile && !*CAfile)
8890: 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 . CAfile.
88a0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
88b0: 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26 26 if (CAdir &&
88c0: 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 20 20 !*CAdir).
88d0: 20 20 43 41 64 69 72 09 20 20 20 20 20 20 20 20 CAdir.
88e0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
88f0: 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 DHparams && !*DH
8900: 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 params).
8910: 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 DHparams
8920: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 = NULL;.. /*
8930: 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f new SSL state */
8940: 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d . statePtr..=
8950: 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c (State *) ckall
8960: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 oc((unsigned) si
8970: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 zeof(State));.
8980: 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 memset(statePt
8990: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 r, 0, sizeof(Sta
89a0: 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 te));.. state
89b0: 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 Ptr->flags.= fla
89c0: 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 gs;. statePtr
89d0: 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 ->interp.= inter
89e0: 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d p;. statePtr-
89f0: 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 >vflags.= verify
8a00: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
8a10: 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f err.= "";.. /
8a20: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 * allocate scrip
8a30: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 t */. if (scr
8a40: 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 ipt) {..(void) T
8a50: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
8a60: 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e Obj(script, &len
8a70: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
8a80: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 statePtr->ca
8a90: 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b llback = script;
8aa0: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
8ab0: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
8ac0: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 >callback);..}.
8ad0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c }.. /* all
8ae0: 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a ocate password *
8af0: 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f /. if (passwo
8b00: 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 rd) {..(void) Tc
8b10: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
8b20: 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 bj(password, &le
8b30: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
8b40: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 . statePtr->p
8b50: 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f assword = passwo
8b60: 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 rd;.. Tcl_Inc
8b70: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
8b80: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 tr->password);..
8b90: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 }. }.. if
8ba0: 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 (model != NULL)
8bb0: 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a {..int mode;../*
8bc0: 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 Get the "model"
8bd0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 context */..cha
8be0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
8bf0: 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c el(interp, model
8c00: 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 , &mode);..if (c
8c10: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
8c20: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 nel) NULL) {..
8c30: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
8c40: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
8c50: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
8c60: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 RROR;..}.../*..
8c70: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
8c80: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
8c90: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 pmost channel..
8ca0: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 */..chan = Tcl_G
8cb0: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
8cc0: 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 n);..if (Tcl_Get
8cd0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
8ce0: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
8cf0: 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 Type()) {.. T
8d00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8d10: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
8d20: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
8d30: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
8d40: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 n),..."\": not a
8d50: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e TLS channel", N
8d60: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
8d70: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
8d80: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
8d90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
8da0: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 }..ctx = ((State
8db0: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *)Tcl_GetChanne
8dc0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
8dd0: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d an))->ctx;. }
8de0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 else {..if ((ct
8df0: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 x = CTX_Init(sta
8e00: 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 tePtr, server, p
8e10: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 roto, keyfile, c
8e20: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 ertfile, key, ce
8e30: 72 74 2c 0a 09 20 20 20 20 6b 65 79 5f 6c 65 6e rt,.. key_len
8e40: 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69 , cert_len, CAdi
8e50: 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 r, CAfile, ciphe
8e60: 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 rs, ciphersuites
8e70: 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d , level, DHparam
8e80: 73 29 29 20 3d 3d 20 28 53 53 4c 5f 43 54 58 2a s)) == (SSL_CTX*
8e90: 29 30 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 )0) {.. Tls_F
8ea0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
8eb0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
8ec0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
8ed0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 }. }.. sta
8ee0: 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 tePtr->ctx = ctx
8ef0: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
8f00: 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 We need to make
8f10: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 sure that the c
8f20: 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 hannel works in
8f30: 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65 0a binary (for the.
8f40: 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69 6f * encryptio
8f50: 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f n not to get goo
8f60: 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 fed up).. *
8f70: 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 We only want to
8f80: 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 66 65 adjust the buffe
8f90: 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 63 ring in pre-v2 c
8fa0: 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 hannels, where.
8fb0: 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e 6e * each chann
8fc0: 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 el in the stack
8fd0: 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20 6f maintained its o
8fe0: 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20 20 wn buffers..
8ff0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 */. Tcl_DStr
9000: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
9010: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
9020: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
9030: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
9040: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 nnelBlocking);.
9050: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
9060: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
9070: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 EOFChar);. Tc
9080: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
9090: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
90a0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 ing);. Tcl_Ge
90b0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
90c0: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 nterp, chan, "-e
90d0: 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 ofchar", &upperC
90e0: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a hannelEOFChar);.
90f0: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e Tcl_GetChann
9100: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
9110: 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e chan, "-encodin
9120: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 g", &upperChanne
9130: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 lEncoding);.
9140: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
9150: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
9160: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
9170: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
9180: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 Translation);.
9190: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c Tcl_GetChannel
91a0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
91b0: 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 han, "-blocking"
91c0: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 , &upperChannelB
91d0: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 locking);. Tc
91e0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
91f0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
9200: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c "-translation",
9210: 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 "binary");.
9220: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
9230: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
9240: 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 n, "-blocking",
9250: 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70 72 "true");. dpr
9260: 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 intf("Consuming
9270: 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c Tcl channel %s",
9280: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
9290: 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 ame(chan));.
92a0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
92b0: 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 Tcl_StackChanne
92c0: 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 l(interp, Tls_Ch
92d0: 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 6c annelType(), (Cl
92e0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
92f0: 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 4c tr, (TCL_READABL
9300: 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 E | TCL_WRITABLE
9310: 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 ), chan);. dp
9320: 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 63 rintf("Created c
9330: 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 hannel named %s"
9340: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
9350: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
9360: 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 73 elf));. if (s
9370: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d tatePtr->self ==
9380: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
9390: 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e ULL) {../*.. * N
93a0: 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 o use of Tcl_Eve
93b0: 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 61 ntuallyFree beca
93c0: 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 use no possible
93d0: 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 Tcl_Preserve...
93e0: 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 */..Tls_Free((ch
93f0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
9400: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
9410: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
9420: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
9430: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ion(interp, stat
9440: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 ePtr->self, "-tr
9450: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f anslation", Tcl_
9460: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 DStringValue(&up
9470: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
9480: 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c ation));. Tcl
9490: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
94a0: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
94b0: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f tr->self, "-enco
94c0: 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 ding", Tcl_DStri
94d0: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
94e0: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b annelEncoding));
94f0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
9500: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
9510: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
9520: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 , "-eofchar", Tc
9530: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
9540: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 upperChannelEOFC
9550: 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 har));. Tcl_S
9560: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
9570: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
9580: 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 ->self, "-blocki
9590: 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 ng", Tcl_DString
95a0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e Value(&upperChan
95b0: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a nelBlocking));..
95c0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 /*. * SS
95d0: 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e L Initialization
95e0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 . */. sta
95f0: 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c tePtr->ssl = SSL
9600: 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 _new(statePtr->c
9610: 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 tx);. if (!st
9620: 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 atePtr->ssl) {..
9630: 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 /* SSL library e
9640: 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 rror */..Tcl_App
9650: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
9660: 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 , "couldn't cons
9670: 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f truct ssl sessio
9680: 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 n: ", REASON(),
9690: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
96a0: 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 .Tls_Free((char
96b0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 *) statePtr);..r
96c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
96d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
96e0: 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e et host server n
96f0: 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 ame */. if (s
9700: 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a ervername) {../*
9710: 20 53 65 74 73 20 74 68 65 20 73 65 72 76 65 72 Sets the server
9720: 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e name indication
9730: 20 28 53 4e 49 29 20 43 6c 69 65 6e 74 48 65 6c (SNI) ClientHel
9740: 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a lo extension */.
9750: 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c .if (!SSL_set_tl
9760: 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 sext_host_name(s
9770: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 tatePtr->ssl, se
9780: 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71 rvername) && req
9790: 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c uire) {.. Tcl
97a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
97b0: 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 54 terp, "setting T
97c0: 4c 53 20 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 LS host name ext
97d0: 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20 ension failed",
97e0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f Tls_
9800: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
9810: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 atePtr);.
9820: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f return TCL_
9830: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d ERROR;. }
9840: 0a 0a 09 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 .../* Configure
9850: 73 65 72 76 65 72 20 68 6f 73 74 20 6e 61 6d 65 server host name
9860: 20 63 68 65 63 6b 73 20 69 6e 20 74 68 65 20 53 checks in the S
9870: 53 4c 20 63 6c 69 65 6e 74 2e 20 53 65 74 20 44 SL client. Set D
9880: 4e 53 20 68 6f 73 74 6e 61 6d 65 20 74 6f 0a 09 NS hostname to..
9890: 20 20 20 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 name for peer
98a0: 20 63 65 72 74 69 66 69 63 61 74 65 20 63 68 65 certificate che
98b0: 63 6b 73 2e 20 53 53 4c 5f 73 65 74 31 5f 68 6f cks. SSL_set1_ho
98c0: 73 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f st has limitatio
98d0: 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c ns. */..if (!SSL
98e0: 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 _add1_host(state
98f0: 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 Ptr->ssl, server
9900: 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 name)) {.. Tc
9910: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
9920: 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 nterp, "setting
9930: 44 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 66 61 DNS host name fa
9940: 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 iled", (char *)
9950: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 NULL);.
9960: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
9970: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
9980: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 retu
9990: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
99a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 . }.. /* R
99b0: 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 esume session id
99c0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 */. if (sess
99d0: 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e ion_id && strlen
99e0: 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 (session_id) <=
99f0: 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f SSL_MAX_SID_CTX_
9a00: 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 LENGTH) {../* SS
9a10: 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 L_set_session()
9a20: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 */..if (!SSL_SES
9a30: 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e SION_set1_id_con
9a40: 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 text(SSL_get_ses
9a50: 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 sion(statePtr->s
9a60: 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c sl), session_id,
9a70: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 (unsigned int)
9a80: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 strlen(session_i
9a90: 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f d))) {.. Tcl_
9aa0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
9ab0: 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73 erp, "Resume ses
9ac0: 73 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 73 69 sion id ", sessi
9ad0: 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 64 22 on_id, " failed"
9ae0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9af0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6c ;. Tl
9b00: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
9b10: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 statePtr);.
9b20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 return TC
9b30: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 L_ERROR;..}.
9b40: 7d 0a 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 }.. if (alpn)
9b50: 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 {../* Convert a
9b60: 20 54 63 6c 20 6c 69 73 74 20 69 6e 74 6f 20 61 Tcl list into a
9b70: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 protocol-list i
9b80: 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f n wire-format */
9b90: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
9ba0: 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e *protos, *p;..un
9bb0: 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f signed int proto
9bc0: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 s_len = 0;..int
9bd0: 69 2c 20 6c 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 i, len, cnt;..Tc
9be0: 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 l_Obj **list;...
9bf0: 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 if (Tcl_ListObjG
9c00: 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 etElements(inter
9c10: 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 p, alpn, &cnt, &
9c20: 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 list) != TCL_OK)
9c30: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 {.. Tls_Free
9c40: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
9c50: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
9c60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a TCL_ERROR;..}..
9c70: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 ./* Determine th
9c80: 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 e memory require
9c90: 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 d for the protoc
9ca0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 ol-list */..for
9cb0: 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b (i = 0; i < cnt;
9cc0: 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c i++) {.. Tcl
9cd0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
9ce0: 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 j(list[i], &len)
9cf0: 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e ;.. if (len >
9d00: 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 255) {...Tcl_Ap
9d10: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
9d20: 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f p, "ALPN protoco
9d30: 6c 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 l name too long"
9d40: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9d50: 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 63 68 ;...Tls_Free((ch
9d60: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
9d70: 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
9d80: 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 ROR;.. }..
9d90: 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 protos_len += 1
9da0: 20 2b 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 + len;..}.../*
9db0: 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 Build the comple
9dc0: 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 te protocol-list
9dd0: 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b */..protos = ck
9de0: 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e alloc(protos_len
9df0: 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d );../* protocol-
9e00: 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 lists consist of
9e10: 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 8-bit length-pr
9e20: 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 efixed, byte str
9e30: 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 69 20 ings */..for (i
9e40: 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b = 0, p = protos;
9e50: 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b i < cnt; i++) {
9e60: 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 .. char *str
9e70: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
9e80: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 romObj(list[i],
9e90: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b &len);.. *p++
9ea0: 20 3d 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d = len;.. mem
9eb0: 63 70 79 28 70 2c 20 73 74 72 2c 20 6c 65 6e 29 cpy(p, str, len)
9ec0: 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b ;.. p += len;
9ed0: 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 ..}.../* SSL_set
9ee0: 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b _alpn_protos mak
9ef0: 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 es a copy of the
9f00: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a protocol-list *
9f10: 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 /../* Note: This
9f20: 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 76 65 72 functions rever
9f30: 73 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 ses the return v
9f40: 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 alue convention
9f50: 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f */..if (SSL_set_
9f60: 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 alpn_protos(stat
9f70: 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f ePtr->ssl, proto
9f80: 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 s, protos_len))
9f90: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
9fa0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
9fb0: 22 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 41 "failed to set A
9fc0: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 LPN protocols",
9fd0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
9fe0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
9ff0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
a000: 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72 ;.. ckfree(pr
a010: 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75 otos);.. retu
a020: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
a030: 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 .../* Store prot
a040: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 ocols list */..s
a050: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
a060: 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 = protos;..state
a070: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 Ptr->protos_len
a080: 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 = protos_len;.
a090: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 } else {..stat
a0a0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e ePtr->protos = N
a0b0: 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e ULL;..statePtr->
a0c0: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a protos_len = 0;.
a0d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
a0e0: 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 * SSL Callbac
a0f0: 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 ks. */. S
a100: 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 SL_set_app_data(
a110: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 statePtr->ssl, (
a120: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
a130: 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 ;./* point back
a140: 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c to us */. SSL
a150: 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74 _set_verify(stat
a160: 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 ePtr->ssl, verif
a170: 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 y, VerifyCallbac
a180: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f k);. SSL_CTX_
a190: 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 set_info_callbac
a1a0: 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c k(statePtr->ctx,
a1b0: 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a InfoCallback);.
a1c0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 . /* Create T
a1d0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 cl_Channel BIO H
a1e0: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 andler */. st
a1f0: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 atePtr->p_bio.=
a200: 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 BIO_new_tcl(stat
a210: 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 ePtr, BIO_NOCLOS
a220: 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 E);. statePtr
a230: 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 ->bio.= BIO_new(
a240: 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 BIO_f_ssl());..
a250: 20 20 20 69 66 20 28 73 65 72 76 65 72 29 20 7b if (server) {
a260: 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c ../* Server call
a270: 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 backs */..SSL_CT
a280: 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 X_set_alpn_selec
a290: 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 t_cb(statePtr->c
a2a0: 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b tx, ALPNCallback
a2b0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
a2c0: 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 tr);..SSL_CTX_se
a2d0: 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e t_tlsext_servern
a2e0: 61 6d 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 ame_arg(statePtr
a2f0: 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 ->ctx, (void *)s
a300: 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 tatePtr);..SSL_C
a310: 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 TX_set_tlsext_se
a320: 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 rvername_callbac
a330: 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c k(statePtr->ctx,
a340: 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 SNICallback);..
a350: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 SSL_CTX_set_clie
a360: 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 nt_hello_cb(stat
a370: 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f ePtr->ctx, Hello
a380: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 Callback, (void
a390: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 09 73 *)statePtr);...s
a3a0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c tatePtr->flags |
a3b0: 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 = TLS_TCL_SERVER
a3c0: 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 ;..SSL_set_accep
a3d0: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 t_state(statePtr
a3e0: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c ->ssl);. } el
a3f0: 73 65 20 7b 0a 09 2f 2a 20 53 65 73 73 69 6f 6e se {../* Session
a400: 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c caching */..SSL
a410: 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e _CTX_set_session
a420: 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 _cache_mode(stat
a430: 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 ePtr->ctx, SSL_S
a440: 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 ESS_CACHE_CLIENT
a450: 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 | SSL_SESS_CACH
a460: 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 E_NO_INTERNAL_ST
a470: 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 ORE);..SSL_CTX_s
a480: 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 ess_set_new_cb(s
a490: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 tatePtr->ctx, Se
a4a0: 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a ssionCallback);.
a4b0: 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 ..SSL_set_connec
a4c0: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 t_state(statePtr
a4d0: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 ->ssl);. }.
a4e0: 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 SSL_set_bio(st
a4f0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 atePtr->ssl, sta
a500: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 tePtr->p_bio, st
a510: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a atePtr->p_bio);.
a520: 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 BIO_set_ssl(
a530: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 statePtr->bio, s
a540: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 tatePtr->ssl, BI
a550: 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 O_NOCLOSE);..
a560: 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f /*. * End o
a570: 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 f SSL Init.
a580: 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 */. dprintf("
a590: 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 Returning %s", T
a5a0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
a5b0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
a5c0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 ));. Tcl_SetR
a5d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 esult(interp, (c
a5e0: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 har *) Tcl_GetCh
a5f0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
a600: 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 tr->self), TCL_V
a610: 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 OLATILE);.. r
a620: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
a630: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
a640: 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ntData;.}.../*.
a650: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
a660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a690: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 ----. *. * Unimp
a6a0: 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a ortObjCmd --. *.
a6b0: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
a6c0: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 e is invoked to
a6d0: 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f remove the topmo
a6e0: 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 st channel filte
a6f0: 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 r.. *. * Results
a700: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
a710: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
a720: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
a730: 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 *.May modify th
a740: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e e behavior of an
a750: 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a IO channel.. *.
a760: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
a770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a7a0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
a7b0: 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a int.UnimportObj
a7c0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
a7d0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
a7e0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
a7f0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
a800: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
a810: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
a820: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 l chan;../* The
a830: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
a840: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 mode on. */..
a850: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
a860: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
a870: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f jc != 2) {..Tcl_
a880: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
a890: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
a8a0: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 hannel");..retur
a8b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
a8c0: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
a8d0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
a8e0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
a8f0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 ing(objv[1]), NU
a900: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 LL);. if (cha
a910: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
a920: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
a930: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
a940: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
a950: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
a960: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
a970: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
a980: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
a990: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a Channel(chan);..
a9a0: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
a9b0: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
a9c0: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
a9d0: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ype()) {..Tcl_Ap
a9e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
a9f0: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
aa00: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
aa10: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
aa20: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 ."\": not a TLS
aa30: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b channel", NULL);
aa40: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
aa50: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
aa60: 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 f (Tcl_UnstackCh
aa70: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 annel(interp, ch
aa80: 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 an) == TCL_ERROR
aa90: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
aaa0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
aab0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
aac0: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
aad0: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
aae0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
aaf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ab00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ab10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ab20: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 -------. *. * CT
ab30: 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 X_Init -- constr
ab40: 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e uct a SSL_CTX in
ab50: 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 stance. *. * Res
ab60: 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 ults:. *.A valid
ab70: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 SSL_CTX instanc
ab80: 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a e or NULL.. *. *
ab90: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
aba0: 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c *.constructs SSL
abb0: 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 context (CTX).
abc0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
abd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
abe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
abf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ac00: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
ac10: 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 ic SSL_CTX *.CTX
ac20: 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 _Init(State *sta
ac30: 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 tePtr, int isSer
ac40: 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 ver, int proto,
ac50: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 char *keyfile, c
ac60: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 har *certfile,.
ac70: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
ac80: 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 *key, unsigned
ac90: 63 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74 20 char *cert, int
aca0: 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 key_len, int cer
acb0: 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 t_len, char *CAd
acc0: 69 72 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41 ir,. char *CA
acd0: 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70 68 file, char *ciph
ace0: 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70 68 65 ers, char *ciphe
acf0: 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 rsuites, int lev
ad00: 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 72 61 el, char *DHpara
ad10: 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e ms) {. Tcl_In
ad20: 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 terp *interp = s
ad30: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
ad40: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 . SSL_CTX *ct
ad50: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 x = NULL;. Tc
ad60: 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 l_DString ds;.
ad70: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 Tcl_DString ds
ad80: 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 1;. int off =
ad90: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 0;. int load
ada0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 _private_key;.
adb0: 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 const SSL_METH
adc0: 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 OD *method;..
add0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
ade0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 ");.. if (!pr
adf0: 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 oto) {..Tcl_Appe
ae00: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
ae10: 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f "no valid proto
ae20: 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 4e col selected", N
ae30: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 ULL);..return (S
ae40: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 SL_CTX *)0;.
ae50: 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 }.. /* create
ae60: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a SSL context */.
ae70: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
ae80: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 ION_NUMBER >= 0x
ae90: 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 10100000L || def
aea0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c ined(NO_SSL2) ||
aeb0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
aec0: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 _NO_SSL2). if
aed0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
aee0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 TLS_PROTO_SSL2)
aef0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
af00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
af10: 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 SL2 protocol not
af20: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
af30: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c L);..return (SSL
af40: 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a _CTX *)0;. }.
af50: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
af60: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 ed(NO_SSL3) || d
af70: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
af80: 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 O_SSL3). if (
af90: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
afa0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 LS_PROTO_SSL3))
afb0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
afc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c ult(interp, "SSL
afd0: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 3 protocol not s
afe0: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
aff0: 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 ;..return (SSL_C
b000: 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 TX *)0;. }.#e
b010: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
b020: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 (NO_TLS1) || def
b030: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
b040: 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e TLS1). if (EN
b050: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
b060: 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a _PROTO_TLS1)) {.
b070: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
b080: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
b090: 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .0 protocol not
b0a0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
b0b0: 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f );..return (SSL_
b0c0: 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 CTX *)0;. }.#
b0d0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
b0e0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 d(NO_TLS1_1) ||
b0f0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
b100: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 NO_TLS1_1). i
b110: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
b120: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
b130: 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 _1)) {..Tcl_Appe
b140: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
b150: 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 "TLS 1.1 protoc
b160: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
b170: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
b180: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a n (SSL_CTX *)0;.
b190: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
b1a0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
b1b0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _2) || defined(O
b1c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
b1d0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
b1e0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
b1f0: 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 TO_TLS1_2)) {..T
b200: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
b210: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 interp, "TLS 1.2
b220: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
b230: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
b240: 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 ..return (SSL_CT
b250: 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e X *)0;. }.#en
b260: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
b270: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
b280: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
b290: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 _TLS1_3). if
b2a0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
b2b0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
b2c0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
b2d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
b2e0: 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c TLS 1.3 protocol
b2f0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
b300: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
b310: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 (SSL_CTX *)0;.
b320: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 }.#endif..
b330: 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 7b switch (proto) {
b340: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
b350: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
b360: 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 10100000L && !de
b370: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 fined(NO_SSL2) &
b380: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
b390: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 SL_NO_SSL2).
b3a0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 case TLS_PROTO_S
b3b0: 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 SL2:..method = i
b3c0: 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32 5f sServer ? SSLv2_
b3d0: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 server_method()
b3e0: 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d : SSLv2_client_m
b3f0: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b ethod();..break;
b400: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
b410: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 ined(NO_SSL3) &&
b420: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
b430: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 L_NO_SSL3) && !d
b440: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
b450: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 O_SSL3_METHOD).
b460: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
b470: 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 O_SSL3:..method
b480: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c = isServer ? SSL
b490: 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 v3_server_method
b4a0: 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e () : SSLv3_clien
b4b0: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
b4c0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
b4d0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
b4e0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
b4f0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 NSSL_NO_TLS1) &&
b500: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
b510: 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 L_NO_TLS1_METHOD
b520: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
b530: 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 ROTO_TLS1:..meth
b540: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
b550: 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 TLSv1_server_met
b560: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c hod() : TLSv1_cl
b570: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
b580: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
b590: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
b5a0: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
b5b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
b5c0: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_1) && !defined
b5d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
b5e0: 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 _1_METHOD). c
b5f0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
b600: 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 S1_1:..method =
b610: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 isServer ? TLSv1
b620: 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 _1_server_method
b630: 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 () : TLSv1_1_cli
b640: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
b650: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
b660: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
b670: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
b680: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
b690: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _2) && !defined(
b6a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
b6b0: 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 2_METHOD). ca
b6c0: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 se TLS_PROTO_TLS
b6d0: 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 1_2:..method = i
b6e0: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f sServer ? TLSv1_
b6f0: 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 2_server_method(
b700: 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 ) : TLSv1_2_clie
b710: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
b720: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
b730: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
b740: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
b750: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
b760: 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 3). case TLS_
b770: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f PROTO_TLS1_3:../
b780: 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 69 * Use the generi
b790: 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e c method and con
b7a0: 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 66 straint range af
b7b0: 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 63 ter context is c
b7c0: 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f reated */..metho
b7d0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
b7e0: 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 LS_server_method
b7f0: 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f () : TLS_client_
b800: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
b810: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 ;.#endif. def
b820: 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 ault:../* Negoti
b830: 61 74 65 20 68 69 67 68 65 73 74 20 61 76 61 69 ate highest avai
b840: 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 lable SSL/TLS ve
b850: 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 rsion */..method
b860: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c = isServer ? TL
b870: 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 S_server_method(
b880: 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d ) : TLS_client_m
b890: 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45 ethod();.#if OPE
b8a0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
b8b0: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 BER < 0x10100000
b8c0: 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f L && !defined(NO
b8d0: 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e _SSL2) && !defin
b8e0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
b8f0: 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 L2)..off |= (ENA
b900: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
b910: 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 PROTO_SSL2) ?
b920: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 0 : SSL_OP_NO_SS
b930: 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 Lv2);.#endif.#if
b940: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
b950: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
b960: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a PENSSL_NO_SSL3).
b970: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
b980: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
b990: 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 O_SSL3) ? 0 :
b9a0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 SSL_OP_NO_SSLv3)
b9b0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
b9c0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 fined(NO_TLS1) &
b9d0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
b9e0: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 SL_NO_TLS1)..off
b9f0: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f |= (ENABLED(pro
ba00: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
ba10: 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f S1) ? 0 : SSL_
ba20: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 OP_NO_TLSv1);.#e
ba30: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
ba40: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 d(NO_TLS1_1) &&
ba50: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
ba60: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66 _NO_TLS1_1)..off
ba70: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f |= (ENABLED(pro
ba80: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
ba90: 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f S1_1) ? 0 : SSL_
baa0: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a OP_NO_TLSv1_1);.
bab0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
bac0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 ned(NO_TLS1_2) &
bad0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
bae0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f SL_NO_TLS1_2)..o
baf0: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
bb00: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
bb10: 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 TLS1_2) ? 0 : SS
bb20: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 L_OP_NO_TLSv1_2)
bb30: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
bb40: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
bb50: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
bb60: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
bb70: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
bb80: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
bb90: 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 O_TLS1_3) ? 0 :
bba0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f SSL_OP_NO_TLSv1_
bbb0: 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 3);.#endif..brea
bbc0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 k;. }.. ER
bbd0: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b R_clear_error();
bbe0: 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 . ctx = SSL_C
bbf0: 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a TX_new(method);.
bc00: 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 20 7b . if (!ctx) {
bc10: 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
bc20: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 }.. if (g
bc30: 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 etenv(SSLKEYLOGF
bc40: 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 ILE)) {..SSL_CTX
bc50: 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c _set_keylog_call
bc60: 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 back(ctx, KeyLog
bc70: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d Callback);. }
bc80: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e ..#if !defined(N
bc90: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 O_TLS1_3) && !de
bca0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
bcb0: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 _TLS1_3). if
bcc0: 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 (proto == TLS_PR
bcd0: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 OTO_TLS1_3) {..S
bce0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 SL_CTX_set_min_p
bcf0: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
bd00: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
bd10: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f );..SSL_CTX_set_
bd20: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f max_proto_versio
bd30: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
bd40: 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 RSION);. }.#e
bd50: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 ndif.. /* For
bd60: 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 74 ce cipher select
bd70: 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72 ion order by ser
bd80: 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 ver */. if (!
bd90: 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c isServer) {..SSL
bda0: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
bdb0: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 (ctx, SSL_OP_CIP
bdc0: 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45 HER_SERVER_PREFE
bdd0: 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 RENCE);. }..
bde0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 SSL_CTX_set_a
bdf0: 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 76 6f pp_data(ctx, (vo
be00: 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 id*)interp);./*
be10: 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e 74 remember the int
be20: 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 erpreter */.
be30: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
be40: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f ons(ctx, SSL_OP_
be50: 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c ALL);./* all SSL
be60: 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 bug workarounds
be70: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f */. SSL_CTX_
be80: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c set_options(ctx,
be90: 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 off);../* disab
bea0: 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 le protocol vers
beb0: 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e ions */.#if OPEN
bec0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
bed0: 45 52 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c ER < 0x10101000L
bee0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
bef0: 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d _mode(ctx, SSL_M
bf00: 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b ODE_AUTO_RETRY);
bf10: 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 ./* handle new h
bf20: 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 61 63 andshakes in bac
bf30: 6b 67 72 6f 75 6e 64 20 2a 2f 0a 23 65 6e 64 69 kground */.#endi
bf40: 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 f. SSL_CTX_se
bf50: 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a ss_set_cache_siz
bf60: 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 e(ctx, 128);..
bf70: 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 /* Set user de
bf80: 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 fined ciphers, c
bf90: 69 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e ipher suites, an
bfa0: 64 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c d security level
bfb0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 */. if ((cip
bfc0: 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 hers != NULL) &&
bfd0: 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 !SSL_CTX_set_ci
bfe0: 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 pher_list(ctx, c
bff0: 69 70 68 65 72 73 29 29 20 7b 0a 09 20 20 20 20 iphers)) {..
c000: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
c010: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 (interp, "Set ci
c020: 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f phers failed: No
c030: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c valid ciphers",
c040: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
c050: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 .. SSL_CTX_fr
c060: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 ee(ctx);.. re
c070: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 turn (SSL_CTX *)
c080: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 0;. }. if
c090: 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 21 ((ciphersuites !
c0a0: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f = NULL) && !SSL_
c0b0: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75 CTX_set_ciphersu
c0c0: 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 72 ites(ctx, cipher
c0d0: 73 75 69 74 65 73 29 29 20 7b 0a 09 20 20 20 20 suites)) {..
c0e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
c0f0: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 (interp, "Set ci
c100: 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69 6c pher suites fail
c110: 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 ed: No valid cip
c120: 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 hers", (char *)
c130: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
c140: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
c150: 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f return (SSL_
c160: 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a CTX *)0;. }..
c170: 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 /* Set secur
c180: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 ity level */.
c190: 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 if (level > -1
c1a0: 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a && level < 6) {.
c1b0: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 ./* SSL_set_secu
c1c0: 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 rity_level */..S
c1d0: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 SL_CTX_set_secur
c1e0: 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c ity_level(ctx, l
c1f0: 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 evel);. }..
c200: 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 /* set some ca
c210: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 llbacks */. S
c220: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 SL_CTX_set_defau
c230: 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 lt_passwd_cb(ctx
c240: 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 , PasswordCallba
c250: 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 ck);. SSL_CTX
c260: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 _set_default_pas
c270: 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 swd_cb_userdata(
c280: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ctx, (void *)sta
c290: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 tePtr);.. /*
c2a0: 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 read a Diffie-He
c2b0: 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 llman parameters
c2c0: 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 file, or use th
c2d0: 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a e built-in one *
c2e0: 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c /.#ifdef OPENSSL
c2f0: 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 _NO_DH. if (D
c300: 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 Hparams != NULL)
c310: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
c320: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 sult(interp, "DH
c330: 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f parameter suppo
c340: 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 rt not available
c350: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
c360: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 );..SSL_CTX_free
c370: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 28 (ctx);..return (
c380: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 SSL_CTX *)0;.
c390: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 }.#else. {..
c3a0: 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 DH* dh;..if (DHp
c3b0: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b arams != NULL) {
c3c0: 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a .. BIO *bio;.
c3d0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
c3e0: 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 20 20 Init(&ds);..
c3f0: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 bio = BIO_new_fi
c400: 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c le(F2N(DHparams,
c410: 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 &ds), "r");..
c420: 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 if (!bio) {...
c430: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
c440: 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 &ds);...Tcl_Appe
c450: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
c460: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 "Could not find
c470: 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 DH parameters f
c480: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ile", (char *) N
c490: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
c4a0: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
c4b0: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
c4c0: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 ;.. }... d
c4d0: 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f h = PEM_read_bio
c4e0: 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e _DHparams(bio, N
c4f0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 ULL, NULL, NULL)
c500: 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 ;.. BIO_free(
c510: 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 bio);.. Tcl_D
c520: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
c530: 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b .. if (!dh) {
c540: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
c550: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 ult(interp, "Cou
c560: 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 ld not read DH p
c570: 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 arameters from f
c580: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ile", (char *) N
c590: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
c5a0: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
c5b0: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
c5c0: 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 ;.. }..} else
c5d0: 20 7b 0a 09 20 20 20 20 64 68 20 3d 20 67 65 74 {.. dh = get
c5e0: 5f 64 68 50 61 72 61 6d 73 28 29 3b 0a 09 7d 0a _dhParams();..}.
c5f0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 .SSL_CTX_set_tmp
c600: 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 44 _dh(ctx, dh);..D
c610: 48 5f 66 72 65 65 28 64 68 29 3b 0a 20 20 20 20 H_free(dh);.
c620: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a }.#endif.. /*
c630: 20 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 set our certifi
c640: 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 cate */. load
c650: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 _private_key = 0
c660: 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 ;. if (certfi
c670: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c le != NULL) {..l
c680: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 oad_private_key
c690: 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44 53 74 72 69 = 1;...Tcl_DStri
c6a0: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 0a 09 69 ngInit(&ds);...i
c6b0: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 f (SSL_CTX_use_c
c6c0: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 ertificate_file(
c6d0: 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c ctx, F2N(certfil
c6e0: 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c e, &ds), SSL_FIL
c6f0: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 ETYPE_PEM) <= 0)
c700: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 {.. Tcl_DStr
c710: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
c720: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
c730: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
c740: 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 ble to set certi
c750: 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 ficate file ", c
c760: 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 ertfile, ": ",..
c770: 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c .. REASON(),
c780: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
c790: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 .. SSL_CTX_fr
c7a0: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 ee(ctx);.. re
c7b0: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 turn (SSL_CTX *)
c7c0: 30 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 0;..}. } else
c7d0: 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c if (cert != NUL
c7e0: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 L) {..load_priva
c7f0: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 te_key = 1;..if
c800: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 (SSL_CTX_use_cer
c810: 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 tificate_ASN1(ct
c820: 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 x, cert_len, cer
c830: 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 t) <= 0) {..
c840: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
c850: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 &ds);.. Tcl_A
c860: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
c870: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
c880: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 et certificate:
c890: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f ",.... REASO
c8a0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
c8b0: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
c8c0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
c8d0: 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 return (SSL_CT
c8e0: 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 7d 20 X *)0;..}. }
c8f0: 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 else {..certfile
c900: 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 = (char*)X509_g
c910: 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f et_default_cert_
c920: 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 file();...if (SS
c930: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 L_CTX_use_certif
c940: 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 icate_file(ctx,
c950: 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 certfile, SSL_FI
c960: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 LETYPE_PEM) <= 0
c970: 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 ) {.#if 0.. T
c980: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
c990: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 ds);.. Tcl_Ap
c9a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
c9b0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 p, "unable to us
c9c0: 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 e default certif
c9d0: 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 icate file ", ce
c9e0: 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 rtfile, ": ",...
c9f0: 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 . REASON(),
ca00: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
ca10: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 . SSL_CTX_fre
ca20: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 e(ctx);.. ret
ca30: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
ca40: 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 ;.#endif..}.
ca50: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 }.. /* set ou
ca60: 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f r private key */
ca70: 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 . if (load_pr
ca80: 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 ivate_key) {..if
ca90: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c (keyfile == NUL
caa0: 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c L && key == NULL
cab0: 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 ) {.. keyfile
cac0: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a = certfile;..}.
cad0: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d ..if (keyfile !=
cae0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a NULL) {.. /*
caf0: 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65 get the private
cb00: 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 key associated
cb10: 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66 with this certif
cb20: 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 icate */.. if
cb30: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c (keyfile == NUL
cb40: 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d L) {...keyfile =
cb50: 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 certfile;..
cb60: 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f }... if (SSL_
cb70: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b CTX_use_PrivateK
cb80: 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e ey_file(ctx, F2N
cb90: 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 (keyfile, &ds),
cba0: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d SSL_FILETYPE_PEM
cbb0: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f ) <= 0) {...Tcl_
cbc0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
cbd0: 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 ;.../* flush the
cbe0: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 passphrase whic
cbf0: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 h might be left
cc00: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f in the result */
cc10: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
cc20: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 (interp, NULL, T
cc30: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 CL_STATIC);...Tc
cc40: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
cc50: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
cc60: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 o set public key
cc70: 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 file ", keyfile
cc80: 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20 20 , " ",....
cc90: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 REASON(), (ch
cca0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 ar *) NULL);...S
ccb0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
ccc0: 3b 0a 09 09 72 65 74 75 72 6e 20 28 53 53 4c 5f ;...return (SSL_
ccd0: 43 54 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a CTX *)0;.. }.
cce0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
ccf0: 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 Free(&ds);...} e
cd00: 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e lse if (key != N
cd10: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 ULL) {.. if (
cd20: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 SSL_CTX_use_Priv
cd30: 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f ateKey_ASN1(EVP_
cd40: 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b PKEY_RSA, ctx, k
cd50: 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 ey,key_len) <= 0
cd60: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ) {...Tcl_DStrin
cd70: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a gFree(&ds);.../*
cd80: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 flush the passp
cd90: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 hrase which migh
cda0: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 t be left in the
cdb0: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c result */...Tcl
cdc0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
cdd0: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 p, NULL, TCL_STA
cde0: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 TIC);...Tcl_Appe
cdf0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
ce00: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
ce10: 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 52 public key: ", R
ce20: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
ce30: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 ) NULL);...SSL_C
ce40: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 TX_free(ctx);...
ce50: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
ce60: 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 *)0;.. }..}..
ce70: 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 /* Now we know t
ce80: 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 hat a key and ce
ce90: 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 rt have been set
cea0: 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 against.. * the
ceb0: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a SSL context */.
cec0: 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 .if (!SSL_CTX_ch
ced0: 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 eck_private_key(
cee0: 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c ctx)) {.. Tcl
cef0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
cf00: 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b terp, "private k
cf10: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 ey does not matc
cf20: 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 h the certificat
cf30: 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 e public key",..
cf40: 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 .. (char *)
cf50: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
cf60: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
cf70: 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f return (SSL_
cf80: 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 CTX *)0;..}.
cf90: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 76 65 }.. /* Set ve
cfa0: 72 69 66 69 63 61 74 69 6f 6e 20 43 41 73 20 2a rification CAs *
cfb0: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e /. Tcl_DStrin
cfc0: 67 49 6e 69 74 28 26 64 73 29 3b 0a 20 20 20 20 gInit(&ds);.
cfd0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
cfe0: 26 64 73 31 29 3b 0a 20 20 20 20 69 66 20 28 21 &ds1);. if (!
cff0: 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 SSL_CTX_load_ver
d000: 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 ify_locations(ct
d010: 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 x, F2N(CAfile, &
d020: 64 73 29 2c 20 46 32 4e 28 43 41 64 69 72 2c 20 ds), F2N(CAdir,
d030: 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f &ds1)) ||..!SSL_
d040: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
d050: 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 verify_paths(ctx
d060: 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f )) {.#if 0..Tcl_
d070: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
d080: 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ;..Tcl_DStringFr
d090: 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f ee(&ds1);../* Do
d0a0: 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 20 63 61 n't currently ca
d0b0: 72 65 20 69 66 20 74 68 69 73 20 66 61 69 6c 73 re if this fails
d0c0: 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 */..Tcl_AppendR
d0d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
d0e0: 53 4c 20 64 65 66 61 75 6c 74 20 76 65 72 69 66 SL default verif
d0f0: 79 20 70 61 74 68 73 3a 20 22 2c 20 52 45 41 53 y paths: ", REAS
d100: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
d110: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
d120: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
d130: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a n (SSL_CTX *)0;.
d140: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
d150: 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 /* https://sou
d160: 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 rceforge.net/p/t
d170: 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 ls/bugs/57/ */.
d180: 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 /* XXX:TODO:
d190: 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75 70 Let the user sup
d1a0: 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 ply values here
d1b0: 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 instead of somet
d1c0: 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 hing that exists
d1d0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 on the filesyst
d1e0: 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28 43 41 em */. if (CA
d1f0: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
d200: 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e .STACK_OF(X509_N
d210: 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 AME) *certNames
d220: 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e = SSL_load_clien
d230: 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 t_CA_file(F2N(CA
d240: 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69 66 file, &ds));..if
d250: 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e (certNames != N
d260: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f ULL) {.. SSL_
d270: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 CTX_set_client_C
d280: 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 A_list(ctx, cert
d290: 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d Names);..}. }
d2a0: 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
d2b0: 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 gFree(&ds);.
d2c0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
d2d0: 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72 &ds1);. retur
d2e0: 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a n ctx;.}.../*. *
d2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d330: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 ---. *. * Status
d340: 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e ObjCmd -- return
d350: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 certificate for
d360: 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e connected peer.
d370: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
d380: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
d390: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
d3a0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
d3b0: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
d3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
d400: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 */.static int.S
d410: 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 tatusObjCmd(Clie
d420: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
d430: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
d440: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
d450: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
d460: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 objv[]) {. St
d470: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 ate *statePtr;.
d480: 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 X509 *peer;.
d490: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
d4a0: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e tr;. Tcl_Chan
d4b0: 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 nel chan;. ch
d4c0: 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c ar *channelName,
d4d0: 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 *ciphers;. i
d4e0: 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e nt mode;. con
d4f0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
d500: 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 *proto;. uns
d510: 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 0a igned int len;..
d520: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
d530: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 77 69 74 led");.. swit
d540: 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61 73 ch (objc) {..cas
d550: 65 20 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e 65 e 2:.. channe
d560: 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 lName = Tcl_GetS
d570: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
d580: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 v[1], NULL);..
d590: 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 break;...case
d5a0: 33 3a 0a 09 20 20 20 20 69 66 20 28 21 73 74 72 3:.. if (!str
d5b0: 63 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 72 69 cmp (Tcl_GetStri
d5c0: 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d ng (objv[1]), "-
d5d0: 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 68 61 local")) {...cha
d5e0: 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 nnelName = Tcl_G
d5f0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
d600: 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b 0a objv[2], NULL);.
d610: 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a ..break;.. }.
d620: 09 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c . /* else fal
d630: 6c 2d 74 68 72 6f 75 67 68 20 2e 2e 2e 20 2a 2f l-through ... */
d640: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 47 .#if defined(__G
d650: 4e 55 43 5f 5f 29 0a 09 20 20 20 20 5f 5f 61 74 NUC__).. __at
d660: 74 72 69 62 75 74 65 5f 5f 28 28 66 61 6c 6c 74 tribute__((fallt
d670: 68 72 6f 75 67 68 29 29 3b 0a 23 65 6e 64 69 66 hrough));.#endif
d680: 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 ..default:..
d690: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
d6a0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
d6b0: 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e , "?-local? chan
d6c0: 6e 65 6c 22 29 3b 0a 09 20 20 20 20 72 65 74 75 nel");.. retu
d6d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
d6e0: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 }.. chan =
d6f0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
d700: 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 nterp, channelNa
d710: 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 me, &mode);.
d720: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
d730: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
d740: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
d750: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f ROR;. }. /
d760: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
d770: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
d780: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
d790: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
d7a0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
d7b0: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c an);. if (Tcl
d7c0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
d7d0: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
d7e0: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 nnelType()) {..T
d7f0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
d800: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
d810: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
d820: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
d830: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 n),..."\": not a
d840: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e TLS channel", N
d850: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
d860: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
d870: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 statePtr = (S
d880: 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 tate *) Tcl_GetC
d890: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
d8a0: 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 ta(chan);. if
d8b0: 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 (objc == 2) {..
d8c0: 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 peer = SSL_get_p
d8d0: 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 eer_certificate(
d8e0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
d8f0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 } else {..pe
d900: 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 er = SSL_get_cer
d910: 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 tificate(statePt
d920: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 r->ssl);. }.
d930: 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 if (peer) {..
d940: 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 objPtr = Tls_New
d950: 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 X509Obj(interp,
d960: 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 peer);..if (objc
d970: 20 3d 3d 20 32 29 20 7b 20 58 35 30 39 5f 66 72 == 2) { X509_fr
d980: 65 65 28 70 65 65 72 29 3b 20 7d 0a 20 20 20 20 ee(peer); }.
d990: 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 } else {..objPtr
d9a0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
d9b0: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 j(0, NULL);.
d9c0: 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 63 }.. /* Peer c
d9d0: 65 72 74 20 63 68 61 69 6e 20 28 63 6c 69 65 6e ert chain (clien
d9e0: 74 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 20 20 53 t only) */. S
d9f0: 54 41 43 4b 5f 4f 46 28 58 35 30 39 29 2a 20 73 TACK_OF(X509)* s
da00: 73 6c 5f 63 65 72 74 73 20 3d 20 53 53 4c 5f 67 sl_certs = SSL_g
da10: 65 74 5f 70 65 65 72 5f 63 65 72 74 5f 63 68 61 et_peer_cert_cha
da20: 69 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c in(statePtr->ssl
da30: 29 3b 0a 20 20 20 20 69 66 20 28 21 70 65 65 72 );. if (!peer
da40: 20 26 26 20 28 73 73 6c 5f 63 65 72 74 73 20 3d && (ssl_certs =
da50: 3d 20 4e 55 4c 4c 20 7c 7c 20 73 6b 5f 58 35 30 = NULL || sk_X50
da60: 39 5f 6e 75 6d 28 73 73 6c 5f 63 65 72 74 73 29 9_num(ssl_certs)
da70: 20 3d 3d 20 30 29 29 20 7b 0a 09 72 65 74 75 72 == 0)) {..retur
da80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
da90: 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 }.. /* Peer
daa0: 6e 61 6d 65 20 66 72 6f 6d 20 63 65 72 74 20 2a name from cert *
dab0: 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 /. Tcl_ListOb
dac0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
dad0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
dae0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
daf0: 22 70 65 65 72 6e 61 6d 65 22 2c 20 2d 31 29 29 "peername", -1))
db00: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
db10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
db20: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
db30: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
db40: 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d SSL_get0_peernam
db50: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
db60: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c , -1));.. Tcl
db70: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
db80: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
db90: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
dba0: 69 6e 67 4f 62 6a 28 22 73 62 69 74 73 22 2c 20 ingObj("sbits",
dbb0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
dbc0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
dbd0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
dbe0: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a r, Tcl_NewIntObj
dbf0: 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f (SSL_get_cipher_
dc00: 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 bits(statePtr->s
dc10: 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 sl, NULL)));..
dc20: 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 ciphers = (cha
dc30: 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 r*)SSL_get_ciphe
dc40: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 r(statePtr->ssl)
dc50: 3b 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 ;. if ((ciphe
dc60: 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 28 rs != NULL) && (
dc70: 73 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c 20 strcmp(ciphers,
dc80: 22 28 4e 4f 4e 45 29 22 29 20 21 3d 20 30 29 29 "(NONE)") != 0))
dc90: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
dca0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
dcb0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
dcc0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 _NewStringObj("c
dcd0: 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 ipher", -1));..T
dce0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
dcf0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
dd00: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
dd10: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 tringObj(SSL_get
dd20: 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 _cipher(statePtr
dd30: 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 ->ssl), -1));.
dd40: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 }.. /* Veri
dd50: 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 fy the X509 cert
dd60: 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 ificate presente
dd70: 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f d by the peer */
dd80: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
dd90: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
dda0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
ddb0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
ddc0: 76 61 6c 69 64 61 74 69 6f 6e 22 2c 20 2d 31 29 validation", -1)
ddd0: 29 3b 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 67 );. if (SSL_g
dde0: 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 et_verify_result
ddf0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 (statePtr->ssl)
de00: 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a != X509_V_OK) {.
de10: 09 2f 2a 20 70 72 6f 74 6f 20 3d 20 22 66 61 69 ./* proto = "fai
de20: 6c 65 64 22 3b 20 2a 2f 0a 09 70 72 6f 74 6f 20 led"; */..proto
de30: 3d 20 52 45 41 53 4f 4e 28 29 3b 0a 20 20 20 20 = REASON();.
de40: 7d 20 65 6c 73 65 20 7b 0a 09 70 72 6f 74 6f 20 } else {..proto
de50: 3d 20 22 6f 6b 22 3b 0a 20 20 20 20 7d 0a 20 20 = "ok";. }.
de60: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
de70: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
de80: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
de90: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
dea0: 6f 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a o, -1));.. /*
deb0: 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 Report the sele
dec0: 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 cted protocol as
ded0: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 a result of the
dee0: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a negotiation */.
def0: 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 SSL_get0_alp
df00: 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 n_selected(state
df10: 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f Ptr->ssl, &proto
df20: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c , &len);. Tcl
df30: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
df40: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
df50: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
df60: 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d ingObj("alpn", -
df70: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
df80: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
df90: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
dfa0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
dfb0: 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f bj((char *)proto
dfc0: 2c 20 28 69 6e 74 29 20 6c 65 6e 29 29 3b 0a 20 , (int) len));.
dfd0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
dfe0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
dff0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
e000: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 NewStringObj("pr
e010: 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 20 otocol", -1));.
e020: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
e030: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
e040: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
e050: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c NewStringObj(SSL
e060: 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 _get_version(sta
e070: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 tePtr->ssl), -1)
e080: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f );.. Tcl_SetO
e090: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
e0a0: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 objPtr);. re
e0b0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c turn TCL_OK;..cl
e0c0: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
e0d0: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a tData;.}.../*. *
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 2d 2d 2d 2d 2d 2d 2d ----------------
e100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e120: 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 ---. *. * Connec
e130: 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d tionInfoObjCmd -
e140: 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 - return connect
e150: 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 ion info from Op
e160: 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 enSSL.. *. * Res
e170: 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 ults:. *.A list
e180: 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e of connection in
e190: 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d fo. *. *-------
e1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
e1e0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e ..static int Con
e1f0: 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d nectionInfoObjCm
e200: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
e210: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
e220: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
e230: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
e240: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
e250: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
e260: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 chan;../* The ch
e270: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
e280: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 ode on. */. S
e290: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 tate *statePtr;.
e2a0: 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 ./* client state
e2b0: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 for ssl socket
e2c0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a */. Tcl_Obj *
e2d0: 6f 62 6a 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 objPtr;. cons
e2e0: 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 t SSL *ssl;.
e2f0: 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 const SSL_CIPHER
e300: 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63 6f *cipher;. co
e310: 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 nst SSL_SESSION
e320: 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f *session;. co
e330: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
e340: 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 6c 6f r *proto;. lo
e350: 6e 67 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 69 66 ng mode;.. if
e360: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 (objc != 2) {..
e370: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
e380: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
e390: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 , "channel");..r
e3a0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
e3b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 ;. }.. cha
e3c0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
e3d0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 el(interp, Tcl_G
e3e0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
e3f0: 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 objv[1], NULL),
e400: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
e410: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
e420: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
e430: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
e440: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
e450: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
e460: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
e470: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
e480: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
e490: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
e4a0: 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 ;. if (Tcl_Ge
e4b0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 tChannelType(cha
e4c0: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 n) != Tls_Channe
e4d0: 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f lType()) {..Tcl_
e4e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
e4f0: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
e500: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
e510: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
e520: 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 "\": not a TLS
e530: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b channel", NULL);
e540: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
e550: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
e560: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
e570: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
e580: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 ;.. /* Connec
e590: 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 tion info */.
e5a0: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
e5b0: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e te *)Tcl_GetChan
e5c0: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
e5d0: 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d chan);. ssl =
e5e0: 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a statePtr->ssl;.
e5f0: 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e if (ssl != N
e600: 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 ULL) {../* conne
e610: 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 ction state */..
e620: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
e630: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
e640: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
e650: 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 74 65 StringObj("state
e660: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
e670: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
e680: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
e690: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
e6a0: 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 Obj(SSL_state_st
e6b0: 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 ring_long(ssl),
e6c0: 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 -1));.../* Get S
e6d0: 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 65 72 NI requested ser
e6e0: 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 54 63 6c ver name */..Tcl
e6f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
e700: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
e710: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
e720: 69 6e 67 4f 62 6a 28 22 73 65 72 76 65 72 6e 61 ingObj("serverna
e730: 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f me", -1));..Tcl_
e740: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
e750: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
e760: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
e770: 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 ngObj(SSL_get_se
e780: 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c rvername(ssl, TL
e790: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f SEXT_NAMETYPE_ho
e7a0: 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 29 3b 0a st_name), -1));.
e7b0: 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f ../* Get protoco
e7c0: 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 l */..Tcl_ListOb
e7d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
e7e0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
e7f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
e800: 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 "protocol", -1))
e810: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
e820: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
e830: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
e840: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c NewStringObj(SSL
e850: 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c _get_version(ssl
e860: 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 52 65 ), -1));.../* Re
e870: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f negotiation allo
e880: 77 65 64 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 wed */..Tcl_List
e890: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
e8a0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
e8b0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
e8c0: 6a 28 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e j("renegotiation
e8d0: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
e8e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
e8f0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
e900: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
e910: 4f 62 6a 28 0a 09 20 20 20 20 53 53 4c 5f 67 65 Obj(.. SSL_ge
e920: 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 t_secure_renegot
e930: 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73 iation_support(s
e940: 73 6c 29 20 3f 20 22 73 75 70 70 6f 72 74 65 64 sl) ? "supported
e950: 22 20 3a 20 22 6e 6f 74 20 73 75 70 70 6f 72 74 " : "not support
e960: 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 ed", -1));.../*
e970: 47 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 Get security lev
e980: 65 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f el */..Tcl_ListO
e990: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
e9a0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
e9b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
e9c0: 28 22 73 65 63 75 72 69 74 79 6c 65 76 65 6c 22 ("securitylevel"
e9d0: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
e9e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
e9f0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
ea00: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
ea10: 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 SSL_get_security
ea20: 5f 6c 65 76 65 6c 28 73 73 6c 29 29 29 3b 0a 0a _level(ssl)));..
ea30: 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f ./* Session info
ea40: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
ea50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
ea60: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
ea70: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
ea80: 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c session_reused",
ea90: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
eaa0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
eab0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
eac0: 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f Tcl_NewBooleanO
ead0: 62 6a 28 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 bj(SSL_session_r
eae0: 65 75 73 65 64 28 73 73 6c 29 29 29 3b 0a 0a 09 eused(ssl)));...
eaf0: 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 /* Is server inf
eb00: 6f 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 o */..Tcl_ListOb
eb10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
eb20: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
eb30: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
eb40: 22 69 73 5f 73 65 72 76 65 72 22 2c 20 2d 31 29 "is_server", -1)
eb50: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
eb60: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
eb70: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
eb80: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 _NewBooleanObj(S
eb90: 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c SL_is_server(ssl
eba0: 29 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 )));. }..
ebb0: 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a /* Cipher info *
ebc0: 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 /. cipher = S
ebd0: 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 SL_get_current_c
ebe0: 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 ipher(ssl);.
ebf0: 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 if (cipher != NU
ec00: 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b LL) {..char buf[
ec10: 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 BUFSIZ] = {0};..
ec20: 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 int bits, alg_bi
ec30: 74 73 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 ts;...Tcl_ListOb
ec40: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
ec50: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
ec60: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
ec70: 22 63 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a "cipher", -1));.
ec80: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
ec90: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
eca0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
ecb0: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 wStringObj(SSL_C
ecc0: 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 IPHER_get_name(c
ecd0: 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 09 54 ipher), -1));..T
ece0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
ecf0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
ed00: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
ed10: 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 6e 64 61 tringObj("standa
ed20: 72 64 5f 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a rd_name", -1));.
ed30: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
ed40: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
ed50: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
ed60: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 wStringObj(SSL_C
ed70: 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e IPHER_standard_n
ed80: 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 ame(cipher), -1)
ed90: 29 3b 0a 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f );...bits = SSL_
eda0: 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73 28 CIPHER_get_bits(
edb0: 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 cipher, &alg_bit
edc0: 73 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a s);..Tcl_ListObj
edd0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
ede0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
edf0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
ee00: 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 bits", -1));..Tc
ee10: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
ee20: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
ee30: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e bjPtr, Tcl_NewIn
ee40: 74 4f 62 6a 28 62 69 74 73 29 29 3b 0a 09 54 63 tObj(bits));..Tc
ee50: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
ee60: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
ee70: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
ee80: 72 69 6e 67 4f 62 6a 28 22 73 65 63 72 65 74 5f ringObj("secret_
ee90: 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 bits", -1));..Tc
eea0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
eeb0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
eec0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e bjPtr, Tcl_NewIn
eed0: 74 4f 62 6a 28 61 6c 67 5f 62 69 74 73 29 29 3b tObj(alg_bits));
eee0: 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 ../* alg_bits is
eef0: 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63 72 actual key secr
ef00: 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65 20 et bits. If use
ef10: 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74 20 bits and secret
ef20: 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 73 (algorithm) bits
ef30: 20 64 69 66 66 65 72 2c 0a 20 20 20 20 20 20 20 differ,.
ef40: 20 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 the rest of
ef50: 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78 the bits are fix
ef60: 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d ed, i.e. for lim
ef70: 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 ited export ciph
ef80: 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 ers (bits < 56)
ef90: 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 */..Tcl_ListObjA
efa0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
efb0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
efc0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d _NewStringObj("m
efd0: 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 2d 31 29 in_version", -1)
efe0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
eff0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f000: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f010: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
f020: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 L_CIPHER_get_ver
f030: 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 sion(cipher), -1
f040: 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 ));.../* Get Ope
f050: 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 nSSL-specific ID
f060: 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f , not IANA ID */
f070: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
f080: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
f090: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
f0a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 64 22 ewStringObj("id"
f0b0: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
f0c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
f0d0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
f0e0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
f0f0: 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 (int) SSL_CIPHER
f100: 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 _get_id(cipher))
f110: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 );...if (SSL_CIP
f120: 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 HER_description(
f130: 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a cipher, buf, siz
f140: 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c eof(buf)) != NUL
f150: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 L) {.. Tcl_Li
f160: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f170: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
f180: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
f190: 4f 62 6a 28 22 64 65 73 63 72 69 70 74 69 6f 6e Obj("description
f1a0: 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 54 63 ", -1));.. Tc
f1b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
f1c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
f1d0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
f1e0: 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d 31 29 ringObj(buf, -1)
f1f0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
f200: 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f /* Session info
f210: 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 */. session
f220: 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f = SSL_get_sessio
f230: 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 n(ssl);. if (
f240: 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 session != NULL)
f250: 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e {..const unsign
f260: 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b ed char *ticket;
f270: 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 ..size_t len2;..
f280: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 unsigned int ule
f290: 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e n;..const unsign
f2a0: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e ed char *session
f2b0: 5f 69 64 3b 0a 09 63 68 61 72 20 62 75 66 66 65 _id;..char buffe
f2c0: 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 r[SSL_MAX_MASTER
f2d0: 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 _KEY_LENGTH];...
f2e0: 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 /* Report the se
f2f0: 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
f300: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 as a result of t
f310: 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 he ALPN negotiat
f320: 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 ion */..SSL_SESS
f330: 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 ION_get0_alpn_se
f340: 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 lected(session,
f350: 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a &proto, &len2);.
f360: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
f370: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f380: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
f390: 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e wStringObj("alpn
f3a0: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
f3b0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f3c0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
f3d0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
f3e0: 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 Obj((char *)prot
f3f0: 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b o, (int) len2));
f400: 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 .../* Resumable
f410: 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 54 63 6c 5f session */..Tcl_
f420: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
f430: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
f440: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
f450: 6e 67 4f 62 6a 28 22 72 65 73 75 6d 61 62 6c 65 ngObj("resumable
f460: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
f470: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f480: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
f490: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a r, Tcl_NewIntObj
f4a0: 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f (SSL_SESSION_is_
f4b0: 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f resumable(sessio
f4c0: 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 n)));.../* Sessi
f4d0: 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 on start time (s
f4e0: 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f econds since epo
f4f0: 63 68 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 ch) */..Tcl_List
f500: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
f510: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f520: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
f530: 6a 28 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 j("start_time",
f540: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
f550: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
f560: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f570: 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 Tcl_NewLongObj(S
f580: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 SL_SESSION_get_t
f590: 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a ime(session)));.
f5a0: 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c ../* Timeout val
f5b0: 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 ue - SSL_CTX_get
f5c0: 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 _timeout (in sec
f5d0: 6f 6e 64 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 onds) */..Tcl_Li
f5e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f5f0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
f600: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
f610: 4f 62 6a 28 22 74 69 6d 65 6f 75 74 22 2c 20 2d Obj("timeout", -
f620: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
f630: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
f640: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
f650: 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 cl_NewLongObj(SS
f660: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
f670: 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 29 meout(session)))
f680: 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 ;.../* Session t
f690: 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68 icket lifetime h
f6a0: 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 int (in seconds)
f6b0: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
f6c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
f6d0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
f6e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
f6f0: 6c 69 66 65 74 69 6d 65 22 2c 20 2d 31 29 29 3b lifetime", -1));
f700: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
f710: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
f720: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
f730: 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 ewLongObj(SSL_SE
f740: 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 SSION_get_ticket
f750: 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 _lifetime_hint(s
f760: 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 ession)));.../*
f770: 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 73 Session id */..s
f780: 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f ession_id = SSL_
f790: 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 SESSION_get_id(s
f7a0: 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a ession, &ulen);.
f7b0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
f7c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f7d0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
f7e0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 wStringObj("sess
f7f0: 69 6f 6e 5f 69 64 22 2c 20 2d 31 29 29 3b 0a 09 ion_id", -1));..
f800: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
f810: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
f820: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
f830: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 ByteArrayObj(ses
f840: 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 sion_id, (int) u
f850: 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 len));.../* Sess
f860: 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 ion ticket - cli
f870: 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c ent only */..SSL
f880: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 _SESSION_get0_ti
f890: 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 cket(session, &t
f8a0: 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 icket, &len2);..
f8b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
f8c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
f8d0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
f8e0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 StringObj("sessi
f8f0: 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 2d 31 29 29 on_ticket", -1))
f900: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
f910: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
f920: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
f930: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 NewByteArrayObj(
f940: 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 ticket, (int) le
f950: 6e 32 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 n2));.../* Ticke
f960: 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a 09 53 t app data */..S
f970: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f SL_SESSION_get0_
f980: 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28 73 ticket_appdata(s
f990: 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c ession, &ticket,
f9a0: 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 &len2);..Tcl_Li
f9b0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f9c0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
f9d0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
f9e0: 4f 62 6a 28 22 74 69 63 6b 65 74 5f 61 70 70 5f Obj("ticket_app_
f9f0: 64 61 74 61 22 2c 20 2d 31 29 29 3b 0a 09 54 63 data", -1));..Tc
fa00: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
fa10: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
fa20: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 bjPtr, Tcl_NewBy
fa30: 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 teArrayObj(ticke
fa40: 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b t, (int) len2));
fa50: 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 .../* Get master
fa60: 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 key */..len2 =
fa70: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
fa80: 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69 master_key(sessi
fa90: 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f on, buffer, SSL_
faa0: 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c MAX_MASTER_KEY_L
fab0: 45 4e 47 54 48 29 3b 0a 09 54 63 6c 5f 4c 69 73 ENGTH);..Tcl_Lis
fac0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
fad0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
fae0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
faf0: 62 6a 28 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c bj("master_key",
fb00: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
fb10: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
fb20: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
fb30: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 Tcl_NewByteArra
fb40: 79 4f 62 6a 28 62 75 66 66 65 72 2c 20 28 69 6e yObj(buffer, (in
fb50: 74 29 20 6c 65 6e 32 29 29 3b 0a 20 20 20 20 7d t) len2));. }
fb60: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 .. /* Compres
fb70: 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 sion info */.
fb80: 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c if (ssl != NULL
fb90: 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f ) {.#ifdef HAVE_
fba0: 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a SSL_COMPRESSION.
fbb0: 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 .const COMP_METH
fbc0: 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b OD *comp, *expn;
fbd0: 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 ..comp = SSL_get
fbe0: 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 _current_compres
fbf0: 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e sion(ssl);..expn
fc00: 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 = SSL_get_curre
fc10: 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c nt_expansion(ssl
fc20: 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a );...Tcl_ListObj
fc30: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
fc40: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
fc50: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
fc60: 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 compression", -1
fc70: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
fc80: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
fc90: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
fca0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 l_NewStringObj(c
fcb0: 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 omp ? SSL_COMP_g
fcc0: 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 et_name(comp) :
fcd0: 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 09 54 "NONE", -1));..T
fce0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
fcf0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
fd00: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
fd10: 74 72 69 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73 tringObj("expans
fd20: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ion", -1));..Tcl
fd30: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
fd40: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
fd50: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
fd60: 69 6e 67 4f 62 6a 28 65 78 70 6e 20 3f 20 53 53 ingObj(expn ? SS
fd70: 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 L_COMP_get_name(
fd80: 65 78 70 6e 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 expn) : "NONE",
fd90: 2d 31 29 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c -1));.#else..Tcl
fda0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
fdb0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
fdc0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
fdd0: 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65 73 73 ingObj("compress
fde0: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ion", -1));..Tcl
fdf0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
fe00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
fe10: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
fe20: 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20 2d ingObj("NONE", -
fe30: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
fe40: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
fe50: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
fe60: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
fe70: 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 "expansion", -1)
fe80: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
fe90: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
fea0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
feb0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e _NewStringObj("N
fec0: 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 ONE", -1));.#end
fed0: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a if. }.. /*
fee0: 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a Server info */.
fef0: 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 mode = SSL_C
ff00: 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 TX_get_session_c
ff10: 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 ache_mode(stateP
ff20: 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 tr->ctx);. if
ff30: 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 (mode & SSL_SES
ff40: 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 S_CACHE_OFF) {..
ff50: 70 72 6f 74 6f 20 3d 20 22 6f 66 66 22 3b 0a 20 proto = "off";.
ff60: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f } else if (mo
ff70: 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 de & SSL_SESS_CA
ff80: 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 70 CHE_CLIENT) {..p
ff90: 72 6f 74 6f 20 3d 20 22 63 6c 69 65 6e 74 22 3b roto = "client";
ffa0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
ffb0: 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f mode & SSL_SESS_
ffc0: 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a CACHE_SERVER) {.
ffd0: 09 70 72 6f 74 6f 20 3d 20 22 73 65 72 76 65 72 .proto = "server
ffe0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ";. } else if
fff0: 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 (mode & SSL_SES
10000 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a S_CACHE_BOTH) {.
10010 09 70 72 6f 74 6f 20 3d 20 22 62 6f 74 68 22 3b .proto = "both";
10020 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 . } else {..p
10030 72 6f 74 6f 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 roto = "unknown"
10040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
10050 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10060 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
10070 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
10080 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 63 ngObj("session_c
10090 61 63 68 65 5f 6d 6f 64 65 22 2c 20 2d 31 29 29 ache_mode", -1))
100a0 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
100b0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
100c0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
100d0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
100e0 70 72 6f 74 6f 2c 20 2d 31 29 29 3b 0a 0a 20 20 proto, -1));..
100f0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
10100 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
10110 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
10120 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 CL_OK;..clientDa
10130 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
10140 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
10150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
10190 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d . * VersionObjCm
101a0 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 d -- return vers
101b0 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 ion string from
101c0 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 OpenSSL.. *. * R
101d0 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
101e0 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
101f0 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
10200 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
10210 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
10220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10250 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
10260 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 ic int.VersionOb
10270 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
10280 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
10290 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
102a0 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
102b0 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
102c0 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
102d0 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 objPtr;.. dpr
102e0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
102f0 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 . objPtr = Tc
10300 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f l_NewStringObj(O
10310 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 PENSSL_VERSION_T
10320 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 EXT, -1);. Tc
10330 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
10340 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a nterp, objPtr);.
10350 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
10360 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 OK;..clientData
10370 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 09 6f = clientData;..o
10380 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 6f 62 6a bjc = objc;..obj
10390 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a v = objv;.}.../*
103a0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
103b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
103c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
103d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
103e0 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 ------. *. * Mis
103f0 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 cObjCmd -- misc
10400 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 commands. *. * R
10410 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
10420 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
10430 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
10440 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
10450 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
10460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10490 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
104a0 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d ic int.MiscObjCm
104b0 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
104c0 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
104d0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
104e0 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
104f0 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
10500 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 static const
10510 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 char *commands
10520 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 [] = { "req", "s
10530 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a trreq", NULL };.
10540 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 enum command
10550 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 { C_REQ, C_STRR
10560 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 EQ, C_DUMMY };.
10570 20 20 20 69 6e 74 20 63 6d 64 2c 20 69 73 53 74 int cmd, isSt
10580 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 r;. char buff
10590 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 20 20 er[16384];..
105a0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
105b0 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
105c0 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f < 2) {..Tcl_Wro
105d0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
105e0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 , 1, objv, "subc
105f0 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b ommand ?args?");
10600 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
10610 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
10620 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 (Tcl_GetIndexFr
10630 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
10640 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c jv[1], commands,
10650 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 26 63 "command", 0,&c
10660 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b md) != TCL_OK) {
10670 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
10680 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
10690 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 sStr = (cmd == C
106a0 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 _STRREQ);. sw
106b0 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d itch ((enum comm
106c0 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 and) cmd) {..cas
106d0 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 e C_REQ:..case C
106e0 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 _STRREQ: {..
106f0 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e EVP_PKEY *pkey=N
10700 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a ULL;.. X509 *
10710 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 cert=NULL;..
10720 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d X509_NAME *name=
10730 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f NULL;.. Tcl_O
10740 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 bj **listv;..
10750 20 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 int listc,i;...
10760 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c BIO *out=NUL
10770 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b L;... char *k
10780 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a _C="",*k_ST="",*
10790 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a k_L="",*k_O="",*
107a0 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 k_OU="",*k_CN=""
107b0 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 ,*k_Email="";..
107c0 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c char *keyout,
107d0 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 *pemout,*str;..
107e0 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 int keysize,s
107f0 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 erial=0,days=365
10800 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 ;..#if OPENSSL_V
10810 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
10820 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 0x30000000L..
10830 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e BIGNUM *bne = N
10840 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 ULL;.. RSA *r
10850 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 sa = NULL;.#else
10860 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 .. EVP_PKEY_C
10870 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a TX *ctx = NULL;.
10880 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 #endif... if
10890 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 ((objc<5) || (ob
108a0 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 jc>6)) {...Tcl_W
108b0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
108c0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 rp, 2, objv, "ke
108d0 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 ysize keyfile ce
108e0 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b rtfile ?info?");
108f0 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
10900 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ROR;.. }...
10910 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 if (Tcl_GetInt
10920 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
10930 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a objv[2], &keysiz
10940 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a e) != TCL_OK) {.
10950 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
10960 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 OR;.. }..
10970 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 keyout=Tcl_GetSt
10980 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 ring(objv[3]);..
10990 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 pemout=Tcl_G
109a0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d etString(objv[4]
109b0 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 );.. if (isSt
109c0 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 r) {...Tcl_SetVa
109d0 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c r(interp,keyout,
109e0 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 "",0);...Tcl_Set
109f0 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 Var(interp,pemou
10a00 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a t,"",0);.. }.
10a10 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d .. if (objc>=
10a20 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 6) {...if (Tcl_L
10a30 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 istObjGetElement
10a40 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 s(interp, objv[5
10a50 5d 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20 26 6c ],....&listc, &l
10a60 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 istv) != TCL_OK)
10a70 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 {... return
10a80 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a TCL_ERROR;...}..
10a90 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 20 ..if ((listc%2)
10aa0 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 63 != 0) {... Tc
10ab0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
10ac0 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 rp,"Information
10ad0 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 65 list must have e
10ae0 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 ven number of ar
10af0 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a guments",NULL);.
10b00 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
10b10 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f _ERROR;...}...fo
10b20 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b r (i=0; i<listc;
10b30 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 i+=2) {... s
10b40 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 tr=Tcl_GetString
10b50 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 (listv[i]);...
10b60 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 if (strcmp(str
10b70 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 ,"days")==0) {..
10b80 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 ..if (Tcl_GetInt
10b90 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c FromObj(interp,l
10ba0 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 istv[i+1],&days)
10bb0 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 !=TCL_OK)....
10bc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
10bd0 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 R;... } else
10be0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
10bf0 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 serial")==0) {..
10c00 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 ..if (Tcl_GetInt
10c10 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c FromObj(interp,l
10c20 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 istv[i+1],&seria
10c30 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 l)!=TCL_OK)....
10c40 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
10c50 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 ROR;... } els
10c60 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
10c70 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ,"C")==0) {....k
10c80 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 _C=Tcl_GetString
10c90 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
10ca0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
10cb0 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d trcmp(str,"ST")=
10cc0 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 =0) {....k_ST=Tc
10cd0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
10ce0 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
10cf0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
10d00 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a (str,"L")==0) {.
10d10 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 ...k_L=Tcl_GetSt
10d20 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
10d30 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
10d40 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f f (strcmp(str,"O
10d50 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d ")==0) {....k_O=
10d60 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
10d70 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
10d80 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
10d90 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 mp(str,"OU")==0)
10da0 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 {....k_OU=Tcl_G
10db0 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
10dc0 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
10dd0 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
10de0 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 r,"CN")==0) {...
10df0 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 .k_CN=Tcl_GetStr
10e00 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
10e10 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
10e20 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d (strcmp(str,"Em
10e30 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ail")==0) {....k
10e40 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 _Email=Tcl_GetSt
10e50 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
10e60 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b ;... } else {
10e70 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c ....Tcl_SetResul
10e80 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 t(interp,"Unknow
10e90 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c n parameter",NUL
10ea0 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43 L);....return TC
10eb0 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d L_ERROR;... }
10ec0 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 ...}.. }..#if
10ed0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
10ee0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
10ef0 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 0000L.. bne =
10f00 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 BN_new();..
10f10 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b rsa = RSA_new();
10f20 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 .. pkey = EVP
10f30 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 _PKEY_new();..
10f40 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c if (bne == NUL
10f50 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c L || rsa == NULL
10f60 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c || pkey == NULL
10f70 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 || !BN_set_word
10f80 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a (bne,RSA_F4) ||.
10f90 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 5f ..!RSA_generate_
10fa0 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 key_ex(rsa, keys
10fb0 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 ize, bne, NULL)
10fc0 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 || !EVP_PKEY_ass
10fd0 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 ign_RSA(pkey, rs
10fe0 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 a)) {...EVP_PKEY
10ff0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f _free(pkey);.../
11000 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 3b * RSA_free(rsa);
11010 20 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 4b freed by EVP_PK
11020 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f EY_free */...BN_
11030 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 free(bne);.#else
11040 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 .. pkey = EVP
11050 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e _RSA_gen((unsign
11060 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 ed int) keysize)
11070 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 50 ;.. ctx = EVP
11080 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b _PKEY_CTX_new(pk
11090 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 ey,NULL);.. i
110a0 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 f (pkey == NULL
110b0 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c || ctx == NULL |
110c0 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 | !EVP_PKEY_keyg
110d0 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a en_init(ctx) ||.
110e0 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f ..!EVP_PKEY_CTX_
110f0 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 set_rsa_keygen_b
11100 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 its(ctx, keysize
11110 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b ) || !EVP_PKEY_k
11120 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 eygen(ctx, &pkey
11130 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f )) {...EVP_PKEY_
11140 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 free(pkey);...EV
11150 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 P_PKEY_CTX_free(
11160 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 ctx);.#endif...T
11170 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
11180 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 erp,"Error gener
11190 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b 65 ating private ke
111a0 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 y",NULL);...retu
111b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
111c0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 } else {...if
111d0 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 (isStr) {...
111e0 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f out=BIO_new(BIO
111f0 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 _s_mem());...
11200 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 PEM_write_bio_P
11210 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b rivateKey(out,pk
11220 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e ey,NULL,NULL,0,N
11230 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 ULL,NULL);...
11240 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c i=BIO_read(out,
11250 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 buffer,sizeof(bu
11260 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 ffer)-1);...
11270 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b i=(i<0) ? 0 : i;
11280 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d ... buffer[i]
11290 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c ='\0';... Tcl
112a0 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b _SetVar(interp,k
112b0 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b eyout,buffer,0);
112c0 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 ... BIO_flush
112d0 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f (out);... BIO
112e0 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 _free(out);...}
112f0 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 else {... out
11300 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 =BIO_new(BIO_s_f
11310 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 ile());... BI
11320 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 O_write_filename
11330 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 (out,keyout);...
11340 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 PEM_write_bi
11350 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 o_PrivateKey(out
11360 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c ,pkey,NULL,NULL,
11370 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 0,NULL,NULL);...
11380 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 /* PEM_write
11390 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 4b _bio_RSAPrivateK
113a0 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c ey(out, rsa, NUL
113b0 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c L, NULL, 0, NULL
113c0 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 , NULL); */...
113d0 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f BIO_free_all(o
113e0 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 ut);.. .}....if
113f0 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 ((cert=X509_new(
11400 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 ))==NULL) {...
11410 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 Tcl_SetResult(
11420 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 interp,"Error ge
11430 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 69 nerating certifi
11440 63 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55 cate request",NU
11450 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 LL);... EVP_P
11460 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
11470 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
11480 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
11490 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 0000000L... B
114a0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e N_free(bne);.#en
114b0 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 6e dif... return
114c0 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d (TCL_ERROR);...}
114d0 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72 ....X509_set_ver
114e0 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 sion(cert,2);...
114f0 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 ASN1_INTEGER_set
11500 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c (X509_get_serial
11510 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72 Number(cert),ser
11520 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 ial);...X509_gmt
11530 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 ime_adj(X509_get
11540 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 m_notBefore(cert
11550 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 ),0);...X509_gmt
11560 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 ime_adj(X509_get
11570 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 m_notAfter(cert)
11580 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a ,(long)60*60*24*
11590 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 days);...X509_se
115a0 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b t_pubkey(cert,pk
115b0 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 ey);....name=X50
115c0 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 9_get_subject_na
115d0 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 me(cert);....X50
115e0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
115f0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 _by_txt(name,"C"
11600 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
11610 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
11620 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c char *) k_C, -1,
11630 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
11640 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
11650 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c y_txt(name,"ST",
11660 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
11670 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
11680 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c har *) k_ST, -1,
11690 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
116a0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
116b0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 y_txt(name,"L",
116c0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
116d0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
116e0 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d ar *) k_L, -1, -
116f0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
11700 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
11710 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 txt(name,"O", MB
11720 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
11730 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
11740 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c *) k_O, -1, -1,
11750 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
11760 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
11770 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 t(name,"OU", MBS
11780 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
11790 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
117a0 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c *) k_OU, -1, -1,
117b0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
117c0 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
117d0 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 t(name,"CN", MBS
117e0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
117f0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
11800 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c *) k_CN, -1, -1,
11810 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
11820 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
11830 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 t(name,"Email",
11840 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
11850 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
11860 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d ar *) k_Email, -
11870 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 1, -1, 0);....X5
11880 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 09_set_subject_n
11890 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a ame(cert,name);.
118a0 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 67 ...if (!X509_sig
118b0 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f n(cert,pkey,EVP_
118c0 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20 sha256())) {...
118d0 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 72 X509_free(cer
118e0 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b t);... EVP_PK
118f0 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 EY_free(pkey);.#
11900 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
11910 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
11920 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 000000L... BN
11930 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 _free(bne);.#end
11940 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 if... Tcl_Set
11950 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 Result(interp,"E
11960 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72 rror signing cer
11970 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b tificate",NULL);
11980 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
11990 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 L_ERROR;...}....
119a0 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 if (isStr) {...
119b0 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
119c0 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 IO_s_mem());...
119d0 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
119e0 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b _X509(out,cert);
119f0 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 ... i=BIO_rea
11a00 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a d(out,buffer,siz
11a10 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a eof(buffer)-1);.
11a20 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 .. i=(i<0) ?
11a30 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 0 : i;... buf
11a40 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 fer[i]='\0';...
11a50 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e Tcl_SetVar(in
11a60 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 terp,pemout,buff
11a70 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f er,0);... BIO
11a80 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 _flush(out);...
11a90 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 BIO_free(out)
11aa0 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 ;...} else {...
11ab0 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
11ac0 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 IO_s_file());...
11ad0 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 BIO_write_fi
11ae0 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 lename(out,pemou
11af0 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 t);... PEM_wr
11b00 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 ite_bio_X509(out
11b10 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49 ,cert);... BI
11b20 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b O_free_all(out);
11b30 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 ...}....X509_fre
11b40 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 e(cert);...EVP_P
11b50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
11b60 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
11b70 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
11b80 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 0000000L...BN_fr
11b90 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a ee(bne);.#endif.
11ba0 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b . }..}..break
11bb0 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 ;. default:..
11bc0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 break;. }.
11bd0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
11be0 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
11bf0 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
11c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11c10 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 ***/./* Init
11c20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a */./***
11c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11c40 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d */../*. *-------
11c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
11c90 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 * Tls_Free --.
11ca0 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
11cb0 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 ure cleans up wh
11cc0 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 en a SSL socket
11cd0 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a based channel. *
11ce0 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 .is closed and i
11cf0 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 ts reference cou
11d00 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 nt falls below 1
11d10 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
11d20 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.none. *. * Si
11d30 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 de effects:. *.F
11d40 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 rees all the sta
11d50 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d te. *. *--------
11d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
11da0 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 void.Tls_Free(ch
11db0 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a ar *blockPtr) {.
11dc0 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
11dd0 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 Ptr = (State *)b
11de0 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 lockPtr;.. dp
11df0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
11e00 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 .. Tls_Clean(
11e10 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 statePtr);. c
11e20 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b kfree(blockPtr);
11e30 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
11e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
11e80 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d . * Tls_Clean --
11e90 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
11ea0 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 edure cleans up
11eb0 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 when a SSL socke
11ec0 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a t based channel.
11ed0 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 *.is closed and
11ee0 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 its reference c
11ef0 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 ount falls below
11f00 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 1. This should
11f10 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 . *.be called sy
11f20 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 nchronously by t
11f30 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f he CloseProc, no
11f40 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e t in the. *.Even
11f50 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 tuallyFree callb
11f60 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ack.. *. * Resul
11f70 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 ts:. *.none. *.
11f80 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
11f90 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 *.Frees all the
11fa0 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d state. *. *----
11fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
11ff0 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 */.void Tls_Cle
12000 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 an(State *stateP
12010 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 tr) {. dprint
12020 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
12030 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 /*. * we'r
12040 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 e assuming here
12050 74 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c that we're singl
12060 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 e-threaded.
12070 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
12080 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 Ptr->timer != (T
12090 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e cl_TimerToken) N
120a0 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 ULL) {..Tcl_Dele
120b0 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 teTimerHandler(s
120c0 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b tatePtr->timer);
120d0 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 ..statePtr->time
120e0 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a r = NULL;. }.
120f0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
12100 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b r->protos) {..ck
12110 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 free(statePtr->p
12120 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 rotos);..statePt
12130 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c r->protos = NULL
12140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
12150 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b statePtr->bio) {
12160 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 ../* This will c
12170 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e all SSL_shutdown
12180 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f . Bug 1414045 */
12190 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 ..dprintf("BIO_f
121a0 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 ree_all(%p)", st
121b0 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 atePtr->bio);..B
121c0 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 IO_free_all(stat
121d0 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 ePtr->bio);..sta
121e0 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c tePtr->bio = NUL
121f0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
12200 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 (statePtr->ssl)
12210 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f {..dprintf("SSL_
12220 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 free(%p)", state
12230 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f Ptr->ssl);..SSL_
12240 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 free(statePtr->s
12250 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e sl);..statePtr->
12260 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ssl = NULL;.
12270 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
12280 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f tr->ctx) {..SSL_
12290 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 CTX_free(statePt
122a0 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 r->ctx);..stateP
122b0 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a tr->ctx = NULL;.
122c0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
122d0 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
122e0 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 ) {..Tcl_DecrRef
122f0 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
12300 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 callback);..stat
12310 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
12320 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
12330 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
12340 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f assword) {..Tcl_
12350 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 DecrRefCount(sta
12360 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 tePtr->password)
12370 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 ;..statePtr->pas
12380 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 sword = NULL;.
12390 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 }.. dprintf
123a0 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d ("Returning");.}
123b0 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
123c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
123d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
123e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
123f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
12400 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a * Tls_Init --. *
12410 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 . *.This is a pa
12420 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 ckage initializa
12430 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 tion procedure,
12440 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a which is called.
12450 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20 74 *.by Tcl when t
12460 68 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 his package is t
12470 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e o be added to an
12480 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a interpreter.. *
12490 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 73 . * Results: Ss
124a0 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 l configured and
124b0 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 loaded. *. * Si
124c0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 de effects:. *.
124d0 63 72 65 61 74 65 20 74 68 65 20 73 73 6c 20 63 create the ssl c
124e0 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 ommand, initiali
124f0 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 ze ssl context.
12500 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
12510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12540 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 -------. */.DLLE
12550 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e XPORT int Tls_In
12560 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 it(Tcl_Interp *i
12570 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 63 6f 6e nterp) {. con
12580 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e st char tlsTclIn
12590 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 itScript[] = {.#
125a0 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c include "tls.tcl
125b0 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b .h"..0x00. };
125c0 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
125d0 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a alled");.. /*
125e0 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 . * We only
125f0 73 75 70 70 6f 72 74 20 54 63 6c 20 38 2e 34 20 support Tcl 8.4
12600 6f 72 20 6e 65 77 65 72 0a 20 20 20 20 20 2a 2f or newer. */
12610 0a 20 20 20 20 69 66 20 28 0a 23 69 66 64 65 66 . if (.#ifdef
12620 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 09 USE_TCL_STUBS..
12630 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e Tcl_InitStubs(in
12640 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 0a terp, "8.4", 0).
12650 23 65 6c 73 65 0a 09 54 63 6c 5f 50 6b 67 52 65 #else..Tcl_PkgRe
12660 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 54 quire(interp, "T
12670 63 6c 22 2c 20 22 38 2e 34 2d 22 2c 20 30 29 0a cl", "8.4-", 0).
12680 23 65 6e 64 69 66 0a 09 20 3d 3d 20 4e 55 4c 4c #endif.. == NULL
12690 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
126a0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
126b0 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 if (TlsLibInit
126c0 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b (0) != TCL_OK) {
126d0 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
126e0 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c lt(interp, "coul
126f0 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 d not initialize
12700 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 4e SSL library", N
12710 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
12720 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
12730 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
12740 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
12750 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c "tls::ciphers",
12760 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 CiphersObjCmd,
12770 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
12780 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
12790 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
127a0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
127b0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
127c0 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c ls::connection",
127d0 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f ConnectionInfoO
127e0 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
127f0 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
12800 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
12810 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
12820 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
12830 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 erp, "tls::hands
12840 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 hake", Handshake
12850 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
12860 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
12870 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
12880 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
12890 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
128a0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f terp, "tls::impo
128b0 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d rt", ImportObjCm
128c0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
128d0 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
128e0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
128f0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
12900 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
12910 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 "tls::unimport"
12920 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 , UnimportObjCmd
12930 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
12940 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
12950 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
12960 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
12970 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
12980 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 "tls::status", S
12990 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c tatusObjCmd, (Cl
129a0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
129b0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
129c0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
129d0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
129e0 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
129f0 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 :version", Versi
12a00 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e onObjCmd, (Clien
12a10 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
12a20 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
12a30 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
12a40 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
12a50 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 interp, "tls::mi
12a60 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c sc", MiscObjCmd,
12a70 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
12a80 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
12a90 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
12aa0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
12ab0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
12ac0 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c tls::protocols",
12ad0 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 ProtocolsObjCmd
12ae0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
12af0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
12b00 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a Proc *) NULL);..
12b10 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 29 20 if (interp)
12b20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 {..Tcl_Eval(inte
12b30 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 rp, tlsTclInitSc
12b40 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 ript);. }..
12b50 20 20 72 65 74 75 72 6e 28 54 63 6c 5f 50 6b 67 return(Tcl_Pkg
12b60 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 Provide(interp,
12b70 22 74 6c 73 22 2c 20 50 41 43 4b 41 47 45 5f 56 "tls", PACKAGE_V
12b80 45 52 53 49 4f 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a ERSION));.}../*.
12b90 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
12ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12bc0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
12bd0 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a Tls_SafeInit --.
12be0 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *.----------
12bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c10 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 ------*. *.Stand
12c20 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 72 65 ard procedure re
12c30 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64 27 quired by 'load'
12c40 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 .. *.Initializes
12c50 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 this extension
12c60 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65 72 for a safe inter
12c70 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d preter.. *.-----
12c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a -----------*. *.
12cb0 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a *.Side effects:
12cc0 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 5f . *..As of 'Tls_
12cd0 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 Init'. *. *.Resu
12ce0 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 lt:. *..A standa
12cf0 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 rd Tcl error cod
12d00 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
12d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
12d40 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e */.DLLEXPORT in
12d50 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 t Tls_SafeInit(T
12d60 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
12d70 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 p) {. dprintf
12d80 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 ("Called");.
12d90 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28 return(Tls_Init(
12da0 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a interp));.}../*.
12db0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
12dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12de0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
12df0 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a TlsLibInit --. *
12e00 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.------------
12e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e30 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c ----*. *.Initial
12e40 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 izes SSL library
12e50 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63 once per applic
12e60 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d ation. *.-------
12e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a ---------*. *. *
12ea0 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 .Side effects:.
12eb0 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 *..initializes S
12ec0 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a SL library. *. *
12ed0 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e .Result:. *..non
12ee0 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
12ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
12f20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c */.static int Tl
12f30 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 sLibInit(int uni
12f40 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 nitialize) {.
12f50 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 static int init
12f60 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 ialized = 0;.
12f70 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20 54 43 int status = TC
12f80 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 L_OK;.#if define
12f90 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
12fa0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
12fb0 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 73 L_THREADS). s
12fc0 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b ize_t num_locks;
12fd0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 .#endif.. if
12fe0 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b (uninitialize) {
12ff0 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 69 6e . if (!in
13000 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 20 20 20 itialized) {.
13010 20 20 20 20 20 20 20 20 20 64 70 72 69 6e 74 66 dprintf
13020 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 ("Asked to unini
13030 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 tialize, but we
13040 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 are not initiali
13050 7a 65 64 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 zed");..
13060 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f return(TCL_O
13070 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 K);. }..
13080 20 20 20 20 20 20 20 64 70 72 69 6e 74 66 28 22 dprintf("
13090 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 Asked to uniniti
130a0 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 alize");..#if de
130b0 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
130c0 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
130d0 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 d(TCL_THREADS).
130e0 20 20 20 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 Tcl_Mutex
130f0 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a Lock(&init_mx);.
13100 0a 20 20 20 20 20 20 20 20 69 66 20 28 6c 6f 63 . if (loc
13110 6b 73 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 ks) {.
13120 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 20 free(locks);.
13130 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 73 locks
13140 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 = NULL;.
13150 20 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 locksCount
13160 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 = 0;. }.#
13170 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e endif. in
13180 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a itialized = 0;..
13190 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
131a0 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
131b0 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
131c0 41 44 53 29 0a 20 20 20 20 20 20 20 20 54 63 6c ADS). Tcl
131d0 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e _MutexUnlock(&in
131e0 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a it_mx);.#endif..
131f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 28 54 return(T
13200 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 CL_OK);. }..
13210 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a if (initializ
13220 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 64 70 ed) {. dp
13230 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 rintf("Called, b
13240 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 ut using cached
13250 76 61 6c 75 65 22 29 3b 0a 20 20 20 20 20 20 20 value");.
13260 20 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b return(status);
13270 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 . }.. dpri
13280 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
13290 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
132a0 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
132b0 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
132c0 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 ADS). Tcl_Mut
132d0 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 exLock(&init_mx)
132e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 ;.#endif. ini
132f0 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 tialized = 1;..#
13300 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
13310 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
13320 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
13330 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b DS). num_lock
13340 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 s = 1;. locks
13350 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75 Count = (int) nu
13360 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 m_locks;. loc
13370 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 ks = malloc(size
13380 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d of(*locks) * num
13390 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d _locks);. mem
133a0 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 set(locks, 0, si
133b0 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e zeof(*locks) * n
133c0 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 um_locks);.#endi
133d0 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 f.. /* Initia
133e0 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79 lize BOTH libcry
133f0 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 pto and libssl.
13400 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 */. OPENSSL_i
13410 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f nit_ssl(OPENSSL_
13420 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 INIT_LOAD_SSL_ST
13430 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f RINGS | OPENSSL_
13440 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f INIT_LOAD_CRYPTO
13450 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e _STRINGS..| OPEN
13460 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c SSL_INIT_ADD_ALL
13470 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 _CIPHERS | OPENS
13480 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f SL_INIT_ADD_ALL_
13490 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a DIGESTS, NULL);.
134a0 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c . BIO_new_tcl
134b0 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 (NULL, 0);..#if
134c0 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 0. /*. *
134d0 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 XXX:TODO: Remove
134e0 20 74 68 69 73 20 63 6f 64 65 20 61 6e 64 20 72 this code and r
134f0 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 eplace it with a
13500 20 63 68 65 63 6b 0a 20 20 20 20 20 2a 20 66 6f check. * fo
13510 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f 70 79 r enough entropy
13520 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72 79 20 and do not try
13530 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 to create our ow
13540 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 69 62 6c n. * terribl
13550 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 20 20 2a e entropy. *
13560 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 /. /*. *
13570 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 Seed the random
13580 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 number generator
13590 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72 in the SSL libr
135a0 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 69 6e ary,. * usin
135b0 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 20 63 g the do/while c
135c0 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75 73 65 onstruct because
135d0 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f 74 65 of the bug note
135e0 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20 4f in the. * O
135f0 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20 68 74 penSSL FAQ at ht
13600 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 73 6c tp://www.openssl
13610 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 61 71 .org/support/faq
13620 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 20 20 .html#USER1.
13630 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 63 72 *. * The cr
13640 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62 6c 65 ux of the proble
13650 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61 72 69 m is that Solari
13660 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 s 7 does not hav
13670 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 65 76 2f e a. * /dev/
13680 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 random or /dev/u
13690 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 73 6f random device so
136a0 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 68 65 it cannot gathe
136b0 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 2a 20 r enough. *
136c0 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 68 65 entropy from the
136d0 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77 68 65 RAND_seed() whe
136e0 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 7a 65 n TLS initialize
136f0 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a 20 20 s and refuses.
13700 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 * to go furth
13710 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65 72 73 er. Earlier vers
13720 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 4c 20 ions of OpenSSL
13730 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67 61 72 carried on regar
13740 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 dless.. */.
13750 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69 67 6e srand((unsign
13760 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28 74 69 ed int) time((ti
13770 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a me_t *) NULL));.
13780 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 28 69 do {..for (i
13790 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 69 2b = 0; i < 16; i+
137a0 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f 73 65 +) {.. rnd_se
137b0 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 68 61 ed[i] = 1 + (cha
137c0 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61 6e 64 r) (255.0 * rand
137d0 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 ()/(RAND_MAX+1.0
137e0 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 65 65 ));..}..RAND_see
137f0 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65 d(rnd_seed, size
13800 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b 0a 20 of(rnd_seed));.
13810 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41 4e 44 } while (RAND
13820 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31 29 3b _status() != 1);
13830 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 .#endif..#if def
13840 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 ined(OPENSSL_THR
13850 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 EADS) && defined
13860 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 (TCL_THREADS)..T
13870 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 cl_MutexUnlock(&
13880 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 init_mx);.#endif
13890 0a 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75 73 ...return(status
138a0 29 3b 0a 7d 0a );.}.