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 20 20 20 rp, cmdPtr,..
19d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
19e0: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
19f0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
1a00: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 elf), -1));.
1a10: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1a20: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1a30: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
1a40: 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a IntObj(depth));.
1a50: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
1a60: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
1a70: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 erp, cmdPtr, Tls
1a80: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 _NewX509Obj(inte
1a90: 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20 rp, cert));.
1aa0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1ab0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1ac0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
1ad0: 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 IntObj(ok));.
1ae0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
1af0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
1b00: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
1b10: 77 53 74 72 69 6e 67 4f 62 6a 28 65 72 72 53 74 wStringObj(errSt
1b20: 72 20 3f 20 65 72 72 53 74 72 20 3a 20 22 22 2c r ? errStr : "",
1b30: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f -1));.. Tcl_
1b40: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
1b50: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
1b60: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
1b70: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
1b80: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 73 74 61 tePtr);.. sta
1b90: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 tePtr->flags |=
1ba0: 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b TLS_TCL_CALLBACK
1bb0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 ;.. Tcl_IncrR
1bc0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
1bd0: 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f . code = Tcl_
1be0: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 EvalObjEx(interp
1bf0: 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 , cmdPtr, TCL_EV
1c00: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 AL_GLOBAL);.
1c10: 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f if (code != TCL_
1c20: 4f 4b 29 20 7b 0a 09 2f 2a 20 49 74 20 67 6f 74 OK) {../* It got
1c30: 20 61 6e 20 65 72 72 6f 72 20 2d 20 72 65 6a 65 an error - reje
1c40: 63 74 20 74 68 65 20 63 65 72 74 69 66 69 63 61 ct the certifica
1c50: 74 65 2e 09 09 2a 2f 0a 23 69 66 20 28 54 43 4c te...*/.#if (TCL
1c60: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d _MAJOR_VERSION =
1c70: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e = 8) && (TCL_MIN
1c80: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a OR_VERSION < 6).
1c90: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
1ca0: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 rror(interp);.#e
1cb0: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f lse..Tcl_Backgro
1cc0: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 undException(int
1cd0: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 erp, code);.#end
1ce0: 69 66 0a 09 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 if..ok = 0;.
1cf0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 75 6c 74 } else {..result
1d00: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 = Tcl_GetObjRes
1d10: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 73 74 ult(interp);..st
1d20: 72 69 6e 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 ring = Tcl_GetSt
1d30: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 72 65 73 75 ringFromObj(resu
1d40: 6c 74 2c 20 26 6c 65 6e 67 74 68 29 3b 0a 09 2f lt, &length);../
1d50: 2a 20 41 6e 20 65 6d 70 74 79 20 72 65 73 75 6c * An empty resul
1d60: 74 20 6c 65 61 76 65 73 20 76 65 72 69 66 69 63 t leaves verific
1d70: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e ation unchanged.
1d80: 09 2a 2f 0a 09 69 66 20 28 73 74 72 69 6e 67 20 .*/..if (string
1d90: 21 3d 20 4e 55 4c 4c 20 26 26 20 6c 65 6e 67 74 != NULL && lengt
1da0: 68 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 63 6f h > 0) {.. co
1db0: 64 65 20 3d 20 54 63 6c 5f 47 65 74 49 6e 74 46 de = Tcl_GetIntF
1dc0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72 romObj(interp, r
1dd0: 65 73 75 6c 74 2c 20 26 6f 6b 29 3b 0a 09 20 20 esult, &ok);..
1de0: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 if (code != TC
1df0: 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c L_OK) {.#if (TCL
1e00: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d _MAJOR_VERSION =
1e10: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e = 8) && (TCL_MIN
1e20: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a OR_VERSION < 6).
1e30: 09 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
1e40: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 Error(interp);.#
1e50: 65 6c 73 65 0a 09 09 54 63 6c 5f 42 61 63 6b 67 else...Tcl_Backg
1e60: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 roundException(i
1e70: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 nterp, code);.#e
1e80: 6e 64 69 66 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 ndif...ok = 0;..
1e90: 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 }..}. }.
1ea0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
1eb0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 unt(cmdPtr);..
1ec0: 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 statePtr->flag
1ed0: 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 s &= ~(TLS_TCL_C
1ee0: 41 4c 4c 42 41 43 4b 29 3b 0a 0a 20 20 20 20 54 ALLBACK);.. T
1ef0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
1f00: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
1f10: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 );. Tcl_Relea
1f20: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
1f30: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 interp);. ret
1f40: 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 urn(ok);./* By d
1f50: 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 efault, leave ve
1f60: 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 rification uncha
1f70: 6e 67 65 64 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a nged..*/.}.../*.
1f80: 20 2a 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 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
1fd0: 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 Error --. *. *.C
1fe0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 alls callback wi
1ff0: 74 68 20 24 66 64 20 61 6e 64 20 24 6d 73 67 20 th $fd and $msg
2000: 2d 20 73 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 - so the callbac
2010: 6b 20 63 61 6e 20 64 65 63 69 64 65 0a 20 2a 09 k can decide. *.
2020: 77 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 what to do with
2030: 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 errors.. *. * Si
2040: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 de effects:. *.T
2050: 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 he err field of
2060: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 the currently op
2070: 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73 erative State is
2080: 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 set. *. to a s
2090: 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 tring describing
20a0: 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 the SSL negotia
20b0: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 tion failure rea
20c0: 73 6f 6e 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d son. *----------
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 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
2110: 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 id.Tls_Error(Sta
2120: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 te *statePtr, ch
2130: 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 ar *msg) {. T
2140: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
2150: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
2160: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
2170: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 j *cmdPtr;. i
2180: 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 nt code;.. dp
2190: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
21a0: 0a 0a 20 20 20 20 69 66 20 28 6d 73 67 20 26 26 .. if (msg &&
21b0: 20 2a 6d 73 67 29 20 7b 0a 09 54 63 6c 5f 53 65 *msg) {..Tcl_Se
21c0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
21d0: 70 2c 20 22 53 53 4c 22 2c 20 6d 73 67 2c 20 28 p, "SSL", msg, (
21e0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 char *)NULL);.
21f0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6d 73 67 20 } else {..msg
2200: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
2210: 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 romObj(Tcl_GetOb
2220: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c jResult(interp),
2230: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 NULL);. }.
2240: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20 statePtr->err
2250: 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 69 66 20 28 = msg;.. if (
2260: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
2270: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 ck == (Tcl_Obj*)
2280: 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 NULL) {..char bu
2290: 66 5b 42 55 46 53 49 5a 5d 3b 0a 09 73 70 72 69 f[BUFSIZ];..spri
22a0: 6e 74 66 28 62 75 66 2c 20 22 53 53 4c 20 63 68 ntf(buf, "SSL ch
22b0: 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 3a 20 65 72 annel \"%s\": er
22c0: 72 6f 72 3a 20 25 73 22 2c 0a 09 20 20 20 20 54 ror: %s",.. T
22d0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
22e0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
22f0: 29 2c 20 6d 73 67 29 3b 0a 09 54 63 6c 5f 53 65 ), msg);..Tcl_Se
2300: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 tResult(interp,
2310: 62 75 66 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c buf, TCL_VOLATIL
2320: 45 29 3b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a E);.#if (TCL_MAJ
2330: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
2340: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
2350: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
2360: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
2370: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
2380: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
2390: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
23a0: 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 23 65 6e TCL_ERROR);.#en
23b0: 64 69 66 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 dif..return;.
23c0: 20 7d 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 }. cmdPtr =
23d0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
23e0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
23f0: 61 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c ack);.. Tcl_L
2400: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2410: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2420: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
2430: 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31 gObj("error", -1
2440: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2450: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2460: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2470: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
2480: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 ingObj(Tcl_GetCh
2490: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
24a0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b tr->self), -1));
24b0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
24c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
24d0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
24e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
24f0: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 sg, -1));.. T
2500: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
2510: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
2520: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 ;. Tcl_Preser
2530: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
2540: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
2550: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
2560: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
2570: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
2580: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
2590: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
25a0: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
25b0: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
25c0: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
25d0: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
25e0: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
25f0: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
2600: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
2610: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
2620: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
2630: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
2640: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
2650: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
2660: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
2670: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 Tcl_Release((C
2680: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
2690: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 Ptr);. Tcl_Re
26a0: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 lease((ClientDat
26b0: 61 29 20 69 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a a) interp);.}...
26c0: 2f 2a 0a 20 2a 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 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b --------. *. * K
2710: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d eyLogCallback --
2720: 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72 65 63 . *. *.Write rec
2730: 65 69 76 65 64 20 6b 65 79 20 64 61 74 61 20 74 eived key data t
2740: 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 o log file.. *.
2750: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
2760: 20 2a 09 6e 6f 6e 65 0a 20 2a 2d 2d 2d 2d 2d 2d *.none. *------
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 2d 2d 2d 2d 0a 20 2a -------------. *
27b0: 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c /.void KeyLogCal
27c0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 lback(const SSL
27d0: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 *ssl, const char
27e0: 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 *line) {. ch
27f0: 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 ar *str = getenv
2800: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b (SSLKEYLOGFILE);
2810: 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 20 . FILE *fd;.
2820: 20 20 20 69 66 20 28 73 74 72 29 20 7b 0a 09 66 if (str) {..f
2830: 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 d = fopen(str, "
2840: 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 a");..fprintf(fd
2850: 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a , "%s\n",line);.
2860: 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 .fclose(fd);.
2870: 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 0a ---------------.
28c0: 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 43 61 *. * PasswordCa
28d0: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 llback --. *. *.
28e0: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 Called when a pa
28f0: 73 73 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 ssword is needed
2900: 20 74 6f 20 75 6e 70 61 63 6b 20 52 53 41 20 61 to unpack RSA a
2910: 6e 64 20 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 nd PEM keys.. *.
2920: 45 76 61 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 Evals any bound
2930: 70 61 73 73 77 6f 72 64 20 73 63 72 69 70 74 20 password script
2940: 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 and returns the
2950: 72 65 73 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 result as. *.the
2960: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 password string
2970: 2e 0a 20 2a 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 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
29c0: 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 ic int.PasswordC
29d0: 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 allback(char *bu
29e0: 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 f, int size, int
29f0: 20 76 65 72 69 66 79 2c 20 76 6f 69 64 20 2a 75 verify, void *u
2a00: 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 data) {. Stat
2a10: 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 e *statePtr.= (S
2a20: 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 tate *) udata;.
2a30: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
2a40: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
2a50: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 ->interp;. Tc
2a60: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
2a70: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 int code;..
2a80: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
2a90: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
2aa0: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
2ab0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 == NULL) {..if
2ac0: 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 (Tcl_EvalEx(inte
2ad0: 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f rp, "tls::passwo
2ae0: 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 rd", -1, TCL_EVA
2af0: 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c L_GLOBAL) == TCL
2b00: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 _OK) {.. char
2b10: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 *ret = (char *)
2b20: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 Tcl_GetStringRe
2b30: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 sult(interp);..
2b40: 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 strncpy(buf,
2b50: 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 ret, (size_t) si
2b60: 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e ze);.. return
2b70: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 (int)strlen(ret
2b80: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 );..} else {..
2b90: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a return -1;..}.
2ba0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 }.. cmdPt
2bb0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
2bc0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 eObj(statePtr->p
2bd0: 61 73 73 77 6f 72 64 29 3b 0a 0a 20 20 20 20 54 assword);.. T
2be0: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
2bf0: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
2c00: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 ;. Tcl_Preser
2c10: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
2c20: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
2c30: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
2c40: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
2c50: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
2c60: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
2c70: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
2c80: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
2c90: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
2ca0: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
2cb0: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
2cc0: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
2cd0: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
2ce0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
2cf0: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
2d00: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
2d10: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
2d20: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
2d30: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
2d40: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
2d50: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
2d60: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
2d70: 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 ePtr);.. if (
2d80: 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 code == TCL_OK)
2d90: 7b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 {..char *ret = (
2da0: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 char *) Tcl_GetS
2db0: 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 tringResult(inte
2dc0: 72 70 29 3b 0a 09 69 66 20 28 73 74 72 6c 65 6e rp);..if (strlen
2dd0: 28 72 65 74 29 20 3c 20 73 69 7a 65 20 2d 20 31 (ret) < size - 1
2de0: 29 20 7b 0a 09 20 20 20 20 73 74 72 6e 63 70 79 ) {.. strncpy
2df0: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 (buf, ret, (size
2e00: 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 _t) size);..
2e10: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
2e20: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
2e30: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 ;.. return (i
2e40: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a nt)strlen(ret);.
2e50: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c .}. }. Tcl
2e60: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
2e70: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
2e80: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 76 return -1;..v
2e90: 65 72 69 66 79 20 3d 20 76 65 72 69 66 79 3b 0a erify = verify;.
2ea0: 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 0a 20 2a 0a ------------. *.
2ef0: 20 2a 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 * SessionCallba
2f00: 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d ck for Clients -
2f10: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 -. *. *.Called w
2f20: 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f hen a new sessio
2f30: 6e 20 74 69 63 6b 65 74 20 68 61 73 20 62 65 65 n ticket has bee
2f40: 6e 20 72 65 63 65 69 76 65 64 2e 20 49 6e 20 54 n received. In T
2f50: 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d LS 1.3. *.this m
2f60: 61 79 20 62 65 20 72 65 63 65 69 76 65 64 20 6d ay be received m
2f70: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 ultiple times af
2f80: 74 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b ter the handshak
2f90: 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 e. For. *.earlie
2fa0: 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 r versions, this
2fb0: 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 will be receive
2fc0: 64 20 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e d during the han
2fd0: 64 73 68 61 6b 65 2e 0a 20 2a 0a 20 2a 20 52 65 dshake.. *. * Re
2fe0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 sults:. *.None.
2ff0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
3000: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c s:. *.Calls call
3010: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 back (if defined
3020: 29 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ). *------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
3070: 69 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 ic int.SessionCa
3080: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
3090: 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 *ssl, SSL_SESSI
30a0: 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 ON *session) {.
30b0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
30c0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c tr = (State*)SSL
30d0: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 _get_app_data((S
30e0: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 SL *)ssl);. T
30f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
3100: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
3110: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
3120: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 j *cmdPtr;. c
3130: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
3140: 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 ar *ticket;.
3150: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
3160: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b har *session_id;
3170: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 . int len;.
3180: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 int code;.
3190: 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 0a 20 20 size_t len2;..
31a0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
31b0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
31c0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
31d0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
31e0: 4c 4c 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 0a LL)..return 0;..
31f0: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
3200: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
3210: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
3220: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 );.. Tcl_List
3230: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3240: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3250: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3260: 6a 28 20 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 j( "session", -1
3270: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 ));.. /* Sess
3280: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 ion id */. se
3290: 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 ssion_id = SSL_S
32a0: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 ESSION_get0_id_c
32b0: 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 ontext(session,
32c0: 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c &len);. Tcl_L
32d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
32e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
32f0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
3300: 67 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c gObj(session_id,
3310: 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 len));.. /*
3320: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a Session ticket *
3330: 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f /. SSL_SESSIO
3340: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 N_get0_ticket(se
3350: 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 ssion, &ticket,
3360: 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f &len2);. Tcl_
3370: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3380: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3390: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
33a0: 6e 67 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 ngObj(ticket, (i
33b0: 6e 74 29 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 nt)len2));..
33c0: 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 /* Lifetime - nu
33d0: 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 mber of seconds
33e0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f */. Tcl_ListO
33f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3400: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
3410: 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 .Tcl_NewLongObj(
3420: 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 (long) SSL_SESSI
3430: 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 ON_get_ticket_li
3440: 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 fetime_hint(sess
3450: 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 54 63 6c ion)));.. Tcl
3460: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
3470: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a tData) interp);.
3480: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
3490: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 ((ClientData) st
34a0: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 atePtr);.. Tc
34b0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
34c0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 mdPtr);. code
34d0: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 = Tcl_EvalObjEx
34e0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
34f0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c TCL_EVAL_GLOBAL
3500: 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 );. if (code
3510: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 != TCL_OK) {.#if
3520: 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 (TCL_MAJOR_VERS
3530: 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 ION == 8) && (TC
3540: 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MINOR_VERSION
3550: 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 < 6)..Tcl_Backgr
3560: 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 oundError(interp
3570: 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 );.#else..Tcl_Ba
3580: 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f ckgroundExceptio
3590: 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b n(interp, code);
35a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 .#endif. }.
35b0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
35c0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 nt(cmdPtr);..
35d0: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c Tcl_Release((Cl
35e0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
35f0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c tr);. Tcl_Rel
3600: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 ease((ClientData
3610: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 ) interp);. r
3620: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0c 0a 2f 2a 0a eturn 1;.}.../*.
3630: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3670: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e -----. *. * ALPN
3680: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 Callback for Se
3690: 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 53 rvers --. *. *.S
36a0: 65 6c 65 63 74 20 77 68 69 63 68 20 70 72 6f 74 elect which prot
36b0: 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 ocol (http/1.1,
36c0: 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 74 6f h2, h3, etc.) to
36d0: 20 75 73 65 20 66 6f 72 20 74 68 65 0a 20 2a 09 use for the. *.
36e0: 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 incoming connect
36f0: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ion.. *. * Resul
3700: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
3710: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
3720: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
3730: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
3740: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 *. * Return code
3750: 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s:. *.SSL_TLSEXT
3760: 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 _ERR_OK: ALPN pr
3770: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e otocol selected.
3780: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
3790: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
37a0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 L_TLSEXT_ERR_ALE
37b0: 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20 RT_FATAL: There
37c0: 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 was no overlap b
37d0: 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e etween the clien
37e0: 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c t's. *. suppl
37f0: 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65 ied list and the
3800: 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72 server configur
3810: 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 ation. The conne
3820: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 ction will be ab
3830: 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c orted.. *.SSL_TL
3840: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 SEXT_ERR_NOACK:
3850: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f ALPN protocol no
3860: 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e t selected, e.g.
3870: 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 , because no ALP
3880: 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f N. *. protoco
3890: 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 ls are configure
38a0: 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 d for this conne
38b0: 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 ction. The conne
38c0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
38d0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
3920: 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c atic int.ALPNCal
3930: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 lback(const SSL
3940: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 *ssl, const unsi
3950: 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c gned char **out,
3960: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
3970: 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 outlen,..const u
3980: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e nsigned char *in
3990: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 , unsigned int i
39a0: 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 nlen, void *arg)
39b0: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
39c0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a atePtr = (State*
39d0: 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e )arg;. Tcl_In
39e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
39f0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
3a00: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d . Tcl_Obj *cm
3a10: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f dPtr;. int co
3a20: 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 de;.. dprintf
3a30: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
3a40: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
3a50: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f allback == (Tcl_
3a60: 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 Obj*)NULL)..retu
3a70: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
3a80: 52 5f 4f 4b 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 R_OK;.. /* Se
3a90: 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f lect protocol */
3aa0: 0a 20 20 20 20 53 53 4c 5f 73 65 6c 65 63 74 5f . SSL_select_
3ab0: 6e 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74 2c 20 next_proto(out,
3ac0: 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72 outlen, statePtr
3ad0: 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50 ->protos, stateP
3ae0: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 20 tr->protos_len,
3af0: 69 6e 2c 20 69 6e 6c 65 6e 29 3b 0a 0a 20 20 20 in, inlen);..
3b00: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
3b10: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
3b20: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
3b30: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
3b40: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3b50: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
3b60: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 _NewStringObj("a
3b70: 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 lpn", -1));.
3b80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
3b90: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
3ba0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
3bb0: 53 74 72 69 6e 67 4f 62 6a 28 2a 6f 75 74 2c 20 StringObj(*out,
3bc0: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 -1));.. Tcl_P
3bd0: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
3be0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
3bf0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
3c00: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
3c10: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ePtr);.. Tcl_
3c20: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
3c30: 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d Ptr);. code =
3c40: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 Tcl_EvalObjEx(i
3c50: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3c60: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b CL_EVAL_GLOBAL);
3c70: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d . if (code !=
3c80: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 TCL_OK) {.#if (
3c90: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
3ca0: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f N == 8) && (TCL_
3cb0: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 MINOR_VERSION <
3cc0: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6)..Tcl_Backgrou
3cd0: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b ndError(interp);
3ce0: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b .#else..Tcl_Back
3cf0: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 groundException(
3d00: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 interp, code);.#
3d10: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 endif. }.
3d20: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
3d30: 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 (cmdPtr);.. T
3d40: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
3d50: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
3d60: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 );. Tcl_Relea
3d70: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
3d80: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 interp);. ret
3d90: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
3da0: 52 52 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a RR_OK;.}.../*. *
3db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3df0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 ---. *. * SNI Ca
3e00: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 llback for Serve
3e10: 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 rs --. *. *.Perf
3e20: 6f 72 6d 20 73 65 72 76 65 72 20 6e 61 6d 65 20 orm server name
3e30: 73 65 6c 65 63 74 69 6f 6e 0a 20 2a 0a 20 2a 20 selection. *. *
3e40: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 Results:. *.None
3e50: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
3e60: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 cts:. *.Calls ca
3e70: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e llback (if defin
3e80: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e ed). *. * Return
3e90: 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 codes:. *.SSL_T
3ea0: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e LSEXT_ERR_OK: SN
3eb0: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 I hostname is ac
3ec0: 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e cepted. The conn
3ed0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
3ee0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
3ef0: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a ERR_ALERT_FATAL:
3f00: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 SNI hostname is
3f10: 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2e 20 54 not accepted. T
3f20: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a he connection. *
3f30: 09 20 20 20 20 69 73 20 61 62 6f 72 74 65 64 2e . is aborted.
3f40: 20 44 65 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 Default for ale
3f50: 72 74 20 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 rt is SSL_AD_UNR
3f60: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a ECOGNIZED_NAME..
3f70: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
3f80: 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a R_ALERT_WARNING:
3f90: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 SNI hostname is
3fa0: 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2c 20 77 not accepted, w
3fb0: 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 arning alert. *.
3fc0: 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 20 69 6e sent (not in
3fd0: 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 63 TLSv1.3). The c
3fe0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
3ff0: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 ues.. *.SSL_TLSE
4000: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e XT_ERR_NOACK: SN
4010: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f I hostname is no
4020: 74 20 61 63 63 65 70 74 65 64 20 61 6e 64 20 6e t accepted and n
4030: 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c ot acknowledged,
4040: 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 20 . *. e.g. if
4050: 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 65 6e SNI has not been
4060: 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 65 configured. The
4070: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
4080: 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d inues.. *. *----
4090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
40d0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 */.static int.S
40e0: 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 NICallback(const
40f0: 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a SSL *ssl, int *
4100: 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 alert, void *arg
4110: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
4120: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
4130: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 *)arg;. Tcl_I
4140: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
4150: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
4160: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
4170: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 mdPtr;. int c
4180: 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 ode;. char *s
4190: 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c ervername = NULL
41a0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
41b0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
41c0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
41d0: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
41e0: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 j*)NULL) {..retu
41f0: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
4200: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 R_OK;. } else
4210: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
4220: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
4230: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
4240: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 72 ;. }.. ser
4250: 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 vername = SSL_ge
4260: 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c t_servername(ssl
4270: 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 , TLSEXT_NAMETYP
4280: 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 E_host_name);.
4290: 20 20 69 66 20 28 21 73 65 72 76 65 72 6e 61 6d if (!servernam
42a0: 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b e || servername[
42b0: 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 20 20 0] == '\0') {.
42c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c return SSL
42d0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
42e0: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d K;. }.. cm
42f0: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
4300: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
4310: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 ->callback);..
4320: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
4330: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
4340: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
4350: 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 22 73 6e ewStringObj( "sn
4360: 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 i", -1));. Tc
4370: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
4380: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
4390: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
43a0: 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 ringObj(serverna
43b0: 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 me , -1));..
43c0: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c Tcl_Preserve((Cl
43d0: 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 ientData) interp
43e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 );. Tcl_Prese
43f0: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 rve((ClientData)
4400: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 statePtr);..
4410: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
4420: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 t(cmdPtr);. c
4430: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 ode = Tcl_EvalOb
4440: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 jEx(interp, cmdP
4450: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f tr, TCL_EVAL_GLO
4460: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f BAL);. if (co
4470: 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a de != TCL_OK) {.
4480: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 #if (TCL_MAJOR_V
4490: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 ERSION == 8) &&
44a0: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 (TCL_MINOR_VERSI
44b0: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 ON < 6)..Tcl_Bac
44c0: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 kgroundError(int
44d0: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c erp);.#else..Tcl
44e0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 _BackgroundExcep
44f0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 tion(interp, cod
4500: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d e);.#endif. }
4510: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
4520: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a Count(cmdPtr);..
4530: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
4540: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
4550: 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f tePtr);. Tcl_
4560: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
4570: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
4580: 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 return SSL_TLS
4590: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 0c 0a EXT_ERR_OK;.}...
45a0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
45b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 --------. *. * H
45f0: 65 6c 6c 6f 20 43 61 6c 6c 62 61 63 6b 20 66 6f ello Callback fo
4600: 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a r Servers --. *.
4610: 20 2a 09 55 73 65 64 20 62 79 20 73 65 72 76 65 *.Used by serve
4620: 72 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 r to examine the
4630: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 server name ind
4640: 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 ication (SNI) ex
4650: 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 tension. *.provi
4660: 64 65 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e ded by the clien
4670: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 t in order to se
4680: 6c 65 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69 lect an appropri
4690: 61 74 65 20 63 65 72 74 69 66 69 63 61 74 65 20 ate certificate
46a0: 74 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 to. *.present, a
46b0: 6e 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f nd make other co
46c0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 nfiguration adju
46d0: 73 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 stments relevant
46e0: 20 74 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a to that server.
46f0: 20 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 *.name and its
4700: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 configuration. T
4710: 68 69 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61 his includes swa
4720: 70 70 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73 pping out the as
4730: 73 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f sociated. *.SSL_
4740: 43 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 CTX pointer, mod
4750: 69 66 79 69 6e 67 20 74 68 65 20 73 65 72 76 65 ifying the serve
4760: 72 27 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d r's list of perm
4770: 69 74 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f itted TLS versio
4780: 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 ns,. *.changing
4790: 74 68 65 20 73 65 72 76 65 72 27 73 20 63 69 70 the server's cip
47a0: 68 65 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70 her list in resp
47b0: 6f 6e 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65 onse to the clie
47c0: 6e 74 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 nt's cipher list
47d0: 2c 20 65 74 63 2e 0a 20 2a 0a 20 2a 20 52 65 73 , etc.. *. * Res
47e0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
47f0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
4800: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
4810: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
4820: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
4830: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 des:. *.SSL_CLIE
4840: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 20 3d NT_HELLO_RETRY =
4850: 20 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e suspend the han
4860: 64 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 dshake, and the
4870: 68 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 handshake functi
4880: 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 on will return i
4890: 6d 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 mmediately. *.SS
48a0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
48b0: 52 52 4f 52 20 3d 20 66 61 69 6c 75 72 65 2c 20 RROR = failure,
48c0: 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 terminate connec
48d0: 74 69 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 tion. Set alert
48e0: 74 6f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 to error code..
48f0: 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c *.SSL_CLIENT_HEL
4900: 4c 4f 5f 53 55 43 43 45 53 53 20 3d 20 73 75 63 LO_SUCCESS = suc
4910: 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d cess. *. *------
4920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4960: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 48 65 6c /.static int.Hel
4970: 6c 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 loCallback(const
4980: 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a SSL *ssl, int *
4990: 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 alert, void *arg
49a0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
49b0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
49c0: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 *)arg;. Tcl_I
49d0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
49e0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
49f0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
4a00: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 mdPtr;. int c
4a10: 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ode;.. dprint
4a20: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
4a30: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
4a40: 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c callback == (Tcl
4a50: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 _Obj*)NULL)..ret
4a60: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
4a70: 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 0a 20 ELLO_SUCCESS;..
4a80: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
4a90: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
4aa0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
4ab0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f ;.. Tcl_ListO
4ac0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
4ad0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
4ae0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
4af0: 28 20 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b ( "hello", -1));
4b00: 0a 0a 20 20 20 20 2f 2a 20 53 53 4c 5f 63 6c 69 .. /* SSL_cli
4b10: 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 72 ent_hello_get0_r
4b20: 61 6e 64 6f 6d 28 29 2c 20 53 53 4c 5f 63 6c 69 andom(), SSL_cli
4b30: 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 73 ent_hello_get0_s
4b40: 65 73 73 69 6f 6e 5f 69 64 28 29 2c 20 53 53 4c ession_id(), SSL
4b50: 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 _client_hello_ge
4b60: 74 30 5f 63 69 70 68 65 72 73 28 29 2c 20 61 6e t0_ciphers(), an
4b70: 64 20 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c d SSL_client_hel
4b80: 6c 6f 5f 67 65 74 30 5f 63 6f 6d 70 72 65 73 73 lo_get0_compress
4b90: 69 6f 6e 5f 6d 65 74 68 6f 64 73 28 29 20 70 72 ion_methods() pr
4ba0: 6f 76 69 64 65 20 61 63 63 65 73 73 20 74 6f 20 ovide access to
4bb0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e the correspondin
4bc0: 67 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 66 69 g ClientHello fi
4bd0: 65 6c 64 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 elds, returning
4be0: 74 68 65 20 66 69 65 6c 64 20 6c 65 6e 67 74 68 the field length
4bf0: 20 61 6e 64 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 and optionally
4c00: 73 65 74 74 69 6e 67 20 61 6e 20 6f 75 74 20 70 setting an out p
4c10: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 63 ointer to the oc
4c20: 74 65 74 73 20 6f 66 20 74 68 61 74 20 66 69 65 tets of that fie
4c30: 6c 64 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 ld. */.. /* S
4c40: 69 6d 69 6c 61 72 6c 79 2c 20 53 53 4c 5f 63 6c imilarly, SSL_cl
4c50: 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f ient_hello_get0_
4c60: 65 78 74 28 29 20 70 72 6f 76 69 64 65 73 20 61 ext() provides a
4c70: 63 63 65 73 73 20 74 6f 20 69 6e 64 69 76 69 64 ccess to individ
4c80: 75 61 6c 20 65 78 74 65 6e 73 69 6f 6e 73 20 66 ual extensions f
4c90: 72 6f 6d 20 74 68 65 20 43 6c 69 65 6e 74 48 65 rom the ClientHe
4ca0: 6c 6c 6f 20 6f 6e 20 61 20 70 65 72 2d 65 78 74 llo on a per-ext
4cb0: 65 6e 73 69 6f 6e 20 62 61 73 69 73 2e 20 46 6f ension basis. Fo
4cc0: 72 20 74 68 65 20 70 72 6f 76 69 64 65 64 20 77 r the provided w
4cd0: 69 72 65 20 70 72 6f 74 6f 63 6f 6c 20 65 78 74 ire protocol ext
4ce0: 65 6e 73 69 6f 6e 20 74 79 70 65 20 76 61 6c 75 ension type valu
4cf0: 65 2c 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e e, the extension
4d00: 20 76 61 6c 75 65 20 61 6e 64 20 6c 65 6e 67 74 value and lengt
4d10: 68 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 69 h are returned i
4d20: 6e 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 n the output par
4d30: 61 6d 65 74 65 72 73 20 28 69 66 20 70 72 65 73 ameters (if pres
4d40: 65 6e 74 29 2e 20 2a 2f 0a 0a 0a 20 20 20 20 54 ent). */... T
4d50: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
4d60: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
4d70: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 ;. Tcl_Preser
4d80: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
4d90: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
4da0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
4db0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
4dc0: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
4dd0: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
4de0: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
4df0: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
4e00: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
4e10: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
4e20: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
4e30: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
4e40: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
4e50: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
4e60: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
4e70: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
4e80: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
4e90: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
4ea0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
4eb0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
4ec0: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
4ed0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
4ee0: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 ePtr);. Tcl_R
4ef0: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
4f00: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 ta) interp);.
4f10: 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 return SSL_CLIE
4f20: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 NT_HELLO_SUCCESS
4f30: 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a ;.}.../*********
4f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 ***********/./*
4f50: 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 20 Commands
4f60: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./***********
4f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 *********/../*.
4f80: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
4f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4fc0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 ----. *. * Ciphe
4fd0: 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 rsObjCmd -- list
4fe0: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 available ciphe
4ff0: 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 rs. *. *.This pr
5000: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
5010: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 ed to process th
5020: 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 e "tls::ciphers"
5030: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c command. *.to l
5040: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 ist available ci
5050: 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 70 6f phers, based upo
5060: 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 n protocol selec
5070: 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ted.. *. * Resul
5080: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
5090: 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 d Tcl result lis
50a0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
50b0: 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 fects:. *.constr
50c0: 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f 79 ucts and destroy
50d0: 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 s SSL context (C
50e0: 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d TX). *. *-------
50f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
5130: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 .static const ch
5140: 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 ar *protocols[]
5150: 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22 73 73 = {.."ssl2", "ss
5160: 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 74 6c l3", "tls1", "tl
5170: 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22 2c s1.1", "tls1.2",
5180: 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a "tls1.3", NULL.
5190: 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c };.enum protocol
51a0: 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c 32 2c {. TLS_SSL2,
51b0: 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f 54 TLS_SSL3, TLS_T
51c0: 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 31 2c LS1, TLS_TLS1_1,
51d0: 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 4c 53 TLS_TLS1_2, TLS
51e0: 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f 4e _TLS1_3, TLS_NON
51f0: 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 E.};..static int
5200: 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 43 .CiphersObjCmd(C
5210: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
5220: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
5230: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
5240: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
5250: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
5260: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 Tcl_Obj *objPtr
5270: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c = NULL;. SSL
5280: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c _CTX *ctx = NULL
5290: 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d ;. SSL *ssl =
52a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b NULL;. STACK
52b0: 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29 20 _OF(SSL_CIPHER)
52c0: 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 *sk;. char *c
52d0: 70 2c 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a p, buf[BUFSIZ];.
52e0: 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 int index, v
52f0: 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f erbose = 0, use_
5300: 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a 0a supported = 0;..
5310: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
5320: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
5330: 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f (objc < 2) || (o
5340: 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c bjc > 4)) {..Tcl
5350: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
5360: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
5370: 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 protocol ?verbos
5380: 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29 e? ?supported?")
5390: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
53a0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
53b0: 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 f (Tcl_GetIndexF
53c0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
53d0: 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c bjv[1], protocol
53e0: 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 s, "protocol", 0
53f0: 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c , &index) != TCL
5400: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
5410: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
5420: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 if ((objc >
5430: 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 2) && Tcl_GetBoo
5440: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 leanFromObj(inte
5450: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 rp, objv[2], &ve
5460: 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b rbose) != TCL_OK
5470: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
5480: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
5490: 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20 if ((objc > 3)
54a0: 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 && Tcl_GetBoolea
54b0: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c nFromObj(interp,
54c0: 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 objv[3], &use_s
54d0: 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c upported) != TCL
54e0: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
54f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
5500: 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e . switch ((en
5510: 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 um protocol)inde
5520: 78 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53 x) {..case TLS_S
5530: 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c SL2:.#if OPENSSL
5540: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
5550: 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c >= 0x10100000L |
5560: 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c | defined(NO_SSL
5570: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
5580: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 ENSSL_NO_SSL2)..
5590: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
55a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
55b0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
55c0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
55d0: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
55e0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
55f0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
5600: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 ctx = SSL_CT
5610: 58 5f 6e 65 77 28 53 53 4c 76 32 5f 6d 65 74 68 X_new(SSLv2_meth
5620: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 od()); break;.#e
5630: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 ndif..case TLS_S
5640: 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 SL3:.#if defined
5650: 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 (NO_SSL3) || def
5660: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
5670: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL3) || defined
5680: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
5690: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 _METHOD).. Tc
56a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
56b0: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
56c0: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
56d0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
56e0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
56f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
5700: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 R;.#else.. ct
5710: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 x = SSL_CTX_new(
5720: 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 29 3b SSLv3_method());
5730: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
5740: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 case TLS_TLS1:.#
5750: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
5760: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f S1) || defined(O
5770: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 PENSSL_NO_TLS1)
5780: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
5790: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f SL_NO_TLS1_METHO
57a0: 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 D).. Tcl_Appe
57b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
57c0: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 protocols[index
57d0: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e ], ": protocol n
57e0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
57f0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ULL);.. retur
5800: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c n TCL_ERROR;.#el
5810: 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 se.. ctx = SS
5820: 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f L_CTX_new(TLSv1_
5830: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b method()); break
5840: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 ;.#endif..case T
5850: 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 LS_TLS1_1:.#if d
5860: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
5870: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
5880: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 NSSL_NO_TLS1_1)
5890: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
58a0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 SL_NO_TLS1_1_MET
58b0: 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 HOD).. Tcl_Ap
58c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
58d0: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 p, protocols[ind
58e0: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c ex], ": protocol
58f0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
5900: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
5910: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
5920: 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 else.. ctx =
5930: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 SSL_CTX_new(TLSv
5940: 31 5f 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 1_1_method()); b
5950: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 reak;.#endif..ca
5960: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 se TLS_TLS1_2:.#
5970: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
5980: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_2) || defined
5990: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
59a0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _2) || defined(O
59b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
59c0: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 _METHOD).. Tc
59d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
59e0: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
59f0: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
5a00: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
5a10: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
5a20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
5a30: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 R;.#else.. ct
5a40: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 x = SSL_CTX_new(
5a50: 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29 TLSv1_2_method()
5a60: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ); break;.#endif
5a70: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f ..case TLS_TLS1_
5a80: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 3:.#if defined(N
5a90: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 O_TLS1_3) || def
5aa0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
5ab0: 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 54 63 6c TLS1_3).. Tcl
5ac0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
5ad0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
5ae0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
5af0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
5b00: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 d", NULL);..
5b10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
5b20: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 ;.#else.. ctx
5b30: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 = SSL_CTX_new(T
5b40: 4c 53 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 20 20 LS_method());.
5b50: 20 20 20 20 20 20 20 20 20 20 53 53 4c 5f 43 54 SSL_CT
5b60: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f X_set_min_proto_
5b70: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 version(ctx, TLS
5b80: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 1_3_VERSION);..
5b90: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d SSL_CTX_set_m
5ba0: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e ax_proto_version
5bb0: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 (ctx, TLS1_3_VER
5bc0: 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 SION);.. brea
5bd0: 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 75 k;.#endif..defau
5be0: 6c 74 3a 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a lt:.. break;.
5bf0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 74 }. if (ct
5c00: 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 x == NULL) {..Tc
5c10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
5c20: 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c nterp, REASON(),
5c30: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
5c40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
5c50: 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f .. ssl = SSL_
5c60: 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 new(ctx);. if
5c70: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b (ssl == NULL) {
5c80: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
5c90: 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f lt(interp, REASO
5ca0: 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c N(), NULL);..SSL
5cb0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
5cc0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
5cd0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
5ce0: 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 Use list and or
5cf0: 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20 der as would be
5d00: 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 sent in a Client
5d10: 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 Hello or all ava
5d20: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a ilable ciphers *
5d30: 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75 /. if (use_su
5d40: 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d pported) {..sk =
5d50: 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 SSL_get1_suppor
5d60: 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29 ted_ciphers(ssl)
5d70: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
5d80: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 sk = SSL_get_cip
5d90: 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d hers(ssl);. }
5da0: 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20 .. if (sk !=
5db0: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 NULL) {..if (!ve
5dc0: 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f 62 rbose) {.. ob
5dd0: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
5de0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
5df0: 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 . for (int i
5e00: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f = 0; i < sk_SSL_
5e10: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 CIPHER_num(sk);
5e20: 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 i++) {...const S
5e30: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 SL_CIPHER *c = s
5e40: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c k_SSL_CIPHER_val
5e50: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 ue(sk, i);...if
5e60: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 (c == NULL) cont
5e70: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 inue;..../* ciph
5e80: 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 er name or (NONE
5e90: 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f ) */...cp = SSL_
5ea0: 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 CIPHER_get_name(
5eb0: 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 c);...if (cp ==
5ec0: 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 NULL) break;...T
5ed0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
5ee0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
5ef0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
5f00: 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 29 tringObj(cp, -1)
5f10: 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c );.. }...} el
5f20: 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 se {.. objPtr
5f30: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 = Tcl_NewString
5f40: 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 Obj("",0);..
5f50: 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 for (int i = 0;
5f60: 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 i < sk_SSL_CIPHE
5f70: 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 R_num(sk); i++)
5f80: 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 {...const SSL_CI
5f90: 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c PHER *c = sk_SSL
5fa0: 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b _CIPHER_value(sk
5fb0: 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d , i);...if (c ==
5fc0: 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b NULL) continue;
5fd0: 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 ..../* textual d
5fe0: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 escription of th
5ff0: 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 e cipher */...if
6000: 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 (SSL_CIPHER_des
6010: 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c cription(c, buf,
6020: 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d sizeof(buf)) !=
6030: 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 NULL) {... T
6040: 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f cl_AppendToObj(o
6050: 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 69 6e 74 bjPtr, buf, (int
6060: 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a ) strlen(buf));.
6070: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 ..} else {...
6080: 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a Tcl_AppendToObj
6090: 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 (objPtr, "UNKNOW
60a0: 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 N\n", 8);...}..
60b0: 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 }..}..if (use
60c0: 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 _supported) {..
60d0: 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 sk_SSL_CIPHER
60e0: 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 _free(sk);..}.
60f0: 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 }. SSL_free
6100: 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 (ssl);. SSL_C
6110: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 TX_free(ctx);..
6120: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
6130: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ult(interp, objP
6140: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
6150: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 TCL_OK;..clientD
6160: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 ata = clientData
6170: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
6180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
61a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
61b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
61c0: 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 *. * ProtocolsOb
61d0: 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 jCmd -- list ava
61e0: 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 ilable protocols
61f0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
6200: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
6210: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 to process the
6220: 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 "tls::protocols"
6230: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c command. *.to l
6240: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 ist available pr
6250: 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52 otocols.. *. * R
6260: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
6270: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
6280: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 list.. *. * Sid
6290: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f e effects:. *.no
62a0: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ne. *. *--------
62b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
62c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
62d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
62e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
62f0: 73 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 74 6f static int.Proto
6300: 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e colsObjCmd(Clien
6310: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
6320: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
6330: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
6340: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
6350: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
6360: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 _Obj *objPtr;..
6370: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
6380: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
6390: 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c bjc != 1) {..Tcl
63a0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
63b0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
63c0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
63d0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
63e0: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
63f0: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
6400: 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c L);..#if OPENSSL
6410: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
6420: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 < 0x10100000L &&
6430: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
6440: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
6450: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a PENSSL_NO_SSL2).
6460: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
6470: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
6480: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
6490: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
64a0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 otocols[TLS_SSL2
64b0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
64c0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
64d0: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
64e0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
64f0: 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 3). Tcl_ListO
6500: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
6510: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
6520: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
6530: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 (protocols[TLS_S
6540: 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 SL3], -1));.#end
6550: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
6560: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 NO_TLS1) && !def
6570: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
6580: 54 4c 53 31 29 0a 20 20 20 20 54 63 6c 5f 4c 69 TLS1). Tcl_Li
6590: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
65a0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
65b0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
65c0: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
65d0: 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 S_TLS1], -1));.#
65e0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
65f0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 ed(NO_TLS1_1) &&
6600: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
6610: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 L_NO_TLS1_1).
6620: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
6630: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
6640: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
6650: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
6660: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d cols[TLS_TLS1_1]
6670: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
6680: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
6690: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
66a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
66b0: 53 31 5f 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 S1_2). Tcl_Li
66c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
66d0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
66e0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
66f0: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
6700: 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b S_TLS1_2], -1));
6710: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
6720: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
6730: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
6740: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
6750: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
6760: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
6770: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
6780: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
6790: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f tocols[TLS_TLS1_
67a0: 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 3], -1));.#endif
67b0: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
67c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
67d0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
67e0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
67f0: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
6800: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
6810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6850: 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b -. *. * Handshak
6860: 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a eObjCmd --. *. *
6870: 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 .This command is
6880: 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 used to verify
6890: 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e 64 whether the hand
68a0: 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 shake is complet
68b0: 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a e. *.or not.. *.
68c0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
68d0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
68e0: 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 sult. 1 means ha
68f0: 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 ndshake complete
6900: 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e , 0 means pendin
6910: 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 g.. *. * Side ef
6920: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f fects:. *.May fo
6930: 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 rce SSL negotiat
6940: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 ion to take plac
6950: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
6960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
69a0: 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 73 static int Hands
69b0: 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e hakeObjCmd(Clien
69c0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
69d0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
69e0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
69f0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
6a00: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
6a10: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 _Channel chan;
6a20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 61 /* The cha
6a30: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f nnel to set a mo
6a40: 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 de on. */. St
6a50: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 20 ate *statePtr;
6a60: 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 /* client
6a70: 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f state for ssl so
6a80: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 cket */. cons
6a90: 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 3d t char *errStr =
6aa0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 NULL;. int r
6ab0: 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 et = 1;. int
6ac0: 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 err = 0;.. dp
6ad0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
6ae0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
6af0: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 2) {..Tcl_Wron
6b00: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
6b10: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
6b20: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 el");..return(TC
6b30: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a L_ERROR);. }.
6b40: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
6b50: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
6b60: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
6b70: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
6b80: 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 NULL), NULL);.
6b90: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
6ba0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
6bb0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c L) {..return(TCL
6bc0: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a _ERROR);. }..
6bd0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
6be0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
6bf0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
6c00: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
6c10: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
6c20: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 el(chan);. if
6c30: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
6c40: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
6c50: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
6c60: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
6c70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
6c80: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
6c90: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
6ca0: 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f e(chan), "\": no
6cb0: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 t a TLS channel"
6cc0: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
6cd0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
6ce0: 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 }. statePtr
6cf0: 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 = (State *)Tcl_G
6d00: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 etChannelInstanc
6d10: 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 eData(chan);..
6d20: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 dprintf("Calli
6d30: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f ng Tls_WaitForCo
6d40: 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 nnect");. ret
6d50: 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f = Tls_WaitForCo
6d60: 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 nnect(statePtr,
6d70: 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 &err, 1);. dp
6d80: 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 rintf("Tls_WaitF
6d90: 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e orConnect return
6da0: 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a ed: %i", ret);..
6db0: 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 if (ret < 0
6dc0: 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 && ((statePtr->f
6dd0: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 lags & TLS_TCL_A
6de0: 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d SYNC) && (err ==
6df0: 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 EAGAIN))) {..dp
6e00: 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 rintf("Async set
6e10: 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 and err = EAGAI
6e20: 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 N");..ret = 0;.
6e30: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 } else if (re
6e40: 74 20 3c 20 30 29 20 7b 0a 09 65 72 72 53 74 72 t < 0) {..errStr
6e50: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 = statePtr->err
6e60: 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 ;..Tcl_ResetResu
6e70: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c lt(interp);..Tcl
6e80: 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a _SetErrno(err);.
6e90: 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c ..if (!errStr ||
6ea0: 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 (*errStr == 0))
6eb0: 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d {.. errStr =
6ec0: 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 Tcl_PosixError(
6ed0: 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 interp);..}...Tc
6ee0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
6ef0: 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b nterp, "handshak
6f00: 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 e failed: ", err
6f10: 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 Str, (char *) NU
6f20: 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 LL);..dprintf("R
6f30: 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 eturning TCL_ERR
6f40: 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b OR with handshak
6f50: 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 e failed: %s", e
6f60: 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 rrStr);..return(
6f70: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
6f80: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 } else {..if (er
6f90: 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 r != 0) {.. d
6fa0: 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 printf("Got an e
6fb0: 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 rror with a comp
6fc0: 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a leted handshake:
6fd0: 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 err = %i", err)
6fe0: 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 ;..}..ret = 1;.
6ff0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
7000: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c f("Returning TCL
7010: 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 _OK with data \"
7020: 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 %i\"", ret);.
7030: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
7040: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 t(interp, Tcl_Ne
7050: 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 wIntObj(ret));.
7060: 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b return(TCL_OK
7070: 29 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d );..clientData =
7080: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a clientData;.}..
7090: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
70a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
70b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
70c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
70d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 --------. *. * I
70e0: 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 mportObjCmd --.
70f0: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
7100: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 ure is invoked t
7110: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 o process the "s
7120: 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 sl" command. *.
7130: 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e *.The ssl comman
7140: 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 d pushes SSL ove
7150: 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 r a (newly conne
7160: 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 cted) tcp socket
7170: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
7180: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
7190: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
71a0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
71b0: 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 .May modify the
71c0: 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 behavior of an I
71d0: 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a O channel.. *. *
71e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
71f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7220: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
7230: 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 nt.ImportObjCmd(
7240: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
7250: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
7260: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
7270: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
7280: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
7290: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
72a0: 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e an;../* The chan
72b0: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 nel to set a mod
72c0: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 e on. */. Sta
72d0: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f te *statePtr;../
72e0: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 * client state f
72f0: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f or ssl socket */
7300: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 . SSL_CTX *ct
7310: 78 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c x. = NULL
7320: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 ;. Tcl_Obj *s
7330: 63 72 69 70 74 09 20 20 20 20 20 20 20 20 3d 20 cript. =
7340: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 NULL;. Tcl_Ob
7350: 6a 20 2a 70 61 73 73 77 6f 72 64 09 20 20 20 20 j *password.
7360: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
7370: 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 Tcl_DString uppe
7380: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
7390: 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 ion, upperChanne
73a0: 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 lBlocking, upper
73b0: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c ChannelEncoding,
73c0: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 upperChannelEOF
73d0: 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 Char;. int id
73e0: 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 x, len;. int
73f0: 66 6c 61 67 73 09 09 20 20 20 20 20 20 20 20 3d flags.. =
7400: 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 TLS_TCL_INIT;.
7410: 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 09 20 int server..
7420: 20 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 69 = 0;./* i
7430: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 s connection inc
7440: 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e oming or outgoin
7450: 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a g? */. char *
7460: 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 keyfile.
7470: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
7480: 20 2a 63 65 72 74 66 69 6c 65 09 20 20 20 20 20 *certfile.
7490: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 = NULL;. u
74a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 nsigned char *ke
74b0: 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 y .= NULL;.
74c0: 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 20 20 20 20 int key_len
74d0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b = 0;
74e0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
74f0: 61 72 20 2a 63 65 72 74 20 20 20 20 20 20 20 20 ar *cert
7500: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 = NULL;. int
7510: 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 20 20 cert_len
7520: 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 = 0;.
7530: 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 09 char *ciphers.
7540: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
7550: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 char *cipher
7560: 73 75 69 74 65 73 09 20 20 20 20 20 20 20 20 3d suites. =
7570: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
7580: 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 *CAfile.
7590: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
75a0: 20 2a 43 41 64 69 72 09 09 20 20 20 20 20 20 20 *CAdir..
75b0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
75c0: 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20 20 20 r *DHparams.
75d0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
75e0: 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 20 20 char *model..
75f0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
7600: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
7610: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c e. = NULL
7620: 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f ;./* hostname fo
7630: 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e r Server Name In
7640: 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 dication */.
7650: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
7660: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 20 har *session_id
7670: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
7680: 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c Obj *alpn..= NUL
7690: 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 L;. int ssl2
76a0: 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 = 0, ssl3 = 0;.
76b0: 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c int tls1 = 1,
76c0: 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 tls1_1 = 1, tls
76d0: 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 1_2 = 1, tls1_3
76e0: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f = 1;. int pro
76f0: 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 to = 0, level =
7700: 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 -1;. int veri
7710: 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 fy = 0, require
7720: 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 = 0, request = 1
7730: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
7740: 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 4f Called");..#if O
7750: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
7760: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
7770: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 00L && !defined(
7780: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
7790: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f && !defined(NO_
77a0: 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e 65 64 SSL2) && defined
77b0: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64 65 66 (NO_SSL3) && def
77c0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 ined(NO_TLS1) &&
77d0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
77e0: 5f 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e _1) && defined(N
77f0: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 64 65 66 O_TLS1_2) && def
7800: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a ined(NO_TLS1_3).
7810: 20 20 20 20 73 73 6c 32 20 3d 20 31 3b 0a 23 65 ssl2 = 1;.#e
7820: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
7830: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
7840: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 3) && !defined(N
7850: 4f 5f 53 53 4c 33 29 20 26 26 20 64 65 66 69 6e O_SSL3) && defin
7860: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 ed(NO_SSL2) && d
7870: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
7880: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c && defined(NO_TL
7890: 53 31 5f 31 29 20 26 26 20 64 65 66 69 6e 65 64 S1_1) && defined
78a0: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 64 (NO_TLS1_2) && d
78b0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
78c0: 29 0a 20 20 20 20 73 73 6c 33 20 3d 20 31 3b 0a ). ssl3 = 1;.
78d0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
78e0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 ed(NO_TLS1) || d
78f0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7900: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 O_TLS1). tls1
7910: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 0;.#endif.#if
7920: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
7930: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
7940: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
7950: 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 ). tls1_1 = 0
7960: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ;.#endif.#if def
7970: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
7980: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
7990: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 SL_NO_TLS1_2).
79a0: 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 tls1_2 = 0;.#e
79b0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
79c0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 (NO_TLS1_3) || d
79d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
79e0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c O_TLS1_3). tl
79f0: 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 s1_3 = 0;.#endif
7a00: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c .. if (objc <
7a10: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
7a20: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
7a30: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
7a40: 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 l ?options?");..
7a50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7a60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 ;. }.. cha
7a70: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
7a80: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 el(interp, Tcl_G
7a90: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
7aa0: 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 objv[1], NULL),
7ab0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
7ac0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
7ad0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
7ae0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7af0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
7b00: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
7b10: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
7b20: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
7b30: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
7b40: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
7b50: 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d .. for (idx =
7b60: 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 2; idx < objc;
7b70: 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a idx++) {..char *
7b80: 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 opt = Tcl_GetStr
7b90: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
7ba0: 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 idx], NULL);...i
7bb0: 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 f (opt[0] != '-'
7bc0: 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 ).. break;...
7bd0: 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c OPTSTR("-cadir",
7be0: 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 52 CAdir);..OPTSTR
7bf0: 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69 ("-cafile", CAfi
7c00: 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 le);..OPTSTR("-c
7c10: 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 ertfile", certfi
7c20: 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 le);..OPTSTR("-c
7c30: 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 ipher", ciphers)
7c40: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 ;..OPTSTR("-ciph
7c50: 65 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a ers", ciphers);.
7c60: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 .OPTSTR("-cipher
7c70: 73 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 suites", ciphers
7c80: 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 uites);..OPTOBJ(
7c90: 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 "-command", scri
7ca0: 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 pt);..OPTSTR("-d
7cb0: 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 hparams", DHpara
7cc0: 6d 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b ms);..OPTSTR("-k
7cd0: 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 eyfile", keyfile
7ce0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 );..OPTSTR("-mod
7cf0: 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 el", model);..OP
7d00: 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 TOBJ("-password"
7d10: 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 , password);..OP
7d20: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 TBOOL("-require"
7d30: 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 , require);..OPT
7d40: 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 2c BOOL("-request",
7d50: 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 49 request);..OPTI
7d60: 4e 54 28 22 2d 73 65 63 75 72 69 74 79 6c 65 76 NT("-securitylev
7d70: 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 el", level);..OP
7d80: 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c TBOOL("-server",
7d90: 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 54 server);..OPTST
7da0: 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c R("-servername",
7db0: 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f servername);..O
7dc0: 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f PTSTR("-session_
7dd0: 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29 id", session_id)
7de0: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e ;..OPTOBJ("-alpn
7df0: 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 42 4f ", alpn);..OPTBO
7e00: 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 OL("-ssl2", ssl2
7e10: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 );..OPTBOOL("-ss
7e20: 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 l3", ssl3);..OPT
7e30: 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c BOOL("-tls1", tl
7e40: 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d s1);..OPTBOOL("-
7e50: 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 tls1.1", tls1_1)
7e60: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
7e70: 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 1.2", tls1_2);..
7e80: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 OPTBOOL("-tls1.3
7e90: 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 ", tls1_3);..OPT
7ea0: 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 65 BYTE("-cert", ce
7eb0: 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 rt, cert_len);..
7ec0: 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 OPTBYTE("-key",
7ed0: 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 0a key, key_len);..
7ee0: 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 .OPTBAD("option"
7ef0: 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 , "-alpn, -cadir
7f00: 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 , -cafile, -cert
7f10: 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 , -certfile, -ci
7f20: 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69 pher, -ciphersui
7f30: 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d tes, -command, -
7f40: 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 dhparams, -key,
7f50: 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c -keyfile, -model
7f60: 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 72 65 , -password, -re
7f70: 71 75 69 72 65 2c 20 2d 72 65 71 75 65 73 74 2c quire, -request,
7f80: 20 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c 2c -securitylevel,
7f90: 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 -server, -serve
7fa0: 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f rname, -session_
7fb0: 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 id, -ssl2, -ssl3
7fc0: 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 , -tls1, -tls1.1
7fd0: 2c 20 2d 74 6c 73 31 2e 32 2c 20 6f 72 20 2d 74 , -tls1.2, or -t
7fe0: 6c 73 31 2e 33 22 29 3b 0a 0a 09 72 65 74 75 72 ls1.3");...retur
7ff0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
8000: 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 }. if (reque
8010: 73 74 29 09 20 20 20 20 76 65 72 69 66 79 20 7c st). verify |
8020: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 = SSL_VERIFY_CLI
8030: 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 ENT_ONCE | SSL_V
8040: 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 ERIFY_PEER;.
8050: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72 if (request && r
8060: 65 71 75 69 72 65 29 20 76 65 72 69 66 79 20 7c equire) verify |
8070: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 = SSL_VERIFY_FAI
8080: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 L_IF_NO_PEER_CER
8090: 54 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 T;. if (verif
80a0: 79 20 3d 3d 20 30 29 09 76 65 72 69 66 79 20 3d y == 0).verify =
80b0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 SSL_VERIFY_NONE
80c0: 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 ;.. proto |=
80d0: 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 (ssl2 ? TLS_PROT
80e0: 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 O_SSL2 : 0);.
80f0: 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 proto |= (ssl3
8100: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 ? TLS_PROTO_SSL3
8110: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f : 0);. proto
8120: 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f |= (tls1 ? TLS_
8130: 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b PROTO_TLS1 : 0);
8140: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 . proto |= (t
8150: 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 ls1_1 ? TLS_PROT
8160: 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 O_TLS1_1 : 0);.
8170: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 proto |= (tls
8180: 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 1_2 ? TLS_PROTO_
8190: 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 TLS1_2 : 0);.
81a0: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f proto |= (tls1_
81b0: 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 3 ? TLS_PROTO_TL
81c0: 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 S1_3 : 0);..
81d0: 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c /* reset to NULL
81e0: 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 if blank string
81f0: 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 provided */.
8200: 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 if (cert && !*c
8210: 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63 65 ert).. ce
8220: 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c rt. = NUL
8230: 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 L;. if (key &
8240: 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20 & !*key)..
8250: 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20 key. =
8260: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 NULL;. if (ce
8270: 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74 rtfile && !*cert
8280: 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 65 file) ce
8290: 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 rtfile.= NULL;.
82a0: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26 if (keyfile &
82b0: 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 & !*keyfile)..ke
82c0: 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 yfile. =
82d0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 NULL;. if (ci
82e0: 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 phers && !*ciphe
82f0: 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70 68 rs). ciph
8300: 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ers. = NU
8310: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 LL;. if (ciph
8320: 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 69 ersuites && !*ci
8330: 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70 68 phersuites) ciph
8340: 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e 55 ersuites = NU
8350: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69 LL;. if (CAfi
8360: 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09 le && !*CAfile).
8370: 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 20 CAfile.
8380: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
8390: 20 20 20 69 66 20 28 43 41 64 69 72 20 26 26 20 if (CAdir &&
83a0: 21 2a 43 41 64 69 72 29 09 20 20 20 20 20 20 20 !*CAdir).
83b0: 20 43 41 64 69 72 09 20 20 20 20 20 20 20 20 3d CAdir. =
83c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 NULL;. if (D
83d0: 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 Hparams && !*DHp
83e0: 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 arams). D
83f0: 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d Hparams =
8400: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e NULL;.. /* n
8410: 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a ew SSL state */.
8420: 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 statePtr..=
8430: 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f (State *) ckallo
8440: 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a c((unsigned) siz
8450: 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 eof(State));.
8460: 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 memset(statePtr
8470: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 , 0, sizeof(Stat
8480: 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 e));.. stateP
8490: 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 tr->flags.= flag
84a0: 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d s;. statePtr-
84b0: 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 >interp.= interp
84c0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
84d0: 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b vflags.= verify;
84e0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 . statePtr->e
84f0: 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a rr.= "";.. /*
8500: 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 allocate script
8510: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 */. if (scri
8520: 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 pt) {..(void) Tc
8530: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
8540: 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 bj(script, &len)
8550: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 ;..if (len) {..
8560: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c statePtr->cal
8570: 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a lback = script;.
8580: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
8590: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
85a0: 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 callback);..}.
85b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f }.. /* allo
85c0: 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f cate password */
85d0: 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 . if (passwor
85e0: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c d) {..(void) Tcl
85f0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
8600: 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e j(password, &len
8610: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
8620: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 statePtr->pa
8630: 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 ssword = passwor
8640: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 d;.. Tcl_Incr
8650: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
8660: 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d r->password);..}
8670: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
8680: 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b model != NULL) {
8690: 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 ..int mode;../*
86a0: 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 Get the "model"
86b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e context */..chan
86c0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
86d0: 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c l(interp, model,
86e0: 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 &mode);..if (ch
86f0: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
8700: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 el) NULL) {..
8710: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 Tls_Free((char
8720: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
8730: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
8740: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a ROR;..}.../*.. *
8750: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
8760: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
8770: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a most channel.. *
8780: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 /..chan = Tcl_Ge
8790: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
87a0: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 );..if (Tcl_GetC
87b0: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
87c0: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
87d0: 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 ype()) {.. Tc
87e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
87f0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
8800: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
8810: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
8820: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 ),..."\": not a
8830: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 TLS channel", NU
8840: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 LL);.. Tls_Fr
8850: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
8860: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
8870: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
8880: 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20 ..ctx = ((State
8890: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c *)Tcl_GetChannel
88a0: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 InstanceData(cha
88b0: 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 n))->ctx;. }
88c0: 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 else {..if ((ctx
88d0: 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74 = CTX_Init(stat
88e0: 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72 ePtr, server, pr
88f0: 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 oto, keyfile, ce
8900: 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 rtfile, key, cer
8910: 74 2c 0a 09 20 20 20 20 6b 65 79 5f 6c 65 6e 2c t,.. key_len,
8920: 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69 72 cert_len, CAdir
8930: 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72 , CAfile, cipher
8940: 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 2c s, ciphersuites,
8950: 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 level, DHparams
8960: 29 29 20 3d 3d 20 28 53 53 4c 5f 43 54 58 2a 29 )) == (SSL_CTX*)
8970: 30 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 0) {.. Tls_Fr
8980: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
8990: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
89a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
89b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 . }.. stat
89c0: 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b ePtr->ctx = ctx;
89d0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
89e0: 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 We need to make
89f0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 68 sure that the ch
8a00: 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 annel works in b
8a10: 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 inary (for the.
8a20: 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e * encryption
8a30: 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 not to get goof
8a40: 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 ed up).. * W
8a50: 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 e only want to a
8a60: 64 6a 75 73 74 20 74 68 65 20 62 75 66 66 65 72 djust the buffer
8a70: 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 ing in pre-v2 ch
8a80: 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 annels, where.
8a90: 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 * each channe
8aa0: 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d l in the stack m
8ab0: 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 aintained its ow
8ac0: 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 n buffers..
8ad0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 */. Tcl_DStri
8ae0: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
8af0: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 nnelTranslation)
8b00: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
8b10: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e gInit(&upperChan
8b20: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 nelBlocking);.
8b30: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
8b40: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 t(&upperChannelE
8b50: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c OFChar);. Tcl
8b60: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 _DStringInit(&up
8b70: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
8b80: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 ng);. Tcl_Get
8b90: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
8ba0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f terp, chan, "-eo
8bb0: 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 fchar", &upperCh
8bc0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 annelEOFChar);.
8bd0: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
8be0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
8bf0: 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 chan, "-encoding
8c00: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
8c10: 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 Encoding);. T
8c20: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
8c30: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
8c40: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
8c50: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 , &upperChannelT
8c60: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 ranslation);.
8c70: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
8c80: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
8c90: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c an, "-blocking",
8ca0: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c &upperChannelBl
8cb0: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c ocking);. Tcl
8cc0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
8cd0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
8ce0: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 "-translation",
8cf0: 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 "binary");. T
8d00: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
8d10: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
8d20: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 , "-blocking", "
8d30: 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 true");. dpri
8d40: 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 ntf("Consuming T
8d50: 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 cl channel %s",
8d60: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
8d70: 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 me(chan));. s
8d80: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 tatePtr->self =
8d90: 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c Tcl_StackChannel
8da0: 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 (interp, Tls_Cha
8db0: 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 nnelType(), (Cli
8dc0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
8dd0: 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 r, (TCL_READABLE
8de0: 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 | TCL_WRITABLE)
8df0: 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 , chan);. dpr
8e00: 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 63 68 intf("Created ch
8e10: 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c annel named %s",
8e20: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
8e30: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
8e40: 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 lf));. if (st
8e50: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 atePtr->self ==
8e60: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
8e70: 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f LL) {../*.. * No
8e80: 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e use of Tcl_Even
8e90: 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 tuallyFree becau
8ea0: 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 se no possible T
8eb0: 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a cl_Preserve... *
8ec0: 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 /..Tls_Free((cha
8ed0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
8ee0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
8ef0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 R;. }.. Tc
8f00: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
8f10: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 on(interp, state
8f20: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 Ptr->self, "-tra
8f30: 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 nslation", Tcl_D
8f40: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
8f50: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
8f60: 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f tion));. Tcl_
8f70: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
8f80: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
8f90: 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 r->self, "-encod
8fa0: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e ing", Tcl_DStrin
8fb0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
8fc0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a nnelEncoding));.
8fd0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
8fe0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
8ff0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c statePtr->self,
9000: 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c "-eofchar", Tcl
9010: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
9020: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
9030: 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ar));. Tcl_Se
9040: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
9050: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
9060: 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e >self, "-blockin
9070: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 g", Tcl_DStringV
9080: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
9090: 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 elBlocking));..
90a0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c /*. * SSL
90b0: 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a Initialization.
90c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 */. stat
90d0: 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f ePtr->ssl = SSL_
90e0: 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 new(statePtr->ct
90f0: 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 x);. if (!sta
9100: 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f tePtr->ssl) {../
9110: 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 * SSL library er
9120: 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 ror */..Tcl_Appe
9130: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
9140: 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 "couldn't const
9150: 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e ruct ssl session
9160: 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 : ", REASON(), (
9170: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
9180: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
9190: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 ) statePtr);..re
91a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
91b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
91c0: 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 t host server na
91d0: 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 me */. if (se
91e0: 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 69 66 20 rvername) {..if
91f0: 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 (!SSL_set_tlsext
9200: 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 _host_name(state
9210: 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 Ptr->ssl, server
9220: 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 name) && require
9230: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
9240: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
9250: 2c 20 22 73 65 74 74 69 6e 67 20 54 4c 53 20 68 , "setting TLS h
9260: 6f 73 74 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 ost name extensi
9270: 6f 6e 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 on failed", (cha
9280: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 r *) NULL);.
9290: 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72 65 65 Tls_Free
92a0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
92b0: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 tr);.
92c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
92d0: 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 R;. }.
92e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d }.. /* Resum
92f0: 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a e session id */.
9300: 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f if (session_
9310: 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 id && strlen(ses
9320: 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f sion_id) <= SSL_
9330: 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 MAX_SID_CTX_LENG
9340: 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 TH) {../* SSL_se
9350: 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 t_session() */..
9360: 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e if (!SSL_SESSION
9370: 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 _set1_id_context
9380: 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e (SSL_get_session
9390: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c (statePtr->ssl),
93a0: 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e session_id, (un
93b0: 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c signed int) strl
93c0: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 en(session_id)))
93d0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
93e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
93f0: 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e "Resume session
9400: 20 69 64 20 22 2c 20 73 65 73 73 69 6f 6e 5f 69 id ", session_i
9410: 64 2c 20 22 20 66 61 69 6c 65 64 22 2c 20 28 63 d, " failed", (c
9420: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 har *) NULL);.
9430: 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72 Tls_Fr
9440: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
9450: 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 ePtr);.
9460: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
9470: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ROR;..}. }..
9480: 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 if (alpn) {..
9490: 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 63 6c /* Convert a Tcl
94a0: 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f list into a pro
94b0: 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 tocol-list in wi
94c0: 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e re-format */..un
94d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f signed char *pro
94e0: 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e tos, *p;..unsign
94f0: 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 ed int protos_le
9500: 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c n = 0;..int i, l
9510: 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 en, cnt;..Tcl_Ob
9520: 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 j **list;...if (
9530: 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c Tcl_ListObjGetEl
9540: 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 ements(interp, a
9550: 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 lpn, &cnt, &list
9560: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
9570: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
9580: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
9590: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
95a0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 _ERROR;..}.../*
95b0: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 Determine the me
95c0: 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f mory required fo
95d0: 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c r the protocol-l
95e0: 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d ist */..for (i =
95f0: 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 0; i < cnt; i++
9600: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 ) {.. Tcl_Get
9610: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 StringFromObj(li
9620: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 st[i], &len);..
9630: 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 if (len > 255
9640: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 ) {...Tcl_Append
9650: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
9660: 61 6c 70 6e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 alpn protocol na
9670: 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 me too long", (c
9680: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
9690: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
96a0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 ) statePtr);...r
96b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
96c0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f .. }.. pro
96d0: 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c tos_len += 1 + l
96e0: 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c en;..}.../* Buil
96f0: 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 d the complete p
9700: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a rotocol-list */.
9710: 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f .protos = ckallo
9720: 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 c(protos_len);..
9730: 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 /* protocol-list
9740: 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 s consist of 8-b
9750: 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 it length-prefix
9760: 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 ed, byte strings
9770: 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c */..for (i = 0,
9780: 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c p = protos; i <
9790: 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 cnt; i++) {..
97a0: 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 char *str = Tc
97b0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
97c0: 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e bj(list[i], &len
97d0: 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c );.. *p++ = l
97e0: 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 en;.. memcpy(
97f0: 70 2c 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 p, str, len);..
9800: 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a p += len;..}.
9810: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 ../* SSL_set_alp
9820: 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 n_protos makes a
9830: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f copy of the pro
9840: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f tocol-list */../
9850: 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e * Note: This fun
9860: 63 74 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20 ctions reverses
9870: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 the return value
9880: 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 convention */..
9890: 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e if (SSL_set_alpn
98a0: 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 _protos(statePtr
98b0: 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 ->ssl, protos, p
98c0: 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 rotos_len)) {..
98d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
98e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69 ult(interp, "fai
98f0: 6c 65 64 20 74 6f 20 73 65 74 20 61 6c 70 6e 20 led to set alpn
9900: 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 protocols", (cha
9910: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
9920: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 Tls_Free((char
9930: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
9940: 20 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 ckfree(protos
9950: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
9960: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
9970: 2a 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c * Store protocol
9980: 73 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 s list */..state
9990: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 Ptr->protos = pr
99a0: 6f 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d otos;..statePtr-
99b0: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 >protos_len = pr
99c0: 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 otos_len;. }
99d0: 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 else {..statePtr
99e0: 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b ->protos = NULL;
99f0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
9a00: 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 os_len = 0;.
9a10: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
9a20: 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 SSL Callbacks.
9a30: 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 */. SSL_s
9a40: 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 et_app_data(stat
9a50: 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 ePtr->ssl, (void
9a60: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a *)statePtr);./*
9a70: 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 point back to u
9a80: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 s */. SSL_set
9a90: 5f 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 _verify(statePtr
9aa0: 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 ->ssl, verify, V
9ab0: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a erifyCallback);.
9ac0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
9ad0: 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 info_callback(st
9ae0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 49 6e 66 atePtr->ctx, Inf
9af0: 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 oCallback);.
9b00: 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 SSL_CTX_sess_set
9b10: 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 _new_cb(statePtr
9b20: 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 ->ctx, SessionCa
9b30: 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a llback);.. /*
9b40: 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e Create Tcl_Chan
9b50: 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 nel BIO Handler
9b60: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d */. statePtr-
9b70: 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 >p_bio.= BIO_new
9b80: 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 _tcl(statePtr, B
9b90: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 IO_NOCLOSE);.
9ba0: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d statePtr->bio.=
9bb0: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 BIO_new(BIO_f_s
9bc0: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 sl());.. if (
9bd0: 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 server) {../* Se
9be0: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a rver callbacks *
9bf0: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 /..SSL_CTX_set_a
9c00: 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 lpn_select_cb(st
9c10: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 atePtr->ctx, ALP
9c20: 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 NCallback, (void
9c30: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53 *)statePtr);..S
9c40: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 SL_CTX_set_tlsex
9c50: 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 t_servername_arg
9c60: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
9c70: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
9c80: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f );..SSL_CTX_set_
9c90: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d tlsext_servernam
9ca0: 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 e_callback(state
9cb0: 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c Ptr->ctx, SNICal
9cc0: 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 lback);..SSL_CTX
9cd0: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c _set_client_hell
9ce0: 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 o_cb(statePtr->c
9cf0: 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 tx, HelloCallbac
9d00: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 k, (void *)state
9d10: 50 74 72 29 3b 0a 0a 09 73 74 61 74 65 50 74 72 Ptr);...statePtr
9d20: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 ->flags |= TLS_T
9d30: 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f CL_SERVER;..SSL_
9d40: 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 set_accept_state
9d50: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
9d60: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 53 . } else {..S
9d70: 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 SL_set_connect_s
9d80: 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 tate(statePtr->s
9d90: 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 sl);. }. S
9da0: 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 SL_set_bio(state
9db0: 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 Ptr->ssl, stateP
9dc0: 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 tr->p_bio, state
9dd0: 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 Ptr->p_bio);.
9de0: 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 BIO_set_ssl(sta
9df0: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 tePtr->bio, stat
9e00: 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e ePtr->ssl, BIO_N
9e10: 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a OCLOSE);.. /*
9e20: 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 . * End of S
9e30: 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a SL Init. */.
9e40: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 dprintf("Ret
9e50: 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f urning %s", Tcl_
9e60: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
9e70: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b tatePtr->self));
9e80: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 . Tcl_SetResu
9e90: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 lt(interp, (char
9ea0: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e *) Tcl_GetChann
9eb0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
9ec0: 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 >self), TCL_VOLA
9ed0: 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 TILE);.. retu
9ee0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
9ef0: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
9f00: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
9f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f50: 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 -. *. * Unimport
9f60: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ObjCmd --. *. *.
9f70: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
9f80: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d s invoked to rem
9f90: 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 ove the topmost
9fa0: 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a channel filter..
9fb0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
9fc0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
9fd0: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
9fe0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
9ff0: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 May modify the b
a000: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f ehavior of an IO
a010: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d channel.. *. *-
a020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a060: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
a070: 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 t.UnimportObjCmd
a080: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
a090: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
a0a0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
a0b0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
a0c0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
a0d0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
a0e0: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 han;../* The cha
a0f0: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f nnel to set a mo
a100: 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 de on. */.. d
a110: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
a120: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
a130: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
a140: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
a150: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
a160: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 nel");..return T
a170: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
a180: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
a190: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
a1a0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
a1b0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 (objv[1]), NULL)
a1c0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
a1d0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
a1e0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
a1f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
a200: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
a210: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
a220: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
a230: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
a240: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
a250: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 nnel(chan);..
a260: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e if (Tcl_GetChan
a270: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d nelType(chan) !=
a280: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
a290: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e ()) {..Tcl_Appen
a2a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
a2b0: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 "bad channel \""
a2c0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
a2d0: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c Name(chan),..."\
a2e0: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
a2f0: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 nnel", NULL);..r
a300: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
a310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
a320: 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e Tcl_UnstackChann
a330: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 el(interp, chan)
a340: 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b == TCL_ERROR) {
a350: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
a360: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 OR;. }.. r
a370: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
a380: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
a390: 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ntData;.}.../*.
a3a0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
a3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a3e0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 ----. *. * CTX_I
a3f0: 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 nit -- construct
a400: 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 a SSL_CTX insta
a410: 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 nce. *. * Result
a420: 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 s:. *.A valid SS
a430: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f L_CTX instance o
a440: 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 r NULL.. *. * Si
a450: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 de effects:. *.c
a460: 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f onstructs SSL co
a470: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 ntext (CTX). *.
a480: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
a490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a4c0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
a4d0: 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e SSL_CTX *.CTX_In
a4e0: 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 it(State *stateP
a4f0: 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 tr, int isServer
a500: 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 , int proto, cha
a510: 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 r *keyfile, char
a520: 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 *certfile,.
a530: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b unsigned char *k
a540: 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ey, unsigned cha
a550: 72 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 r *cert, int key
a560: 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c _len, int cert_l
a570: 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c en, char *CAdir,
a580: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c . char *CAfil
a590: 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 e, char *ciphers
a5a0: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 , char *ciphersu
a5b0: 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c ites, int level,
a5c0: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 char *DHparams)
a5d0: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 {. Tcl_Inter
a5e0: 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 p *interp = stat
a5f0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
a600: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d SSL_CTX *ctx =
a610: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 NULL;. Tcl_D
a620: 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 String ds;. T
a630: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a cl_DString ds1;.
a640: 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b int off = 0;
a650: 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 . int load_pr
a660: 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 ivate_key;. c
a670: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 onst SSL_METHOD
a680: 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 *method;.. dp
a690: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
a6a0: 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f .. if (!proto
a6b0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
a6c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e esult(interp, "n
a6d0: 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c o valid protocol
a6e0: 20 73 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c selected", NULL
a6f0: 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f );..return (SSL_
a700: 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a CTX *)0;. }..
a710: 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 /* create SS
a720: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 L context */.#if
a730: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
a740: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 _NUMBER >= 0x101
a750: 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 00000L || define
a760: 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 d(NO_SSL2) || de
a770: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
a780: 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 _SSL2). if (E
a790: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
a7a0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b S_PROTO_SSL2)) {
a7b0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
a7c0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 lt(interp, "SSL2
a7d0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
a7e0: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
a7f0: 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 ..return (SSL_CT
a800: 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e X *)0;. }.#en
a810: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
a820: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 NO_SSL3) || defi
a830: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
a840: 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 SL3). if (ENA
a850: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
a860: 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 PROTO_SSL3)) {..
a870: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
a880: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 (interp, "SSL3 p
a890: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
a8a0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
a8b0: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
a8c0: 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 *)0;. }.#endi
a8d0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
a8e0: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 _TLS1) || define
a8f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
a900: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 1). if (ENABL
a910: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
a920: 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 OTO_TLS1)) {..Tc
a930: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
a940: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 nterp, "TLS 1.0
a950: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
a960: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
a970: 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 .return (SSL_CTX
a980: 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 *)0;. }.#end
a990: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
a9a0: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 O_TLS1_1) || def
a9b0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
a9c0: 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 TLS1_1). if (
a9d0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
a9e0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 LS_PROTO_TLS1_1)
a9f0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
aa00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 esult(interp, "T
aa10: 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 LS 1.1 protocol
aa20: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
aa30: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 NULL);..return (
aa40: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 SSL_CTX *)0;.
aa50: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
aa60: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
aa70: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
aa80: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 SSL_NO_TLS1_2).
aa90: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
aaa0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
aab0: 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f TLS1_2)) {..Tcl_
aac0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
aad0: 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 erp, "TLS 1.2 pr
aae0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
aaf0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 rted", NULL);..r
ab00: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
ab10: 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 )0;. }.#endif
ab20: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
ab30: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e TLS1_3) || defin
ab40: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
ab50: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e S1_3). if (EN
ab60: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
ab70: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 _PROTO_TLS1_3))
ab80: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
ab90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ult(interp, "TLS
aba0: 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 1.3 protocol no
abb0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
abc0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 LL);..return (SS
abd0: 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d L_CTX *)0;. }
abe0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 77 69 .#endif.. swi
abf0: 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 tch (proto) {.#i
ac00: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
ac10: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
ac20: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 00000L && !defin
ac30: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 ed(NO_SSL2) && !
ac40: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
ac50: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 NO_SSL2). cas
ac60: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 e TLS_PROTO_SSL2
ac70: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 :..method = SSLv
ac80: 32 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 2_method();..bre
ac90: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
aca0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
acb0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
acc0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 NSSL_NO_SSL3) &&
acd0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
ace0: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 L_NO_SSL3_METHOD
acf0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
ad00: 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 ROTO_SSL3:..meth
ad10: 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f od = SSLv3_metho
ad20: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
ad30: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
ad40: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 (NO_TLS1) && !de
ad50: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
ad60: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e _TLS1) && !defin
ad70: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
ad80: 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 S1_METHOD). c
ad90: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
ada0: 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c S1:..method = TL
adb0: 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 Sv1_method();..b
adc0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
add0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
ade0: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_1) && !defined
adf0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
ae00: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _1) && !defined(
ae10: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
ae20: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 1_METHOD). ca
ae30: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 se TLS_PROTO_TLS
ae40: 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 1_1:..method = T
ae50: 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b LSv1_1_method();
ae60: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
ae70: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
ae80: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
ae90: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
aea0: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
aeb0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
aec0: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_2_METHOD).
aed0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
aee0: 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 TLS1_2:..method
aef0: 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 = TLSv1_2_method
af00: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
af10: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
af20: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 NO_TLS1_3) && !d
af30: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
af40: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 O_TLS1_3). ca
af50: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 se TLS_PROTO_TLS
af60: 31 5f 33 3a 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 1_3:../*.. * The
af70: 20 76 65 72 73 69 6f 6e 20 72 61 6e 67 65 20 69 version range i
af80: 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 65 s constrained be
af90: 6c 6f 77 2c 0a 09 20 2a 20 61 66 74 65 72 20 74 low,.. * after t
afa0: 68 65 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72 he context is cr
afb0: 65 61 74 65 64 2e 20 20 55 73 65 20 74 68 65 0a eated. Use the.
afc0: 09 20 2a 20 67 65 6e 65 72 69 63 20 6d 65 74 68 . * generic meth
afd0: 6f 64 20 68 65 72 65 2e 0a 09 20 2a 2f 0a 09 6d od here... */..m
afe0: 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 ethod = TLS_meth
aff0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
b000: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 ndif. default
b010: 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 :../* Negotiate
b020: 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c highest availabl
b030: 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f e SSL/TLS versio
b040: 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 54 n */..method = T
b050: 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 LS_method();.#if
b060: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
b070: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
b080: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 0000L && !define
b090: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 d(NO_SSL2) && !d
b0a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
b0b0: 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 O_SSL2)..off |=
b0c0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
b0d0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 TLS_PROTO_SSL2)
b0e0: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ? 0 : SSL_OP_N
b0f0: 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 O_SSLv2);.#endif
b100: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
b110: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
b120: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
b130: 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 L3)..off |= (ENA
b140: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
b150: 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 PROTO_SSL3) ?
b160: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 0 : SSL_OP_NO_SS
b170: 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 Lv3);.#endif.#if
b180: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
b190: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
b1a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a PENSSL_NO_TLS1).
b1b0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
b1c0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
b1d0: 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 O_TLS1) ? 0 :
b1e0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 SSL_OP_NO_TLSv1)
b1f0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
b200: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
b210: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
b220: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a NSSL_NO_TLS1_1).
b230: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
b240: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
b250: 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 O_TLS1_1) ? 0 :
b260: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f SSL_OP_NO_TLSv1_
b270: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 1);.#endif.#if !
b280: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
b290: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
b2a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
b2b0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
b2c0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
b2d0: 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 OTO_TLS1_2) ? 0
b2e0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
b2f0: 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 1_2);.#endif.#if
b300: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
b310: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
b320: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
b330: 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 _3)..off |= (ENA
b340: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
b350: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 PROTO_TLS1_3) ?
b360: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 0 : SSL_OP_NO_TL
b370: 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 Sv1_3);.#endif..
b380: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 break;. }..
b390: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f ctx = SSL_CTX_
b3a0: 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 0a 20 20 new(method);..
b3b0: 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 if (!ctx) {..r
b3c0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 eturn(NULL);.
b3d0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 }.. if (gete
b3e0: 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 nv(SSLKEYLOGFILE
b3f0: 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 )) {..SSL_CTX_se
b400: 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 t_keylog_callbac
b410: 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c k(ctx, KeyLogCal
b420: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 lback);. }..#
b430: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
b440: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
b450: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
b460: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 S1_3). if (pr
b470: 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f oto == TLS_PROTO
b480: 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f _TLS1_3) {..SSL_
b490: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 CTX_set_min_prot
b4a0: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 o_version(ctx, T
b4b0: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a LS1_3_VERSION);.
b4c0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 .SSL_CTX_set_max
b4d0: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
b4e0: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 tx, TLS1_3_VERSI
b4f0: 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ON);. }.#endi
b500: 66 0a 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 f.. if (!isSe
b510: 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 rver) {..SSL_CTX
b520: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 _set_options(ctx
b530: 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f , SSL_OP_CIPHER_
b540: 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 SERVER_PREFERENC
b550: 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53 E);. }.. S
b560: 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 SL_CTX_set_app_d
b570: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 ata(ctx, (void*)
b580: 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 interp);./* reme
b590: 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 72 mber the interpr
b5a0: 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f eter */. SSL_
b5b0: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 CTX_set_options(
b5c0: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 ctx, SSL_OP_ALL)
b5d0: 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 ;./* all SSL bug
b5e0: 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a workarounds */.
b5f0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
b600: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 options(ctx, off
b610: 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 );../* disable p
b620: 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 rotocol versions
b630: 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f */.#if OPENSSL_
b640: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
b650: 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20 0x10101000L.
b660: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 SSL_CTX_set_mod
b670: 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f e(ctx, SSL_MODE_
b680: 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20 AUTO_RETRY);./*
b690: 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64 73 handle new hands
b6a0: 68 61 6b 65 73 20 69 6e 20 62 61 63 6b 67 72 6f hakes in backgro
b6b0: 75 6e 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 und */.#endif.
b6c0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 SSL_CTX_sess_s
b6d0: 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 et_cache_size(ct
b6e0: 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a x, 128);.. /*
b6f0: 20 53 65 74 20 75 73 65 72 20 64 65 66 69 6e 65 Set user define
b700: 64 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 d ciphers, ciphe
b710: 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65 r suites, and se
b720: 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a curity level */.
b730: 20 20 20 20 69 66 20 28 28 28 63 69 70 68 65 72 if (((cipher
b740: 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 s != NULL) && !S
b750: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 SL_CTX_set_ciphe
b760: 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70 68 r_list(ctx, ciph
b770: 65 72 73 29 29 20 7c 7c 20 5c 0a 09 28 28 63 69 ers)) || \..((ci
b780: 70 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 phersuites != NU
b790: 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f LL) && !SSL_CTX_
b7a0: 73 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 set_ciphersuites
b7b0: 28 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 (ctx, ciphersuit
b7c0: 65 73 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c es))) {.. Tcl
b7d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
b7e0: 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 terp, "Set ciphe
b7f0: 72 73 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 rs failed", (cha
b800: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
b810: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
b820: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
b830: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 (SSL_CTX *)0;.
b840: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 }.. /* Set
b850: 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a security level *
b860: 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 /. if (level
b870: 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 > -1 && level <
b880: 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 6) {../* SSL_set
b890: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 _security_level
b8a0: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f */..SSL_CTX_set_
b8b0: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 security_level(c
b8c0: 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 tx, level);.
b8d0: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f }.. /* set so
b8e0: 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a me callbacks */.
b8f0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
b900: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 default_passwd_c
b910: 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 b(ctx, PasswordC
b920: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 allback);. SS
b930: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c L_CTX_set_defaul
b940: 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 t_passwd_cb_user
b950: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 data(ctx, (void
b960: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 *)statePtr);..
b970: 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 /* read a Diff
b980: 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d ie-Hellman param
b990: 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 eters file, or u
b9a0: 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 se the built-in
b9b0: 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 one */.#ifdef OP
b9c0: 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 ENSSL_NO_DH.
b9d0: 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 if (DHparams !=
b9e0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
b9f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
ba00: 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 , "DH parameter
ba10: 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 support not avai
ba20: 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 lable", (char *)
ba30: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
ba40: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
ba50: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
ba60: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 ;. }.#else.
ba70: 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 {..DH* dh;..if
ba80: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 (DHparams != NU
ba90: 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a LL) {.. BIO *
baa0: 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 bio;.. Tcl_DS
bab0: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a tringInit(&ds);.
bac0: 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e . bio = BIO_n
bad0: 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 ew_file(F2N(DHpa
bae0: 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 rams, &ds), "r")
baf0: 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 ;.. if (!bio)
bb00: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 {...Tcl_DString
bb10: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c Free(&ds);...Tcl
bb20: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
bb30: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 terp, "Could not
bb40: 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 find DH paramet
bb50: 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 ers file", (char
bb60: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c *) NULL);...SSL
bb70: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
bb80: 09 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 ..return (SSL_CT
bb90: 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 0a 09 X *)0;.. }...
bba0: 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 dh = PEM_rea
bbb0: 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 d_bio_DHparams(b
bbc0: 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 io, NULL, NULL,
bbd0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f NULL);.. BIO_
bbe0: 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 free(bio);..
bbf0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
bc00: 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 &ds);.. if (!
bc10: 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 dh) {...Tcl_Appe
bc20: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
bc30: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 "Could not read
bc40: 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 DH parameters f
bc50: 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 rom file", (char
bc60: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c *) NULL);...SSL
bc70: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
bc80: 09 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 ..return (SSL_CT
bc90: 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 09 7d X *)0;.. }..}
bca0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 68 20 else {.. dh
bcb0: 3d 20 67 65 74 5f 64 68 50 61 72 61 6d 73 28 29 = get_dhParams()
bcc0: 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65 ;..}..SSL_CTX_se
bcd0: 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 t_tmp_dh(ctx, dh
bce0: 29 3b 0a 09 44 48 5f 66 72 65 65 28 64 68 29 3b );..DH_free(dh);
bcf0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 . }.#endif..
bd00: 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 /* set our ce
bd10: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 rtificate */.
bd20: 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 load_private_ke
bd30: 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 y = 0;. if (c
bd40: 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 ertfile != NULL)
bd50: 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 {..load_private
bd60: 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f _key = 1;...Tcl_
bd70: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 DStringInit(&ds)
bd80: 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f ;...if (SSL_CTX_
bd90: 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f use_certificate_
bda0: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 file(ctx, F2N(ce
bdb0: 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 rtfile, &ds), SS
bdc0: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 L_FILETYPE_PEM)
bdd0: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c <= 0) {.. Tcl
bde0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
bdf0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 );.. Tcl_Appe
be00: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
be10: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
be20: 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 certificate file
be30: 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a ", certfile, ":
be40: 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 ",.... REAS
be50: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
be60: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
be70: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
be80: 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 return (SSL_C
be90: 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 7d TX *)0;..}. }
bea0: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 else if (cert !
beb0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f = NULL) {..load_
bec0: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b private_key = 1;
bed0: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 ..if (SSL_CTX_us
bee0: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 e_certificate_AS
bef0: 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e N1(ctx, cert_len
bf00: 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a , cert) <= 0) {.
bf10: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
bf20: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 Free(&ds);..
bf30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
bf40: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
bf50: 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 to set certific
bf60: 61 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 ate: ",....
bf70: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
bf80: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
bf90: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
bfa0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 53 ;.. return (S
bfb0: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 SL_CTX *)0;..}.
bfc0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 } else {..cer
bfd0: 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 tfile = (char*)X
bfe0: 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 509_get_default_
bff0: 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 cert_file();...i
c000: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 f (SSL_CTX_use_c
c010: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 ertificate_file(
c020: 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 ctx, certfile, S
c030: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 SL_FILETYPE_PEM)
c040: 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 <= 0) {.#if 0..
c050: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
c060: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 ree(&ds);.. T
c070: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
c080: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
c090: 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 to use default c
c0a0: 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 ertificate file
c0b0: 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 ", certfile, ":
c0c0: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f ",.... REASO
c0d0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
c0e0: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
c0f0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
c100: 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 return (SSL_CT
c110: 58 20 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 09 7d X *)0;.#endif..}
c120: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 . }.. /* s
c130: 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b et our private k
c140: 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f ey */. if (lo
c150: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 ad_private_key)
c160: 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d {..if (keyfile =
c170: 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d = NULL && key ==
c180: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 NULL) {.. ke
c190: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 yfile = certfile
c1a0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 ;..}...if (keyfi
c1b0: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 le != NULL) {..
c1c0: 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 /* get the pr
c1d0: 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 ivate key associ
c1e0: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 ated with this c
c1f0: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 ertificate */..
c200: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d if (keyfile =
c210: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 = NULL) {...keyf
c220: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a ile = certfile;.
c230: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 . }... if
c240: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 (SSL_CTX_use_Pri
c250: 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 vateKey_file(ctx
c260: 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 , F2N(keyfile, &
c270: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ds), SSL_FILETYP
c280: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 E_PEM) <= 0) {..
c290: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
c2a0: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 (&ds);.../* flus
c2b0: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 h the passphrase
c2c0: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 which might be
c2d0: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 left in the resu
c2e0: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 lt */...Tcl_SetR
c2f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 esult(interp, NU
c300: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b LL, TCL_STATIC);
c310: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
c320: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
c330: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 ble to set publi
c340: 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 c key file ", ke
c350: 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 yfile, " ",....
c360: 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 REASON()
c370: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
c380: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
c390: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
c3a0: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 20 (SSL_CTX *)0;..
c3b0: 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 }.. Tcl_DS
c3c0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
c3d0: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 ..} else if (key
c3e0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
c3f0: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 if (SSL_CTX_use
c400: 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 _PrivateKey_ASN1
c410: 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 (EVP_PKEY_RSA, c
c420: 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 tx, key,key_len)
c430: 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 <= 0) {...Tcl_D
c440: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
c450: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 .../* flush the
c460: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 passphrase which
c470: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 might be left i
c480: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a n the result */.
c490: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 ..Tcl_SetResult(
c4a0: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 interp, NULL, TC
c4b0: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c L_STATIC);...Tcl
c4c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
c4d0: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
c4e0: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a set public key:
c4f0: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 ", REASON(), (c
c500: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
c510: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
c520: 29 3b 0a 09 09 72 65 74 75 72 6e 20 28 53 53 4c );...return (SSL
c530: 5f 43 54 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d _CTX *)0;.. }
c540: 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b ..}../* Now we k
c550: 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 now that a key a
c560: 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65 nd cert have bee
c570: 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 n set against..
c580: 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 * the SSL contex
c590: 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 t */..if (!SSL_C
c5a0: 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 TX_check_private
c5b0: 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 _key(ctx)) {..
c5c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
c5d0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 lt(interp, "priv
c5e0: 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 ate key does not
c5f0: 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 match the certi
c600: 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 ficate public ke
c610: 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 y",.... (cha
c620: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
c630: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
c640: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
c650: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d (SSL_CTX *)0;..}
c660: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
c670: 65 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 et verification
c680: 43 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 CAs */. Tcl_D
c690: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b StringInit(&ds);
c6a0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
c6b0: 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20 20 Init(&ds1);.
c6c0: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 if (!SSL_CTX_loa
c6d0: 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f d_verify_locatio
c6e0: 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 ns(ctx, F2N(CAfi
c6f0: 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 le, &ds), F2N(CA
c700: 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 dir, &ds1)) ||..
c710: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 !SSL_CTX_set_def
c720: 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 ault_verify_path
c730: 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a s(ctx)) {.#if 0.
c740: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
c750: 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 (&ds);..Tcl_DStr
c760: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 ingFree(&ds1);..
c770: 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 /* Don't current
c780: 6c 79 20 63 61 72 65 20 69 66 20 74 68 69 73 20 ly care if this
c790: 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 fails */..Tcl_Ap
c7a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
c7b0: 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20 p, "SSL default
c7c0: 76 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c verify paths: ",
c7d0: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
c7e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f *) NULL);..SSL_
c7f0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
c800: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
c810: 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 *)0;.#endif.
c820: 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a }.. /* https:
c830: 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 //sourceforge.ne
c840: 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f t/p/tls/bugs/57/
c850: 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 */. /* XXX:T
c860: 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 ODO: Let the use
c870: 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 r supply values
c880: 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 here instead of
c890: 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 something that e
c8a0: 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c xists on the fil
c8b0: 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 esystem */. i
c8c0: 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c f (CAfile != NUL
c8d0: 4c 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 L) {..STACK_OF(X
c8e0: 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 509_NAME) *certN
c8f0: 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f ames = SSL_load_
c900: 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 client_CA_file(F
c910: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 2N(CAfile, &ds))
c920: 3b 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 ;..if (certNames
c930: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
c940: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 SSL_CTX_set_cli
c950: 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c ent_CA_list(ctx,
c960: 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a certNames);..}.
c970: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 }.. Tcl_D
c980: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
c990: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
c9a0: 46 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 Free(&ds1);.
c9b0: 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a return ctx;.}...
c9c0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
c9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 --------. *. * S
ca10: 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 tatusObjCmd -- r
ca20: 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 eturn certificat
ca30: 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 e for connected
ca40: 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 peer.. *. * Resu
ca50: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
ca60: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
ca70: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
ca80: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
ca90: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
caa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cad0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
cae0: 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 int.StatusObjCmd
caf0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
cb00: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
cb10: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
cb20: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
cb30: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
cb40: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
cb50: 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 tr;. X509 *pe
cb60: 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 er;. Tcl_Obj
cb70: 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c *objPtr;. Tcl
cb80: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 _Channel chan;.
cb90: 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c char *channel
cba0: 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a Name, *ciphers;.
cbb0: 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 int mode;.
cbc0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
cbd0: 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 char *proto;.
cbe0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c unsigned int l
cbf0: 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 en;.. dprintf
cc00: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
cc10: 20 73 77 69 74 63 68 20 28 6f 62 6a 63 29 20 7b switch (objc) {
cc20: 0a 09 63 61 73 65 20 32 3a 0a 09 20 20 20 20 63 ..case 2:.. c
cc30: 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c hannelName = Tcl
cc40: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
cc50: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 j(objv[1], NULL)
cc60: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 ;.. break;...
cc70: 63 61 73 65 20 33 3a 0a 09 20 20 20 20 69 66 20 case 3:.. if
cc80: 28 21 73 74 72 63 6d 70 20 28 54 63 6c 5f 47 65 (!strcmp (Tcl_Ge
cc90: 74 53 74 72 69 6e 67 20 28 6f 62 6a 76 5b 31 5d tString (objv[1]
cca0: 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a ), "-local")) {.
ccb0: 09 09 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 ..channelName =
ccc0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
ccd0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 mObj(objv[2], NU
cce0: 4c 4c 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 LL);...break;..
ccf0: 20 20 20 7d 0a 09 20 20 20 20 2f 2a 20 65 6c 73 }.. /* els
cd00: 65 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2e e fall-through .
cd10: 2e 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 .. */.#if define
cd20: 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 20 20 20 d(__GNUC__)..
cd30: 20 5f 5f 61 74 74 72 69 62 75 74 65 5f 5f 28 28 __attribute__((
cd40: 66 61 6c 6c 74 68 72 6f 75 67 68 29 29 3b 0a 23 fallthrough));.#
cd50: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a endif..default:.
cd60: 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 . Tcl_WrongNu
cd70: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
cd80: 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f objv, "?-local?
cd90: 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 20 20 20 channel");..
cda0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
cdb0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 R;. }.. ch
cdc0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
cdd0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e nel(interp, chan
cde0: 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b nelName, &mode);
cdf0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
ce00: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
ce10: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
ce20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
ce30: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
ce40: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
ce50: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
ce60: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
ce70: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
ce80: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 el(chan);. if
ce90: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
cea0: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
ceb0: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
cec0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
ced0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
cee0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
cef0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
cf00: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 e(chan),..."\":
cf10: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
cf20: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 l", NULL);..retu
cf30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
cf40: 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 }. statePtr
cf50: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c = (State *) Tcl
cf60: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
cf70: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 nceData(chan);.
cf80: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 if (objc == 2
cf90: 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f ) {..peer = SSL_
cfa0: 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 get_peer_certifi
cfb0: 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 cate(statePtr->s
cfc0: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 sl);. } else
cfd0: 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 {..peer = SSL_ge
cfe0: 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 t_certificate(st
cff0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
d000: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 65 65 72 }. if (peer
d010: 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c ) {..objPtr = Tl
d020: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 s_NewX509Obj(int
d030: 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 erp, peer);..if
d040: 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 20 58 35 (objc == 2) { X5
d050: 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 20 7d 09_free(peer); }
d060: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f . } else {..o
d070: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c bjPtr = Tcl_NewL
d080: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
d090: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f . }.. Tcl_
d0a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
d0b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
d0c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
d0d0: 6e 67 4f 62 6a 28 22 73 62 69 74 73 22 2c 20 2d ngObj("sbits", -
d0e0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
d0f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
d100: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
d110: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
d120: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 SSL_get_cipher_b
d130: 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 its(statePtr->ss
d140: 6c 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 20 l, NULL)));..
d150: 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 ciphers = (char
d160: 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 *)SSL_get_cipher
d170: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
d180: 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72 . if ((cipher
d190: 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 28 73 s != NULL) && (s
d1a0: 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c 20 22 trcmp(ciphers, "
d1b0: 28 4e 4f 4e 45 29 22 29 20 21 3d 20 30 29 29 20 (NONE)") != 0))
d1c0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
d1d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
d1e0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
d1f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 NewStringObj("ci
d200: 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 pher", -1));..Tc
d210: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
d220: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
d230: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
d240: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f ringObj(SSL_get_
d250: 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d cipher(statePtr-
d260: 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 >ssl), -1));.
d270: 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 }.. /* Verif
d280: 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 y the X509 certi
d290: 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 ficate presented
d2a0: 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a by the peer */.
d2b0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
d2c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
d2d0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
d2e0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 _NewStringObj("v
d2f0: 61 6c 69 64 61 74 69 6f 6e 22 2c 20 2d 31 29 29 alidation", -1))
d300: 3b 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 67 65 ;. if (SSL_ge
d310: 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 t_verify_result(
d320: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 21 statePtr->ssl) !
d330: 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 = X509_V_OK) {..
d340: 2f 2a 20 70 72 6f 74 6f 20 3d 20 22 66 61 69 6c /* proto = "fail
d350: 65 64 22 3b 20 2a 2f 0a 09 70 72 6f 74 6f 20 3d ed"; */..proto =
d360: 20 52 45 41 53 4f 4e 28 29 3b 0a 20 20 20 20 7d REASON();. }
d370: 20 65 6c 73 65 20 7b 0a 09 70 72 6f 74 6f 20 3d else {..proto =
d380: 20 22 6f 6b 22 3b 0a 20 20 20 20 7d 0a 20 20 20 "ok";. }.
d390: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
d3a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
d3b0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
d3c0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
d3d0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 , -1));.. /*
d3e0: 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 Report the selec
d3f0: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 ted protocol as
d400: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 a result of the
d410: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 negotiation */.
d420: 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e SSL_get0_alpn
d430: 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 _selected(stateP
d440: 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c tr->ssl, &proto,
d450: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f &len);. Tcl_
d460: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
d470: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
d480: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
d490: 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 ngObj("alpn", -1
d4a0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
d4b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
d4c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
d4d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
d4e0: 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c j((char *)proto,
d4f0: 20 28 69 6e 74 29 6c 65 6e 29 29 3b 0a 20 20 20 (int)len));.
d500: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
d510: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
d520: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
d530: 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 73 wStringObj("vers
d540: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ion", -1));.
d550: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
d560: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
d570: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
d580: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 StringObj(SSL_ge
d590: 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 t_version(stateP
d5a0: 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a tr->ssl), -1));.
d5b0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
d5c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
d5d0: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 jPtr);. retur
d5e0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e n TCL_OK;..clien
d5f0: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 tData = clientDa
d600: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ta;.}.../*. *---
d610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d650: 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f . *. * Connectio
d660: 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 nInfoObjCmd -- r
d670: 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e eturn connection
d680: 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 info from OpenS
d690: 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 SL.. *. * Result
d6a0: 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 s:. *.A list of
d6b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a connection info.
d6c0: 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *----------
d6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
d710: 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 tatic int Connec
d720: 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 tionInfoObjCmd(C
d730: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
d740: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
d750: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
d760: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
d770: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
d780: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
d790: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e n;../* The chann
d7a0: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 el to set a mode
d7b0: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 on. */. Stat
d7c0: 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a e *statePtr;../*
d7d0: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f client state fo
d7e0: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a r ssl socket */.
d7f0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
d800: 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 Ptr;. const S
d810: 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e SL *ssl;. con
d820: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 st SSL_CIPHER *c
d830: 69 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 ipher;. const
d840: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 SSL_SESSION *se
d850: 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 ssion;. const
d860: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
d870: 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 proto;. unsig
d880: 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 ned int len;.
d890: 20 6c 6f 6e 67 20 6d 6f 64 65 3b 0a 0a 20 20 20 long mode;..
d8a0: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 if (objc != 2)
d8b0: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
d8c0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
d8d0: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b bjv, "channel");
d8e0: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
d8f0: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
d900: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
d910: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 annel(interp, Tc
d920: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
d930: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c bj(objv[1], NULL
d940: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 ), NULL);. if
d950: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
d960: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
d970: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f .return(TCL_ERRO
d980: 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f R);. }.. /
d990: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
d9a0: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
d9b0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
d9c0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
d9d0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
d9e0: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c an);. if (Tcl
d9f0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
da00: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
da10: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 nnelType()) {..T
da20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
da30: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
da40: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
da50: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
da60: 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 n), "\": not a T
da70: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
da80: 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f L);..return(TCL_
da90: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 ERROR);. }..
daa0: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
dab0: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
dac0: 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e LL);.. /* Con
dad0: 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a nection info */.
dae0: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
daf0: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 State *)Tcl_GetC
db00: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
db10: 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 ta(chan);. ss
db20: 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 l = statePtr->ss
db30: 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 l;. if (ssl !
db40: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 = NULL) {..const
db50: 20 63 68 61 72 20 2a 73 74 61 74 65 3b 0a 0a 09 char *state;...
db60: 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 /* connection st
db70: 61 74 65 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f ate */..if (SSL_
db80: 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 is_init_finished
db90: 28 73 73 6c 29 29 20 7b 0a 09 20 20 20 20 73 74 (ssl)) {.. st
dba0: 61 74 65 20 3d 20 22 65 73 74 61 62 6c 69 73 68 ate = "establish
dbb0: 65 64 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 ed";..} else if
dbc0: 28 53 53 4c 5f 69 6e 5f 69 6e 69 74 28 73 73 6c (SSL_in_init(ssl
dbd0: 29 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 20 )) {.. state
dbe0: 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 = "handshake";..
dbf0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 73 74 } else {.. st
dc00: 61 74 65 20 3d 20 22 69 6e 69 74 69 61 6c 69 7a ate = "initializ
dc10: 69 6e 67 22 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 ing";..}..Tcl_Li
dc20: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
dc30: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
dc40: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
dc50: 4f 62 6a 28 22 73 74 61 74 65 22 2c 20 2d 31 29 Obj("state", -1)
dc60: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
dc70: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
dc80: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
dc90: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 74 _NewStringObj(st
dca0: 61 74 65 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 ate, -1));.../*
dcb0: 47 65 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 Get server name
dcc0: 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 */..Tcl_ListObjA
dcd0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
dce0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
dcf0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 _NewStringObj("s
dd00: 65 72 76 65 72 6e 61 6d 65 22 2c 20 2d 31 29 29 ervername", -1))
dd10: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
dd20: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
dd30: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
dd40: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c NewStringObj(SSL
dd50: 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 _get_servername(
dd60: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 ssl, TLSEXT_NAME
dd70: 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c TYPE_host_name),
dd80: 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 -1));.../* Get
dd90: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 54 63 6c protocol */..Tcl
dda0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
ddb0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
ddc0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
ddd0: 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f 63 6f 6c ingObj("protocol
dde0: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
ddf0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
de00: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
de10: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
de20: 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 Obj(SSL_get_vers
de30: 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a ion(ssl), -1));.
de40: 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 ../* Renegotiati
de50: 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 54 on allowed */..T
de60: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
de70: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
de80: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
de90: 74 72 69 6e 67 4f 62 6a 28 22 72 65 6e 65 67 6f tringObj("renego
dea0: 74 69 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a tiation", -1));.
deb0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
dec0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
ded0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
dee0: 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 20 20 20 wStringObj(..
def0: 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f SSL_get_secure_
df00: 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 renegotiation_su
df10: 70 70 6f 72 74 28 73 73 6c 29 20 3f 20 22 61 6c pport(ssl) ? "al
df20: 6c 6f 77 65 64 22 20 3a 20 22 6e 6f 74 20 73 75 lowed" : "not su
df30: 70 70 6f 72 74 65 64 22 2c 20 2d 31 29 29 3b 0a pported", -1));.
df40: 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 ../* Report the
df50: 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f selected protoco
df60: 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 l as a result of
df70: 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 the ALPN negoti
df80: 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 67 65 ation */..SSL_ge
df90: 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 t0_alpn_selected
dfa0: 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c (ssl, &proto, &l
dfb0: 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 en);..Tcl_ListOb
dfc0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
dfd0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
dfe0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
dff0: 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 "alpn", -1));..T
e000: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
e010: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
e020: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
e030: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a tringObj((char *
e040: 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 6c 65 6e )proto, (int)len
e050: 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 ));.../* Get sec
e060: 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 urity level */..
e070: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
e080: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
e090: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
e0a0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 75 72 StringObj("secur
e0b0: 69 74 79 6c 65 76 65 6c 22 2c 20 2d 31 29 29 3b itylevel", -1));
e0c0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
e0d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
e0e0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
e0f0: 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 ewIntObj(SSL_get
e100: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 _security_level(
e110: 73 73 6c 29 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 ssl)));. }..
e120: 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 /* Cipher inf
e130: 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20 o */. cipher
e140: 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e = SSL_get_curren
e150: 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 t_cipher(ssl);.
e160: 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d if (cipher !=
e170: 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 NULL) {..char b
e180: 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d uf[BUFSIZ] = {0}
e190: 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 ;..int bits, alg
e1a0: 5f 62 69 74 73 3b 0a 0a 09 54 63 6c 5f 4c 69 73 _bits;...Tcl_Lis
e1b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
e1c0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
e1d0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
e1e0: 62 6a 28 22 63 69 70 68 65 72 22 2c 20 2d 31 29 bj("cipher", -1)
e1f0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
e200: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
e210: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
e220: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
e230: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d L_CIPHER_get_nam
e240: 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b e(cipher), -1));
e250: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
e260: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
e270: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
e280: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 ewStringObj("sta
e290: 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 2d 31 29 ndard_name", -1)
e2a0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
e2b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
e2c0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
e2d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
e2e0: 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 L_CIPHER_standar
e2f0: 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 d_name(cipher),
e300: 2d 31 29 29 3b 0a 0a 09 62 69 74 73 20 3d 20 53 -1));...bits = S
e310: 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 SL_CIPHER_get_bi
e320: 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f ts(cipher, &alg_
e330: 62 69 74 73 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 bits);..Tcl_List
e340: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
e350: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
e360: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
e370: 6a 28 22 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a j("bits", -1));.
e380: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
e390: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
e3a0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
e3b0: 77 49 6e 74 4f 62 6a 28 62 69 74 73 29 29 3b 0a wIntObj(bits));.
e3c0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
e3d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
e3e0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
e3f0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 72 wStringObj("secr
e400: 65 74 5f 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a et_bits", -1));.
e410: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
e420: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
e430: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
e440: 77 49 6e 74 4f 62 6a 28 61 6c 67 5f 62 69 74 73 wIntObj(alg_bits
e450: 29 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 ));../* alg_bits
e460: 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 is actual key s
e470: 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 ecret bits. If u
e480: 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 se bits and secr
e490: 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 et (algorithm) b
e4a0: 69 74 73 20 64 69 66 66 65 72 2c 0a 20 20 20 20 its differ,.
e4b0: 20 20 20 20 20 20 20 74 68 65 20 72 65 73 74 20 the rest
e4c0: 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 20 of the bits are
e4d0: 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 fixed, i.e. for
e4e0: 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 limited export c
e4f0: 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 iphers (bits < 5
e500: 36 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 6) */..Tcl_ListO
e510: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
e520: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
e530: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
e540: 28 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 ("min_version",
e550: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
e560: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
e570: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
e580: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
e590: 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f (SSL_CIPHER_get_
e5a0: 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c version(cipher),
e5b0: 20 2d 31 29 29 3b 0a 0a 09 69 66 20 28 53 53 4c -1));...if (SSL
e5c0: 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 _CIPHER_descript
e5d0: 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c ion(cipher, buf,
e5e0: 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d sizeof(buf)) !=
e5f0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 NULL) {.. Tc
e600: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
e610: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
e620: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
e630: 72 69 6e 67 4f 62 6a 28 22 64 65 73 63 72 69 70 ringObj("descrip
e640: 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 20 20 tion", -1));..
e650: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
e660: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
e670: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
e680: 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c ewStringObj(buf,
e690: 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a -1));..}. }.
e6a0: 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 . /* Session
e6b0: 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 info */. sess
e6c0: 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 ion = SSL_get_se
e6d0: 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 ssion(ssl);.
e6e0: 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e if (session != N
e6f0: 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e ULL) {..const un
e700: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 signed char *tic
e710: 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e ket;..size_t len
e720: 32 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 2;..const unsign
e730: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e ed char *session
e740: 5f 69 64 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f _id;.../* Sessio
e750: 6e 20 69 6e 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c n info */..Tcl_L
e760: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
e770: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
e780: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
e790: 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 72 65 gObj("session_re
e7a0: 75 73 65 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 used", -1));..Tc
e7b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
e7c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
e7d0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e bjPtr, Tcl_NewIn
e7e0: 74 4f 62 6a 28 53 53 4c 5f 73 65 73 73 69 6f 6e tObj(SSL_session
e7f0: 5f 72 65 75 73 65 64 28 73 73 6c 29 29 29 3b 0a _reused(ssl)));.
e800: 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 ../* Session id
e810: 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 */..Tcl_ListObjA
e820: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
e830: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
e840: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 _NewStringObj("s
e850: 65 73 73 69 6f 6e 5f 69 64 22 2c 20 2d 31 29 29 ession_id", -1))
e860: 3b 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 ;..session_id =
e870: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
e880: 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 _id_context(sess
e890: 69 6f 6e 2c 20 26 6c 65 6e 29 3b 0a 09 54 63 6c ion, &len);..Tcl
e8a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
e8b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
e8c0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
e8d0: 69 6e 67 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 ingObj(session_i
e8e0: 64 2c 20 28 69 6e 74 29 6c 65 6e 29 29 3b 0a 0a d, (int)len));..
e8f0: 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b ./* Session tick
e900: 65 74 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 et */..SSL_SESSI
e910: 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 ON_get0_ticket(s
e920: 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c ession, &ticket,
e930: 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 &len2);..Tcl_Li
e940: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
e950: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
e960: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
e970: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 74 69 63 Obj("session_tic
e980: 6b 65 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ket", -1));..Tcl
e990: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
e9a0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
e9b0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
e9c0: 69 6e 67 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 ingObj(ticket, (
e9d0: 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f int) len2));.../
e9e0: 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 * Resumable sess
e9f0: 69 6f 6e 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 ion */..Tcl_List
ea00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
ea10: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
ea20: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
ea30: 6a 28 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 2d j("resumable", -
ea40: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
ea50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
ea60: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
ea70: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c cl_NewIntObj(SSL
ea80: 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 _SESSION_is_resu
ea90: 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 29 mable(session)))
eaa0: 3b 0a 0a 09 2f 2a 20 53 74 61 72 74 20 74 69 6d ;.../* Start tim
eab0: 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 e */..Tcl_ListOb
eac0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
ead0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
eae0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
eaf0: 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 2d 31 "start_time", -1
eb00: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
eb10: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
eb20: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
eb30: 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c l_NewLongObj(SSL
eb40: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d _SESSION_get_tim
eb50: 65 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 e(session)));...
eb60: 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 /* Timeout value
eb70: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
eb80: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
eb90: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
eba0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
ebb0: 74 69 6d 65 6f 75 74 22 2c 20 2d 31 29 29 3b 0a timeout", -1));.
ebc0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
ebd0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
ebe0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
ebf0: 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 wLongObj(SSL_SES
ec00: 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 SION_get_timeout
ec10: 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 20 20 20 (session)));.
ec20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 }.. /* Compr
ec30: 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 ession info */.
ec40: 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 if (ssl != NU
ec50: 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 LL) {.#ifdef HAV
ec60: 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f E_SSL_COMPRESSIO
ec70: 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 N..const COMP_ME
ec80: 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 THOD *comp, *exp
ec90: 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 n;..comp = SSL_g
eca0: 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 et_current_compr
ecb0: 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 ession(ssl);..ex
ecc0: 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 pn = SSL_get_cur
ecd0: 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 rent_expansion(s
ece0: 73 6c 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f sl);...Tcl_ListO
ecf0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
ed00: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
ed10: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
ed20: 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 ("compression",
ed30: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
ed40: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
ed50: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
ed60: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
ed70: 28 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 (comp ? SSL_COMP
ed80: 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 _get_name(comp)
ed90: 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a : "NONE", -1));.
eda0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
edb0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
edc0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
edd0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78 70 61 wStringObj("expa
ede0: 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 nsion", -1));..T
edf0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
ee00: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
ee10: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
ee20: 74 72 69 6e 67 4f 62 6a 28 65 78 70 6e 20 3f 20 tringObj(expn ?
ee30: 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d SSL_COMP_get_nam
ee40: 65 28 65 78 70 6e 29 20 3a 20 22 4e 4f 4e 45 22 e(expn) : "NONE"
ee50: 2c 20 2d 31 29 29 3b 0a 23 65 6c 73 65 0a 09 54 , -1));.#else..T
ee60: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
ee70: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
ee80: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
ee90: 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65 tringObj("compre
eea0: 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 ssion", -1));..T
eeb0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
eec0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
eed0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
eee0: 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c tringObj("NONE",
eef0: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
ef00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
ef10: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
ef20: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
ef30: 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 2d j("expansion", -
ef40: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
ef50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
ef60: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
ef70: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
ef80: 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 65 "NONE", -1));.#e
ef90: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ndif. }..
efa0: 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a /* Server info *
efb0: 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c /. mode = SSL
efc0: 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e _CTX_get_session
efd0: 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 _cache_mode(stat
efe0: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 ePtr->ctx);.
eff0: 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 if (mode & SSL_S
f000: 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b ESS_CACHE_OFF) {
f010: 0a 09 70 72 6f 74 6f 20 3d 20 22 6f 66 66 22 3b ..proto = "off";
f020: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
f030: 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f mode & SSL_SESS_
f040: 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a CACHE_CLIENT) {.
f050: 09 70 72 6f 74 6f 20 3d 20 22 63 6c 69 65 6e 74 .proto = "client
f060: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ";. } else if
f070: 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 (mode & SSL_SES
f080: 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 S_CACHE_SERVER)
f090: 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 73 65 72 76 {..proto = "serv
f0a0: 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 er";. } else
f0b0: 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 if (mode & SSL_S
f0c0: 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 ESS_CACHE_BOTH)
f0d0: 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 62 6f 74 68 {..proto = "both
f0e0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ";. } else {.
f0f0: 09 70 72 6f 74 6f 20 3d 20 22 75 6e 6b 6e 6f 77 .proto = "unknow
f100: 6e 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 n";. }. Tc
f110: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
f120: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
f130: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
f140: 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e ringObj("session
f150: 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 2d 31 _cache_mode", -1
f160: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
f170: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
f180: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f190: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
f1a0: 6a 28 70 72 6f 74 6f 2c 20 2d 31 29 29 3b 0a 0a j(proto, -1));..
f1b0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
f1c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
f1d0: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
f1e0: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
f1f0: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
f200: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d a;.}.../*. *----
f210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
f250: 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a *. * VersionObj
f260: 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 Cmd -- return ve
f270: 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f rsion string fro
f280: 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a m OpenSSL.. *. *
f290: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
f2a0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
f2b0: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
f2c0: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
f2d0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
f2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
f320: 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e atic int.Version
f330: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
f340: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
f350: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
f360: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
f370: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
f380: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ]) {. Tcl_Obj
f390: 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 *objPtr;.. d
f3a0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
f3b0: 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 ;.. objPtr =
f3c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
f3d0: 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e (OPENSSL_VERSION
f3e0: 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 _TEXT, -1);.
f3f0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
f400: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
f410: 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
f420: 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 L_OK;..clientDat
f430: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a a = clientData;.
f440: 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 6f .objc = objc;..o
f450: 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a bjv = objv;.}...
f460: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
f470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f4a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d --------. *. * M
f4b0: 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 iscObjCmd -- mis
f4c0: 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a c commands. *. *
f4d0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
f4e0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
f4f0: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
f500: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
f510: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
f520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
f560: 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a atic int.MiscObj
f570: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
f580: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
f590: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
f5a0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
f5b0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
f5c0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e {. static con
f5d0: 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 st char *command
f5e0: 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 s [] = { "req",
f5f0: 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d "strreq", NULL }
f600: 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 ;. enum comma
f610: 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 nd { C_REQ, C_ST
f620: 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b RREQ, C_DUMMY };
f630: 0a 20 20 20 20 69 6e 74 20 63 6d 64 2c 20 69 73 . int cmd, is
f640: 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 Str;. char bu
f650: 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 ffer[16384];..
f660: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
f670: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
f680: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 jc < 2) {..Tcl_W
f690: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
f6a0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 rp, 1, objv, "su
f6b0: 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 bcommand ?args?"
f6c0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
f6d0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
f6e0: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 if (Tcl_GetIndex
f6f0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
f700: 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 objv[1], command
f710: 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c s, "command", 0,
f720: 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 &cmd) != TCL_OK)
f730: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
f740: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
f750: 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d isStr = (cmd ==
f760: 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 C_STRREQ);.
f770: 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f switch ((enum co
f780: 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 mmand) cmd) {..c
f790: 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 ase C_REQ:..case
f7a0: 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 C_STRREQ: {..
f7b0: 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 EVP_PKEY *pkey
f7c0: 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 =NULL;.. X509
f7d0: 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 *cert=NULL;..
f7e0: 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d X509_NAME *nam
f7f0: 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c e=NULL;.. Tcl
f800: 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 _Obj **listv;..
f810: 20 20 20 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a int listc,i;.
f820: 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e .. BIO *out=N
f830: 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 ULL;... char
f840: 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 *k_C="",*k_ST=""
f850: 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 ,*k_L="",*k_O=""
f860: 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d ,*k_OU="",*k_CN=
f870: 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a "",*k_Email="";.
f880: 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 . char *keyou
f890: 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a t,*pemout,*str;.
f8a0: 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 . int keysize
f8b0: 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 ,serial=0,days=3
f8c0: 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 65;..#if OPENSSL
f8d0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
f8e0: 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 < 0x30000000L..
f8f0: 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d BIGNUM *bne =
f900: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 NULL;.. RSA
f910: 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c *rsa = NULL;.#el
f920: 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 se.. EVP_PKEY
f930: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c _CTX *ctx = NULL
f940: 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 ;.#endif... i
f950: 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 f ((objc<5) || (
f960: 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c objc>6)) {...Tcl
f970: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
f980: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 terp, 2, objv, "
f990: 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 keysize keyfile
f9a0: 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 certfile ?info?"
f9b0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
f9c0: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 ERROR;.. }...
f9d0: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 if (Tcl_GetI
f9e0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
f9f0: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 , objv[2], &keys
fa00: 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ize) != TCL_OK)
fa10: 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {...return TCL_E
fa20: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 RROR;.. }..
fa30: 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 keyout=Tcl_Get
fa40: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b String(objv[3]);
fa50: 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c .. pemout=Tcl
fa60: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
fa70: 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 4]);.. if (is
fa80: 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 Str) {...Tcl_Set
fa90: 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 Var(interp,keyou
faa0: 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 t,"",0);...Tcl_S
fab0: 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d etVar(interp,pem
fac0: 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 out,"",0);..
fad0: 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 }... if (objc
fae0: 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c >=6) {...if (Tcl
faf0: 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 _ListObjGetEleme
fb00: 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 nts(interp, objv
fb10: 5b 35 5d 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20 [5],....&listc,
fb20: 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f &listv) != TCL_O
fb30: 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 K) {... retur
fb40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
fb50: 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 ....if ((listc%2
fb60: 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 ) != 0) {...
fb70: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
fb80: 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f terp,"Informatio
fb90: 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 n list must have
fba0: 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 even number of
fbb0: 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 arguments",NULL)
fbc0: 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 ;... return T
fbd0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 CL_ERROR;...}...
fbe0: 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 for (i=0; i<list
fbf0: 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 c; i+=2) {...
fc00: 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 str=Tcl_GetStri
fc10: 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 ng(listv[i]);...
fc20: 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 if (strcmp(s
fc30: 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b tr,"days")==0) {
fc40: 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
fc50: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
fc60: 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 ,listv[i+1],&day
fc70: 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 s)!=TCL_OK)....
fc80: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
fc90: 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 ROR;... } els
fca0: 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
fcb0: 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b ,"serial")==0) {
fcc0: 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
fcd0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
fce0: 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 ,listv[i+1],&ser
fcf0: 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 ial)!=TCL_OK)...
fd00: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
fd10: 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 ERROR;... } e
fd20: 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
fd30: 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 tr,"C")==0) {...
fd40: 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 .k_C=Tcl_GetStri
fd50: 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
fd60: 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
fd70: 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 (strcmp(str,"ST"
fd80: 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d )==0) {....k_ST=
fd90: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
fda0: 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
fdb0: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
fdc0: 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 mp(str,"L")==0)
fdd0: 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 {....k_L=Tcl_Get
fde0: 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
fdf0: 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
fe00: 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
fe10: 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "O")==0) {....k_
fe20: 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 O=Tcl_GetString(
fe30: 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
fe40: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
fe50: 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d rcmp(str,"OU")==
fe60: 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 0) {....k_OU=Tcl
fe70: 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
fe80: 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
fe90: 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
fea0: 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a str,"CN")==0) {.
feb0: 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 ...k_CN=Tcl_GetS
fec0: 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
fed0: 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
fee0: 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
fef0: 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 Email")==0) {...
ff00: 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 .k_Email=Tcl_Get
ff10: 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
ff20: 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
ff30: 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 {....Tcl_SetRes
ff40: 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e ult(interp,"Unkn
ff50: 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e own parameter",N
ff60: 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 ULL);....return
ff70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 TCL_ERROR;...
ff80: 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 }...}.. }..#
ff90: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
ffa0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
ffb0: 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 000000L.. bne
ffc0: 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 = BN_new();..
ffd0: 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 rsa = RSA_new(
ffe0: 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 );.. pkey = E
fff0: 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 VP_PKEY_new();..
10000 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e if (bne == N
10010 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 ULL || rsa == NU
10020 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 LL || pkey == NU
10030 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f LL || !BN_set_wo
10040 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c rd(bne,RSA_F4) |
10050 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 |...!RSA_generat
10060 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 e_key_ex(rsa, ke
10070 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c ysize, bne, NULL
10080 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 ) || !EVP_PKEY_a
10090 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 ssign_RSA(pkey,
100a0 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b rsa)) {...EVP_PK
100b0 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 EY_free(pkey);..
100c0 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 ./* RSA_free(rsa
100d0 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f ); freed by EVP_
100e0 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 PKEY_free */...B
100f0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c N_free(bne);.#el
10100 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 se.. pkey = E
10110 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 VP_RSA_gen((unsi
10120 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a gned int) keysiz
10130 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 e);.. ctx = E
10140 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 VP_PKEY_CTX_new(
10150 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 pkey,NULL);..
10160 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c if (pkey == NUL
10170 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c L || ctx == NULL
10180 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 || !EVP_PKEY_ke
10190 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c ygen_init(ctx) |
101a0 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 |...!EVP_PKEY_CT
101b0 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e X_set_rsa_keygen
101c0 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 _bits(ctx, keysi
101d0 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 ze) || !EVP_PKEY
101e0 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b _keygen(ctx, &pk
101f0 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 ey)) {...EVP_PKE
10200 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 Y_free(pkey);...
10210 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 EVP_PKEY_CTX_fre
10220 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 e(ctx);.#endif..
10230 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
10240 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e nterp,"Error gen
10250 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 erating private
10260 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 key",NULL);...re
10270 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
10280 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
10290 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 if (isStr) {...
102a0 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
102b0 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 IO_s_mem());...
102c0 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
102d0 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c _PrivateKey(out,
102e0 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 pkey,NULL,NULL,0
102f0 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 ,NULL,NULL);...
10300 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 i=BIO_read(ou
10310 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 t,buffer,sizeof(
10320 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 buffer)-1);...
10330 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 i=(i<0) ? 0 :
10340 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b i;... buffer[
10350 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 i]='\0';... T
10360 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
10370 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 ,keyout,buffer,0
10380 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 );... BIO_flu
10390 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 sh(out);... B
103a0 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 IO_free(out);...
103b0 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f } else {... o
103c0 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
103d0 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 _file());...
103e0 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 BIO_write_filena
103f0 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a me(out,keyout);.
10400 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
10410 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f bio_PrivateKey(o
10420 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c ut,pkey,NULL,NUL
10430 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a L,0,NULL,NULL);.
10440 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 .. /* PEM_wri
10450 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 te_bio_RSAPrivat
10460 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e eKey(out, rsa, N
10470 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 ULL, NULL, 0, NU
10480 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 LL, NULL); */...
10490 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c BIO_free_all
104a0 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 (out);.. .}....i
104b0 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 f ((cert=X509_ne
104c0 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 w())==NULL) {...
104d0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
104e0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
104f0 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 generating certi
10500 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c ficate request",
10510 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 NULL);... EVP
10520 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
10530 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
10540 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
10550 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 x30000000L...
10560 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 BN_free(bne);.#
10570 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 endif... retu
10580 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 rn(TCL_ERROR);..
10590 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 .}....X509_set_v
105a0 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a ersion(cert,2);.
105b0 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 ..ASN1_INTEGER_s
105c0 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 et(X509_get_seri
105d0 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 alNumber(cert),s
105e0 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 erial);...X509_g
105f0 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 mtime_adj(X509_g
10600 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 etm_notBefore(ce
10610 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 rt),0);...X509_g
10620 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 mtime_adj(X509_g
10630 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 etm_notAfter(cer
10640 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 t),(long)60*60*2
10650 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 4*days);...X509_
10660 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c set_pubkey(cert,
10670 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 pkey);....name=X
10680 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 509_get_subject_
10690 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 name(cert);....X
106a0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
106b0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
106c0 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 C", MBSTRING_ASC
106d0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
106e0 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d d char *) k_C, -
106f0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
10700 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
10710 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 _by_txt(name,"ST
10720 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
10730 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
10740 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d char *) k_ST, -
10750 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
10760 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
10770 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 _by_txt(name,"L"
10780 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
10790 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
107a0 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c char *) k_L, -1,
107b0 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
107c0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
107d0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 y_txt(name,"O",
107e0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
107f0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
10800 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d ar *) k_O, -1, -
10810 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
10820 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
10830 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d txt(name,"OU", M
10840 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
10850 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
10860 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d r *) k_OU, -1, -
10870 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
10880 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
10890 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d txt(name,"CN", M
108a0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
108b0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
108c0 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d r *) k_CN, -1, -
108d0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
108e0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
108f0 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 txt(name,"Email"
10900 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
10910 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
10920 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c char *) k_Email,
10930 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 -1, -1, 0);....
10940 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 X509_set_subject
10950 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 _name(cert,name)
10960 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 ;....if (!X509_s
10970 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 ign(cert,pkey,EV
10980 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 P_sha256())) {..
10990 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 . X509_free(c
109a0 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f ert);... EVP_
109b0 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
109c0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
109d0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
109e0 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 30000000L...
109f0 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
10a00 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 ndif... Tcl_S
10a10 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
10a20 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 "Error signing c
10a30 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c ertificate",NULL
10a40 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 );... return
10a50 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a TCL_ERROR;...}..
10a60 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 ..if (isStr) {..
10a70 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
10a80 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 (BIO_s_mem());..
10a90 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
10aa0 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 io_X509(out,cert
10ab0 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 );... i=BIO_r
10ac0 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 ead(out,buffer,s
10ad0 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 izeof(buffer)-1)
10ae0 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 ;... i=(i<0)
10af0 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 ? 0 : i;... b
10b00 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 uffer[i]='\0';..
10b10 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 . Tcl_SetVar(
10b20 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 interp,pemout,bu
10b30 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 ffer,0);... B
10b40 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 IO_flush(out);..
10b50 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 . BIO_free(ou
10b60 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 t);...} else {..
10b70 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
10b80 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a (BIO_s_file());.
10b90 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f .. BIO_write_
10ba0 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d filename(out,pem
10bb0 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f out);... PEM_
10bc0 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f write_bio_X509(o
10bd0 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 ut,cert);...
10be0 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 BIO_free_all(out
10bf0 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 );...}....X509_f
10c00 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 ree(cert);...EVP
10c10 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
10c20 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
10c30 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
10c40 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f x30000000L...BN_
10c50 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 free(bne);.#endi
10c60 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 f.. }..}..bre
10c70 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a ak;. default:
10c80 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 ..break;. }.
10c90 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
10ca0 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
10cb0 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
10cc0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
10cd0 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 *****/./* Init
10ce0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a */./*
10cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10d00 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ***/../*. *-----
10d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
10d50 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d *. * Tls_Free --
10d60 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
10d70 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 edure cleans up
10d80 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 when a SSL socke
10d90 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a t based channel.
10da0 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 *.is closed and
10db0 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 its reference c
10dc0 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 ount falls below
10dd0 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 1. *. * Results
10de0 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.none. *. *
10df0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
10e00 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 .Frees all the s
10e10 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d tate. *. *------
10e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
10e60 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 /.void.Tls_Free(
10e70 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 char *blockPtr)
10e80 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
10e90 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
10ea0 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 )blockPtr;..
10eb0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
10ec0 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 );.. Tls_Clea
10ed0 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 n(statePtr);.
10ee0 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 ckfree(blockPtr
10ef0 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
10f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
10f40 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 *. * Tls_Clean
10f50 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
10f60 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 ocedure cleans u
10f70 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 p when a SSL soc
10f80 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 ket based channe
10f90 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 l. *.is closed a
10fa0 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 nd its reference
10fb0 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c count falls bel
10fc0 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 ow 1. This shou
10fd0 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 ld. *.be called
10fe0 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 synchronously by
10ff0 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 the CloseProc,
11000 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 not in the. *.Ev
11010 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c entuallyFree cal
11020 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 lback.. *. * Res
11030 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ults:. *.none. *
11040 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
11050 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 :. *.Frees all t
11060 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d he state. *. *--
11070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
110a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
110b0 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 -. */.void Tls_C
110c0 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 lean(State *stat
110d0 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 ePtr) {. dpri
110e0 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
110f0 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 /*. * we
11100 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 're assuming her
11110 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e e that we're sin
11120 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 gle-threaded.
11130 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 */. if (sta
11140 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 tePtr->timer !=
11150 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 (Tcl_TimerToken)
11160 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 NULL) {..Tcl_De
11170 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 leteTimerHandler
11180 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 (statePtr->timer
11190 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 );..statePtr->ti
111a0 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 mer = NULL;.
111b0 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }.. if (state
111c0 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 Ptr->protos) {..
111d0 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 2d ckfree(statePtr-
111e0 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 >protos);..state
111f0 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 Ptr->protos = NU
11200 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
11210 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 (statePtr->bio)
11220 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c {../* This will
11230 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f call SSL_shutdo
11240 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 wn. Bug 1414045
11250 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f */..dprintf("BIO
11260 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 _free_all(%p)",
11270 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a statePtr->bio);.
11280 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 .BIO_free_all(st
11290 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 atePtr->bio);..s
112a0 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e tatePtr->bio = N
112b0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
112c0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c f (statePtr->ssl
112d0 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 ) {..dprintf("SS
112e0 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 L_free(%p)", sta
112f0 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 tePtr->ssl);..SS
11300 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d L_free(statePtr-
11310 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 >ssl);..statePtr
11320 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ->ssl = NULL;.
11330 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
11340 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 ePtr->ctx) {..SS
11350 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 L_CTX_free(state
11360 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 Ptr->ctx);..stat
11370 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c ePtr->ctx = NULL
11380 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
11390 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
113a0 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 ck) {..Tcl_DecrR
113b0 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
113c0 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 ->callback);..st
113d0 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
113e0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
113f0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
11400 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 >password) {..Tc
11410 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 l_DecrRefCount(s
11420 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
11430 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 d);..statePtr->p
11440 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a assword = NULL;.
11450 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
11460 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b tf("Returning");
11470 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
11480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
114a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
114b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
114c0 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a . * Tls_Init --.
114d0 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 *. *.This is a
114e0 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 package initiali
114f0 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 zation procedure
11500 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 , which is calle
11510 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e d. *.by Tcl when
11520 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73 this package is
11530 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 to be added to
11540 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a an interpreter..
11550 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 *. * Results:
11560 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61 Ssl configured a
11570 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 nd loaded. *. *
11580 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
11590 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73 6c . create the ssl
115a0 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 command, initia
115b0 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 lize ssl context
115c0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
115d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
115e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
115f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11600 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c ---------. */.DL
11610 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f LEXPORT int Tls_
11620 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 Init(Tcl_Interp
11630 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 63 *interp) {. c
11640 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c onst char tlsTcl
11650 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b InitScript[] = {
11660 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 .#include "tls.t
11670 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20 cl.h"..0x00.
11680 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 };.. dprintf(
11690 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
116a0 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c /*. * We onl
116b0 79 20 73 75 70 70 6f 72 74 20 54 63 6c 20 38 2e y support Tcl 8.
116c0 34 20 6f 72 20 6e 65 77 65 72 0a 20 20 20 20 20 4 or newer.
116d0 2a 2f 0a 20 20 20 20 69 66 20 28 0a 23 69 66 64 */. if (.#ifd
116e0 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 ef USE_TCL_STUBS
116f0 0a 09 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 ..Tcl_InitStubs(
11700 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 interp, "8.4", 0
11710 29 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 50 6b 67 ).#else..Tcl_Pkg
11720 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 Require(interp,
11730 22 54 63 6c 22 2c 20 22 38 2e 34 2d 22 2c 20 30 "Tcl", "8.4-", 0
11740 29 0a 23 65 6e 64 69 66 0a 09 20 3d 3d 20 4e 55 ).#endif.. == NU
11750 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
11760 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
11770 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e if (TlsLibIn
11780 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 it(0) != TCL_OK)
11790 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
117a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f sult(interp, "co
117b0 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 uld not initiali
117c0 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c ze SSL library",
117d0 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
117e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
117f0 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 .. Tcl_Create
11800 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
11810 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 p, "tls::ciphers
11820 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 ", CiphersObjCmd
11830 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
11840 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
11850 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
11860 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
11870 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
11880 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e "tls::connection
11890 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 ", ConnectionInf
118a0 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 oObjCmd, (Client
118b0 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
118c0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
118d0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
118e0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
118f0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e nterp, "tls::han
11900 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 dshake", Handsha
11910 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e keObjCmd, (Clien
11920 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
11930 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
11940 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
11950 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
11960 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d interp, "tls::im
11970 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a port", ImportObj
11980 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
11990 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
119a0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
119b0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
119c0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
119d0 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 p, "tls::unimpor
119e0 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 t", UnimportObjC
119f0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
11a00 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
11a10 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
11a20 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
11a30 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
11a40 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c , "tls::status",
11a50 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 StatusObjCmd, (
11a60 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
11a70 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
11a80 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
11a90 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
11aa0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
11ab0 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 s::version", Ver
11ac0 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 sionObjCmd, (Cli
11ad0 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
11ae0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
11af0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
11b00 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
11b10 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
11b20 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d misc", MiscObjCm
11b30 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
11b40 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
11b50 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
11b60 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
11b70 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
11b80 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 "tls::protocols
11b90 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 ", ProtocolsObjC
11ba0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
11bb0 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
11bc0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
11bd0 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 .. if (interp
11be0 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e ) {..Tcl_Eval(in
11bf0 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 terp, tlsTclInit
11c00 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a Script);. }..
11c10 20 20 20 20 72 65 74 75 72 6e 28 54 63 6c 5f 50 return(Tcl_P
11c20 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 kgProvide(interp
11c30 2c 20 22 74 6c 73 22 2c 20 50 41 43 4b 41 47 45 , "tls", PACKAGE
11c40 5f 56 45 52 53 49 4f 4e 29 29 3b 0a 7d 0a 0a 2f _VERSION));.}../
11c50 2a 0a 20 2a 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 2a 0a 20 2a 0a 20 ----------*. *.
11c90 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d *.Tls_SafeInit -
11ca0 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d -. *. *.--------
11cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11cd0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 --------*. *.Sta
11ce0 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 ndard procedure
11cf0 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 required by 'loa
11d00 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a d'.. *.Initializ
11d10 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f es this extensio
11d20 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74 n for a safe int
11d30 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d erpreter.. *.---
11d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
11d70 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 *. *.Side effect
11d80 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c s:. *..As of 'Tl
11d90 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 s_Init'. *. *.Re
11da0 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e sult:. *..A stan
11db0 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 dard Tcl error c
11dc0 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ode.. *. *------
11dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11e00 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 *. */.DLLEXPORT
11e10 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 int Tls_SafeInit
11e20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
11e30 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e erp) {. dprin
11e40 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 tf("Called");.
11e50 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69 return(Tls_Ini
11e60 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f t(interp));.}../
11e70 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
11e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 ----------*. *.
11eb0 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a *.TlsLibInit --.
11ec0 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *.----------
11ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ef0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 ------*. *.Initi
11f00 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 alizes SSL libra
11f10 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c ry once per appl
11f20 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d ication. *.-----
11f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a -----------*. *.
11f60 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a *.Side effects:
11f70 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 . *..initializes
11f80 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a SSL library. *.
11f90 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e *.Result:. *..n
11fa0 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d one. *. *-------
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 2a ---------------*
11fe0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 . */.static int
11ff0 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 TlsLibInit(int u
12000 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 ninitialize) {.
12010 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e static int in
12020 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 itialized = 0;.
12030 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20 int status =
12040 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 TCL_OK;.#if defi
12050 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 ned(OPENSSL_THRE
12060 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 ADS) && defined(
12070 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 TCL_THREADS).
12080 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b size_t num_lock
12090 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 s;.#endif.. i
120a0 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 f (uninitialize)
120b0 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 {. if (!
120c0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 20 initialized) {.
120d0 20 20 20 20 20 20 20 20 20 20 20 64 70 72 69 6e dprin
120e0 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 tf("Asked to uni
120f0 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 nitialize, but w
12100 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 e are not initia
12110 6c 69 7a 65 64 22 29 3b 0a 0a 20 20 20 20 20 20 lized");..
12120 20 20 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c return(TCL
12130 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a _OK);. }.
12140 0a 20 20 20 20 20 20 20 20 64 70 72 69 6e 74 66 . dprintf
12150 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 ("Asked to unini
12160 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 tialize");..#if
12170 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
12180 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
12190 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
121a0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4d 75 74 . Tcl_Mut
121b0 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 exLock(&init_mx)
121c0 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28 6c ;.. if (l
121d0 6f 63 6b 73 29 20 7b 0a 20 20 20 20 20 20 20 20 ocks) {.
121e0 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b free(locks);
121f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 . loc
12200 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 ks = NULL;.
12210 20 20 20 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e locksCoun
12220 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d t = 0;. }
12230 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 .#endif.
12240 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b initialized = 0;
12250 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ..#if defined(OP
12260 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
12270 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
12280 52 45 41 44 53 29 0a 20 20 20 20 20 20 20 20 54 READS). T
12290 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 cl_MutexUnlock(&
122a0 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 init_mx);.#endif
122b0 0a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e .. return
122c0 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a (TCL_OK);. }.
122d0 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c . if (initial
122e0 69 7a 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 ized) {.
122f0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c dprintf("Called,
12300 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 but using cache
12310 64 20 76 61 6c 75 65 22 29 3b 0a 20 20 20 20 20 d value");.
12320 20 20 20 72 65 74 75 72 6e 28 73 74 61 74 75 73 return(status
12330 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 );. }.. dp
12340 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
12350 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ..#if defined(OP
12360 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
12370 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
12380 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d READS). Tcl_M
12390 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d utexLock(&init_m
123a0 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 x);.#endif. i
123b0 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a nitialized = 1;.
123c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
123d0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
123e0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
123f0 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f EADS). num_lo
12400 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 cks = 1;. loc
12410 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 ksCount = (int)
12420 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c num_locks;. l
12430 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 ocks = malloc(si
12440 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e zeof(*locks) * n
12450 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d um_locks);. m
12460 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 emset(locks, 0,
12470 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a sizeof(*locks) *
12480 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e num_locks);.#en
12490 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 dif.. /* Init
124a0 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 ialize BOTH libc
124b0 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c rypto and libssl
124c0 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c . */. OPENSSL
124d0 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 _init_ssl(OPENSS
124e0 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f L_INIT_LOAD_SSL_
124f0 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 STRINGS | OPENSS
12500 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 L_INIT_LOAD_CRYP
12510 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 TO_STRINGS..| OP
12520 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 ENSSL_INIT_ADD_A
12530 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 LL_CIPHERS | OPE
12540 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c NSSL_INIT_ADD_AL
12550 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 L_DIGESTS, NULL)
12560 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 ;.. BIO_new_t
12570 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 cl(NULL, 0);..#i
12580 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 f 0. /*.
12590 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f * XXX:TODO: Remo
125a0 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e 64 ve this code and
125b0 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 replace it with
125c0 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a 20 a check. *
125d0 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f for enough entro
125e0 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72 py and do not tr
125f0 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 y to create our
12600 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 69 own. * terri
12610 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 20 ble entropy.
12620 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 */. /*.
12630 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f * Seed the rando
12640 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 m number generat
12650 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 or in the SSL li
12660 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 brary,. * us
12670 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 ing the do/while
12680 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75 construct becau
12690 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f se of the bug no
126a0 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a te in the. *
126b0 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20 OpenSSL FAQ at
126c0 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 http://www.opens
126d0 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 sl.org/support/f
126e0 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 aq.html#USER1.
126f0 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 *. * The
12700 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62 crux of the prob
12710 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61 lem is that Sola
12720 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 ris 7 does not h
12730 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 65 ave a. * /de
12740 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 v/random or /dev
12750 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 /urandom device
12760 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 so it cannot gat
12770 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 her enough.
12780 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 * entropy from t
12790 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77 he RAND_seed() w
127a0 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 hen TLS initiali
127b0 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a zes and refuses.
127c0 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 * to go fur
127d0 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65 ther. Earlier ve
127e0 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 rsions of OpenSS
127f0 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67 L carried on reg
12800 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f ardless.. */
12810 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69 . srand((unsi
12820 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28 gned int) time((
12830 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 time_t *) NULL))
12840 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 ;. do {..for
12850 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 (i = 0; i < 16;
12860 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f i++) {.. rnd_
12870 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 seed[i] = 1 + (c
12880 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61 har) (255.0 * ra
12890 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 nd()/(RAND_MAX+1
128a0 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 .0));..}..RAND_s
128b0 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 eed(rnd_seed, si
128c0 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b zeof(rnd_seed));
128d0 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41 . } while (RA
128e0 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31 ND_status() != 1
128f0 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 );.#endif..#if d
12900 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
12910 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
12920 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
12930 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b .Tcl_MutexUnlock
12940 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 (&init_mx);.#end
12950 69 66 0a 0a 09 72 65 74 75 72 6e 28 73 74 61 74 if...return(stat
12960 75 73 29 3b 0a 7d 0a us);.}.