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 45 --------. *. * E
0a20: 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d val Callback Com
0a30: 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76 mand --. *. *.Ev
0a40: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
0a50: 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 6e and and catch an
0a60: 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52 y errors. *. * R
0a70: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43 esults:. *.0 = C
0a80: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20 ommand returned
0a90: 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 74 fail or eval ret
0aa0: 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a urned TCL_ERROR.
0ab0: 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 *.1 = Command r
0ac0: 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 20 eturned success
0ad0: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64 or eval returned
0ae0: 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69 TCL_OK. *. * Si
0af0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45 de effects:. *.E
0b00: 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 63 valuates callbac
0b10: 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d k command. *. *-
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b60: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
0b70: 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54 t.EvalCallback(T
0b80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
0b90: 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 p, State *stateP
0ba0: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 tr, Tcl_Obj *cmd
0bb0: 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 63 Ptr) {. int c
0bc0: 6f 64 65 2c 20 6f 6b 3b 0a 0a 20 20 20 20 54 63 ode, ok;.. Tc
0bd0: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 l_Preserve((Clie
0be0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
0bf0: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 . Tcl_Preserv
0c00: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
0c10: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f tatePtr);.. /
0c20: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
0c30: 77 69 74 68 20 73 75 63 63 65 73 73 20 66 6f 72 with success for
0c40: 20 6f 6b 20 6f 72 20 72 65 74 75 72 6e 20 76 61 ok or return va
0c50: 6c 75 65 20 31 2c 20 66 61 69 6c 20 66 6f 72 20 lue 1, fail for
0c60: 65 72 72 6f 72 20 6f 72 20 72 65 74 75 72 6e 20 error or return
0c70: 76 61 6c 75 65 20 30 20 2a 2f 0a 20 20 20 20 63 value 0 */. c
0c80: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 ode = Tcl_EvalOb
0c90: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 jEx(interp, cmdP
0ca0: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f tr, TCL_EVAL_GLO
0cb0: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f BAL);. if (co
0cc0: 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a de == TCL_OK) {.
0cd0: 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c 74 ./* Check result
0ce0: 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 for return valu
0cf0: 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 e */..Tcl_Obj *r
0d00: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f esult = Tcl_GetO
0d10: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 bjResult(interp)
0d20: 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d ;..if (result ==
0d30: 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 NULL || Tcl_Get
0d40: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 IntFromObj(inter
0d50: 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 p, result, &ok)
0d60: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 != TCL_OK) {..
0d70: 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 20 20 20 ok = 1;..}.
0d80: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45 72 } else {../* Er
0d90: 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68 65 ror - reject the
0da0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a certificate */.
0db0: 09 6f 6b 20 3d 20 30 3b 0a 23 69 66 20 28 54 43 .ok = 0;.#if (TC
0dc0: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MAJOR_VERSION
0dd0: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 == 8) && (TCL_MI
0de0: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 NOR_VERSION < 6)
0df0: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
0e00: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 Error(interp);.#
0e10: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 else..Tcl_Backgr
0e20: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e oundException(in
0e30: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e terp, code);.#en
0e40: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 dif. }.. T
0e50: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
0e60: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
0e70: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 );. Tcl_Relea
0e80: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
0e90: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 interp);. ret
0ea0: 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 urn ok;.}.../*.
0eb0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ef0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43 ----. *. * InfoC
0f00: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a allback --. *. *
0f10: 09 6d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f .monitors SSL co
0f20: 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 nnection process
0f30: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
0f40: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
0f50: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
0f60: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
0f70: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 2d 2d 2d f defined). *---
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fc0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 . */.static void
0fd0: 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 28 63 6f .InfoCallback(co
0fe0: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e nst SSL *ssl, in
0ff0: 74 20 77 68 65 72 65 2c 20 69 6e 74 20 72 65 74 t where, int ret
1000: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
1010: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
1020: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 *)SSL_get_app_da
1030: 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a ta((SSL *)ssl);.
1040: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
1050: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
1060: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
1070: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
1080: 20 20 20 20 63 68 61 72 20 2a 6d 61 6a 6f 72 3b char *major;
1090: 20 63 68 61 72 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 char *minor;..
10a0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
10b0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
10c0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
10d0: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e k == (Tcl_Obj*)N
10e0: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 23 ULL)..return;..#
10f0: 69 66 20 30 0a 20 20 20 20 69 66 20 28 77 68 65 if 0. if (whe
1100: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 re & SSL_CB_ALER
1110: 54 29 20 7b 0a 09 73 65 76 20 3d 20 53 53 4c 5f T) {..sev = SSL_
1120: 61 6c 65 72 74 5f 74 79 70 65 5f 73 74 72 69 6e alert_type_strin
1130: 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a 09 69 66 g_long(ret);..if
1140: 20 28 73 74 72 63 6d 70 28 73 65 76 2c 20 22 66 (strcmp(sev, "f
1150: 61 74 61 6c 22 29 3d 3d 30 29 20 7b 09 2f 2a 20 atal")==0) {./*
1160: 4d 61 70 20 74 6f 20 65 72 72 6f 72 20 2a 2f 0a Map to error */.
1170: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 . Tls_Error(s
1180: 74 61 74 65 50 74 72 2c 20 53 53 4c 5f 45 52 52 tatePtr, SSL_ERR
1190: 4f 52 28 73 73 6c 2c 20 30 29 29 3b 0a 09 20 20 OR(ssl, 0));..
11a0: 20 20 72 65 74 75 72 6e 3b 0a 09 7d 0a 20 20 20 return;..}.
11b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 }.#endif.. i
11c0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
11d0: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 B_HANDSHAKE_STAR
11e0: 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 T) {..major = "h
11f0: 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f andshake";..mino
1200: 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 r = "start";.
1210: 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 } else if (wher
1220: 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 e & SSL_CB_HANDS
1230: 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 HAKE_DONE) {..ma
1240: 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 jor = "handshake
1250: 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e ";..minor = "don
1260: 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b e";. } else {
1270: 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 ..if (where & SS
1280: 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a L_CB_ALERT)..maj
1290: 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 or = "alert";..e
12a0: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 lse if (where &
12b0: 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 SSL_ST_CONNECT).
12c0: 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 major = "connect
12d0: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 ";..else if (whe
12e0: 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 re & SSL_ST_ACCE
12f0: 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 PT)..major = "ac
1300: 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 cept";..else....
1310: 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 .major = "unknow
1320: 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 n";...if (where
1330: 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 & SSL_CB_READ)..
1340: 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a minor = "read";.
1350: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 .else if (where
1360: 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 & SSL_CB_WRITE).
1370: 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 .minor = "write"
1380: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
1390: 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 e & SSL_CB_LOOP)
13a0: 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 ..minor = "loop"
13b0: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
13c0: 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 e & SSL_CB_EXIT)
13d0: 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 ..minor = "exit"
13e0: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f ;..else.....mino
13f0: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 r = "unknown";.
1400: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
1410: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
1420: 76 61 6c 20 66 72 6f 6d 20 63 61 6c 6c 62 61 63 val from callbac
1430: 6b 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 k */. cmdPtr
1440: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
1450: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c bj(statePtr->cal
1460: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f lback);. Tcl_
1470: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1480: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1490: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
14a0: 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 ngObj("info", -1
14b0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
14c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
14d0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
14e0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
14f0: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 ingObj(Tcl_GetCh
1500: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
1510: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b tr->self), -1));
1520: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1530: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1540: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
1550: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
1560: 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ajor, -1));.
1570: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1580: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1590: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
15a0: 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72 2c StringObj(minor,
15b0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 -1));.. if (
15c0: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 where & SSL_CB_A
15d0: 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 LERT) {..Tcl_Lis
15e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
15f0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
1600: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
1610: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 ringObj(SSL_aler
1620: 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c 6f t_desc_string_lo
1630: 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 09 ng(ret), -1));..
1640: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1650: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1660: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
1670: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 l_NewStringObj(S
1680: 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73 74 SL_alert_type_st
1690: 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 ring_long(ret),
16a0: 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 -1));. } else
16b0: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
16c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
16d0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
16e0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
16f0: 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 bj(SSL_state_str
1700: 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d ing_long(ssl), -
1710: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
1720: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1730: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
1740: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1750: 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 "info", -1));.
1760: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c }.. /* Eval
1770: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
1780: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
1790: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
17a0: 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 );. EvalCallb
17b0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ack(interp, stat
17c0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 ePtr, cmdPtr);.
17d0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
17e0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c unt(cmdPtr);.}..
17f0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
1800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
1840: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d VerifyCallback -
1850: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 -. *. *.Monitors
1860: 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 74 65 SSL certificate
1870: 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63 validation proc
1880: 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63 6f 6e ess. Used to con
1890: 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65 68 61 trol the. *.beha
18a0: 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20 53 53 vior when the SS
18b0: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20 66 6c L_VERIFY_PEER fl
18c0: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 ag is set. This
18d0: 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77 68 65 is called. *.whe
18e0: 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69 63 never a certific
18f0: 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 64 ate is inspected
1900: 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 61 or decided inva
1910: 6c 69 64 2e 0a 20 2a 0a 20 2a 20 43 68 65 63 6b lid.. *. * Check
1920: 73 3a 0a 20 2a 09 63 65 72 74 69 66 69 63 61 74 s:. *.certificat
1930: 65 20 63 68 61 69 6e 20 69 73 20 63 68 65 63 6b e chain is check
1940: 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 ed starting with
1950: 20 74 68 65 20 64 65 65 70 65 73 74 20 6e 65 73 the deepest nes
1960: 74 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20 20 ting level. *.
1970: 28 74 68 65 20 72 6f 6f 74 20 43 41 20 63 65 72 (the root CA cer
1980: 74 69 66 69 63 61 74 65 29 20 61 6e 64 20 77 6f tificate) and wo
1990: 72 6b 65 64 20 75 70 77 61 72 64 20 74 6f 20 74 rked upward to t
19a0: 68 65 20 70 65 65 72 27 73 20 63 65 72 74 69 66 he peer's certif
19b0: 69 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 icate.. *.All si
19c0: 67 6e 61 74 75 72 65 73 20 61 72 65 20 76 61 6c gnatures are val
19d0: 69 64 2c 20 63 75 72 72 65 6e 74 20 74 69 6d 65 id, current time
19e0: 20 69 73 20 77 69 74 68 69 6e 20 66 69 72 73 74 is within first
19f0: 20 61 6e 64 20 6c 61 73 74 20 76 61 6c 69 64 69 and last validi
1a00: 74 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65 63 ty time.. *.Chec
1a10: 6b 20 74 68 61 74 20 74 68 65 20 63 65 72 74 69 k that the certi
1a20: 66 69 63 61 74 65 20 69 73 20 69 73 73 75 65 64 ficate is issued
1a30: 20 62 79 20 74 68 65 20 69 73 73 75 65 72 20 63 by the issuer c
1a40: 65 72 74 69 66 69 63 61 74 65 20 69 73 73 75 65 ertificate issue
1a50: 72 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 r.. *.Check the
1a60: 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 revocation statu
1a70: 73 20 66 6f 72 20 65 61 63 68 20 63 65 72 74 69 s for each certi
1a80: 66 69 63 61 74 65 2e 0a 20 2a 09 43 68 65 63 6b ficate.. *.Check
1a90: 20 74 68 65 20 76 61 6c 69 64 69 74 79 20 6f 66 the validity of
1aa0: 20 74 68 65 20 67 69 76 65 6e 20 43 52 4c 20 61 the given CRL a
1ab0: 6e 64 20 74 68 65 20 63 65 72 74 20 72 65 76 6f nd the cert revo
1ac0: 63 61 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a 20 cation status..
1ad0: 2a 09 43 68 65 63 6b 20 74 68 65 20 70 6f 6c 69 *.Check the poli
1ae0: 63 69 65 73 20 6f 66 20 61 6c 6c 20 74 68 65 20 cies of all the
1af0: 63 65 72 74 69 66 69 63 61 74 65 73 0a 20 2a 0a certificates. *.
1b00: 20 2a 20 41 72 67 73 0a 20 2a 09 70 72 65 76 65 * Args. *.preve
1b10: 72 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74 65 rify_ok indicate
1b20: 73 20 77 68 65 74 68 65 72 20 74 68 65 20 63 65 s whether the ce
1b30: 72 74 69 66 69 63 61 74 65 20 76 65 72 69 66 69 rtificate verifi
1b40: 63 61 74 69 6f 6e 20 70 61 73 73 65 64 20 28 31 cation passed (1
1b50: 29 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a 0a ) or not (0). *.
1b60: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
1b70: 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 20 callback bound
1b80: 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20 6d 61 to the socket ma
1b90: 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 3a y return one of:
1ba0: 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20 74 68 . *. 0...- th
1bb0: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 e certificate is
1bc0: 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69 64 2c deemed invalid,
1bd0: 20 73 65 6e 64 20 76 65 72 69 66 69 63 61 74 69 send verificati
1be0: 6f 6e 0a 20 2a 09 09 09 09 20 20 66 61 69 6c 75 on. *.... failu
1bf0: 72 65 20 61 6c 65 72 74 20 74 6f 20 70 65 65 72 re alert to peer
1c00: 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 20 , and terminate
1c10: 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 handshake.. *.
1c20: 20 20 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 1...- the cert
1c30: 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 ificate is deeme
1c40: 64 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 d valid, continu
1c50: 65 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 e with handshake
1c60: 2e 0a 20 2a 09 20 20 20 20 65 6d 70 74 79 20 73 .. *. empty s
1c70: 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e 67 tring.- no chang
1c80: 65 20 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 e to certificate
1c90: 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 validation. *.
1ca0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
1cb0: 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 *.The err field
1cc0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c of the currentl
1cd0: 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 y operative Stat
1ce0: 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f e is set. *. to
1cf0: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 a string descri
1d00: 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 bing the SSL neg
1d10: 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 otiation failure
1d20: 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d 2d 2d 2d 2d reason. *------
1d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
1d70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 /.static int.Ver
1d80: 69 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 ifyCallback(int
1d90: 6f 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 ok, X509_STORE_C
1da0: 54 58 20 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 TX *ctx) {. T
1db0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
1dc0: 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 SSL *ssl..
1dd0: 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f = (SSL*)X509_STO
1de0: 52 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 RE_CTX_get_ex_da
1df0: 74 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f ta(ctx, SSL_get_
1e00: 65 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54 4f ex_data_X509_STO
1e10: 52 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 RE_CTX_idx());.
1e20: 20 20 20 58 35 30 39 20 20 2a 63 65 72 74 09 09 X509 *cert..
1e30: 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 = X509_STORE_CTX
1e40: 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 _get_current_cer
1e50: 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61 74 t(ctx);. Stat
1e60: 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 e *statePtr.= (S
1e70: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 tate*)SSL_get_ap
1e80: 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 p_data(ssl);.
1e90: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
1ea0: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e erp.= statePtr->
1eb0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 interp;. int
1ec0: 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53 54 depth..= X509_ST
1ed0: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f ORE_CTX_get_erro
1ee0: 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20 20 r_depth(ctx);.
1ef0: 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35 30 int err..= X50
1f00: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 9_STORE_CTX_get_
1f10: 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 error(ctx);..
1f20: 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 dprintf("Verify
1f30: 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 : %d", ok);..
1f40: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
1f50: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a cmd == (Tcl_Obj*
1f60: 29 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 73 74 )NULL) {..if (st
1f70: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 atePtr->vflags &
1f80: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c SSL_VERIFY_FAIL
1f90: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 _IF_NO_PEER_CERT
1fa0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ) {.. return
1fb0: 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 ok;..} else {..
1fc0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a return 1;..}.
1fd0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
1fe0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
1ff0: 65 76 61 6c 20 66 72 6f 6d 20 63 61 6c 6c 62 61 eval from callba
2000: 63 6b 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 ck */. cmdPtr
2010: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
2020: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 Obj(statePtr->vc
2030: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 md);. Tcl_Lis
2040: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2050: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
2060: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
2070: 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29 bj("verify", -1)
2080: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2090: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
20a0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
20b0: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 .Tcl_NewStringOb
20c0: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
20d0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
20e0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 elf), -1));.
20f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2100: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2110: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
2120: 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a IntObj(depth));.
2130: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2140: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2150: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 erp, cmdPtr, Tls
2160: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 _NewX509Obj(inte
2170: 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20 rp, cert));.
2180: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2190: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
21a0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
21b0: 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 IntObj(ok));.
21c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
21d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
21e0: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e , cmdPtr,..Tcl_N
21f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 ewStringObj((cha
2200: 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 r*)X509_verify_c
2210: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 ert_error_string
2220: 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 (err), -1));..
2230: 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 statePtr->flag
2240: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c s |= TLS_TCL_CAL
2250: 4c 42 41 43 4b 3b 0a 0a 20 20 20 20 2f 2a 20 45 LBACK;.. /* E
2260: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d val callback com
2270: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f mand */. Tcl_
2280: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
2290: 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 Ptr);. ok = E
22a0: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 valCallback(inte
22b0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d rp, statePtr, cm
22c0: 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 dPtr);. Tcl_D
22d0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ecrRefCount(cmdP
22e0: 74 72 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 tr);.. stateP
22f0: 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 tr->flags &= ~(T
2300: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 LS_TCL_CALLBACK)
2310: 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 ;. return(ok)
2320: 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c ;./* By default,
2330: 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74 leave verificat
2340: 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a ion unchanged..*
2350: 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d /.}.../*. *-----
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
23a0: 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d *. * Tls_Error -
23b0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 -. *. *.Calls ca
23c0: 6c 6c 62 61 63 6b 20 77 69 74 68 20 24 66 64 20 llback with $fd
23d0: 61 6e 64 20 24 6d 73 67 20 2d 20 73 6f 20 74 68 and $msg - so th
23e0: 65 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 64 e callback can d
23f0: 65 63 69 64 65 0a 20 2a 09 77 68 61 74 20 74 6f ecide. *.what to
2400: 20 64 6f 20 77 69 74 68 20 65 72 72 6f 72 73 2e do with errors.
2410: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
2420: 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 cts:. *.The err
2430: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 field of the cur
2440: 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 rently operative
2450: 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a State is set. *
2460: 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 . to a string d
2470: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 escribing the SS
2480: 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 L negotiation fa
2490: 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d ilure reason. *-
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24e0: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f --. */.void.Tls_
24f0: 45 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 Error(State *sta
2500: 74 65 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 tePtr, char *msg
2510: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 ) {. Tcl_Inte
2520: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
2530: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
2540: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
2550: 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 tr;.. dprintf
2560: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
2570: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
2580: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f allback == (Tcl_
2590: 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 Obj*)NULL)..retu
25a0: 72 6e 3b 0a 0a 20 20 20 20 69 66 20 28 6d 73 67 rn;.. if (msg
25b0: 20 26 26 20 2a 6d 73 67 29 20 7b 0a 09 54 63 6c && *msg) {..Tcl
25c0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
25d0: 74 65 72 70 2c 20 22 53 53 4c 22 2c 20 6d 73 67 terp, "SSL", msg
25e0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
25f0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6d . } else {..m
2600: 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 sg = Tcl_GetStri
2610: 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 ngFromObj(Tcl_Ge
2620: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
2630: 70 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d p), NULL);. }
2640: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 . statePtr->e
2650: 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 2f rr = msg;.. /
2660: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 * Create command
2670: 20 74 6f 20 65 76 61 6c 20 66 72 6f 6d 20 63 61 to eval from ca
2680: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 63 6d llback */. cm
2690: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
26a0: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
26b0: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 ->callback);.
26c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
26d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
26e0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
26f0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f wStringObj("erro
2700: 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 r", -1));. Tc
2710: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2720: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
2730: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
2740: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
2750: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
2760: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
2770: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
2780: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2790: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
27a0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
27b0: 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a gObj(msg, -1));.
27c0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
27d0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
27e0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
27f0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
2800: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 EvalCallback(
2810: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
2820: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 , cmdPtr);. T
2830: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
2840: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a cmdPtr);.}.../*.
2850: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2890: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c -----. *. * KeyL
28a0: 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a ogCallback --. *
28b0: 0a 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 . *.Write receiv
28c0: 65 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c ed key data to l
28d0: 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 og file.. *. * S
28e0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
28f0: 6e 6f 6e 65 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d none. *---------
2900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 ----------. */.v
2940: 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 oid KeyLogCallba
2950: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 ck(const SSL *ss
2960: 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c l, const char *l
2970: 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20 ine) {. char
2980: 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53 *str = getenv(SS
2990: 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 LKEYLOGFILE);.
29a0: 20 20 46 49 4c 45 20 2a 66 64 3b 0a 20 20 20 20 FILE *fd;.
29b0: 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d if (str) {..fd =
29c0: 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29 fopen(str, "a")
29d0: 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22 ;..fprintf(fd, "
29e0: 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 %s\n",line);..fc
29f0: 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a lose(fd);. }.
2a00: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
2a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
2a50: 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c * Password Call
2a60: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 back --. *. *.Ca
2a70: 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 lled when a pass
2a80: 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 74 word is needed t
2a90: 6f 20 75 6e 70 61 63 6b 20 52 53 41 20 61 6e 64 o unpack RSA and
2aa0: 20 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 45 76 PEM keys.. *.Ev
2ab0: 61 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 70 61 als any bound pa
2ac0: 73 73 77 6f 72 64 20 73 63 72 69 70 74 20 61 6e ssword script an
2ad0: 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65 d returns the re
2ae0: 73 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 20 70 sult as. *.the p
2af0: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 2e 0a assword string..
2b00: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
2b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b40: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
2b50: 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c int.PasswordCal
2b60: 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c lback(char *buf,
2b70: 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76 int size, int v
2b80: 65 72 69 66 79 2c 20 76 6f 69 64 20 2a 75 64 61 erify, void *uda
2b90: 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 ta) {. State
2ba0: 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 *statePtr.= (Sta
2bb0: 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 te *) udata;.
2bc0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
2bd0: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e erp.= statePtr->
2be0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f interp;. Tcl_
2bf0: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 Obj *cmdPtr;.
2c00: 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 int code;..
2c10: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
2c20: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
2c30: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d ePtr->password =
2c40: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 = NULL) {..if (T
2c50: 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 cl_EvalEx(interp
2c60: 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 , "tls::password
2c70: 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f ", -1, TCL_EVAL_
2c80: 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f GLOBAL) == TCL_O
2c90: 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a K) {.. char *
2ca0: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 ret = (char *) T
2cb0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 cl_GetStringResu
2cc0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 lt(interp);..
2cd0: 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 strncpy(buf, re
2ce0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 t, (size_t) size
2cf0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 );.. return (
2d00: 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b int)strlen(ret);
2d10: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
2d20: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 return -1;..}.
2d30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
2d40: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
2d50: 61 6c 20 66 72 6f 6d 20 63 61 6c 6c 62 61 63 6b al from callback
2d60: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
2d70: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
2d80: 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 j(statePtr->pass
2d90: 77 6f 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f word);.. Tcl_
2da0: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
2db0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
2dc0: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
2dd0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
2de0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 tePtr);.. /*
2df0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 61 6e Eval callback an
2e00: 64 20 73 75 63 63 65 73 73 20 66 6f 72 20 6f 6b d success for ok
2e10: 2c 20 61 62 6f 72 74 20 66 6f 72 20 65 72 72 6f , abort for erro
2e20: 72 2c 20 63 6f 6e 74 69 6e 75 65 20 66 6f 72 20 r, continue for
2e30: 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20 continue */.
2e40: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
2e50: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
2e60: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
2e70: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
2e80: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
2e90: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
2ea0: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
2eb0: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
2ec0: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
2ed0: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
2ee0: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
2ef0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
2f00: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
2f10: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
2f20: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
2f30: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
2f40: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
2f50: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
2f60: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
2f70: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
2f80: 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 ePtr);.. if (
2f90: 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 code == TCL_OK)
2fa0: 7b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 {..char *ret = (
2fb0: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 char *) Tcl_GetS
2fc0: 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 tringResult(inte
2fd0: 72 70 29 3b 0a 09 69 66 20 28 73 74 72 6c 65 6e rp);..if (strlen
2fe0: 28 72 65 74 29 20 3c 20 73 69 7a 65 20 2d 20 31 (ret) < size - 1
2ff0: 29 20 7b 0a 09 20 20 20 20 73 74 72 6e 63 70 79 ) {.. strncpy
3000: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 (buf, ret, (size
3010: 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 _t) size);..
3020: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
3030: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
3040: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 ;.. return (i
3050: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a nt)strlen(ret);.
3060: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c .}. }. Tcl
3070: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
3080: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
3090: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 76 return -1;..v
30a0: 65 72 69 66 79 20 3d 20 76 65 72 69 66 79 3b 0a erify = verify;.
30b0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
30c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
3100: 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 * Session Callb
3110: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 ack for Clients
3120: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
3130: 77 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 when a new sessi
3140: 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 on is added to t
3150: 68 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 he cache. In TLS
3160: 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 1.3. *.this may
3170: 20 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c be received mul
3180: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 tiple times afte
3190: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e r the handshake.
31a0: 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 For. *.earlier
31b0: 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 versions, this w
31c0: 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 ill be received
31d0: 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 during the hands
31e0: 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 hake.. *.This is
31f0: 20 74 68 65 20 70 72 65 66 65 72 72 65 64 20 77 the preferred w
3200: 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 ay to obtain a r
3210: 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e esumable session
3220: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
3230: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
3240: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
3250: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
3260: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
3270: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
3280: 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 *.0 = error whe
3290: 72 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 re session will
32a0: 62 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 be immediately r
32b0: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 emoved from the
32c0: 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a internal cache..
32d0: 20 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 *.1 = success w
32e0: 68 65 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 here app retains
32f0: 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 session in sess
3300: 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d ion cache, and m
3310: 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 ust call SSL_SES
3320: 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e SION_free() when
3330: 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d done.. *. *----
3340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3380: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 */.static int.S
3390: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 essionCallback(c
33a0: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 53 onst SSL *ssl, S
33b0: 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 SL_SESSION *sess
33c0: 69 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65 ion) {. State
33d0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
33e0: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 ate*)SSL_get_app
33f0: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c _data((SSL *)ssl
3400: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 );. Tcl_Inter
3410: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
3420: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
3430: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
3440: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 r;. const uns
3450: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b igned char *tick
3460: 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e et;. const un
3470: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 signed char *ses
3480: 73 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a sion_id;. siz
3490: 65 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e e_t len2;. un
34a0: 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b signed int ulen;
34b0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
34c0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
34d0: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
34e0: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
34f0: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 *)NULL) {..retur
3500: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
3510: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 _OK;. } else
3520: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 if (ssl == NULL)
3530: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
3540: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
3550: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
3560: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
3570: 20 65 76 61 6c 20 66 72 6f 6d 20 63 61 6c 6c 62 eval from callb
3580: 61 63 6b 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 ack */. cmdPt
3590: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
35a0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 eObj(statePtr->c
35b0: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 allback);. Tc
35c0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
35d0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
35e0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
35f0: 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e ringObj("session
3600: 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a ", -1));.. /*
3610: 20 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 Session id */.
3620: 20 20 20 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 session_id =
3630: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
3640: 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 id(session, &ule
3650: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 n);. Tcl_List
3660: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3670: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3680: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 Tcl_NewByteArra
3690: 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c yObj(session_id,
36a0: 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 0a (int) ulen));..
36b0: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 /* Session t
36c0: 69 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c icket */. SSL
36d0: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 _SESSION_get0_ti
36e0: 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 cket(session, &t
36f0: 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 icket, &len2);.
3700: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3710: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3720: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
3730: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 NewByteArrayObj(
3740: 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 ticket, (int) le
3750: 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 n2));.. /* Li
3760: 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 fetime - number
3770: 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 of seconds */.
3780: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
3790: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
37a0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f p, cmdPtr,..Tcl_
37b0: 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 NewLongObj((long
37c0: 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 ) SSL_SESSION_ge
37d0: 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d t_ticket_lifetim
37e0: 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 e_hint(session))
37f0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 );.. /* Eval
3800: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
3810: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 */. Tcl_Incr
3820: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
3830: 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 ;. EvalCallba
3840: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 ck(interp, state
3850: 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 Ptr, cmdPtr);.
3860: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
3870: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
3880: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a return 0;.}.../*
3890: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
38a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 ------. *. * ALP
38e0: 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 N Callback for S
38f0: 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 ervers and NPN C
3900: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 allback for Clie
3910: 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 nts --. *. *.Per
3920: 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 form protocol (h
3930: 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c ttp/1.1, h2, h3,
3940: 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e etc.) selection
3950: 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f for the. *.inco
3960: 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e ming connection.
3970: 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 Called after He
3980: 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 llo and server c
3990: 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 allbacks.. *.Whe
39a0: 72 65 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65 re 'out' is sele
39b0: 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e cted protocol an
39c0: 64 20 27 69 6e 27 20 69 73 20 74 68 65 20 70 65 d 'in' is the pe
39d0: 65 72 20 61 64 76 65 72 74 69 73 65 64 20 6c 69 er advertised li
39e0: 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 st.. *. * Result
39f0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
3a00: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
3a10: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
3a20: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
3a30: 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 . * Return codes
3a40: 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f :. *.SSL_TLSEXT_
3a50: 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f ERR_OK: ALPN pro
3a60: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 tocol selected.
3a70: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
3a80: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c ontinues.. *.SSL
3a90: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 _TLSEXT_ERR_ALER
3aa0: 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77 T_FATAL: There w
3ab0: 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 as no overlap be
3ac0: 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 tween the client
3ad0: 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69 's. *. suppli
3ae0: 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 ed list and the
3af0: 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61 server configura
3b00: 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 tion. The connec
3b10: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f tion will be abo
3b20: 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 rted.. *.SSL_TLS
3b30: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 EXT_ERR_NOACK: A
3b40: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 LPN protocol not
3b50: 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c selected, e.g.,
3b60: 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e because no ALPN
3b70: 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c . *. protocol
3b80: 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 s are configured
3b90: 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 for this connec
3ba0: 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 tion. The connec
3bb0: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a tion continues..
3bc0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
3bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
3c10: 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c tic int.ALPNCall
3c20: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a back(const SSL *
3c30: 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 ssl, const unsig
3c40: 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 ned char **out,
3c50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f unsigned char *o
3c60: 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e utlen,..const un
3c70: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c signed char *in,
3c80: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e unsigned int in
3c90: 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 len, void *arg)
3ca0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
3cb0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
3cc0: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 arg;. Tcl_Int
3cd0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
3ce0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
3cf0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 Tcl_Obj *cmd
3d00: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 Ptr;. int cod
3d10: 65 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 e, res;.. dpr
3d20: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
3d30: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 . if (ssl ==
3d40: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e NULL || arg == N
3d50: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
3d60: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
3d70: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ACK;. }..
3d80: 2f 2a 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 /* Select protoc
3d90: 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 ol */. if (SS
3da0: 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 L_select_next_pr
3db0: 6f 74 6f 28 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c oto(out, outlen,
3dc0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f statePtr->proto
3dd0: 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f s, statePtr->pro
3de0: 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e tos_len,..in, in
3df0: 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f len) == OPENSSL_
3e00: 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 NPN_NEGOTIATED)
3e10: 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e {../* Match foun
3e20: 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f d */..res = SSL_
3e30: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 TLSEXT_ERR_OK;.
3e40: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 } else {../*
3e50: 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f OPENSSL_NPN_NO_O
3e60: 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 VERLAP = No over
3e70: 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 lap, so use firs
3e80: 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 t item from clie
3e90: 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 nt protocol list
3ea0: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 */..res = SSL_T
3eb0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
3ec0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
3ed0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
3ee0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
3ef0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b ) {..return res;
3f00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
3f10: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
3f20: 20 65 76 61 6c 20 66 72 6f 6d 20 63 61 6c 6c 62 eval from callb
3f30: 61 63 6b 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 ack */. cmdPt
3f40: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
3f50: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 eObj(statePtr->v
3f60: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 cmd);. Tcl_Li
3f70: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
3f80: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
3f90: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
3fa0: 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 Obj("alpn", -1))
3fb0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3fc0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3fd0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3fe0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
3ff0: 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 *out, -1));..
4000: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 /* Eval callbac
4010: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 k command */.
4020: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
4030: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 t(cmdPtr);. i
4040: 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 f ((code = EvalC
4050: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
4060: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
4070: 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d )) > 1) {..res =
4080: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
4090: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 NOACK;. } els
40a0: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 e if (code == 1)
40b0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
40c0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
40d0: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
40e0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
40f0: 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 ALERT_FATAL;.
4100: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 }. Tcl_DecrR
4110: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
4120: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b . return res;
4130: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4180: 0a 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 . * Advertise Pr
4190: 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b otocols Callback
41a0: 20 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 for Next Protoc
41b0: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 ol Negotiation (
41c0: 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 NPN) in ServerHe
41d0: 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c llo --. *. *.cal
41e0: 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 led when a TLS s
41f0: 65 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 erver needs a li
4200: 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 st of supported
4210: 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 protocols for Ne
4220: 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e xt. *.Protocol N
4230: 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 egotiation.. *.
4240: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
4250: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
4260: 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 fects:. *. * Ret
4270: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
4280: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a L_TLSEXT_ERR_OK:
4290: 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 NPN protocol se
42a0: 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e lected. The conn
42b0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
42c0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
42d0: 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 ERR_NOACK: NPN p
42e0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 rotocol not sele
42f0: 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 cted. The connec
4300: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a tion continues..
4310: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
4320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4350: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 --------. */.#if
4360: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 def USE_NPN.stat
4370: 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 ic int.NPNCallba
4380: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 ck(const SSL *ss
4390: 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 l, const unsigne
43a0: 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e d char **out, un
43b0: 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c signed int *outl
43c0: 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b en, void *arg) {
43d0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
43e0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
43f0: 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 rg;.. dprintf
4400: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
4410: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
4420: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 || arg == NULL)
4430: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
4440: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
4450: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
4460: 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 et protocols lis
4470: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 t */. if (sta
4480: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d tePtr->protos !=
4490: 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d NULL) {..*out =
44a0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f statePtr->proto
44b0: 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 s;..*outlen = st
44c0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c atePtr->protos_l
44d0: 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b en;. } else {
44e0: 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 ..*out = NULL;..
44f0: 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 *outlen = 0;..re
4500: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
4510: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
4520: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f . return SSL_
4530: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d TLSEXT_ERR_OK;.}
4540: 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d .#endif.../*. *-
4550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4590: 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c --. *. * SNI Cal
45a0: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 lback for Server
45b0: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f s --. *. *.Perfo
45c0: 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 rm server-side S
45d0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 NI hostname sele
45e0: 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 ction after rece
45f0: 69 76 69 6e 67 20 53 4e 49 20 68 65 61 64 65 72 iving SNI header
4600: 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 61 66 74 65 .. *.Called afte
4610: 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b r hello callback
4620: 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c 50 4e but before ALPN
4630: 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a callback.. *. *
4640: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
4650: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
4660: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 ects:. *.Calls c
4670: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 allback (if defi
4680: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ned). *. * Retur
4690: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f n codes:. *.SSL_
46a0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 TLSEXT_ERR_OK: S
46b0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 NI hostname is a
46c0: 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e ccepted. The con
46d0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
46e0: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s.. *.SSL_TLSEXT
46f0: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
4700: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 : SNI hostname i
4710: 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2e 20 s not accepted.
4720: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 The connection.
4730: 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74 65 64 *. is aborted
4740: 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20 61 6c . Default for al
4750: 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f 55 4e ert is SSL_AD_UN
4760: 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e RECOGNIZED_NAME.
4770: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
4780: 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 RR_ALERT_WARNING
4790: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 : SNI hostname i
47a0: 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2c 20 s not accepted,
47b0: 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a 20 2a warning alert. *
47c0: 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 20 73 . sent (not s
47d0: 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c 53 76 upported in TLSv
47e0: 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e 65 63 1.3). The connec
47f0: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a tion continues..
4800: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
4810: 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 6f 73 R_NOACK: SNI hos
4820: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 tname is not acc
4830: 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 61 63 epted and not ac
4840: 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a 09 20 knowledged,. *.
4850: 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 20 68 e.g. if SNI h
4860: 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6e 66 as not been conf
4870: 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f 6e 6e igured. The conn
4880: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
4890: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
48e0: 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 61 6c tatic int.SNICal
48f0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 lback(const SSL
4900: 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 *ssl, int *alert
4910: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 , void *arg) {.
4920: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
4930: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 tr = (State*)arg
4940: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ;. Tcl_Interp
4950: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
4960: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
4970: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
4980: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 ;. int code,
4990: 72 65 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 res;. char *s
49a0: 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c ervername = NULL
49b0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
49c0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
49d0: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c f (ssl == NULL |
49e0: 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b | arg == NULL) {
49f0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
4a00: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
4a10: 20 20 20 7d 0a 0a 20 20 20 20 73 65 72 76 65 72 }.. server
4a20: 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 name = SSL_get_s
4a30: 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 ervername(ssl, T
4a40: 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 LSEXT_NAMETYPE_h
4a50: 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 ost_name);. i
4a60: 66 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c f (!servername |
4a70: 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 | servername[0]
4a80: 3d 3d 20 27 5c 30 27 29 20 7b 0a 20 20 20 20 20 == '\0') {.
4a90: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c return SSL_TL
4aa0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4ab0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
4ac0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d tatePtr->vcmd ==
4ad0: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 (Tcl_Obj*)NULL)
4ae0: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
4af0: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 LSEXT_ERR_OK;.
4b00: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
4b10: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
4b20: 61 6c 20 66 72 6f 6d 20 63 61 6c 6c 62 61 63 6b al from callback
4b30: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
4b40: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
4b50: 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 j(statePtr->vcmd
4b60: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
4b70: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
4b80: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
4b90: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
4ba0: 28 22 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 20 ("sni", -1));.
4bb0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
4bc0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
4bd0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
4be0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 ewStringObj(serv
4bf0: 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a ername , -1));..
4c00: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
4c10: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
4c20: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
4c30: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
4c40: 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 if ((code = Ev
4c50: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 alCallback(inter
4c60: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 p, statePtr, cmd
4c70: 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 Ptr)) > 1) {..re
4c80: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
4c90: 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 RR_ALERT_WARNING
4ca0: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f ;..*alert = SSL_
4cb0: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f AD_UNRECOGNIZED_
4cc0: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 NAME; /* Not sup
4cd0: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e ported by TLS 1.
4ce0: 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 3 */. } else
4cf0: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b if (code == 1) {
4d00: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 ..res = SSL_TLSE
4d10: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
4d20: 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 else {..res = S
4d30: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
4d40: 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c 65 ERT_FATAL;..*ale
4d50: 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 rt = SSL_AD_UNRE
4d60: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f COGNIZED_NAME; /
4d70: 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 * Not supported
4d80: 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 by TLS 1.3 */.
4d90: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 }. Tcl_Decr
4da0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
4db0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 ;. return res
4dc0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
4dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
4e10: 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c 6f *. * ClientHello
4e20: 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62 Handshake Callb
4e30: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 ack for Servers
4e40: 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79 --. *. *.Used by
4e50: 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69 server to exami
4e60: 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 ne the server na
4e70: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 me indication (S
4e80: 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a NI) extension. *
4e90: 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 .provided by the
4ea0: 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72 client in order
4eb0: 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70 to select an ap
4ec0: 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 66 propriate certif
4ed0: 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73 icate to. *.pres
4ee0: 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74 ent, and make ot
4ef0: 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f her configuratio
4f00: 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65 n adjustments re
4f10: 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73 levant to that s
4f20: 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e erver. *.name an
4f30: 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74 d its configurat
4f40: 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 ion. This includ
4f50: 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20 es swapping out
4f60: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 the associated.
4f70: 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65 *.SSL_CTX pointe
4f80: 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 r, modifying the
4f90: 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f server's list o
4fa0: 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20 f permitted TLS
4fb0: 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 versions,. *.cha
4fc0: 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 nging the server
4fd0: 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 69 's cipher list i
4fe0: 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 n response to th
4ff0: 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65 e client's ciphe
5000: 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 09 r list, etc.. *.
5010: 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 4e Called before SN
5020: 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c 62 I and ALPN callb
5030: 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 acks.. *. * Resu
5040: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
5050: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
5060: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
5070: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
5080: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
5090: 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e es:. *.SSL_CLIEN
50a0: 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 73 T_HELLO_RETRY: s
50b0: 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 73 uspend the hands
50c0: 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 61 hake, and the ha
50d0: 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e ndshake function
50e0: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d will return imm
50f0: 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c 5f ediately. *.SSL_
5100: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
5110: 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 72 OR: failure, ter
5120: 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f minate connectio
5130: 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f 20 n. Set alert to
5140: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53 error code.. *.S
5150: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
5160: 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 73 SUCCESS: success
5170: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
51c0: 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 atic int.HelloCa
51d0: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
51e0: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 *ssl, int *aler
51f0: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a t, void *arg) {.
5200: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
5210: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
5220: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 g;. Tcl_Inter
5230: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
5240: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
5250: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
5260: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c r;. int code,
5270: 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 res;. const
5280: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 char *servername
5290: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 ;. const unsi
52a0: 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 gned char *p;.
52b0: 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 size_t len, re
52c0: 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70 maining;.. dp
52d0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
52e0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
52f0: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c tr->vcmd == (Tcl
5300: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 _Obj*)NULL) {..r
5310: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
5320: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a _HELLO_SUCCESS;.
5330: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
5340: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 sl == NULL || ar
5350: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 g == NULL) {..re
5360: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
5370: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
5380: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e }.. /* Get n
5390: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 ames */. if (
53a0: 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c !SSL_client_hell
53b0: 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 o_get0_ext(ssl,
53c0: 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 TLSEXT_TYPE_serv
53d0: 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 er_name, &p, &re
53e0: 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 maining) || rema
53f0: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a ining <= 2) {..*
5400: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 alert = SSL_R_SS
5410: 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 LV3_ALERT_ILLEGA
5420: 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 20 20 20 L_PARAMETER;.
5430: 20 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f return SSL_
5440: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
5450: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
5460: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 * Extract the le
5470: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 ngth of the supp
5480: 6c 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d lied list of nam
5490: 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d es. */. len =
54a0: 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a (*(p++) << 8);.
54b0: 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b len += *(p++
54c0: 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b );. if (len +
54d0: 20 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 2 != remaining)
54e0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
54f0: 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 _R_SSLV3_ALERT_I
5500: 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 LLEGAL_PARAMETER
5510: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e ;. return
5520: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
5530: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 O_ERROR;. }.
5540: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c remaining = l
5550: 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 en;.. /* The
5560: 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 63 65 list in practice
5570: 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e 67 only has a sing
5580: 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77 le element, so w
5590: 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20 e only consider
55a0: 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a the first one. *
55b0: 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e /. if (remain
55c0: 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b ing == 0 || *p++
55d0: 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 != TLSEXT_NAMET
55e0: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b YPE_host_name) {
55f0: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 ..*alert = SSL_R
5600: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 _TLSV1_ALERT_INT
5610: 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 ERNAL_ERROR;.
5620: 20 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f return SSL_
5630: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
5640: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 OR;. }. re
5650: 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 maining--;..
5660: 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 69 /* Now we can fi
5670: 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74 nally pull out t
5680: 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 69 he byte array wi
5690: 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 6f th the actual ho
56a0: 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 stname. */. i
56b0: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 f (remaining <=
56c0: 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 2) {..*alert = S
56d0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 SL_R_TLSV1_ALERT
56e0: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b _INTERNAL_ERROR;
56f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 . return
5700: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
5710: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
5720: 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 len = (*(p++)
5730: 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b << 8);. len +
5740: 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 = *(p++);. if
5750: 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65 6d 61 (len + 2 > rema
5760: 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 ining) {..*alert
5770: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
5780: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
5790: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 72 65 74 ROR;. ret
57a0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
57b0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
57c0: 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 }. remaining
57d0: 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 = len;. serve
57e0: 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 rname = (const c
57f0: 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a har *)p;.. /*
5800: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 Create command
5810: 74 6f 20 65 76 61 6c 20 66 72 6f 6d 20 63 61 6c to eval from cal
5820: 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 63 6d 64 lback */. cmd
5830: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
5840: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
5850: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f >vcmd);. Tcl_
5860: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5870: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
5880: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
5890: 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d ngObj("hello", -
58a0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
58b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
58c0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
58d0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
58e0: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28 bj(servername, (
58f0: 69 6e 74 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 int) len));..
5900: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 /* Eval callbac
5910: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 k command */.
5920: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
5930: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 t(cmdPtr);. i
5940: 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 f ((code = EvalC
5950: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
5960: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
5970: 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d )) > 1) {..res =
5980: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
5990: 4f 5f 52 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74 O_RETRY;..*alert
59a0: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
59b0: 4c 45 52 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c LERT_USER_CANCEL
59c0: 4c 45 44 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 LED;. } else
59d0: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b if (code == 1) {
59e0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 ..res = SSL_CLIE
59f0: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 NT_HELLO_SUCCESS
5a00: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
5a10: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 res = SSL_CLIENT
5a20: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a _HELLO_ERROR;..*
5a30: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c alert = SSL_R_TL
5a40: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e SV1_ALERT_INTERN
5a50: 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a AL_ERROR;. }.
5a60: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
5a70: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
5a80: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a return res;.}.
5a90: 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
5aa0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d *******/./* Comm
5ab0: 61 6e 64 73 20 20 20 20 20 20 20 20 20 2a 2f 0a ands */.
5ac0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
5ad0: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d *****/../*. *---
5ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b20: 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 . *. * CiphersOb
5b30: 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 jCmd -- list ava
5b40: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a 20 ilable ciphers.
5b50: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
5b60: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 ure is invoked t
5b70: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 o process the "t
5b80: 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f 6d ls::ciphers" com
5b90: 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 mand. *.to list
5ba0: 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 available cipher
5bb0: 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70 72 s, based upon pr
5bc0: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e otocol selected.
5bd0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
5be0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
5bf0: 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 l result list..
5c00: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
5c10: 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 s:. *.constructs
5c20: 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53 53 and destroys SS
5c30: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a L context (CTX).
5c40: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
5c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c80: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
5c90: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a tic const char *
5ca0: 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a protocols[] = {.
5cb0: 09 22 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c ."ssl2", "ssl3",
5cc0: 20 22 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 "tls1", "tls1.1
5cd0: 22 2c 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c ", "tls1.2", "tl
5ce0: 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 s1.3", NULL.};.e
5cf0: 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 num protocol {.
5d00: 20 20 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 TLS_SSL2, TLS
5d10: 5f 53 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c _SSL3, TLS_TLS1,
5d20: 20 54 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 TLS_TLS1_1, TLS
5d30: 5f 54 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 _TLS1_2, TLS_TLS
5d40: 31 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 1_3, TLS_NONE.};
5d50: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 69 70 ..static int.Cip
5d60: 68 65 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e hersObjCmd(Clien
5d70: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
5d80: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
5d90: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
5da0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
5db0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
5dc0: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e _Obj *objPtr = N
5dd0: 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 ULL;. SSL_CTX
5de0: 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *ctx = NULL;.
5df0: 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c SSL *ssl = NUL
5e00: 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 L;. STACK_OF(
5e10: 53 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b SSL_CIPHER) *sk;
5e20: 0a 20 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62 . char *cp, b
5e30: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 uf[BUFSIZ];.
5e40: 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f int index, verbo
5e50: 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 se = 0, use_supp
5e60: 6f 72 74 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 orted = 0;..
5e70: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
5e80: 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a );.. if ((obj
5e90: 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 c < 2) || (objc
5ea0: 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f > 4)) {..Tcl_Wro
5eb0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
5ec0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 , 1, objv, "prot
5ed0: 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f ocol ?verbose? ?
5ee0: 73 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 supported?");..r
5ef0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
5f00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 . }. if (T
5f10: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f cl_GetIndexFromO
5f20: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
5f30: 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 1], protocols, "
5f40: 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 protocol", 0, &i
5f50: 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 ndex) != TCL_OK)
5f60: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
5f70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
5f80: 69 66 20 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 if ((objc > 2) &
5f90: 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e & Tcl_GetBoolean
5fa0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
5fb0: 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 objv[2], &verbos
5fc0: 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a e) != TCL_OK) {.
5fd0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
5fe0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
5ff0: 28 28 6f 62 6a 63 20 3e 20 33 29 20 26 26 20 54 ((objc > 3) && T
6000: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f cl_GetBooleanFro
6010: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
6020: 76 5b 33 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f v[3], &use_suppo
6030: 72 74 65 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 rted) != TCL_OK)
6040: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
6050: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
6060: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 ERR_clear_error
6070: 28 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 ();.. switch
6080: 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 ((enum protocol)
6090: 69 6e 64 65 78 29 20 7b 0a 09 63 61 73 65 20 54 index) {..case T
60a0: 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 4f 50 45 LS_SSL2:.#if OPE
60b0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
60c0: 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 BER >= 0x1010000
60d0: 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 0L || defined(NO
60e0: 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL2) || define
60f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
6100: 32 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 2).. Tcl_Appe
6110: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
6120: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 protocols[index
6130: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e ], ": protocol n
6140: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
6150: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ULL);.. retur
6160: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c n TCL_ERROR;.#el
6170: 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 se.. ctx = SS
6180: 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 32 5f L_CTX_new(SSLv2_
6190: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b method()); break
61a0: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 ;.#endif..case T
61b0: 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 LS_SSL3:.#if def
61c0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c ined(NO_SSL3) ||
61d0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
61e0: 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 _NO_SSL3) || def
61f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
6200: 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 SSL3_METHOD)..
6210: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
6220: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f lt(interp, proto
6230: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 cols[index], ":
6240: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
6250: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
6260: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
6270: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 ERROR;.#else..
6280: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f ctx = SSL_CTX_
6290: 6e 65 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64 new(SSLv3_method
62a0: 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 ()); break;.#end
62b0: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 if..case TLS_TLS
62c0: 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 1:.#if defined(N
62d0: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e O_TLS1) || defin
62e0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
62f0: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f S1) || defined(O
6300: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d PENSSL_NO_TLS1_M
6310: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f ETHOD).. Tcl_
6320: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
6330: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
6340: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
6350: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
6360: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 ", NULL);.. r
6370: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
6380: 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 .#else.. ctx
6390: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c = SSL_CTX_new(TL
63a0: 53 76 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 Sv1_method()); b
63b0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 reak;.#endif..ca
63c0: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 se TLS_TLS1_1:.#
63d0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
63e0: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_1) || defined
63f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
6400: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
6410: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
6420: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 _METHOD).. Tc
6430: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
6440: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
6450: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
6460: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
6470: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
6480: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
6490: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 R;.#else.. ct
64a0: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 x = SSL_CTX_new(
64b0: 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 TLSv1_1_method()
64c0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ); break;.#endif
64d0: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f ..case TLS_TLS1_
64e0: 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 2:.#if defined(N
64f0: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 O_TLS1_2) || def
6500: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
6510: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e TLS1_2) || defin
6520: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
6530: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 S1_2_METHOD)..
6540: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
6550: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f lt(interp, proto
6560: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 cols[index], ":
6570: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
6580: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
6590: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
65a0: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 ERROR;.#else..
65b0: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f ctx = SSL_CTX_
65c0: 6e 65 77 28 54 4c 53 76 31 5f 32 5f 6d 65 74 68 new(TLSv1_2_meth
65d0: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 od()); break;.#e
65e0: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
65f0: 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e LS1_3:.#if defin
6600: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c ed(NO_TLS1_3) ||
6610: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
6620: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 _NO_TLS1_3)..
6630: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
6640: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
6650: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
6660: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
6670: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
6680: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
6690: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 RROR;.#else..
66a0: 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e ctx = SSL_CTX_n
66b0: 65 77 28 54 4c 53 5f 6d 65 74 68 6f 64 28 29 29 ew(TLS_method())
66c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 53 ;. SS
66d0: 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 L_CTX_set_min_pr
66e0: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c oto_version(ctx,
66f0: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 TLS1_3_VERSION)
6700: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 ;.. SSL_CTX_s
6710: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 et_max_proto_ver
6720: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 sion(ctx, TLS1_3
6730: 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 _VERSION);..
6740: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 break;.#endif..d
6750: 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 62 72 65 efault:.. bre
6760: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 ak;. }. if
6770: 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b (ctx == NULL) {
6780: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
6790: 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f lt(interp, REASO
67a0: 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 N(), NULL);..ret
67b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
67c0: 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 }.. ssl =
67d0: 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 SSL_new(ctx);.
67e0: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c if (ssl == NUL
67f0: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
6800: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 Result(interp, R
6810: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a EASON(), NULL);.
6820: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
6830: 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f x);..return TCL_
6840: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
6850: 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 6e /* Use list an
6860: 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c 64 d order as would
6870: 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43 6c be sent in a Cl
6880: 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c ientHello or all
6890: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 available ciphe
68a0: 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 rs */. if (us
68b0: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 e_supported) {..
68c0: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 sk = SSL_get1_su
68d0: 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73 28 pported_ciphers(
68e0: 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ssl);. } else
68f0: 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 {..sk = SSL_get
6900: 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 _ciphers(ssl);.
6910: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b }.. if (sk
6920: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 != NULL) {..if
6930: 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 (!verbose) {..
6940: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
6950: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
6960: 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e L);.. for (in
6970: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f t i = 0; i < sk_
6980: 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 SSL_CIPHER_num(s
6990: 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e k); i++) {...con
69a0: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 st SSL_CIPHER *c
69b0: 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 = sk_SSL_CIPHER
69c0: 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 _value(sk, i);..
69d0: 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 .if (c == NULL)
69e0: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 continue;..../*
69f0: 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 cipher name or (
6a00: 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 NONE) */...cp =
6a10: 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e SSL_CIPHER_get_n
6a20: 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70 ame(c);...if (cp
6a30: 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b == NULL) break;
6a40: 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ...Tcl_ListObjAp
6a50: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
6a60: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
6a70: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c NewStringObj(cp,
6a80: 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 -1));.. }...
6a90: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 } else {.. ob
6aa0: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 jPtr = Tcl_NewSt
6ab0: 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 ringObj("",0);..
6ac0: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d for (int i =
6ad0: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 0; i < sk_SSL_C
6ae0: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 IPHER_num(sk); i
6af0: 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 ++) {...const SS
6b00: 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b L_CIPHER *c = sk
6b10: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 _SSL_CIPHER_valu
6b20: 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 e(sk, i);...if (
6b30: 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 c == NULL) conti
6b40: 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 nue;..../* textu
6b50: 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f al description o
6b60: 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a f the cipher */.
6b70: 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 ..if (SSL_CIPHER
6b80: 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 _description(c,
6b90: 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 buf, sizeof(buf)
6ba0: 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 ) != NULL) {...
6bb0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f Tcl_AppendToO
6bc0: 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 bj(objPtr, buf,
6bd0: 28 69 6e 74 29 20 73 74 72 6c 65 6e 28 62 75 66 (int) strlen(buf
6be0: 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ));...} else {..
6bf0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 . Tcl_AppendT
6c00: 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e oObj(objPtr, "UN
6c10: 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 KNOWN\n", 8);...
6c20: 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 }.. }..}..if
6c30: 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 (use_supported)
6c40: 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 {.. sk_SSL_CI
6c50: 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 PHER_free(sk);..
6c60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f }. }. SSL_
6c70: 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 free(ssl);. S
6c80: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
6c90: 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 ;.. Tcl_SetOb
6ca0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
6cb0: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 objPtr);. ret
6cc0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
6cd0: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
6ce0: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Data;.}.../*. *-
6cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d30: 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f --. *. * Protoco
6d40: 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 lsObjCmd -- list
6d50: 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f available proto
6d60: 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 cols. *. *.This
6d70: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
6d80: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
6d90: 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 the "tls::protoc
6da0: 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 ols" command. *.
6db0: 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c to list availabl
6dc0: 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a e protocols.. *.
6dd0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
6de0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
6df0: 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a sult list.. *. *
6e00: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
6e10: 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d *.none. *. *----
6e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
6e60: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 */.static int.P
6e70: 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 rotocolsObjCmd(C
6e80: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
6e90: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
6ea0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
6eb0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
6ec0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
6ed0: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 Tcl_Obj *objPtr
6ee0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
6ef0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
6f00: 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a f (objc != 1) {.
6f10: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
6f20: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
6f30: 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 v, "");..return
6f40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
6f50: 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
6f60: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
6f70: 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 NULL);..#if OPE
6f80: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
6f90: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 BER < 0x10100000
6fa0: 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f L && !defined(NO
6fb0: 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e _SSL2) && !defin
6fc0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
6fd0: 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 L2). Tcl_List
6fe0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
6ff0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
7000: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
7010: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f j(protocols[TLS_
7020: 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e SSL2], -1));.#en
7030: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
7040: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 (NO_SSL3) && !de
7050: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7060: 5f 53 53 4c 33 29 0a 20 20 20 20 54 63 6c 5f 4c _SSL3). Tcl_L
7070: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
7080: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
7090: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
70a0: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
70b0: 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a LS_SSL3], -1));.
70c0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
70d0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 ned(NO_TLS1) &&
70e0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
70f0: 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 54 63 _NO_TLS1). Tc
7100: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
7110: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
7120: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
7130: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
7140: 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 s[TLS_TLS1], -1)
7150: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
7160: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
7170: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
7180: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
7190: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
71a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
71b0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
71c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
71d0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 rotocols[TLS_TLS
71e0: 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 1_1], -1));.#end
71f0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
7200: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 NO_TLS1_2) && !d
7210: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7220: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 54 63 O_TLS1_2). Tc
7230: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
7240: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
7250: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
7260: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
7270: 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d s[TLS_TLS1_2], -
7280: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 1));.#endif.#if
7290: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
72a0: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
72b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
72c0: 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 3). Tcl_ListO
72d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
72e0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
72f0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
7300: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 (protocols[TLS_T
7310: 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 LS1_3], -1));.#e
7320: 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 ndif.. Tcl_Se
7330: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
7340: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
7350: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
7360: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
7370: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a entData;.}.../*.
7380: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
7390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
73a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
73b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
73c0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 -----. *. * Hand
73d0: 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 shakeObjCmd --.
73e0: 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e *. *.This comman
73f0: 64 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 d is used to ver
7400: 69 66 79 20 77 68 65 74 68 65 72 20 74 68 65 20 ify whether the
7410: 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d handshake is com
7420: 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e plete. *.or not.
7430: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
7440: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
7450: 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e l result. 1 mean
7460: 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 s handshake comp
7470: 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 lete, 0 means pe
7480: 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 nding.. *. * Sid
7490: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 e effects:. *.Ma
74a0: 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f y force SSL nego
74b0: 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 tiation to take
74c0: 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d place.. *. *----
74d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
74e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
74f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
7510: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 */.static int H
7520: 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 andshakeObjCmd(C
7530: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
7540: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
7550: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
7560: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
7570: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
7580: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
7590: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 n; /* The
75a0: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 channel to set
75b0: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 a mode on. */.
75c0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
75d0: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 r; /* cli
75e0: 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 ent state for ss
75f0: 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 l socket */.
7600: 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 const char *errS
7610: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 tr = NULL;. i
7620: 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 nt ret = 1;.
7630: 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 int err = 0;..
7640: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
7650: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
7660: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f jc != 2) {..Tcl_
7670: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
7680: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
7690: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 hannel");..retur
76a0: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
76b0: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 }.. chan =
76c0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
76d0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 nterp, Tcl_GetSt
76e0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
76f0: 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c [1], NULL), NULL
7700: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 );. if (chan
7710: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
7720: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
7730: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
7740: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 }.. /* Make
7750: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
7760: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
7770: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
7780: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
7790: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 hannel(chan);.
77a0: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 if (Tcl_GetCha
77b0: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 nnelType(chan) !
77c0: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 = Tls_ChannelTyp
77d0: 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 e()) {..Tcl_Appe
77e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
77f0: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
7800: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
7810: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22 lName(chan), "\"
7820: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
7830: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 nel", NULL);..re
7840: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
7850: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 . }. state
7860: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 Ptr = (State *)T
7870: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
7880: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b tanceData(chan);
7890: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
78a0: 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 alling Tls_WaitF
78b0: 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 orConnect");.
78c0: 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 ret = Tls_WaitF
78d0: 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 orConnect(stateP
78e0: 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 tr, &err, 1);.
78f0: 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 dprintf("Tls_W
7900: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 aitForConnect re
7910: 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 turned: %i", ret
7920: 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 );.. if (ret
7930: 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74 < 0 && ((statePt
7940: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 r->flags & TLS_T
7950: 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 CL_ASYNC) && (er
7960: 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b r == EAGAIN))) {
7970: 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 ..dprintf("Async
7980: 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 set and err = E
7990: 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 AGAIN");..ret =
79a0: 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 0;. } else if
79b0: 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 65 72 (ret < 0) {..er
79c0: 72 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d rStr = statePtr-
79d0: 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 >err;..Tcl_Reset
79e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
79f0: 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 .Tcl_SetErrno(er
7a00: 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 r);...if (!errSt
7a10: 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d r || (*errStr ==
7a20: 20 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 0)) {.. errS
7a30: 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 tr = Tcl_PosixEr
7a40: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a ror(interp);..}.
7a50: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
7a60: 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 lt(interp, "hand
7a70: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c shake failed: ",
7a80: 20 65 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a errStr, (char *
7a90: 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 ) NULL);..dprint
7aa0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c f("Returning TCL
7ab0: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 _ERROR with hand
7ac0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 shake failed: %s
7ad0: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 ", errStr);..ret
7ae0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
7af0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 } else {..if
7b00: 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 (err != 0) {..
7b10: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 dprintf("Got
7b20: 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 an error with a
7b30: 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 completed handsh
7b40: 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 ake: err = %i",
7b50: 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 err);..}..ret =
7b60: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 1;. }.. dp
7b70: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 rintf("Returning
7b80: 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 TCL_OK with dat
7b90: 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b a \"%i\"", ret);
7ba0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
7bb0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
7bc0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 l_NewIntObj(ret)
7bd0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43 );. return(TC
7be0: 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 61 L_OK);..clientDa
7bf0: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
7c00: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
7c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
7c50: 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 * ImportObjCmd
7c60: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
7c70: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
7c80: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 ed to process th
7c90: 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a e "ssl" command.
7ca0: 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f *. *.The ssl co
7cb0: 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c mmand pushes SSL
7cc0: 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 over a (newly c
7cd0: 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f onnected) tcp so
7ce0: 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c cket. *. * Resul
7cf0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
7d00: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
7d10: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
7d20: 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 :. *.May modify
7d30: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 the behavior of
7d40: 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 an IO channel..
7d50: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
7d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d90: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
7da0: 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a ic int.ImportObj
7db0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
7dc0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
7dd0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
7de0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
7df0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
7e00: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
7e10: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 l chan;../* The
7e20: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
7e30: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 mode on. */.
7e40: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
7e50: 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 ;../* client sta
7e60: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 te for ssl socke
7e70: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 t */. SSL_CTX
7e80: 20 2a 63 74 78 09 20 20 20 20 20 20 20 20 3d 20 *ctx. =
7e90: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 NULL;. Tcl_Ob
7ea0: 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20 20 20 j *script.
7eb0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 = NULL;. Tc
7ec0: 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 l_Obj *password.
7ed0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
7ee0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d Tcl_Obj *vcm
7ef0: 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c d. = NULL
7f00: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
7f10: 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 g upperChannelTr
7f20: 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 anslation, upper
7f30: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c ChannelBlocking,
7f40: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 upperChannelEnc
7f50: 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e oding, upperChan
7f60: 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 nelEOFChar;.
7f70: 69 6e 74 20 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 int idx, len;.
7f80: 20 20 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20 int flags..
7f90: 20 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 = TLS_TCL_I
7fa0: 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 NIT;. int ser
7fb0: 76 65 72 09 09 20 20 20 20 20 20 20 20 3d 20 30 ver.. = 0
7fc0: 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 ;./* is connecti
7fd0: 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f on incoming or o
7fe0: 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 utgoing? */.
7ff0: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 char *keyfile.
8000: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
8010: 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 char *certfile
8020: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
8030: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
8040: 61 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c ar *key .= NULL
8050: 3b 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 ;. int key_le
8060: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 n
8070: 20 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 = 0;. unsig
8080: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 20 20 ned char *cert
8090: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
80a0: 20 20 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 20 int cert_len
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d =
80c0: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 0;. char *ci
80d0: 70 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 phers. =
80e0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
80f0: 63 69 70 68 65 72 73 75 69 74 65 73 09 20 20 20 ciphersuites.
8100: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
8110: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 20 20 char *CAfile.
8120: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
8130: 20 20 63 68 61 72 20 2a 43 41 64 69 72 09 09 20 char *CAdir..
8140: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
8150: 20 20 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d char *DHparam
8160: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c s. = NULL
8170: 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 ;. char *mode
8180: 6c 09 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c l.. = NUL
8190: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 L;. char *ser
81a0: 76 65 72 6e 61 6d 65 09 20 20 20 20 20 20 20 20 vername.
81b0: 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e = NULL;./* hostn
81c0: 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e ame for Server N
81d0: 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a ame Indication *
81e0: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 /. const unsi
81f0: 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 gned char *sessi
8200: 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 on_id = NULL;.
8210: 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 Tcl_Obj *alpn.
8220: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 .= NULL;. int
8230: 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 ssl2 = 0, ssl3
8240: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 = 0;. int tls
8250: 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 1 = 1, tls1_1 =
8260: 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 1, tls1_2 = 1, t
8270: 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 ls1_3 = 1;. i
8280: 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 nt proto = 0, le
8290: 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e vel = -1;. in
82a0: 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 t verify = 0, re
82b0: 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 quire = 0, reque
82c0: 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e st = 1, post_han
82d0: 64 73 68 61 6b 65 20 3d 20 30 3b 0a 0a 20 20 20 dshake = 0;..
82e0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
82f0: 22 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c ");..#if OPENSSL
8300: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
8310: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 < 0x10100000L &&
8320: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
8330: 4c 5f 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 L_NO_SSL2) && !d
8340: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
8350: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 && defined(NO_SS
8360: 4c 33 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e L3) && defined(N
8370: 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66 69 6e O_TLS1) && defin
8380: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 ed(NO_TLS1_1) &&
8390: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
83a0: 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e _2) && defined(N
83b0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 73 73 O_TLS1_3). ss
83c0: 6c 32 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 l2 = 1;.#endif.#
83d0: 69 66 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e if !defined(OPEN
83e0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 SSL_NO_SSL3) &&
83f0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 !defined(NO_SSL3
8400: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f ) && defined(NO_
8410: 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e 65 64 SSL2) && defined
8420: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66 (NO_TLS1) && def
8430: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
8440: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c && defined(NO_TL
8450: 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64 S1_2) && defined
8460: 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 (NO_TLS1_3).
8470: 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e 64 69 66 ssl3 = 1;.#endif
8480: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
8490: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 TLS1) || defined
84a0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
84b0: 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a ). tls1 = 0;.
84c0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
84d0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c ed(NO_TLS1_1) ||
84e0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
84f0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 _NO_TLS1_1).
8500: 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 tls1_1 = 0;.#end
8510: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
8520: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 O_TLS1_2) || def
8530: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8540: 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 TLS1_2). tls1
8550: 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 _2 = 0;.#endif.#
8560: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
8570: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_3) || defined
8580: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
8590: 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d _3). tls1_3 =
85a0: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 0;.#endif..
85b0: 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a if (objc < 2) {.
85c0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
85d0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
85e0: 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 v, "channel ?opt
85f0: 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e ions?");..return
8600: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
8610: 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 }.. chan = Tc
8620: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
8630: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 erp, Tcl_GetStri
8640: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 ngFromObj(objv[1
8650: 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b ], NULL), NULL);
8660: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
8670: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
8680: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
8690: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
86a0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
86b0: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
86c0: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
86d0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
86e0: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
86f0: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 nel(chan);..
8700: 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 for (idx = 2; id
8710: 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 x < objc; idx++)
8720: 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 {..char *opt =
8730: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
8740: 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 mObj(objv[idx],
8750: 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 NULL);...if (opt
8760: 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 [0] != '-')..
8770: 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a break;...OPTOBJ
8780: 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b ("-alpn", alpn);
8790: 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72 ..OPTSTR("-cadir
87a0: 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 ", CAdir);..OPTS
87b0: 54 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 TR("-cafile", CA
87c0: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 file);..OPTSTR("
87d0: 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74 -certfile", cert
87e0: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 file);..OPTSTR("
87f0: 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 -cipher", cipher
8800: 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 s);..OPTSTR("-ci
8810: 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 29 phers", ciphers)
8820: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 ;..OPTSTR("-ciph
8830: 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 65 ersuites", ciphe
8840: 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 rsuites);..OPTOB
8850: 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 J("-command", sc
8860: 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 ript);..OPTSTR("
8870: 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61 -dhparams", DHpa
8880: 72 61 6d 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 rams);..OPTSTR("
8890: 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 -keyfile", keyfi
88a0: 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d le);..OPTSTR("-m
88b0: 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 odel", model);..
88c0: 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 OPTOBJ("-passwor
88d0: 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 d", password);..
88e0: 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 OPTBOOL("-post_h
88f0: 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f andshake", post_
8900: 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54 handshake);..OPT
8910: 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c BOOL("-require",
8920: 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 42 require);..OPTB
8930: 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 2c 20 OOL("-request",
8940: 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 49 4e request);..OPTIN
8950: 54 28 22 2d 73 65 63 75 72 69 74 79 6c 65 76 65 T("-securityleve
8960: 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 l", level);..OPT
8970: 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 BOOL("-server",
8980: 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 server);..OPTSTR
8990: 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 ("-servername",
89a0: 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 servername);..OP
89b0: 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 TSTR("-session_i
89c0: 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b d", session_id);
89d0: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 ..OPTBOOL("-ssl2
89e0: 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f ", ssl2);..OPTBO
89f0: 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 OL("-ssl3", ssl3
8a00: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c );..OPTBOOL("-tl
8a10: 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 s1", tls1);..OPT
8a20: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 BOOL("-tls1.1",
8a30: 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f tls1_1);..OPTBOO
8a40: 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 L("-tls1.2", tls
8a50: 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 1_2);..OPTBOOL("
8a60: 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 -tls1.3", tls1_3
8a70: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c );..OPTOBJ("-val
8a80: 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 idatecommand", v
8a90: 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d cmd);..OPTOBJ("-
8aa0: 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f vcmd", vcmd);..O
8ab0: 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 PTBYTE("-cert",
8ac0: 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b cert, cert_len);
8ad0: 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 ..OPTBYTE("-key"
8ae0: 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b , key, key_len);
8af0: 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f ...OPTBAD("optio
8b00: 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 n", "-alpn, -cad
8b10: 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 ir, -cafile, -ce
8b20: 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d rt, -certfile, -
8b30: 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 cipher, -ciphers
8b40: 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c uites, -command,
8b50: 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 -dhparams, -key
8b60: 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 , -keyfile, -mod
8b70: 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d el, -password, -
8b80: 72 65 71 75 69 72 65 2c 20 2d 72 65 71 75 65 73 require, -reques
8b90: 74 2c 20 2d 73 65 63 75 72 69 74 79 6c 65 76 65 t, -securityleve
8ba0: 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 l, -server, -ser
8bb0: 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f vername, -sessio
8bc0: 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 n_id, -ssl2, -ss
8bd0: 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 l3, -tls1, -tls1
8be0: 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c .1, -tls1.2, -tl
8bf0: 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 s1.3, or -valida
8c00: 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 tecommand");...r
8c10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8c20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 . }. if (r
8c30: 65 71 75 65 73 74 29 09 20 20 20 20 76 65 72 69 equest). veri
8c40: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 fy |= SSL_VERIFY
8c50: 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 _CLIENT_ONCE | S
8c60: 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a SL_VERIFY_PEER;.
8c70: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 if (request
8c80: 26 26 20 72 65 71 75 69 72 65 29 20 76 65 72 69 && require) veri
8c90: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 fy |= SSL_VERIFY
8ca0: 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 _FAIL_IF_NO_PEER
8cb0: 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 _CERT;. if (r
8cc0: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 equest && post_h
8cd0: 61 6e 64 73 68 61 6b 65 29 20 20 76 65 72 69 66 andshake) verif
8ce0: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
8cf0: 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a POST_HANDSHAKE;.
8d00: 20 20 20 20 69 66 20 28 76 65 72 69 66 79 20 3d if (verify =
8d10: 3d 20 30 29 09 76 65 72 69 66 79 20 3d 20 53 53 = 0).verify = SS
8d20: 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a L_VERIFY_NONE;..
8d30: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 proto |= (ss
8d40: 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 l2 ? TLS_PROTO_S
8d50: 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 SL2 : 0);. pr
8d60: 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 oto |= (ssl3 ? T
8d70: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 LS_PROTO_SSL3 :
8d80: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
8d90: 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f (tls1 ? TLS_PRO
8da0: 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 TO_TLS1 : 0);.
8db0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
8dc0: 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 _1 ? TLS_PROTO_T
8dd0: 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 LS1_1 : 0);.
8de0: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 proto |= (tls1_2
8df0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
8e00: 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 1_2 : 0);. pr
8e10: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f oto |= (tls1_3 ?
8e20: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
8e30: 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 3 : 0);.. /*
8e40: 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 reset to NULL if
8e50: 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 blank string pr
8e60: 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 ovided */. if
8e70: 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 (cert && !*cert
8e80: 29 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09 ).. cert.
8e90: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
8ea0: 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 if (key && !
8eb0: 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b *key).. k
8ec0: 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c ey. = NUL
8ed0: 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 L;. if (certf
8ee0: 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c ile && !*certfil
8ef0: 65 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66 e) certf
8f00: 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ile.= NULL;.
8f10: 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 if (keyfile && !
8f20: 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 *keyfile)..keyfi
8f30: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c le. = NUL
8f40: 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 L;. if (ciphe
8f50: 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 rs && !*ciphers)
8f60: 09 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73 . ciphers
8f70: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
8f80: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 . if (ciphers
8f90: 75 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 uites && !*ciphe
8fa0: 72 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73 rsuites) ciphers
8fb0: 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b uites = NULL;
8fc0: 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 . if (CAfile
8fd0: 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 && !*CAfile).
8fe0: 20 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 CAfile.
8ff0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
9000: 69 66 20 28 43 41 64 69 72 20 26 26 20 21 2a 43 if (CAdir && !*C
9010: 41 64 69 72 29 09 20 20 20 20 20 20 20 20 43 41 Adir). CA
9020: 64 69 72 09 20 20 20 20 20 20 20 20 3d 20 4e 55 dir. = NU
9030: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61 LL;. if (DHpa
9040: 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61 rams && !*DHpara
9050: 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70 61 ms). DHpa
9060: 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55 rams = NU
9070: 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 LL;.. /* new
9080: 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 SSL state */.
9090: 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 74 statePtr..= (St
90a0: 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 ate *) ckalloc((
90b0: 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 unsigned) sizeof
90c0: 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 (State));. me
90d0: 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 mset(statePtr, 0
90e0: 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 , sizeof(State))
90f0: 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d ;.. statePtr-
9100: 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a >flags.= flags;.
9110: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e statePtr->in
9120: 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 terp.= interp;.
9130: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c statePtr->vfl
9140: 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 ags.= verify;.
9150: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09 statePtr->err.
9160: 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c = "";.. /* al
9170: 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f locate script */
9180: 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 74 29 . if (script)
9190: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 {..(void) Tcl_G
91a0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
91b0: 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 script, &len);..
91c0: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 if (len) {..
91d0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
91e0: 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 ck = script;..
91f0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
9200: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c nt(statePtr->cal
9210: 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d lback);..}. }
9220: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 .. /* allocat
9230: 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 e password */.
9240: 20 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 20 if (password)
9250: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 {..(void) Tcl_Ge
9260: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 tStringFromObj(p
9270: 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a assword, &len);.
9280: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 .if (len) {..
9290: 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 statePtr->passw
92a0: 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a ord = password;.
92b0: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
92c0: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
92d0: 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 password);..}.
92e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f }.. /* allo
92f0: 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 6f cate validate co
9300: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 mmand */. if
9310: 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 (vcmd) {..(void)
9320: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
9330: 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e omObj(vcmd, &len
9340: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
9350: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 63 statePtr->vc
9360: 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 md = vcmd;..
9370: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
9380: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 (statePtr->vcmd)
9390: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
93a0: 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c if (model != NUL
93b0: 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a L) {..int mode;.
93c0: 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64 ./* Get the "mod
93d0: 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 el" context */..
93e0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
93f0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f annel(interp, mo
9400: 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 del, &mode);..if
9410: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
9420: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
9430: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
9440: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
9450: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
9460: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a L_ERROR;..}.../*
9470: 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 .. * Make sure t
9480: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
9490: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
94a0: 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 .. */..chan = Tc
94b0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
94c0: 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f chan);..if (Tcl_
94d0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
94e0: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e han) != Tls_Chan
94f0: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20 nelType()) {..
9500: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
9510: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 lt(interp, "bad
9520: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c channel \"", Tcl
9530: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
9540: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f chan),..."\": no
9550: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 t a TLS channel"
9560: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c , NULL);.. Tl
9570: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
9580: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
9590: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
95a0: 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 ;..}..ctx = ((St
95b0: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 ate *)Tcl_GetCha
95c0: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
95d0: 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 (chan))->ctx;.
95e0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 } else {..if (
95f0: 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 (ctx = CTX_Init(
9600: 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 statePtr, server
9610: 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 , proto, keyfile
9620: 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c , certfile, key,
9630: 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a cert, key_len,.
9640: 09 20 20 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43 . cert_len, C
9650: 41 64 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 Adir, CAfile, ci
9660: 70 68 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 phers, ciphersui
9670: 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 tes, level, DHpa
9680: 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 rams)) == NULL)
9690: 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 {.. Tls_Free(
96a0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
96b0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
96c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
96d0: 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 }.. statePt
96e0: 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 r->ctx = ctx;..
96f0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 /*. * We
9700: 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 need to make sur
9710: 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e e that the chann
9720: 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 el works in bina
9730: 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 ry (for the.
9740: 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f * encryption no
9750: 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 t to get goofed
9760: 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f up).. * We o
9770: 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 nly want to adju
9780: 73 74 20 74 68 65 20 62 75 66 66 65 72 69 6e 67 st the buffering
9790: 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e 6e in pre-v2 chann
97a0: 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20 20 els, where.
97b0: 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 * each channel i
97c0: 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69 6e n the stack main
97d0: 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 tained its own b
97e0: 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a uffers.. */.
97f0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
9800: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
9810: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 lTranslation);.
9820: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
9830: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
9840: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 Blocking);. T
9850: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
9860: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 upperChannelEOFC
9870: 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 har);. Tcl_DS
9880: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 tringInit(&upper
9890: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
98a0: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 ;. Tcl_GetCha
98b0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
98c0: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 p, chan, "-eofch
98d0: 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e ar", &upperChann
98e0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 elEOFChar);.
98f0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
9900: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
9910: 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 n, "-encoding",
9920: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 &upperChannelEnc
9930: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f oding);. Tcl_
9940: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e GetChannelOption
9950: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
9960: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 -translation", &
9970: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
9980: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 slation);. Tc
9990: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_GetChannelOpti
99a0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
99b0: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 "-blocking", &u
99c0: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
99d0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ing);. Tcl_Se
99e0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
99f0: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 nterp, chan, "-t
9a00: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 ranslation", "bi
9a10: 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f nary");. Tcl_
9a20: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
9a30: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
9a40: 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 -blocking", "tru
9a50: 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 e");. dprintf
9a60: 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 ("Consuming Tcl
9a70: 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c channel %s", Tcl
9a80: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
9a90: 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 chan));. stat
9aa0: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c ePtr->self = Tcl
9ab0: 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e _StackChannel(in
9ac0: 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 terp, Tls_Channe
9ad0: 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 lType(), (Client
9ae0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 20 Data) statePtr,
9af0: 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 (TCL_READABLE |
9b00: 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 TCL_WRITABLE), c
9b10: 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 han);. dprint
9b20: 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e f("Created chann
9b30: 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 el named %s", Tc
9b40: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
9b50: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
9b60: 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 );. if (state
9b70: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 Ptr->self == (Tc
9b80: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
9b90: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 {../*.. * No us
9ba0: 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 e of Tcl_Eventua
9bb0: 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 20 llyFree because
9bc0: 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f no possible Tcl_
9bd0: 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 Preserve... */..
9be0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
9bf0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 ) statePtr);..re
9c00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9c10: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 }.. Tcl_S
9c20: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
9c30: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
9c40: 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c ->self, "-transl
9c50: 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 ation", Tcl_DStr
9c60: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 ingValue(&upperC
9c70: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
9c80: 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 n));. Tcl_Set
9c90: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
9ca0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e terp, statePtr->
9cb0: 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 self, "-encoding
9cc0: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 ", Tcl_DStringVa
9cd0: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 lue(&upperChanne
9ce0: 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 lEncoding));.
9cf0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
9d00: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 ption(interp, st
9d10: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d atePtr->self, "-
9d20: 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 eofchar", Tcl_DS
9d30: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 tringValue(&uppe
9d40: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 rChannelEOFChar)
9d50: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
9d60: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
9d70: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 rp, statePtr->se
9d80: 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c lf, "-blocking",
9d90: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 Tcl_DStringValu
9da0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 e(&upperChannelB
9db0: 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20 locking));..
9dc0: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e /*. * SSL In
9dd0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 itialization.
9de0: 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 */. statePt
9df0: 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 r->ssl = SSL_new
9e00: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b (statePtr->ctx);
9e10: 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50 . if (!stateP
9e20: 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 tr->ssl) {../* S
9e30: 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 SL library error
9e40: 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 */..Tcl_AppendR
9e50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 esult(interp, "c
9e60: 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 ouldn't construc
9e70: 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 t ssl session: "
9e80: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 , REASON(), (cha
9e90: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 r *) NULL);..Tls
9ea0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
9eb0: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 tatePtr);..retur
9ec0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
9ed0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 }.. /* Set h
9ee0: 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 ost server name
9ef0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 */. if (serve
9f00: 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 rname) {../* Set
9f10: 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d s the server nam
9f20: 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e e indication (SN
9f30: 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c I) in ClientHell
9f40: 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 o extension */..
9f50: 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 if (!SSL_set_tls
9f60: 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 ext_host_name(st
9f70: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 atePtr->ssl, ser
9f80: 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71 75 vername) && requ
9f90: 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f ire) {.. Tcl_
9fa0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
9fb0: 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 54 4c erp, "setting TL
9fc0: 53 20 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 65 S host name exte
9fd0: 6e 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20 28 nsion failed", (
9fe0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 char *) NULL);.
9ff0: 20 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 Tls_F
a000: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
a010: 74 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 tePtr);.
a020: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
a030: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a RROR;. }.
a040: 0a 09 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 73 ../* Configure s
a050: 65 72 76 65 72 20 68 6f 73 74 20 6e 61 6d 65 20 erver host name
a060: 63 68 65 63 6b 73 20 69 6e 20 74 68 65 20 53 53 checks in the SS
a070: 4c 20 63 6c 69 65 6e 74 2e 20 53 65 74 20 44 4e L client. Set DN
a080: 53 20 68 6f 73 74 6e 61 6d 65 20 74 6f 0a 09 20 S hostname to..
a090: 20 20 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20 name for peer
a0a0: 63 65 72 74 69 66 69 63 61 74 65 20 63 68 65 63 certificate chec
a0b0: 6b 73 2e 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 ks. SSL_set1_hos
a0c0: 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e t has limitation
a0d0: 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f s. */..if (!SSL_
a0e0: 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50 add1_host(stateP
a0f0: 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e tr->ssl, servern
a100: 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c ame)) {.. Tcl
a110: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
a120: 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 44 terp, "setting D
a130: 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 66 61 69 NS host name fai
a140: 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e led", (char *) N
a150: 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 ULL);.
a160: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
a170: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 *) statePtr);.
a180: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 retur
a190: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
a1a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 }.. /* Re
a1b0: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 sume session id
a1c0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 */. if (sessi
a1d0: 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e 28 on_id && strlen(
a1e0: 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 session_id) <= S
a1f0: 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c SL_MAX_SID_CTX_L
a200: 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c ENGTH) {../* SSL
a210: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a _set_session() *
a220: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53 /..if (!SSL_SESS
a230: 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 ION_set1_id_cont
a240: 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 ext(SSL_get_sess
a250: 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ion(statePtr->ss
a260: 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 l), session_id,
a270: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 (unsigned int) s
a280: 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 trlen(session_id
a290: 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 ))) {.. Tcl_A
a2a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
a2b0: 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73 73 rp, "Resume sess
a2c0: 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 73 69 6f ion id ", sessio
a2d0: 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 64 22 2c n_id, " failed",
a2e0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
a2f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6c 73 . Tls
a300: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
a310: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 20 tatePtr);.
a320: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c return TCL
a330: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d _ERROR;..}. }
a340: 0a 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 .. if (alpn)
a350: 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 {../* Convert a
a360: 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 TCL list into a
a370: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e protocol-list in
a380: 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a wire-format */.
a390: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a .unsigned char *
a3a0: 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 protos, *p;..uns
a3b0: 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 igned int protos
a3c0: 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 69 _len = 0;..int i
a3d0: 2c 20 6c 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c , len, cnt;..Tcl
a3e0: 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 _Obj **list;...i
a3f0: 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 f (Tcl_ListObjGe
a400: 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 tElements(interp
a410: 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c , alpn, &cnt, &l
a420: 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ist) != TCL_OK)
a430: 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 {.. Tls_Free(
a440: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
a450: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
a460: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 TCL_ERROR;..}...
a470: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 /* Determine the
a480: 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 memory required
a490: 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 6f for the protoco
a4a0: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 l-list */..for (
a4b0: 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 i = 0; i < cnt;
a4c0: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f i++) {.. Tcl_
a4d0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
a4e0: 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b (list[i], &len);
a4f0: 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 .. if (len >
a500: 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 255) {...Tcl_App
a510: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
a520: 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c , "ALPN protocol
a530: 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c name too long",
a540: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
a550: 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 ...Tls_Free((cha
a560: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
a570: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
a580: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 OR;.. }..
a590: 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 protos_len += 1
a5a0: 2b 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 + len;..}.../* B
a5b0: 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 uild the complet
a5c0: 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 e protocol-list
a5d0: 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 */..protos = cka
a5e0: 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 lloc(protos_len)
a5f0: 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c ;../* protocol-l
a600: 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 ists consist of
a610: 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 8-bit length-pre
a620: 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 69 fixed, byte stri
a630: 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d ngs */..for (i =
a640: 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 0, p = protos;
a650: 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a i < cnt; i++) {.
a660: 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d . char *str =
a670: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
a680: 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 omObj(list[i], &
a690: 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 len);.. *p++
a6a0: 3d 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 = len;.. memc
a6b0: 70 79 28 70 2c 20 73 74 72 2c 20 6c 65 6e 29 3b py(p, str, len);
a6c0: 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a .. p += len;.
a6d0: 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f .}.../* SSL_set_
a6e0: 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 alpn_protos make
a6f0: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 s a copy of the
a700: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f protocol-list */
a710: 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 ../* Note: This
a720: 66 75 6e 63 74 69 6f 6e 73 20 72 65 76 65 72 73 functions revers
a730: 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 es the return va
a740: 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a lue convention *
a750: 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 /..if (SSL_set_a
a760: 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 lpn_protos(state
a770: 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 Ptr->ssl, protos
a780: 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b , protos_len)) {
a790: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
a7a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
a7b0: 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 41 4c failed to set AL
a7c0: 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 PN protocols", (
a7d0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
a7e0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
a7f0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
a800: 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72 6f .. ckfree(pro
a810: 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75 72 tos);.. retur
a820: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
a830: 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 6f ../* Store proto
a840: 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 74 cols list */..st
a850: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d atePtr->protos =
a860: 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 50 protos;..stateP
a870: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d tr->protos_len =
a880: 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 protos_len;.
a890: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 } else {..state
a8a0: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 Ptr->protos = NU
a8b0: 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 LL;..statePtr->p
a8c0: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 rotos_len = 0;.
a8d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
a8e0: 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b * SSL Callback
a8f0: 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 s. */. SS
a900: 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 73 L_set_app_data(s
a910: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 tatePtr->ssl, (v
a920: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
a930: 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 ./* point back t
a940: 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f o us */. SSL_
a950: 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74 65 set_verify(state
a960: 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 Ptr->ssl, verify
a970: 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b , VerifyCallback
a980: 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 69 );. SSL_set_i
a990: 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 nfo_callback(sta
a9a0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f tePtr->ssl, Info
a9b0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 Callback);..
a9c0: 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 /* Create Tcl_Ch
a9d0: 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 annel BIO Handle
a9e0: 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 r */. statePt
a9f0: 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e r->p_bio.= BIO_n
aa00: 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c ew_tcl(statePtr,
aa10: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 BIO_NOCLOSE);.
aa20: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f statePtr->bio
aa30: 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 .= BIO_new(BIO_f
aa40: 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 _ssl());.. if
aa50: 20 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 (server) {../*
aa60: 53 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 Server callbacks
aa70: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 */..SSL_CTX_set
aa80: 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 _tlsext_serverna
aa90: 6d 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d me_arg(statePtr-
aaa0: 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 >ctx, (void *)st
aab0: 61 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 atePtr);..SSL_CT
aac0: 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 X_set_tlsext_ser
aad0: 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b vername_callback
aae0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
aaf0: 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 SNICallback);..S
ab00: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e SL_CTX_set_clien
ab10: 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 t_hello_cb(state
ab20: 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 Ptr->ctx, HelloC
ab30: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a allback, (void *
ab40: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 )statePtr);..if
ab50: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
ab60: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 s != NULL) {..
ab70: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c SSL_CTX_set_al
ab80: 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 pn_select_cb(sta
ab90: 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e tePtr->ctx, ALPN
aba0: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 Callback, (void
abb0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 *)statePtr);.#if
abc0: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 def USE_NPN..
abd0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 SSL_CTX_set_nex
abe0: 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 t_protos_adverti
abf0: 73 65 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d sed_cb(statePtr-
ac00: 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 >ctx, NPNCallbac
ac10: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 k, (void *)state
ac20: 50 74 72 29 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a Ptr);.#endif..}.
ac30: 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 ../* Enable serv
ac40: 65 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20 er to send cert
ac50: 72 65 71 75 65 73 74 20 61 66 74 65 72 20 68 61 request after ha
ac60: 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 ndshake (TLS 1.3
ac70: 20 6f 6e 6c 79 29 20 2a 2f 0a 09 69 66 20 28 72 only) */..if (r
ac80: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 equest && post_h
ac90: 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 andshake) {..
aca0: 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 SSL_verify_clie
acb0: 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b nt_post_handshak
acc0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
acd0: 3b 0a 09 7d 0a 0a 09 73 74 61 74 65 50 74 72 2d ;..}...statePtr-
ace0: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 >flags |= TLS_TC
acf0: 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 L_SERVER;..SSL_s
ad00: 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 et_accept_state(
ad10: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
ad20: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a } else {../*
ad30: 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b Client callback
ad40: 73 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50 s */..if (stateP
ad50: 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 tr->protos != NU
ad60: 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 55 53 45 LL) {.#ifdef USE
ad70: 5f 4e 50 4e 0a 09 20 20 20 20 53 53 4c 5f 43 54 _NPN.. SSL_CT
ad80: 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f X_set_next_proto
ad90: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 _select_cb(state
ada0: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 Ptr->ctx, ALPNCa
adb0: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 llback, (void *)
adc0: 73 74 61 74 65 50 74 72 29 3b 0a 23 65 6e 64 69 statePtr);.#endi
add0: 66 0a 09 7d 0a 09 2f 2a 20 53 65 73 73 69 6f 6e f..}../* Session
ade0: 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c caching */..SSL
adf0: 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e _CTX_set_session
ae00: 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 _cache_mode(stat
ae10: 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 ePtr->ctx, SSL_S
ae20: 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 ESS_CACHE_CLIENT
ae30: 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 | SSL_SESS_CACH
ae40: 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 E_NO_INTERNAL_ST
ae50: 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 ORE);..SSL_CTX_s
ae60: 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 ess_set_new_cb(s
ae70: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 tatePtr->ctx, Se
ae80: 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a ssionCallback);.
ae90: 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 ../* Enable post
aea0: 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 handshake Authe
aeb0: 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 ntication extens
aec0: 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c ion. TLS 1.3 onl
aed0: 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a y, not http/2. *
aee0: 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 /..if (request &
aef0: 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 & post_handshake
af00: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 ) {.. SSL_set
af10: 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f _post_handshake_
af20: 61 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 auth(statePtr->s
af30: 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 53 53 4c sl, 1);..}...SSL
af40: 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 _set_connect_sta
af50: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
af60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c );. }. SSL
af70: 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 _set_bio(statePt
af80: 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 r->ssl, statePtr
af90: 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 ->p_bio, statePt
afa0: 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 r->p_bio);. B
afb0: 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 IO_set_ssl(state
afc0: 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 Ptr->bio, stateP
afd0: 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 tr->ssl, BIO_NOC
afe0: 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 LOSE);.. /*.
aff0: 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c * End of SSL
b000: 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 Init. */.
b010: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 dprintf("Retur
b020: 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 ning %s", Tcl_Ge
b030: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
b040: 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 tePtr->self));.
b050: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 Tcl_SetResult
b060: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a (interp, (char *
b070: 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c ) Tcl_GetChannel
b080: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
b090: 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 elf), TCL_VOLATI
b0a0: 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e LE);.. return
b0b0: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
b0c0: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
b0d0: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d a;.}.../*. *----
b0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
b120: 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 *. * UnimportOb
b130: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
b140: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
b150: 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 invoked to remov
b160: 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 e the topmost ch
b170: 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a annel filter.. *
b180: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
b190: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
b1a0: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
b1b0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 e effects:. *.Ma
b1c0: 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 y modify the beh
b1d0: 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 avior of an IO c
b1e0: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d hannel.. *. *---
b1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b230: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
b240: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 UnimportObjCmd(C
b250: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
b260: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
b270: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
b280: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
b290: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
b2a0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
b2b0: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e n;../* The chann
b2c0: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 el to set a mode
b2d0: 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72 on. */.. dpr
b2e0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
b2f0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
b300: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
b310: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
b320: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
b330: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c l");..return TCL
b340: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
b350: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
b360: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
b370: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
b380: 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a bjv[1]), NULL);.
b390: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
b3a0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
b3b0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
b3c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
b3d0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
b3e0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
b3f0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
b400: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
b410: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
b420: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 el(chan);.. i
b430: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
b440: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
b450: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
b460: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
b470: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
b480: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
b490: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
b4a0: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a me(chan),..."\":
b4b0: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e not a TLS chann
b4c0: 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 el", NULL);..ret
b4d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
b4e0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 }.. if (Tc
b4f0: 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c l_UnstackChannel
b500: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d (interp, chan) =
b510: 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 = TCL_ERROR) {..
b520: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
b530: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 ;. }.. ret
b540: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
b550: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
b560: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Data;.}.../*. *-
b570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b5b0: 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 --. *. * CTX_Ini
b5c0: 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 t -- construct a
b5d0: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 SSL_CTX instanc
b5e0: 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a e. *. * Results:
b5f0: 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f . *.A valid SSL_
b600: 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 CTX instance or
b610: 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 NULL.. *. * Side
b620: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e effects:. *.con
b630: 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 structs SSL cont
b640: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d ext (CTX). *. *-
b650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b690: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 --. */.static SS
b6a0: 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 L_CTX *.CTX_Init
b6b0: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 (State *statePtr
b6c0: 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 , int isServer,
b6d0: 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 int proto, char
b6e0: 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a *keyfile, char *
b6f0: 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e certfile,. un
b700: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 signed char *key
b710: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
b720: 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c *cert, int key_l
b730: 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e en, int cert_len
b740: 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 , char *CAdir,.
b750: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c char *CAfile,
b760: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 char *ciphers,
b770: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 char *ciphersuit
b780: 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 es, int level, c
b790: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b har *DHparams) {
b7a0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
b7b0: 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 *interp = stateP
b7c0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
b7d0: 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e SSL_CTX *ctx = N
b7e0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ULL;. Tcl_DSt
b7f0: 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c ring ds;. Tcl
b800: 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 _DString ds1;.
b810: 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 int off = 0;.
b820: 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 int load_priv
b830: 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e ate_key;. con
b840: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d st SSL_METHOD *m
b850: 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 ethod;.. dpri
b860: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
b870: 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 if (!proto)
b880: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
b890: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 ult(interp, "no
b8a0: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 valid protocol s
b8b0: 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b elected", NULL);
b8c0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
b8d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 }.. /* cre
b8e0: 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 ate SSL context
b8f0: 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 */.#if OPENSSL_V
b900: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d ERSION_NUMBER >=
b910: 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 0x10100000L ||
b920: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
b930: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
b940: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
b950: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
b960: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 to, TLS_PROTO_SS
b970: 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 L2)) {..Tcl_Appe
b980: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
b990: 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 "SSL2 protocol
b9a0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
b9b0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
b9c0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
b9d0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
b9e0: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL3) || define
b9f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
ba00: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 3). if (ENABL
ba10: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
ba20: 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 OTO_SSL3)) {..Tc
ba30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
ba40: 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f nterp, "SSL3 pro
ba50: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
ba60: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ted", NULL);..re
ba70: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
ba80: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
ba90: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 ned(NO_TLS1) ||
baa0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
bab0: 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 NO_TLS1). if
bac0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
bad0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 TLS_PROTO_TLS1))
bae0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
baf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
bb00: 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.0 protocol n
bb10: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
bb20: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
bb30: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
bb40: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
bb50: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e TLS1_1) || defin
bb60: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
bb70: 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e S1_1). if (EN
bb80: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
bb90: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 _PROTO_TLS1_1))
bba0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
bbb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ult(interp, "TLS
bbc0: 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 1.1 protocol no
bbd0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
bbe0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
bbf0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
bc00: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
bc10: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
bc20: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
bc30: 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 1_2). if (ENA
bc40: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
bc50: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b PROTO_TLS1_2)) {
bc60: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
bc70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 lt(interp, "TLS
bc80: 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 1.2 protocol not
bc90: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
bca0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
bcb0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ;. }.#endif.#
bcc0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
bcd0: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_3) || defined
bce0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
bcf0: 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 _3). if (ENAB
bd00: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
bd10: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a ROTO_TLS1_3)) {.
bd20: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
bd30: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
bd40: 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .3 protocol not
bd50: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
bd60: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
bd70: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 . }.#endif..
bd80: 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f switch (proto
bd90: 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f ) {.#if OPENSSL_
bda0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
bdb0: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 0x10100000L &&
bdc0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 !defined(NO_SSL2
bdd0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
bde0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 ENSSL_NO_SSL2).
bdf0: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
be00: 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 O_SSL2:..method
be10: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c = isServer ? SSL
be20: 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 v2_server_method
be30: 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e () : SSLv2_clien
be40: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
be50: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
be60: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
be70: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
be80: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 NSSL_NO_SSL3) &&
be90: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
bea0: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 L_NO_SSL3_METHOD
beb0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
bec0: 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 ROTO_SSL3:..meth
bed0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
bee0: 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 SSLv3_server_met
bef0: 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c hod() : SSLv3_cl
bf00: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
bf10: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
bf20: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
bf30: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
bf40: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
bf50: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
bf60: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 NSSL_NO_TLS1_MET
bf70: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c HOD). case TL
bf80: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d S_PROTO_TLS1:..m
bf90: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
bfa0: 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f ? TLSv1_server_
bfb0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 method() : TLSv1
bfc0: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
bfd0: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
bfe0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
bff0: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 _TLS1_1) && !def
c000: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
c010: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
c020: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
c030: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 LS1_1_METHOD).
c040: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
c050: 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 _TLS1_1:..method
c060: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c = isServer ? TL
c070: 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 Sv1_1_server_met
c080: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f hod() : TLSv1_1_
c090: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
c0a0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
c0b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
c0c0: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
c0d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
c0e0: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
c0f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
c100: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_2_METHOD).
c110: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
c120: 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 TLS1_2:..method
c130: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 = isServer ? TLS
c140: 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 v1_2_server_meth
c150: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 od() : TLSv1_2_c
c160: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
c170: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
c180: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
c190: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
c1a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
c1b0: 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 S1_3). case T
c1c0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a LS_PROTO_TLS1_3:
c1d0: 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e ../* Use the gen
c1e0: 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 eric method and
c1f0: 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 constraint range
c200: 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 after context i
c210: 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 s created */..me
c220: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
c230: 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 ? TLS_server_met
c240: 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 hod() : TLS_clie
c250: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
c260: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 eak;.#endif.
c270: 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 default:../* Neg
c280: 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 20 61 otiate highest a
c290: 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 vailable SSL/TLS
c2a0: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 version */..met
c2b0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
c2c0: 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 TLS_server_meth
c2d0: 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e od() : TLS_clien
c2e0: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 t_method();.#if
c2f0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
c300: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 NUMBER < 0x10100
c310: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 000L && !defined
c320: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 (NO_SSL2) && !de
c330: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
c340: 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 _SSL2)..off |= (
c350: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
c360: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 LS_PROTO_SSL2)
c370: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
c380: 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a _SSLv2);.#endif.
c390: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
c3a0: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
c3b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
c3c0: 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 3)..off |= (ENAB
c3d0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
c3e0: 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 ROTO_SSL3) ? 0
c3f0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c : SSL_OP_NO_SSL
c400: 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 v3);.#endif.#if
c410: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
c420: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
c430: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 ENSSL_NO_TLS1)..
c440: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
c450: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
c460: 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 _TLS1) ? 0 : S
c470: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b SL_OP_NO_TLSv1);
c480: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
c490: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
c4a0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
c4b0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 SSL_NO_TLS1_1)..
c4c0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
c4d0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
c4e0: 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 _TLS1_1) ? 0 : S
c4f0: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 SL_OP_NO_TLSv1_1
c500: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
c510: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
c520: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
c530: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
c540: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
c550: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
c560: 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a TO_TLS1_2) ? 0 :
c570: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
c580: 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 _2);.#endif.#if
c590: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
c5a0: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
c5b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
c5c0: 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 3)..off |= (ENAB
c5d0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
c5e0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 ROTO_TLS1_3) ? 0
c5f0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
c600: 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 v1_3);.#endif..b
c610: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 reak;. }..
c620: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 ERR_clear_error
c630: 28 29 3b 0a 20 20 20 20 63 74 78 20 3d 20 53 53 ();. ctx = SS
c640: 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 L_CTX_new(method
c650: 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 63 74 78 );.. if (!ctx
c660: 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c ) {..return(NULL
c670: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 );. }.. if
c680: 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c (getenv(SSLKEYL
c690: 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f OGFILE)) {..SSL_
c6a0: 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 CTX_set_keylog_c
c6b0: 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 allback(ctx, Key
c6c0: 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 LogCallback);.
c6d0: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 }..#if !define
c6e0: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 d(NO_TLS1_3) &&
c6f0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
c700: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
c710: 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 if (proto == TLS
c720: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b _PROTO_TLS1_3) {
c730: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 ..SSL_CTX_set_mi
c740: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 n_proto_version(
c750: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 ctx, TLS1_3_VERS
c760: 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 ION);..SSL_CTX_s
c770: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 et_max_proto_ver
c780: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 sion(ctx, TLS1_3
c790: 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d _VERSION);. }
c7a0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 .#endif.. /*
c7b0: 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c Force cipher sel
c7c0: 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 ection order by
c7d0: 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 server */. if
c7e0: 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 (!isServer) {..
c7f0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
c800: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f ons(ctx, SSL_OP_
c810: 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 CIPHER_SERVER_PR
c820: 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d EFERENCE);. }
c830: 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
c840: 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 t_app_data(ctx,
c850: 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 (void*)interp);.
c860: 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 /* remember the
c870: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 interpreter */.
c880: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f SSL_CTX_set_o
c890: 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f ptions(ctx, SSL_
c8a0: 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 OP_ALL);./* all
c8b0: 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 SSL bug workarou
c8c0: 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 nds */. SSL_C
c8d0: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 TX_set_options(c
c8e0: 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 tx, off);../* di
c8f0: 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 sable protocol v
c900: 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f ersions */.#if O
c910: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
c920: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 UMBER < 0x101010
c930: 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 00L. SSL_CTX_
c940: 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 set_mode(ctx, SS
c950: 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 L_MODE_AUTO_RETR
c960: 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 Y);./* handle ne
c970: 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 w handshakes in
c980: 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 background. On b
c990: 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65 y default in Ope
c9a0: 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 nSSL 1.1.1. */.#
c9b0: 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 endif. SSL_CT
c9c0: 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 X_sess_set_cache
c9d0: 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b _size(ctx, 128);
c9e0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 .. /* Set use
c9f0: 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 r defined cipher
ca00: 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 73 s, cipher suites
ca10: 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c , and security l
ca20: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 evel */. if (
ca30: 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c (ciphers != NULL
ca40: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 ) && !SSL_CTX_se
ca50: 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 t_cipher_list(ct
ca60: 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09 x, ciphers)) {..
ca70: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
ca80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 sult(interp, "Se
ca90: 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 t ciphers failed
caa0: 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 : No valid ciphe
cab0: 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 rs", (char *) NU
cac0: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
cad0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
cae0: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 return NULL;.
caf0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 }. if ((ci
cb00: 70 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 phersuites != NU
cb10: 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f LL) && !SSL_CTX_
cb20: 73 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 set_ciphersuites
cb30: 28 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 (ctx, ciphersuit
cb40: 65 73 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f es)) {.. Tcl_
cb50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
cb60: 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 erp, "Set cipher
cb70: 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20 suites failed:
cb80: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 No valid ciphers
cb90: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
cba0: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
cbb0: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 free(ctx);..
cbc0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
cbd0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 }.. /* Set s
cbe0: 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f ecurity level */
cbf0: 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e . if (level >
cc00: 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 -1 && level < 6
cc10: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f ) {../* SSL_set_
cc20: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a security_level *
cc30: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 /..SSL_CTX_set_s
cc40: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 ecurity_level(ct
cc50: 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d x, level);. }
cc60: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d .. /* set som
cc70: 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 e callbacks */.
cc80: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 SSL_CTX_set_d
cc90: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 efault_passwd_cb
cca0: 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 (ctx, PasswordCa
ccb0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c llback);. SSL
ccc0: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 _CTX_set_default
ccd0: 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 _passwd_cb_userd
cce0: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a ata(ctx, (void *
ccf0: 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 )statePtr);..
cd00: 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 /* read a Diffi
cd10: 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 e-Hellman parame
cd20: 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 ters file, or us
cd30: 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f e the built-in o
cd40: 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 ne */.#ifdef OPE
cd50: 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 NSSL_NO_DH. i
cd60: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e f (DHparams != N
cd70: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ULL) {..Tcl_Appe
cd80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
cd90: 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 73 "DH parameter s
cda0: 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c upport not avail
cdb0: 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 able", (char *)
cdc0: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f NULL);..SSL_CTX_
cdd0: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 free(ctx);..retu
cde0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
cdf0: 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 else. {..DH*
ce00: 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d dh;..if (DHparam
ce10: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 s != NULL) {..
ce20: 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 BIO *bio;..
ce30: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
ce40: 28 26 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 (&ds);.. bio
ce50: 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 = BIO_new_file(F
ce60: 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 2N(DHparams, &ds
ce70: 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 ), "r");.. if
ce80: 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f (!bio) {...Tcl_
ce90: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
cea0: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 ;...Tcl_AppendRe
ceb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f sult(interp, "Co
cec0: 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 uld not find DH
ced0: 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 parameters file"
cee0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
cef0: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
cf00: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
cf10: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 NULL;.. }...
cf20: 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 dh = PEM_read
cf30: 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 _bio_DHparams(bi
cf40: 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e o, NULL, NULL, N
cf50: 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 ULL);.. BIO_f
cf60: 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 ree(bio);.. T
cf70: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
cf80: 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 ds);.. if (!d
cf90: 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e h) {...Tcl_Appen
cfa0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
cfb0: 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 "Could not read
cfc0: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 DH parameters fr
cfd0: 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 om file", (char
cfe0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f *) NULL);...SSL_
cff0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
d000: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 .return NULL;..
d010: 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 }..} else {..
d020: 20 20 20 20 64 68 20 3d 20 67 65 74 5f 64 68 50 dh = get_dhP
d030: 61 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c arams();..}..SSL
d040: 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 _CTX_set_tmp_dh(
d050: 63 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 ctx, dh);..DH_fr
d060: 65 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 ee(dh);. }.#e
d070: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 ndif.. /* set
d080: 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65 our certificate
d090: 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 */. load_pri
d0a0: 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 vate_key = 0;.
d0b0: 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 if (certfile !
d0c0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f = NULL) {..load_
d0d0: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b private_key = 1;
d0e0: 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e ...Tcl_DStringIn
d0f0: 69 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 it(&ds);...if (S
d100: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 SL_CTX_use_certi
d110: 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c ficate_file(ctx,
d120: 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 F2N(certfile, &
d130: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ds), SSL_FILETYP
d140: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 E_PEM) <= 0) {..
d150: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
d160: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 ree(&ds);.. T
d170: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
d180: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
d190: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 to set certifica
d1a0: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 te file ", certf
d1b0: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 ile, ": ",....
d1c0: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 REASON(), (ch
d1d0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
d1e0: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
d1f0: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tx);.. return
d200: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 NULL;..}. }
d210: 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d else if (cert !=
d220: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 NULL) {..load_p
d230: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a rivate_key = 1;.
d240: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 .if (SSL_CTX_use
d250: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e _certificate_ASN
d260: 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 1(ctx, cert_len,
d270: 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 cert) <= 0) {..
d280: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
d290: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 ree(&ds);.. T
d2a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
d2b0: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
d2c0: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 to set certifica
d2d0: 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 te: ",.... R
d2e0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
d2f0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 ) NULL);.. SS
d300: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
d310: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c .. return NUL
d320: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 L;..}. } else
d330: 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 {..certfile = (
d340: 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 char*)X509_get_d
d350: 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 efault_cert_file
d360: 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 ();...if (SSL_CT
d370: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 X_use_certificat
d380: 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 e_file(ctx, cert
d390: 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 file, SSL_FILETY
d3a0: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a PE_PEM) <= 0) {.
d3b0: 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 #if 0.. Tcl_D
d3c0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
d3d0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
d3e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
d3f0: 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 unable to use de
d400: 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 fault certificat
d410: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 e file ", certfi
d420: 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 le, ": ",....
d430: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 REASON(), (cha
d440: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
d450: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
d460: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
d470: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a NULL;.#endif..}.
d480: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 }.. /* se
d490: 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 t our private ke
d4a0: 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 y */. if (loa
d4b0: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b d_private_key) {
d4c0: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d ..if (keyfile ==
d4d0: 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 NULL && key ==
d4e0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 NULL) {.. key
d4f0: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b file = certfile;
d500: 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c ..}...if (keyfil
d510: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 e != NULL) {..
d520: 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 /* get the pri
d530: 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 vate key associa
d540: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 ted with this ce
d550: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 rtificate */..
d560: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d if (keyfile ==
d570: 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 NULL) {...keyfi
d580: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 le = certfile;..
d590: 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 }... if (
d5a0: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 SSL_CTX_use_Priv
d5b0: 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c ateKey_file(ctx,
d5c0: 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 F2N(keyfile, &d
d5d0: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 s), SSL_FILETYPE
d5e0: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 _PEM) <= 0) {...
d5f0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
d600: 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 &ds);.../* flush
d610: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 the passphrase
d620: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c which might be l
d630: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c eft in the resul
d640: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 t */...Tcl_SetRe
d650: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c sult(interp, NUL
d660: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a L, TCL_STATIC);.
d670: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
d680: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 lt(interp, "unab
d690: 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 le to set public
d6a0: 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 key file ", key
d6b0: 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 20 file, " ",....
d6c0: 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c REASON(),
d6d0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d6e0: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
d6f0: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e ctx);...return N
d700: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 ULL;.. }..
d710: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
d720: 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 (&ds);...} else
d730: 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 if (key != NULL)
d740: 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f {.. if (SSL_
d750: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b CTX_use_PrivateK
d760: 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 ey_ASN1(EVP_PKEY
d770: 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b _RSA, ctx, key,k
d780: 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a ey_len) <= 0) {.
d790: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
d7a0: 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 e(&ds);.../* flu
d7b0: 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 sh the passphras
d7c0: 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 e which might be
d7d0: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 left in the res
d7e0: 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 ult */...Tcl_Set
d7f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e Result(interp, N
d800: 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 ULL, TCL_STATIC)
d810: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 ;...Tcl_AppendRe
d820: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e sult(interp, "un
d830: 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c able to set publ
d840: 69 63 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f ic key: ", REASO
d850: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
d860: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 LL);...SSL_CTX_f
d870: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 ree(ctx);...retu
d880: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a rn NULL;.. }.
d890: 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e .}../* Now we kn
d8a0: 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e ow that a key an
d8b0: 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e d cert have been
d8c0: 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a set against.. *
d8d0: 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 the SSL context
d8e0: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 */..if (!SSL_CT
d8f0: 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f X_check_private_
d900: 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 key(ctx)) {..
d910: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
d920: 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 t(interp, "priva
d930: 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 te key does not
d940: 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66 match the certif
d950: 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 icate public key
d960: 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 ",.... (char
d970: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
d980: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
d990: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
d9a0: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ULL;..}. }..
d9b0: 20 20 20 2f 2a 20 53 65 74 20 76 65 72 69 66 69 /* Set verifi
d9c0: 63 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 cation CAs */.
d9d0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
d9e0: 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f t(&ds);. Tcl_
d9f0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 DStringInit(&ds1
da00: 29 3b 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f );. if (!SSL_
da10: 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f CTX_load_verify_
da20: 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 locations(ctx, F
da30: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 2N(CAfile, &ds),
da40: 20 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31 F2N(CAdir, &ds1
da50: 29 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f )) ||..!SSL_CTX_
da60: 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 set_default_veri
da70: 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b fy_paths(ctx)) {
da80: 0a 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 .#if 0..Tcl_DStr
da90: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 54 ingFree(&ds);..T
daa0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
dab0: 64 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 ds1);../* Don't
dac0: 63 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20 69 currently care i
dad0: 66 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a f this fails */.
dae0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
daf0: 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 t(interp, "SSL d
db00: 65 66 61 75 6c 74 20 76 65 72 69 66 79 20 70 61 efault verify pa
db10: 74 68 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 ths: ", REASON()
db20: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
db30: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ;..SSL_CTX_free(
db40: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ctx);..return NU
db50: 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d LL;.#endif. }
db60: 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f .. /* https:/
db70: 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 /sourceforge.net
db80: 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 /p/tls/bugs/57/
db90: 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f */. /* XXX:TO
dba0: 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 DO: Let the user
dbb0: 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 supply values h
dbc0: 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 ere instead of s
dbd0: 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 omething that ex
dbe0: 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 ists on the file
dbf0: 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 system */. if
dc00: 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c (CAfile != NULL
dc10: 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 ) {..STACK_OF(X5
dc20: 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 09_NAME) *certNa
dc30: 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 mes = SSL_load_c
dc40: 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 lient_CA_file(F2
dc50: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b N(CAfile, &ds));
dc60: 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 ..if (certNames
dc70: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
dc80: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 SSL_CTX_set_clie
dc90: 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 nt_CA_list(ctx,
dca0: 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 certNames);..}.
dcb0: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 }.. Tcl_DS
dcc0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
dcd0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
dce0: 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 ree(&ds1);. r
dcf0: 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f eturn ctx;.}.../
dd00: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
dd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dd40: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 -------. *. * St
dd50: 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 atusObjCmd -- re
dd60: 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 turn certificate
dd70: 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 for connected p
dd80: 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c eer.. *. * Resul
dd90: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
dda0: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
ddb0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
ddc0: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
ddd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ddf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
de00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
de10: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
de20: 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 nt.StatusObjCmd(
de30: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
de40: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
de50: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
de60: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
de70: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
de80: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
de90: 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 r;. X509 *pee
dea0: 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a r;. Tcl_Obj *
deb0: 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f objPtr;. Tcl_
dec0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 Channel chan;.
ded0: 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e char *channelN
dee0: 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 ame, *ciphers;.
def0: 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 int mode;.
df00: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
df10: 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 char *proto;.
df20: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 unsigned int le
df30: 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 3b 0a n;. int nid;.
df40: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
df50: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 77 69 lled");.. swi
df60: 74 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61 tch (objc) {..ca
df70: 73 65 20 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e se 2:.. chann
df80: 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 elName = Tcl_Get
df90: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 StringFromObj(ob
dfa0: 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20 jv[1], NULL);..
dfb0: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 break;...case
dfc0: 20 33 3a 0a 09 20 20 20 20 69 66 20 28 21 73 74 3:.. if (!st
dfd0: 72 63 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 72 rcmp (Tcl_GetStr
dfe0: 69 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 ing (objv[1]), "
dff0: 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 68 -local")) {...ch
e000: 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f annelName = Tcl_
e010: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
e020: 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b (objv[2], NULL);
e030: 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d ...break;.. }
e040: 0a 09 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 .. /* else fa
e050: 6c 6c 2d 74 68 72 6f 75 67 68 20 2e 2e 2e 20 2a ll-through ... *
e060: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f /.#if defined(__
e070: 47 4e 55 43 5f 5f 29 0a 09 20 20 20 20 5f 5f 61 GNUC__).. __a
e080: 74 74 72 69 62 75 74 65 5f 5f 28 28 66 61 6c 6c ttribute__((fall
e090: 74 68 72 6f 75 67 68 29 29 3b 0a 23 65 6e 64 69 through));.#endi
e0a0: 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 f..default:..
e0b0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 Tcl_WrongNumArg
e0c0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
e0d0: 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 v, "?-local? cha
e0e0: 6e 6e 65 6c 22 29 3b 0a 09 20 20 20 20 72 65 74 nnel");.. ret
e0f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
e100: 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d }.. chan =
e110: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
e120: 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e interp, channelN
e130: 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 ame, &mode);.
e140: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 if (chan == (Tc
e150: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
e160: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
e170: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
e180: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
e190: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
e1a0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
e1b0: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
e1c0: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
e1d0: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 han);. if (Tc
e1e0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
e1f0: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
e200: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
e210: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
e220: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
e230: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
e240: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
e250: 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 an),..."\": not
e260: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 a TLS channel",
e270: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
e280: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
e290: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
e2a0: 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 State *) Tcl_Get
e2b0: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
e2c0: 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 ata(chan);. i
e2d0: 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a f (objc == 2) {.
e2e0: 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f .peer = SSL_get_
e2f0: 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 peer_certificate
e300: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
e310: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 . } else {..p
e320: 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 eer = SSL_get_ce
e330: 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 rtificate(stateP
e340: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a tr->ssl);. }.
e350: 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a if (peer) {.
e360: 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 .objPtr = Tls_Ne
e370: 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c wX509Obj(interp,
e380: 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a peer);..if (obj
e390: 63 20 3d 3d 20 32 29 20 7b 20 58 35 30 39 5f 66 c == 2) { X509_f
e3a0: 72 65 65 28 70 65 65 72 29 3b 20 7d 0a 20 20 20 ree(peer); }.
e3b0: 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 } else {..objPt
e3c0: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
e3d0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 bj(0, NULL);.
e3e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 }.. /* Peer
e3f0: 63 65 72 74 20 63 68 61 69 6e 20 28 63 6c 69 65 cert chain (clie
e400: 6e 74 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 20 20 nt only) */.
e410: 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 29 2a 20 STACK_OF(X509)*
e420: 73 73 6c 5f 63 65 72 74 73 20 3d 20 53 53 4c 5f ssl_certs = SSL_
e430: 67 65 74 5f 70 65 65 72 5f 63 65 72 74 5f 63 68 get_peer_cert_ch
e440: 61 69 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ain(statePtr->ss
e450: 6c 29 3b 0a 20 20 20 20 69 66 20 28 21 70 65 65 l);. if (!pee
e460: 72 20 26 26 20 28 73 73 6c 5f 63 65 72 74 73 20 r && (ssl_certs
e470: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 6b 5f 58 35 == NULL || sk_X5
e480: 30 39 5f 6e 75 6d 28 73 73 6c 5f 63 65 72 74 73 09_num(ssl_certs
e490: 29 20 3d 3d 20 30 29 29 20 7b 0a 09 72 65 74 75 ) == 0)) {..retu
e4a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
e4b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 }.. /* Peer
e4c0: 20 6e 61 6d 65 20 66 72 6f 6d 20 63 65 72 74 20 name from cert
e4d0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f */. Tcl_ListO
e4e0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
e4f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
e500: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
e510: 28 22 70 65 65 72 6e 61 6d 65 22 2c 20 2d 31 29 ("peername", -1)
e520: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
e530: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
e540: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
e550: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
e560: 28 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 (SSL_get0_peerna
e570: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c me(statePtr->ssl
e580: 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 ), -1));.. Tc
e590: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
e5a0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
e5b0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
e5c0: 72 69 6e 67 4f 62 6a 28 22 73 62 69 74 73 22 2c ringObj("sbits",
e5d0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
e5e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
e5f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
e600: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 tr, Tcl_NewIntOb
e610: 6a 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 j(SSL_get_cipher
e620: 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e _bits(statePtr->
e630: 73 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20 ssl, NULL)));..
e640: 20 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 ciphers = (ch
e650: 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 ar*)SSL_get_ciph
e660: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c er(statePtr->ssl
e670: 29 3b 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 );. if ((ciph
e680: 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 ers != NULL) &&
e690: 28 73 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c (strcmp(ciphers,
e6a0: 20 22 28 4e 4f 4e 45 29 22 29 20 21 3d 20 30 29 "(NONE)") != 0)
e6b0: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ) {..Tcl_ListObj
e6c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
e6d0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
e6e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
e6f0: 63 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 cipher", -1));..
e700: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
e710: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
e720: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
e730: 53 74 72 69 6e 67 4f 62 6a 28 63 69 70 68 65 72 StringObj(cipher
e740: 73 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a s, -1));. }..
e750: 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 /* Verify th
e760: 65 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61 e X509 certifica
e770: 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 79 20 te presented by
e780: 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 the peer */.
e790: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
e7a0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
e7b0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
e7c0: 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 StringObj("verif
e7d0: 69 63 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a ication", -1));.
e7e0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
e7f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
e800: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 54 63 erp, objPtr,..Tc
e810: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 58 l_NewStringObj(X
e820: 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 509_verify_cert_
e830: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c error_string(SSL
e840: 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 _get_verify_resu
e850: 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c lt(statePtr->ssl
e860: 29 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f )), -1));.. /
e870: 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c * Report the sel
e880: 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 ected protocol a
e890: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 s a result of th
e8a0: 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f e negotiation */
e8b0: 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c . SSL_get0_al
e8c0: 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 pn_selected(stat
e8d0: 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 ePtr->ssl, &prot
e8e0: 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63 o, &len);. Tc
e8f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
e900: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
e910: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
e920: 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 ringObj("alpn",
e930: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. 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 28 63 68 61 72 20 2a 29 70 72 6f 74 Obj((char *)prot
e980: 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 29 29 3b 0a o, (int) len));.
e990: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
e9a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
e9b0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
e9c0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 _NewStringObj("p
e9d0: 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a rotocol", -1));.
e9e0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
e9f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
ea00: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
ea10: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
ea20: 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 L_get_version(st
ea30: 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 atePtr->ssl), -1
ea40: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 ));.. /* Vali
ea50: 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 d for non-RSA si
ea60: 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 gnature and TLS
ea70: 31 2e 33 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 1.3 */. Tcl_L
ea80: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
ea90: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
eaa0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
eab0: 67 4f 62 6a 28 22 73 69 67 6e 61 74 75 72 65 48 gObj("signatureH
eac0: 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 2d ashAlgorithm", -
ead0: 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a 1));. if (obj
eae0: 63 20 3d 3d 20 32 20 3f 20 53 53 4c 5f 67 65 74 c == 2 ? SSL_get
eaf0: 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f _peer_signature_
eb00: 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
eb10: 6c 2c 20 26 6e 69 64 29 20 3a 20 53 53 4c 5f 67 l, &nid) : SSL_g
eb20: 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 et_signature_nid
eb30: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
eb40: 26 6e 69 64 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 &nid)) {..Tcl_Li
eb50: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
eb60: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
eb70: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
eb80: 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e Obj(OBJ_nid2ln(n
eb90: 69 64 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d id), -1));. }
eba0: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 else {..Tcl_Lis
ebb0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
ebc0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
ebd0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
ebe0: 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 20 20 20 bj("", -1));.
ebf0: 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f }. Tcl_ListO
ec00: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
ec10: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
ec20: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
ec30: 28 22 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 ("signature_type
ec40: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 ", -1));. if
ec50: 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 53 53 4c (objc == 2 ? SSL
ec60: 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 _get_peer_signat
ec70: 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 ure_type_nid(sta
ec80: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 tePtr->ssl, &nid
ec90: 29 20 3a 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e ) : SSL_get_sign
eca0: 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 ature_type_nid(s
ecb0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e tatePtr->ssl, &n
ecc0: 69 64 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 id)) {..Tcl_List
ecd0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
ece0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
ecf0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
ed00: 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 j(OBJ_nid2ln(nid
ed10: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 ), -1));. } e
ed20: 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f lse {..Tcl_ListO
ed30: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
ed40: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
ed50: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
ed60: 28 22 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d ("", -1));. }
ed70: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
ed80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
ed90: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
eda0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
edb0: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
edc0: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
edd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ede0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
edf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ee00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ee10: 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 -. *. * Connecti
ee20: 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 onInfoObjCmd --
ee30: 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f return connectio
ee40: 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e n info from Open
ee50: 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c SSL.. *. * Resul
ee60: 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 ts:. *.A list of
ee70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f connection info
ee80: 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *---------
ee90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eeb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
eed0: 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 static int Conne
eee0: 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 ctionInfoObjCmd(
eef0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
ef00: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
ef10: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
ef20: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
ef30: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
ef40: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
ef50: 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e an;../* The chan
ef60: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 nel to set a mod
ef70: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 e on. */. Sta
ef80: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f te *statePtr;../
ef90: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 * client state f
efa0: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f or ssl socket */
efb0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
efc0: 6a 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 jPtr;. const
efd0: 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f SSL *ssl;. co
efe0: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a nst SSL_CIPHER *
eff0: 63 69 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 cipher;. cons
f000: 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 t SSL_SESSION *s
f010: 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 ession;. cons
f020: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
f030: 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 6c 6f 6e 67 *proto;. long
f040: 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 69 66 20 28 mode;.. if (
f050: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 objc != 2) {..Tc
f060: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
f070: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
f080: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 "channel");..ret
f090: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
f0a0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 }.. chan
f0b0: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
f0c0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 (interp, Tcl_Get
f0d0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 StringFromObj(ob
f0e0: 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 jv[1], NULL), NU
f0f0: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 LL);. if (cha
f100: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
f110: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
f120: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
f130: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b }.. /* Mak
f140: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
f150: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
f160: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
f170: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
f180: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
f190: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
f1a0: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
f1b0: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
f1c0: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ype()) {..Tcl_Ap
f1d0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
f1e0: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
f1f0: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
f200: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20 22 nelName(chan), "
f210: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
f220: 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 annel", NULL);..
f230: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
f240: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 );. }.. ob
f250: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
f260: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
f270: 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 . /* Connecti
f280: 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 on info */. s
f290: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
f2a0: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *)Tcl_GetChanne
f2b0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
f2c0: 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 an);. ssl = s
f2d0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 tatePtr->ssl;.
f2e0: 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c if (ssl != NUL
f2f0: 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 L) {../* connect
f300: 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 54 63 ion state */..Tc
f310: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
f320: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
f330: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
f340: 72 69 6e 67 4f 62 6a 28 22 73 74 61 74 65 22 2c ringObj("state",
f350: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
f360: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
f370: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f380: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
f390: 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 j(SSL_state_stri
f3a0: 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 ng_long(ssl), -1
f3b0: 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 ));.../* Get SNI
f3c0: 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76 65 requested serve
f3d0: 72 20 6e 61 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c r name */..Tcl_L
f3e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f3f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
f400: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
f410: 67 4f 62 6a 28 22 73 65 72 76 65 72 6e 61 6d 65 gObj("servername
f420: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ", -1));..Tcl_Li
f430: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
f440: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
f450: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
f460: 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 72 76 Obj(SSL_get_serv
f470: 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 ername(ssl, TLSE
f480: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 XT_NAMETYPE_host
f490: 5f 6e 61 6d 65 29 2c 20 2d 31 29 29 3b 0a 0a 09 _name), -1));...
f4a0: 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 /* Get protocol
f4b0: 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 */..Tcl_ListObjA
f4c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f4d0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f4e0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 _NewStringObj("p
f4f0: 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a rotocol", -1));.
f500: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
f510: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f520: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
f530: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 wStringObj(SSL_g
f540: 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c et_version(ssl),
f550: 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 -1));.../* Rene
f560: 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 gotiation allowe
f570: 64 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 d */..Tcl_ListOb
f580: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
f590: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
f5a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
f5b0: 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 22 2c "renegotiation",
f5c0: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
f5d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
f5e0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f5f0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
f600: 6a 28 0a 09 20 20 20 20 53 53 4c 5f 67 65 74 5f j(.. SSL_get_
f610: 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 secure_renegotia
f620: 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c tion_support(ssl
f630: 29 20 3f 20 22 73 75 70 70 6f 72 74 65 64 22 20 ) ? "supported"
f640: 3a 20 22 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 : "not supported
f650: 22 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 ", -1));.../* Ge
f660: 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c t security level
f670: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a */..Tcl_ListObj
f680: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
f690: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
f6a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
f6b0: 73 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 securitylevel",
f6c0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
f6d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
f6e0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f6f0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 Tcl_NewIntObj(SS
f700: 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c L_get_security_l
f710: 65 76 65 6c 28 73 73 6c 29 29 29 3b 0a 0a 09 2f evel(ssl)));.../
f720: 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a * Session info *
f730: 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 /..Tcl_ListObjAp
f740: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
f750: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
f760: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 NewStringObj("se
f770: 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 2d ssion_reused", -
f780: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
f790: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
f7a0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
f7b0: 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a cl_NewBooleanObj
f7c0: 28 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 (SSL_session_reu
f7d0: 73 65 64 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a sed(ssl)));.../*
f7e0: 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 Is server info
f7f0: 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 */..Tcl_ListObjA
f800: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f810: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f820: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 _NewStringObj("i
f830: 73 5f 73 65 72 76 65 72 22 2c 20 2d 31 29 29 3b s_server", -1));
f840: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
f850: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
f860: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
f870: 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c ewBooleanObj(SSL
f880: 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 _is_server(ssl))
f890: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
f8a0: 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a Cipher info */.
f8b0: 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c cipher = SSL
f8c0: 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 _get_current_cip
f8d0: 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 her(ssl);. if
f8e0: 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c (cipher != NULL
f8f0: 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 ) {..char buf[BU
f900: 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e FSIZ] = {0};..in
f910: 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 t bits, alg_bits
f920: 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 ;...Tcl_ListObjA
f930: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
f940: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
f950: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 _NewStringObj("c
f960: 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 ipher", -1));..T
f970: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
f980: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
f990: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
f9a0: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 tringObj(SSL_CIP
f9b0: 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 HER_get_name(cip
f9c0: 68 65 72 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c her), -1));..Tcl
f9d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
f9e0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
f9f0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
fa00: 69 6e 67 4f 62 6a 28 22 73 74 61 6e 64 61 72 64 ingObj("standard
fa10: 5f 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 _name", -1));..T
fa20: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
fa30: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
fa40: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
fa50: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 tringObj(SSL_CIP
fa60: 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d HER_standard_nam
fa70: 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b e(cipher), -1));
fa80: 0a 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 ...bits = SSL_CI
fa90: 50 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 PHER_get_bits(ci
faa0: 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 pher, &alg_bits)
fab0: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
fac0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
fad0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
fae0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 62 69 NewStringObj("bi
faf0: 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f ts", -1));..Tcl_
fb00: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
fb10: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
fb20: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
fb30: 62 6a 28 62 69 74 73 29 29 3b 0a 09 54 63 6c 5f bj(bits));..Tcl_
fb40: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
fb50: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
fb60: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
fb70: 6e 67 4f 62 6a 28 22 73 65 63 72 65 74 5f 62 69 ngObj("secret_bi
fb80: 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f ts", -1));..Tcl_
fb90: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
fba0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
fbb0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
fbc0: 62 6a 28 61 6c 67 5f 62 69 74 73 29 29 3b 0a 09 bj(alg_bits));..
fbd0: 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 /* alg_bits is a
fbe0: 63 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 ctual key secret
fbf0: 20 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 bits. If use bi
fc00: 74 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 ts and secret (a
fc10: 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 lgorithm) bits d
fc20: 69 66 66 65 72 2c 0a 20 20 20 20 20 20 20 20 20 iffer,.
fc30: 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 the rest of th
fc40: 65 20 62 69 74 73 20 61 72 65 20 66 69 78 65 64 e bits are fixed
fc50: 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 , i.e. for limit
fc60: 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 ed export cipher
fc70: 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f s (bits < 56) */
fc80: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
fc90: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
fca0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
fcb0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69 6e ewStringObj("min
fcc0: 5f 76 65 72 73 69 6f 6e 22 2c 20 2d 31 29 29 3b _version", -1));
fcd0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
fce0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
fcf0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
fd00: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f ewStringObj(SSL_
fd10: 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69 CIPHER_get_versi
fd20: 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29 on(cipher), -1))
fd30: 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 ;.../* Get OpenS
fd40: 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 SL-specific ID,
fd50: 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 not IANA ID */..
fd60: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
fd70: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
fd80: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
fd90: 53 74 72 69 6e 67 4f 62 6a 28 22 69 64 22 2c 20 StringObj("id",
fda0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
fdb0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
fdc0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
fdd0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 28 69 Tcl_NewIntObj((i
fde0: 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 nt) SSL_CIPHER_g
fdf0: 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 29 3b et_id(cipher)));
fe00: 0a 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 ...if (SSL_CIPHE
fe10: 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69 R_description(ci
fe20: 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f pher, buf, sizeo
fe30: 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 f(buf)) != NULL)
fe40: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
fe50: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
fe60: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
fe70: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
fe80: 6a 28 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c j("description",
fe90: 20 2d 31 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f -1));.. Tcl_
fea0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
feb0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
fec0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
fed0: 6e 67 4f 62 6a 28 62 75 66 2c 20 2d 31 29 29 3b ngObj(buf, -1));
fee0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
fef0: 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a * Session info *
ff00: 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 /. session =
ff10: 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 SSL_get_session(
ff20: 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 65 ssl);. if (se
ff30: 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b ssion != NULL) {
ff40: 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 ..const unsigned
ff50: 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 char *ticket;..
ff60: 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e size_t len2;..un
ff70: 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b signed int ulen;
ff80: 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 ..const unsigned
ff90: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 char *session_i
ffa0: 64 3b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b d;..char buffer[
ffb0: 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b SSL_MAX_MASTER_K
ffc0: 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a EY_LENGTH];.../*
ffd0: 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 Report the sele
ffe0: 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 cted protocol as
fff0: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 a result of the
10000 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f ALPN negotiatio
10010 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f n */..SSL_SESSIO
10020 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 N_get0_alpn_sele
10030 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 cted(session, &p
10040 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 roto, &len2);..T
10050 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10060 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10070 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
10080 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c tringObj("alpn",
10090 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
100a0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
100b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
100c0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
100d0 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c j((char *)proto,
100e0 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a (int) len2));..
100f0 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 ./* Report the s
10100 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
10110 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 as a result of
10120 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 the NPN negotiat
10130 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 ion */.#ifdef US
10140 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f E_NPN..SSL_get0_
10150 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 next_proto_negot
10160 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 iated(ssl, &prot
10170 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 54 63 6c 5f o, &ulen);..Tcl_
10180 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10190 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
101a0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
101b0 6e 67 4f 62 6a 28 22 6e 70 6e 22 2c 20 2d 31 29 ngObj("npn", -1)
101c0 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
101d0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
101e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
101f0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 _NewStringObj((c
10200 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e har *)proto, (in
10210 74 29 20 75 6c 65 6e 29 29 3b 0a 23 65 6e 64 69 t) ulen));.#endi
10220 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 f.../* Resumable
10230 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 54 63 6c session */..Tcl
10240 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
10250 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
10260 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
10270 69 6e 67 4f 62 6a 28 22 72 65 73 75 6d 61 62 6c ingObj("resumabl
10280 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c e", -1));..Tcl_L
10290 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
102a0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
102b0 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 tr, Tcl_NewIntOb
102c0 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 j(SSL_SESSION_is
102d0 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 _resumable(sessi
102e0 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 on)));.../* Sess
102f0 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 20 28 ion start time (
10300 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 seconds since ep
10310 6f 63 68 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 och) */..Tcl_Lis
10320 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
10330 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
10340 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
10350 62 6a 28 22 73 74 61 72 74 5f 74 69 6d 65 22 2c bj("start_time",
10360 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
10370 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
10380 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10390 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 Tcl_NewLongObj(
103a0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
103b0 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 29 3b time(session)));
103c0 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 .../* Timeout va
103d0 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 lue - SSL_CTX_ge
103e0 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 t_timeout (in se
103f0 63 6f 6e 64 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c conds) */..Tcl_L
10400 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10410 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
10420 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
10430 67 4f 62 6a 28 22 74 69 6d 65 6f 75 74 22 2c 20 gObj("timeout",
10440 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
10450 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
10460 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10470 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 Tcl_NewLongObj(S
10480 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 SL_SESSION_get_t
10490 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 imeout(session))
104a0 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
104b0 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 ticket lifetime
104c0 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 hint (in seconds
104d0 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 ) */..Tcl_ListOb
104e0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
104f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
10500 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
10510 22 6c 69 66 65 74 69 6d 65 22 2c 20 2d 31 29 29 "lifetime", -1))
10520 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
10530 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10540 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
10550 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 NewLongObj(SSL_S
10560 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 ESSION_get_ticke
10570 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 t_lifetime_hint(
10580 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a session)));.../*
10590 20 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 Session id */..
105a0 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c session_id = SSL
105b0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 _SESSION_get_id(
105c0 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b session, &ulen);
105d0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
105e0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
105f0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
10600 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 ewStringObj("ses
10610 73 69 6f 6e 5f 69 64 22 2c 20 2d 31 29 29 3b 0a sion_id", -1));.
10620 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
10630 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
10640 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
10650 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 wByteArrayObj(se
10660 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 ssion_id, (int)
10670 75 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 ulen));.../* Ses
10680 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c sion ticket - cl
10690 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 ient only */..SS
106a0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 L_SESSION_get0_t
106b0 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 icket(session, &
106c0 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a ticket, &len2);.
106d0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
106e0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
106f0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
10700 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 wStringObj("sess
10710 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 2d 31 29 ion_ticket", -1)
10720 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
10730 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
10740 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
10750 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a _NewByteArrayObj
10760 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c (ticket, (int) l
10770 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b en2));.../* Tick
10780 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a 09 et app data */..
10790 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
107a0 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28 _ticket_appdata(
107b0 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 session, &ticket
107c0 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c , &len2);..Tcl_L
107d0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
107e0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
107f0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
10800 67 4f 62 6a 28 22 74 69 63 6b 65 74 5f 61 70 70 gObj("ticket_app
10810 5f 64 61 74 61 22 2c 20 2d 31 29 29 3b 0a 09 54 _data", -1));..T
10820 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10830 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10840 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 objPtr, Tcl_NewB
10850 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b yteArrayObj(tick
10860 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 et, (int) len2))
10870 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 ;.../* Get maste
10880 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d r key */..len2 =
10890 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
108a0 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73 73 _master_key(sess
108b0 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 4c ion, buffer, SSL
108c0 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f _MAX_MASTER_KEY_
108d0 4c 45 4e 47 54 48 29 3b 0a 09 54 63 6c 5f 4c 69 LENGTH);..Tcl_Li
108e0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
108f0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
10900 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
10910 4f 62 6a 28 22 6d 61 73 74 65 72 5f 6b 65 79 22 Obj("master_key"
10920 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
10930 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
10940 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
10950 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 , Tcl_NewByteArr
10960 61 79 4f 62 6a 28 62 75 66 66 65 72 2c 20 28 69 ayObj(buffer, (i
10970 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 20 20 20 20 nt) len2));.
10980 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 }.. /* Compre
10990 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 ssion info */.
109a0 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c if (ssl != NUL
109b0 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 L) {.#ifdef HAVE
109c0 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e _SSL_COMPRESSION
109d0 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 ..const COMP_MET
109e0 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e HOD *comp, *expn
109f0 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 ;..comp = SSL_ge
10a00 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 t_current_compre
10a10 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 ssion(ssl);..exp
10a20 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 n = SSL_get_curr
10a30 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 ent_expansion(ss
10a40 6c 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 l);...Tcl_ListOb
10a50 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
10a60 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
10a70 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
10a80 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 2d "compression", -
10a90 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
10aa0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
10ab0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
10ac0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
10ad0 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f comp ? SSL_COMP_
10ae0 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a get_name(comp) :
10af0 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 09 "NONE", -1));..
10b00 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
10b10 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
10b20 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
10b30 53 74 72 69 6e 67 4f 62 6a 28 22 65 78 70 61 6e StringObj("expan
10b40 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 sion", -1));..Tc
10b50 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10b60 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
10b70 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
10b80 72 69 6e 67 4f 62 6a 28 65 78 70 6e 20 3f 20 53 ringObj(expn ? S
10b90 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 SL_COMP_get_name
10ba0 28 65 78 70 6e 29 20 3a 20 22 4e 4f 4e 45 22 2c (expn) : "NONE",
10bb0 20 2d 31 29 29 3b 0a 23 65 6c 73 65 0a 09 54 63 -1));.#else..Tc
10bc0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10bd0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
10be0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
10bf0 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65 73 ringObj("compres
10c00 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 sion", -1));..Tc
10c10 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10c20 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
10c30 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
10c40 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20 ringObj("NONE",
10c50 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
10c60 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
10c70 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10c80 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
10c90 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 ("expansion", -1
10ca0 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ));..Tcl_ListObj
10cb0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
10cc0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
10cd0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
10ce0 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 65 6e NONE", -1));.#en
10cf0 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f dif. }.. /
10d00 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f * Server info */
10d10 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f . mode = SSL_
10d20 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f CTX_get_session_
10d30 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 cache_mode(state
10d40 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 Ptr->ctx);. i
10d50 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 f (mode & SSL_SE
10d60 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a SS_CACHE_OFF) {.
10d70 09 70 72 6f 74 6f 20 3d 20 22 6f 66 66 22 3b 0a .proto = "off";.
10d80 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6d } else if (m
10d90 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 ode & SSL_SESS_C
10da0 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 ACHE_CLIENT) {..
10db0 70 72 6f 74 6f 20 3d 20 22 63 6c 69 65 6e 74 22 proto = "client"
10dc0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
10dd0 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 (mode & SSL_SESS
10de0 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b _CACHE_SERVER) {
10df0 0a 09 70 72 6f 74 6f 20 3d 20 22 73 65 72 76 65 ..proto = "serve
10e00 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 r";. } else i
10e10 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 f (mode & SSL_SE
10e20 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b SS_CACHE_BOTH) {
10e30 0a 09 70 72 6f 74 6f 20 3d 20 22 62 6f 74 68 22 ..proto = "both"
10e40 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
10e50 70 72 6f 74 6f 20 3d 20 22 75 6e 6b 6e 6f 77 6e proto = "unknown
10e60 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c ";. }. Tcl
10e70 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
10e80 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
10e90 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
10ea0 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f ingObj("session_
10eb0 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 2d 31 29 cache_mode", -1)
10ec0 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
10ed0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
10ee0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10ef0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
10f00 28 70 72 6f 74 6f 2c 20 2d 31 29 29 3b 0a 0a 20 (proto, -1));..
10f10 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
10f20 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ult(interp, objP
10f30 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
10f40 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 TCL_OK;..clientD
10f50 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 ata = clientData
10f60 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
10f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
10fb0 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 *. * VersionObjC
10fc0 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 md -- return ver
10fd0 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d sion string from
10fe0 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 OpenSSL.. *. *
10ff0 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
11000 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
11010 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
11020 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a fects:. *.None..
11030 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
11040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11070 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
11080 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f tic int.VersionO
11090 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
110a0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
110b0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
110c0 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
110d0 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
110e0 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 ) {. Tcl_Obj
110f0 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 *objPtr;.. dp
11100 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
11110 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
11120 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
11130 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
11140 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54 TEXT, -1);. T
11150 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
11160 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
11170 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
11180 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 _OK;..clientData
11190 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 09 = clientData;..
111a0 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 6f 62 objc = objc;..ob
111b0 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f jv = objv;.}.../
111c0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
111d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
111e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
111f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11200 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 -------. *. * Mi
11210 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 scObjCmd -- misc
11220 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 commands. *. *
11230 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
11240 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
11250 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
11260 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a fects:. *.None..
11270 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
11280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
112a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
112b0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
112c0 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 tic int.MiscObjC
112d0 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
112e0 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
112f0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
11300 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
11310 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
11320 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 . static cons
11330 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 t char *commands
11340 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 [] = { "req", "
11350 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b strreq", NULL };
11360 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e . enum comman
11370 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 d { C_REQ, C_STR
11380 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a REQ, C_DUMMY };.
11390 20 20 20 20 69 6e 74 20 63 6d 64 2c 20 69 73 53 int cmd, isS
113a0 74 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 tr;. char buf
113b0 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 20 fer[16384];..
113c0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
113d0 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ");.. if (obj
113e0 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 c < 2) {..Tcl_Wr
113f0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
11400 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 p, 1, objv, "sub
11410 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 command ?args?")
11420 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
11430 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
11440 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 f (Tcl_GetIndexF
11450 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
11460 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 bjv[1], commands
11470 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 26 , "command", 0,&
11480 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 cmd) != TCL_OK)
11490 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
114a0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
114b0 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 isStr = (cmd ==
114c0 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 C_STRREQ);. s
114d0 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d witch ((enum com
114e0 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 mand) cmd) {..ca
114f0 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 se C_REQ:..case
11500 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 C_STRREQ: {..
11510 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d EVP_PKEY *pkey=
11520 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 NULL;.. X509
11530 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 *cert=NULL;..
11540 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 X509_NAME *name
11550 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f =NULL;.. Tcl_
11560 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 Obj **listv;..
11570 20 20 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a 0a int listc,i;..
11580 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 . BIO *out=NU
11590 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a LL;... char *
115a0 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c k_C="",*k_ST="",
115b0 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c *k_L="",*k_O="",
115c0 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 *k_OU="",*k_CN="
115d0 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 ",*k_Email="";..
115e0 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 char *keyout
115f0 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 ,*pemout,*str;..
11600 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c int keysize,
11610 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 serial=0,days=36
11620 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 5;..#if OPENSSL_
11630 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
11640 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 0x30000000L..
11650 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 BIGNUM *bne =
11660 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a NULL;.. RSA *
11670 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 rsa = NULL;.#els
11680 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f e.. EVP_PKEY_
11690 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b CTX *ctx = NULL;
116a0 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 .#endif... if
116b0 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f ((objc<5) || (o
116c0 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f bjc>6)) {...Tcl_
116d0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
116e0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b erp, 2, objv, "k
116f0 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 eysize keyfile c
11700 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 ertfile ?info?")
11710 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ;...return TCL_E
11720 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 RROR;.. }...
11730 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e if (Tcl_GetIn
11740 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c tFromObj(interp,
11750 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 objv[2], &keysi
11760 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ze) != TCL_OK) {
11770 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
11780 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 ROR;.. }..
11790 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 keyout=Tcl_GetS
117a0 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a tring(objv[3]);.
117b0 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f . pemout=Tcl_
117c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 GetString(objv[4
117d0 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 ]);.. if (isS
117e0 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 tr) {...Tcl_SetV
117f0 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 ar(interp,keyout
11800 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 ,"",0);...Tcl_Se
11810 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f tVar(interp,pemo
11820 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d ut,"",0);.. }
11830 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e ... if (objc>
11840 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f =6) {...if (Tcl_
11850 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e ListObjGetElemen
11860 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b ts(interp, objv[
11870 35 5d 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20 26 5],....&listc, &
11880 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b listv) != TCL_OK
11890 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e ) {... return
118a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a TCL_ERROR;...}.
118b0 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 ...if ((listc%2)
118c0 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 != 0) {... T
118d0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
118e0 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e erp,"Information
118f0 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 list must have
11900 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 even number of a
11910 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b rguments",NULL);
11920 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
11930 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 L_ERROR;...}...f
11940 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 or (i=0; i<listc
11950 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 ; i+=2) {...
11960 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e str=Tcl_GetStrin
11970 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 g(listv[i]);...
11980 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 if (strcmp(st
11990 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a r,"days")==0) {.
119a0 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e ...if (Tcl_GetIn
119b0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c tFromObj(interp,
119c0 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 listv[i+1],&days
119d0 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 )!=TCL_OK)....
119e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
119f0 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 OR;... } else
11a00 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
11a10 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a "serial")==0) {.
11a20 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e ...if (Tcl_GetIn
11a30 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c tFromObj(interp,
11a40 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 listv[i+1],&seri
11a50 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 al)!=TCL_OK)....
11a60 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
11a70 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c RROR;... } el
11a80 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
11a90 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 r,"C")==0) {....
11aa0 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e k_C=Tcl_GetStrin
11ab0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
11ac0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
11ad0 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 strcmp(str,"ST")
11ae0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 ==0) {....k_ST=T
11af0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
11b00 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
11b10 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
11b20 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b p(str,"L")==0) {
11b30 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 ....k_L=Tcl_GetS
11b40 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
11b50 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
11b60 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
11b70 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f O")==0) {....k_O
11b80 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
11b90 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
11ba0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
11bb0 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 cmp(str,"OU")==0
11bc0 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f ) {....k_OU=Tcl_
11bd0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
11be0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
11bf0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
11c00 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 tr,"CN")==0) {..
11c10 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 ..k_CN=Tcl_GetSt
11c20 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
11c30 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
11c40 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 f (strcmp(str,"E
11c50 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 mail")==0) {....
11c60 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 k_Email=Tcl_GetS
11c70 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
11c80 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
11c90 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 {....Tcl_SetResu
11ca0 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f lt(interp,"Unkno
11cb0 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 wn parameter",NU
11cc0 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 LL);....return T
11cd0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 CL_ERROR;...
11ce0 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 }...}.. }..#i
11cf0 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
11d00 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
11d10 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 00000L.. bne
11d20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 = BN_new();..
11d30 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 rsa = RSA_new()
11d40 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 ;.. pkey = EV
11d50 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 P_PKEY_new();..
11d60 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 if (bne == NU
11d70 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c LL || rsa == NUL
11d80 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c L || pkey == NUL
11d90 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 L || !BN_set_wor
11da0 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c d(bne,RSA_F4) ||
11db0 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 ...!RSA_generate
11dc0 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 _key_ex(rsa, key
11dd0 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 size, bne, NULL)
11de0 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 || !EVP_PKEY_as
11df0 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 sign_RSA(pkey, r
11e00 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 sa)) {...EVP_PKE
11e10 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 Y_free(pkey);...
11e20 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 /* RSA_free(rsa)
11e30 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 ; freed by EVP_P
11e40 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e KEY_free */...BN
11e50 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 _free(bne);.#els
11e60 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 e.. pkey = EV
11e70 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 P_RSA_gen((unsig
11e80 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 ned int) keysize
11e90 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 );.. ctx = EV
11ea0 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 P_PKEY_CTX_new(p
11eb0 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 key,NULL);..
11ec0 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c if (pkey == NULL
11ed0 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 || ctx == NULL
11ee0 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 || !EVP_PKEY_key
11ef0 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c gen_init(ctx) ||
11f00 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 ...!EVP_PKEY_CTX
11f10 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f _set_rsa_keygen_
11f20 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a bits(ctx, keysiz
11f30 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f e) || !EVP_PKEY_
11f40 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 keygen(ctx, &pke
11f50 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 y)) {...EVP_PKEY
11f60 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 _free(pkey);...E
11f70 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 VP_PKEY_CTX_free
11f80 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 (ctx);.#endif...
11f90 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
11fa0 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 terp,"Error gene
11fb0 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b rating private k
11fc0 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 ey",NULL);...ret
11fd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
11fe0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 } else {...i
11ff0 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 f (isStr) {...
12000 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 out=BIO_new(BI
12010 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 O_s_mem());...
12020 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f PEM_write_bio_
12030 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 PrivateKey(out,p
12040 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c key,NULL,NULL,0,
12050 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 NULL,NULL);...
12060 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 i=BIO_read(out
12070 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 ,buffer,sizeof(b
12080 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 uffer)-1);...
12090 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 i=(i<0) ? 0 : i
120a0 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 ;... buffer[i
120b0 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 ]='\0';... Tc
120c0 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
120d0 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 keyout,buffer,0)
120e0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 ;... BIO_flus
120f0 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 h(out);... BI
12100 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d O_free(out);...}
12110 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 else {... ou
12120 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
12130 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 file());... B
12140 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d IO_write_filenam
12150 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 e(out,keyout);..
12160 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
12170 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 io_PrivateKey(ou
12180 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c t,pkey,NULL,NULL
12190 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 ,0,NULL,NULL);..
121a0 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 . /* PEM_writ
121b0 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 e_bio_RSAPrivate
121c0 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 Key(out, rsa, NU
121d0 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c LL, NULL, 0, NUL
121e0 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 L, NULL); */...
121f0 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 BIO_free_all(
12200 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 out);.. .}....if
12210 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 ((cert=X509_new
12220 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 ())==NULL) {...
12230 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 Tcl_SetResult
12240 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 (interp,"Error g
12250 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 enerating certif
12260 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e icate request",N
12270 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f ULL);... EVP_
12280 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
12290 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
122a0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
122b0 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 30000000L...
122c0 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
122d0 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 ndif... retur
122e0 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 n(TCL_ERROR);...
122f0 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 }....X509_set_ve
12300 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 rsion(cert,2);..
12310 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 .ASN1_INTEGER_se
12320 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 t(X509_get_seria
12330 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 lNumber(cert),se
12340 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d rial);...X509_gm
12350 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 time_adj(X509_ge
12360 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 tm_notBefore(cer
12370 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d t),0);...X509_gm
12380 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 time_adj(X509_ge
12390 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 tm_notAfter(cert
123a0 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 ),(long)60*60*24
123b0 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 *days);...X509_s
123c0 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 et_pubkey(cert,p
123d0 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 key);....name=X5
123e0 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 09_get_subject_n
123f0 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 ame(cert);....X5
12400 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
12410 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 y_by_txt(name,"C
12420 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
12430 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
12440 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 char *) k_C, -1
12450 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
12460 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
12470 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 by_txt(name,"ST"
12480 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
12490 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
124a0 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 char *) k_ST, -1
124b0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
124c0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
124d0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c by_txt(name,"L",
124e0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
124f0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
12500 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 har *) k_L, -1,
12510 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
12520 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
12530 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d _txt(name,"O", M
12540 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
12550 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
12560 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 r *) k_O, -1, -1
12570 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
12580 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
12590 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 xt(name,"OU", MB
125a0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
125b0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
125c0 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 *) k_OU, -1, -1
125d0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
125e0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
125f0 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 xt(name,"CN", MB
12600 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
12610 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
12620 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 *) k_CN, -1, -1
12630 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
12640 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
12650 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c xt(name,"Email",
12660 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
12670 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
12680 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 har *) k_Email,
12690 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 -1, -1, 0);....X
126a0 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 509_set_subject_
126b0 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b name(cert,name);
126c0 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 ....if (!X509_si
126d0 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 gn(cert,pkey,EVP
126e0 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 _sha256())) {...
126f0 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 X509_free(ce
12700 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 rt);... EVP_P
12710 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
12720 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
12730 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
12740 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 0000000L... B
12750 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e N_free(bne);.#en
12760 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 dif... Tcl_Se
12770 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
12780 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 Error signing ce
12790 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 rtificate",NULL)
127a0 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 ;... return T
127b0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 CL_ERROR;...}...
127c0 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 .if (isStr) {...
127d0 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 out=BIO_new(
127e0 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 BIO_s_mem());...
127f0 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 PEM_write_bi
12800 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 o_X509(out,cert)
12810 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 ;... i=BIO_re
12820 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 ad(out,buffer,si
12830 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b zeof(buffer)-1);
12840 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f ... i=(i<0) ?
12850 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 0 : i;... bu
12860 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 ffer[i]='\0';...
12870 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 Tcl_SetVar(i
12880 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 nterp,pemout,buf
12890 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 fer,0);... BI
128a0 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 O_flush(out);...
128b0 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 BIO_free(out
128c0 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 );...} else {...
128d0 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 out=BIO_new(
128e0 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 BIO_s_file());..
128f0 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 . BIO_write_f
12900 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f ilename(out,pemo
12910 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ut);... PEM_w
12920 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 rite_bio_X509(ou
12930 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 t,cert);... B
12940 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 IO_free_all(out)
12950 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 ;...}....X509_fr
12960 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f ee(cert);...EVP_
12970 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
12980 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
12990 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
129a0 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 30000000L...BN_f
129b0 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 ree(bne);.#endif
129c0 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 .. }..}..brea
129d0 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a k;. default:.
129e0 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 .break;. }.
129f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
12a00 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
12a10 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
12a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12a30 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 ****/./* Init
12a40 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a */./**
12a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12a60 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d **/../*. *------
12a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
12ab0 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a . * Tls_Free --.
12ac0 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
12ad0 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 dure cleans up w
12ae0 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 hen a SSL socket
12af0 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 based channel.
12b00 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 *.is closed and
12b10 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f its reference co
12b20 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 unt falls below
12b30 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 1. *. * Results:
12b40 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.none. *. * S
12b50 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
12b60 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 Frees all the st
12b70 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ate. *. *-------
12b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
12bc0 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 63 .void.Tls_Free(c
12bd0 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b har *blockPtr) {
12be0 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
12bf0 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
12c00 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 blockPtr;.. d
12c10 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
12c20 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e ;.. Tls_Clean
12c30 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 (statePtr);.
12c40 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 ckfree(blockPtr)
12c50 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
12c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
12ca0 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d *. * Tls_Clean -
12cb0 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
12cc0 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 cedure cleans up
12cd0 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b when a SSL sock
12ce0 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c et based channel
12cf0 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e . *.is closed an
12d00 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 d its reference
12d10 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f count falls belo
12d20 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c w 1. This shoul
12d30 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 d. *.be called s
12d40 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 ynchronously by
12d50 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e the CloseProc, n
12d60 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 ot in the. *.Eve
12d70 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c ntuallyFree call
12d80 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 back.. *. * Resu
12d90 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a lts:. *.none. *.
12da0 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
12db0 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 . *.Frees all th
12dc0 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d e state. *. *---
12dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e10 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c . */.void Tls_Cl
12e20 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 ean(State *state
12e30 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e Ptr) {. dprin
12e40 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
12e50 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 /*. * we'
12e60 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 re assuming here
12e70 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 that we're sing
12e80 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 le-threaded.
12e90 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
12ea0 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 ePtr->timer != (
12eb0 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 Tcl_TimerToken)
12ec0 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c NULL) {..Tcl_Del
12ed0 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 eteTimerHandler(
12ee0 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 statePtr->timer)
12ef0 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d ;..statePtr->tim
12f00 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d er = NULL;. }
12f10 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
12f20 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 tr->protos) {..c
12f30 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e kfree(statePtr->
12f40 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 protos);..stateP
12f50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c tr->protos = NUL
12f60 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
12f70 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 (statePtr->bio)
12f80 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 {../* This will
12f90 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 call SSL_shutdow
12fa0 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 2a n. Bug 1414045 *
12fb0 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f /..dprintf("BIO_
12fc0 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 free_all(%p)", s
12fd0 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 tatePtr->bio);..
12fe0 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 BIO_free_all(sta
12ff0 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 tePtr->bio);..st
13000 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 atePtr->bio = NU
13010 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
13020 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 (statePtr->ssl)
13030 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c {..dprintf("SSL
13040 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 _free(%p)", stat
13050 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c ePtr->ssl);..SSL
13060 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e _free(statePtr->
13070 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ssl);..statePtr-
13080 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 >ssl = NULL;.
13090 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
130a0 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c Ptr->ctx) {..SSL
130b0 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 _CTX_free(stateP
130c0 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 tr->ctx);..state
130d0 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b Ptr->ctx = NULL;
130e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
130f0 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
13100 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 k) {..Tcl_DecrRe
13110 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
13120 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 >callback);..sta
13130 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
13140 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
13150 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
13160 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c password) {..Tcl
13170 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _DecrRefCount(st
13180 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
13190 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 );..statePtr->pa
131a0 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 ssword = NULL;.
131b0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
131c0 74 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 tePtr->vcmd) {..
131d0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
131e0 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 (statePtr->vcmd)
131f0 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63 6d ;..statePtr->vcm
13200 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a d = NULL;. }.
13210 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 . dprintf("Re
13220 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f turning");.}.../
13230 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
13240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13270 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
13280 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 s_Init --. *. *.
13290 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 This is a packag
132a0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e e initialization
132b0 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 procedure, whic
132c0 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 h is called. *.b
132d0 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 y Tcl when this
132e0 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 package is to be
132f0 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 added to an int
13300 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 erpreter.. *. *
13310 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f Results: Ssl co
13320 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 nfigured and loa
13330 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ded. *. * Side e
13340 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 ffects:. *. crea
13350 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 te the ssl comma
13360 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 nd, initialize s
13370 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a sl context. *. *
13380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
133a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
133b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
133c0 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 ---. */.DLLEXPOR
133d0 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 T int Tls_Init(T
133e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
133f0 70 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 p) {. const c
13400 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 har tlsTclInitSc
13410 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c ript[] = {.#incl
13420 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a ude "tls.tcl.h".
13430 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 .0x00. };..
13440 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
13450 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 d");.. /*.
13460 20 20 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 * We only supp
13470 6f 72 74 20 54 63 6c 20 38 2e 34 20 6f 72 20 6e ort Tcl 8.4 or n
13480 65 77 65 72 0a 20 20 20 20 20 2a 2f 0a 20 20 20 ewer. */.
13490 20 69 66 20 28 0a 23 69 66 64 65 66 20 55 53 45 if (.#ifdef USE
134a0 5f 54 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c 5f _TCL_STUBS..Tcl_
134b0 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 InitStubs(interp
134c0 2c 20 22 38 2e 34 22 2c 20 30 29 0a 23 65 6c 73 , "8.4", 0).#els
134d0 65 0a 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 e..Tcl_PkgRequir
134e0 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c e(interp, "Tcl",
134f0 20 22 38 2e 34 2d 22 2c 20 30 29 0a 23 65 6e 64 "8.4-", 0).#end
13500 69 66 0a 09 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a if.. == NULL) {.
13510 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
13520 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 R;. }.. if
13530 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 (TlsLibInit(0)
13540 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 != TCL_OK) {..Tc
13550 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
13560 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f nterp, "could no
13570 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c t initialize SSL
13580 20 6c 69 62 72 61 72 79 22 2c 20 4e 55 4c 4c 29 library", NULL)
13590 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
135a0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
135b0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
135c0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
135d0 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 s::ciphers", Cip
135e0 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 hersObjCmd, (Cli
135f0 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
13600 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
13610 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
13620 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
13630 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
13640 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e connection", Con
13650 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d nectionInfoObjCm
13660 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
13670 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
13680 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
13690 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
136a0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
136b0 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 "tls::handshake
136c0 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 ", HandshakeObjC
136d0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
136e0 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
136f0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
13700 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
13710 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
13720 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c , "tls::import",
13730 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 ImportObjCmd, (
13740 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
13750 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
13760 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
13770 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
13780 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
13790 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e s::unimport", Un
137a0 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 importObjCmd, (C
137b0 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
137c0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
137d0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
137e0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
137f0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
13800 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 ::status", Statu
13810 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 sObjCmd, (Client
13820 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
13830 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
13840 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
13850 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
13860 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 nterp, "tls::ver
13870 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 sion", VersionOb
13880 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
13890 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
138a0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
138b0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
138c0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
138d0 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c rp, "tls::misc",
138e0 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c MiscObjCmd, (Cl
138f0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
13900 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
13910 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
13920 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
13930 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
13940 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f :protocols", Pro
13950 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 tocolsObjCmd, (C
13960 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
13970 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
13980 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 *) NULL);..
13990 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 if (interp) {..T
139a0 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 cl_Eval(interp,
139b0 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 tlsTclInitScript
139c0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 );. }.. re
139d0 74 75 72 6e 28 54 63 6c 5f 50 6b 67 50 72 6f 76 turn(Tcl_PkgProv
139e0 69 64 65 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 ide(interp, "tls
139f0 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 ", PACKAGE_VERSI
13a00 4f 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d ON));.}../*. *--
13a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a40 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f ----*. *. *.Tls_
13a50 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 SafeInit --. *.
13a60 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
13a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a90 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 --*. *.Standard
13aa0 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 procedure requir
13ab0 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a ed by 'load'.. *
13ac0 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 .Initializes thi
13ad0 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 s extension for
13ae0 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 a safe interpret
13af0 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d er.. *.---------
13b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b20 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 -------*. *. *.S
13b30 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
13b40 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 .As of 'Tls_Init
13b50 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a '. *. *.Result:.
13b60 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 *..A standard T
13b70 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 cl error code..
13b80 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
13b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a ----------*. */.
13bc0 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c DLLEXPORT int Tl
13bd0 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 s_SafeInit(Tcl_I
13be0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b nterp *interp) {
13bf0 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
13c00 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 lled");. retu
13c10 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 rn(Tls_Init(inte
13c20 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d rp));.}../*. *--
13c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c60 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c ----*. *. *.TlsL
13c70 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 ibInit --. *. *.
13c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13cb0 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 *. *.Initializes
13cc0 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 SSL library onc
13cd0 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f e per applicatio
13ce0 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d n. *.-----------
13cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13d10 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 -----*. *. *.Sid
13d20 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 e effects:. *..i
13d30 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c nitializes SSL l
13d40 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 ibrary. *. *.Res
13d50 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a ult:. *..none. *
13d60 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
13d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 ---------*. */.s
13da0 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 tatic int TlsLib
13db0 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 Init(int uniniti
13dc0 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 alize) {. sta
13dd0 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 tic int initiali
13de0 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 zed = 0;. int
13df0 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b status = TCL_OK
13e00 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ;.#if defined(OP
13e10 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
13e20 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
13e30 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f READS). size_
13e40 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e t num_locks;.#en
13e50 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 dif.. if (uni
13e60 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 nitialize) {.
13e70 20 20 20 20 20 69 66 20 28 21 69 6e 69 74 69 61 if (!initia
13e80 6c 69 7a 65 64 29 20 7b 0a 20 20 20 20 20 20 20 lized) {.
13e90 20 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 dprintf("As
13ea0 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c ked to uninitial
13eb0 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 20 ize, but we are
13ec0 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 not initialized"
13ed0 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 );..
13ee0 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a return(TCL_OK);.
13ef0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 }..
13f00 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 dprintf("Aske
13f10 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a d to uninitializ
13f20 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 e");..#if define
13f30 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
13f40 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
13f50 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 20 L_THREADS).
13f60 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b Tcl_MutexLock
13f70 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 20 20 20 (&init_mx);..
13f80 20 20 20 20 20 69 66 20 28 6c 6f 63 6b 73 29 20 if (locks)
13f90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 72 {. fr
13fa0 65 65 28 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 20 ee(locks);.
13fb0 20 20 20 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e locks = N
13fc0 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 ULL;.
13fd0 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b locksCount = 0;
13fe0 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 . }.#endi
13ff0 66 0a 20 20 20 20 20 20 20 20 69 6e 69 74 69 61 f. initia
14000 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20 lized = 0;..#if
14010 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
14020 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
14030 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
14040 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4d 75 74 . Tcl_Mut
14050 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d exUnlock(&init_m
14060 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 x);.#endif..
14070 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f return(TCL_O
14080 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 K);. }.. i
14090 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 f (initialized)
140a0 7b 0a 20 20 20 20 20 20 20 20 64 70 72 69 6e 74 {. dprint
140b0 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 f("Called, but u
140c0 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 sing cached valu
140d0 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 e");. ret
140e0 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20 urn(status);.
140f0 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 }.. dprintf(
14100 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 "Called");..#if
14110 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
14120 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
14130 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
14140 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f . Tcl_MutexLo
14150 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 ck(&init_mx);.#e
14160 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c ndif. initial
14170 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 ized = 1;..#if d
14180 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
14190 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
141a0 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
141b0 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 num_locks =
141c0 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 1;. locksCoun
141d0 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f t = (int) num_lo
141e0 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d cks;. locks =
141f0 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a malloc(sizeof(*
14200 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 locks) * num_loc
14210 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 ks);. memset(
14220 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 locks, 0, sizeof
14230 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c (*locks) * num_l
14240 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 ocks);.#endif..
14250 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 /* Initialize
14260 20 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 BOTH libcrypto
14270 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 and libssl. */.
14280 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f OPENSSL_init_
14290 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 ssl(OPENSSL_INIT
142a0 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 _LOAD_SSL_STRING
142b0 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 S | OPENSSL_INIT
142c0 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 _LOAD_CRYPTO_STR
142d0 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f INGS..| OPENSSL_
142e0 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 INIT_ADD_ALL_CIP
142f0 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 HERS | OPENSSL_I
14300 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 NIT_ADD_ALL_DIGE
14310 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 STS, NULL);..
14320 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c BIO_new_tcl(NUL
14330 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 L, 0);..#if 0.
14340 20 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a /*. * XXX:
14350 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 TODO: Remove thi
14360 73 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 s code and repla
14370 63 65 20 69 74 20 77 69 74 68 20 61 20 63 68 65 ce it with a che
14380 63 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e ck. * for en
14390 6f 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 ough entropy and
143a0 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 do not try to c
143b0 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 reate our own.
143c0 20 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e * terrible en
143d0 74 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 tropy. */.
143e0 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 /*. * Seed
143f0 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 the random numb
14400 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 er generator in
14410 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c the SSL library,
14420 0a 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 . * using th
14430 65 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 e do/while const
14440 72 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 ruct because of
14450 74 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 the bug note in
14460 74 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 the. * OpenS
14470 53 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f SL FAQ at http:/
14480 2f 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 /www.openssl.org
14490 2f 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d /support/faq.htm
144a0 6c 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 l#USER1. *.
144b0 20 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f * The crux o
144c0 66 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 f the problem is
144d0 20 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 that Solaris 7
144e0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a does not have a.
144f0 20 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 * /dev/rand
14500 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 om or /dev/urand
14510 6f 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 om device so it
14520 63 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e cannot gather en
14530 6f 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 ough. * entr
14540 6f 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e opy from the RAN
14550 44 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c D_seed() when TL
14560 53 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e S initializes an
14570 64 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a d refuses. *
14580 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 to go further.
14590 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 Earlier versions
145a0 20 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 of OpenSSL carr
145b0 69 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 ied on regardles
145c0 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 s.. */. s
145d0 72 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 rand((unsigned i
145e0 6e 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 nt) time((time_t
145f0 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 *) NULL));.
14600 64 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 do {..for (i = 0
14610 3b 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b ; i < 16; i++) {
14620 0a 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 .. rnd_seed[i
14630 5d 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 ] = 1 + (char) (
14640 32 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 255.0 * rand()/(
14650 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a RAND_MAX+1.0));.
14660 09 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e .}..RAND_seed(rn
14670 64 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 d_seed, sizeof(r
14680 6e 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d nd_seed));. }
14690 20 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 while (RAND_sta
146a0 74 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e tus() != 1);.#en
146b0 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 dif..#if defined
146c0 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
146d0 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
146e0 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d _THREADS)..Tcl_M
146f0 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 utexUnlock(&init
14700 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 _mx);.#endif...r
14710 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d eturn(status);.}
14720 0a .