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 0c 0a 2f 2a 2a 2a 2a 2a ADS */..../*****
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
09a0: 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20 ./* Callbacks
09b0: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a */./*******
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 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 20 3d 20 30 3b 0a 0a 20 20 ode, ok = 0;..
0bd0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
0be0: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
0bf0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 rp);. Tcl_Pre
0c00: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 serve((ClientDat
0c10: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 a) statePtr);..
0c20: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 /* Eval callb
0c30: 61 63 6b 20 77 69 74 68 20 73 75 63 63 65 73 73 ack with success
0c40: 20 66 6f 72 20 6f 6b 20 6f 72 20 72 65 74 75 72 for ok or retur
0c50: 6e 20 76 61 6c 75 65 20 31 2c 20 66 61 69 6c 20 n value 1, fail
0c60: 66 6f 72 20 65 72 72 6f 72 20 6f 72 20 72 65 74 for error or ret
0c70: 75 72 6e 20 76 61 6c 75 65 20 30 20 2a 2f 0a 20 urn value 0 */.
0c80: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 Tcl_ResetResu
0c90: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 lt(interp);.
0ca0: 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f code = Tcl_EvalO
0cb0: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 bjEx(interp, cmd
0cc0: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c Ptr, TCL_EVAL_GL
0cd0: 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 OBAL);. if (c
0ce0: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b ode == TCL_OK) {
0cf0: 0a 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c ../* Check resul
0d00: 74 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c t for return val
0d10: 75 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a ue */..Tcl_Obj *
0d20: 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 result = Tcl_Get
0d30: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
0d40: 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d );..if (result =
0d50: 3d 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 = NULL || Tcl_Ge
0d60: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 tIntFromObj(inte
0d70: 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 rp, result, &ok)
0d80: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 != TCL_OK) {..
0d90: 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 20 20 ok = 1;..}.
0da0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45 } else {../* E
0db0: 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68 rror - reject th
0dc0: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f e certificate */
0dd0: 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f .#if (TCL_MAJOR_
0de0: 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 VERSION == 8) &&
0df0: 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 (TCL_MINOR_VERS
0e00: 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 ION < 6)..Tcl_Ba
0e10: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e ckgroundError(in
0e20: 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 terp);.#else..Tc
0e30: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 l_BackgroundExce
0e40: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f ption(interp, co
0e50: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 de);.#endif.
0e60: 7d 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 }.. Tcl_Relea
0e70: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
0e80: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 statePtr);. T
0e90: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
0ea0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
0eb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a . return ok;.
0ec0: 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
0f10: 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 * InfoCallback
0f20: 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 --. *. *.Monitor
0f30: 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e s SSL connection
0f40: 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52 process. *. * R
0f50: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
0f60: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
0f70: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
0f80: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
0f90: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d d). *. *--------
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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
0fe0: 73 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f static void.Info
0ff0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
1000: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 SL *ssl, int whe
1010: 72 65 2c 20 69 6e 74 20 72 65 74 29 20 7b 0a 20 re, int ret) {.
1020: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
1030: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c tr = (State*)SSL
1040: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 _get_app_data((S
1050: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 SL *)ssl);. T
1060: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
1070: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
1080: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
1090: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 j *cmdPtr;. c
10a0: 68 61 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72 har *major; char
10b0: 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 70 *minor;.. dp
10c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
10d0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
10e0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 tr->callback ==
10f0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a (Tcl_Obj*)NULL).
1100: 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66 .return;.. if
1110: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 (where & SSL_CB
1120: 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 54 _HANDSHAKE_START
1130: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 ) {..major = "ha
1140: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 ndshake";..minor
1150: 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 20 = "start";.
1160: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 } else if (where
1170: 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 & SSL_CB_HANDSH
1180: 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a AKE_DONE) {..maj
1190: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 or = "handshake"
11a0: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 ;..minor = "done
11b0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ";. } else {.
11c0: 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c .if (where & SSL
11d0: 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a 6f _CB_ALERT)..majo
11e0: 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 6c r = "alert";..el
11f0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
1200: 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 6d SL_ST_CONNECT).m
1210: 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 22 ajor = "connect"
1220: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
1230: 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 50 e & SSL_ST_ACCEP
1240: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 63 T)..major = "acc
1250: 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 ept";..else.....
1260: 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e major = "unknown
1270: 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 26 ";...if (where &
1280: 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 6d SSL_CB_READ)..m
1290: 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a 09 inor = "read";..
12a0: 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 else if (where &
12b0: 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 09 SSL_CB_WRITE)..
12c0: 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 3b minor = "write";
12d0: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 ..else if (where
12e0: 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 & SSL_CB_LOOP).
12f0: 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b .minor = "loop";
1300: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 ..else if (where
1310: 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 09 & SSL_CB_EXIT).
1320: 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 3b .minor = "exit";
1330: 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f 72 ..else.....minor
1340: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 = "unknown";.
1350: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
1360: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
1370: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 al */. cmdPtr
1380: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
1390: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 Obj(statePtr->ca
13a0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c llback);. Tcl
13b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
13c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
13d0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
13e0: 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d ingObj("info", -
13f0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
1400: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1410: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
1420: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
1430: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
1440: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
1450: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
1460: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
1470: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1480: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
1490: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
14a0: 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 20 major, -1));.
14b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
14c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
14d0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
14e0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72 wStringObj(minor
14f0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 20 , -1));.. if
1500: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1510: 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c 69 ALERT) {..Tcl_Li
1520: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1530: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1540: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
1550: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 tringObj(SSL_ale
1560: 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c rt_desc_string_l
1570: 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a ong(ret), -1));.
1580: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
1590: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
15a0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
15b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
15c0: 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73 SSL_alert_type_s
15d0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c tring_long(ret),
15e0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 -1));. } els
15f0: 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a e {..Tcl_ListObj
1600: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1610: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
1620: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
1630: 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 Obj(SSL_state_st
1640: 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 ring_long(ssl),
1650: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
1660: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1670: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
1680: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1690: 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 ("info", -1));.
16a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 }.. /* Eva
16b0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
16c0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
16d0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
16e0: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c r);. EvalCall
16f0: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
1700: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
1710: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
1720: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a ount(cmdPtr);.}.
1730: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
1780: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b MessageCallback
1790: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f --. *. *.Monito
17a0: 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20 rs SSL protocol
17b0: 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52 messages. *. * R
17c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
17d0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
17e0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
17f0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
1800: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d d). *. *--------
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 2d 2d 2d 2d 2d 2d 2d ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
1850: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f #ifndef OPENSSL_
1860: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 73 74 61 NO_SSL_TRACE.sta
1870: 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 61 67 65 tic void.Message
1880: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 77 72 69 Callback(int wri
1890: 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 73 69 6f te_p, int versio
18a0: 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e 74 5f 74 n, int content_t
18b0: 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 ype, const void
18c0: 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 6c 65 6e *buf, size_t len
18d0: 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 6f 69 64 , SSL *ssl, void
18e0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 *arg) {. Sta
18f0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
1900: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 State*)arg;.
1910: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
1920: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
1930: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
1940: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
1950: 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 79 70 65 char *ver, *type
1960: 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a ;. BIO *bio;.
1970: 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b char buffer[
1980: 31 35 30 30 30 5d 3b 0a 20 20 20 20 62 75 66 66 15000];. buff
1990: 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 er[0] = 0;..
19a0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
19b0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
19c0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
19d0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
19e0: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 )..return;..
19f0: 73 77 69 74 63 68 28 76 65 72 73 69 6f 6e 29 20 switch(version)
1a00: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 {.#if OPENSSL_VE
1a10: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
1a20: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 x10100000L && !d
1a30: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
1a40: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
1a50: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
1a60: 20 63 61 73 65 20 53 53 4c 32 5f 56 45 52 53 49 case SSL2_VERSI
1a70: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c 76 ON:..ver = "SSLv
1a80: 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 2";..break;.#end
1a90: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
1aa0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
1ab0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
1ac0: 53 53 4c 33 29 0a 20 20 20 20 63 61 73 65 20 53 SSL3). case S
1ad0: 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 SL3_VERSION:..ve
1ae0: 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a 09 62 72 r = "SSLv3";..br
1af0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 eak;.#endif.
1b00: 63 61 73 65 20 54 4c 53 31 5f 56 45 52 53 49 4f case TLS1_VERSIO
1b10: 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 N:..ver = "TLSv1
1b20: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 ";..break;. c
1b30: 61 73 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 ase TLS1_1_VERSI
1b40: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 ON:..ver = "TLSv
1b50: 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 1.1";..break;.
1b60: 20 20 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 case TLS1_2_VE
1b70: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 RSION:..ver = "T
1b80: 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b LSv1.2";..break;
1b90: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 33 . case TLS1_3
1ba0: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d _VERSION:..ver =
1bb0: 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 "TLSv1.3";..bre
1bc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a ak;. case 0:.
1bd0: 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 .ver = "none";..
1be0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 break;. defau
1bf0: 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e lt:..ver = "unkn
1c00: 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 own";..break;.
1c10: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 }.. switch
1c20: 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b (content_type) {
1c30: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 . case SSL3_R
1c40: 54 5f 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20 T_HEADER:..type
1c50: 3d 20 22 48 65 61 64 65 72 22 3b 0a 09 62 72 65 = "Header";..bre
1c60: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c ak;. case SSL
1c70: 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 3_RT_INNER_CONTE
1c80: 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d NT_TYPE:..type =
1c90: 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 "Inner Content
1ca0: 54 79 70 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 Type";..break;.
1cb0: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f case SSL3_RT_
1cc0: 43 48 41 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 CHANGE_CIPHER_SP
1cd0: 45 43 3a 0a 09 74 79 70 65 20 3d 20 22 43 68 61 EC:..type = "Cha
1ce0: 6e 67 65 20 43 69 70 68 65 72 22 3b 0a 09 62 72 nge Cipher";..br
1cf0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 eak;. case SS
1d00: 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 L3_RT_ALERT:..ty
1d10: 70 65 20 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 pe = "Alert";..b
1d20: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 reak;. case S
1d30: 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 SL3_RT_HANDSHAKE
1d40: 3a 0a 09 74 79 70 65 20 3d 20 22 48 61 6e 64 73 :..type = "Hands
1d50: 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 hake";..break;.
1d60: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f case SSL3_RT_
1d70: 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 APPLICATION_DATA
1d80: 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 70 20 44 :..type = "App D
1d90: 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 ata";..break;.
1da0: 20 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54 5f case DTLS1_RT_
1db0: 48 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70 65 HEARTBEAT:..type
1dc0: 20 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b 0a = "Heartbeat";.
1dd0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 .break;. defa
1de0: 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e ult:..type = "un
1df0: 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 known";. }..
1e00: 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 /* Needs comp
1e10: 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 ile time option
1e20: 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 "enable-ssl-trac
1e30: 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 e". */. if ((
1e40: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 bio = BIO_new(BI
1e50: 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e O_s_mem())) != N
1e60: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 ULL) {..int n;..
1e70: 53 53 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f SSL_trace(write_
1e80: 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 p, version, cont
1e90: 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c ent_type, buf, l
1ea0: 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a en, ssl, (void *
1eb0: 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f )bio);..n = BIO_
1ec0: 72 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72 read(bio, buffer
1ed0: 2c 20 6d 69 6e 28 42 49 4f 5f 70 65 6e 64 69 6e , min(BIO_pendin
1ee0: 67 28 62 69 6f 29 2c 20 31 34 39 39 39 29 29 3b g(bio), 14999));
1ef0: 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20 ..n = (n<0) ? 0
1f00: 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20 : n;..buffer[n]
1f10: 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f = 0;..(void)BIO_
1f20: 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09 42 49 4f flush(bio);..BIO
1f30: 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20 7d _free(bio);. }
1f40: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
1f50: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
1f60: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 */. cmdPtr =
1f70: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
1f80: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
1f90: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 ack);. Tcl_Li
1fa0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1fb0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1fc0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
1fd0: 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20 2d Obj("message", -
1fe0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
1ff0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2000: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
2010: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
2020: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
2030: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
2040: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
2050: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
2060: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2070: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
2080: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
2090: 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74 22 write_p ? "Sent"
20a0: 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20 2d : "Received", -
20b0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
20c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
20d0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
20e0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
20f0: 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20 20 bj(ver, -1));.
2100: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2110: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2120: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2130: 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70 65 ewStringObj(type
2140: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
2150: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
2160: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
2170: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
2180: 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 ngObj(buffer, -1
2190: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c ));.. /* Eval
21a0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
21b0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
21c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
21d0: 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 );. EvalCallb
21e0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ack(interp, stat
21f0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 ePtr, cmdPtr);.
2200: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
2210: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 23 unt(cmdPtr);.}.#
2220: 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d endif.../*. *---
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2270: 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 6c . *. * VerifyCal
2280: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d lback --. *. *.M
2290: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 74 onitors SSL cert
22a0: 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 ificate validati
22b0: 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65 64 on process. Used
22c0: 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 0a to control the.
22d0: 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65 6e *.behavior when
22e0: 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59 5f the SSL_VERIFY_
22f0: 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65 74 PEER flag is set
2300: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 . This is called
2310: 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20 63 . *.whenever a c
2320: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 6e ertificate is in
2330: 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69 64 spected or decid
2340: 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c 6c ed invalid. Call
2350: 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20 63 ed for. *.each c
2360: 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74 68 ertificate in th
2370: 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20 2a e cert chain.. *
2380: 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09 63 . * Checks:. *.c
2390: 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69 6e ertificate chain
23a0: 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61 72 is checked star
23b0: 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64 65 ting with the de
23c0: 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c 65 epest nesting le
23d0: 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72 6f vel. *. (the ro
23e0: 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74 ot CA certificat
23f0: 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75 70 e) and worked up
2400: 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65 72 ward to the peer
2410: 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e 0a 's certificate..
2420: 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72 65 *.All signature
2430: 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75 72 s are valid, cur
2440: 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69 74 rent time is wit
2450: 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c 61 hin first and la
2460: 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d 65 st validity time
2470: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74 20 .. *.Check that
2480: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 the certificate
2490: 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68 65 is issued by the
24a0: 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69 63 issuer certific
24b0: 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09 43 ate issuer.. *.C
24c0: 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61 74 heck the revocat
24d0: 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20 65 ion status for e
24e0: 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65 2e ach certificate.
24f0: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76 61 . *.Check the va
2500: 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67 69 lidity of the gi
2510: 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65 20 ven CRL and the
2520: 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e 20 cert revocation
2530: 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63 6b status.. *.Check
2540: 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f 66 the policies of
2550: 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66 69 all the certifi
2560: 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67 73 cates. *. * Args
2570: 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f 6b . *.preverify_ok
2580: 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74 68 indicates wheth
2590: 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63 61 er the certifica
25a0: 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 te verification
25b0: 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e 6f passed (1) or no
25c0: 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73 75 t (0). *. * Resu
25d0: 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 lts:. *.A callba
25e0: 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 ck bound to the
25f0: 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72 socket may retur
2600: 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 n one of:. *.
2610: 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 0...- the certi
2620: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 ficate is deemed
2630: 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20 76 invalid, send v
2640: 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09 09 erification. *..
2650: 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65 72 .. failure aler
2660: 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20 74 t to peer, and t
2670: 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68 61 erminate handsha
2680: 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09 2d ke.. *. 1...-
2690: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
26a0: 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69 64 is deemed valid
26b0: 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 , continue with
26c0: 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 handshake.. *.
26d0: 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09 2d empty string.-
26e0: 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 65 no change to ce
26f0: 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 rtificate valida
2700: 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 tion. *. * Side
2710: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 effects:. *.The
2720: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 err field of the
2730: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 currently opera
2740: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 tive State is se
2750: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 t. *. to a stri
2760: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 ng describing th
2770: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f e SSL negotiatio
2780: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e n failure reason
2790: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
27e0: 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79 43 atic int.VerifyC
27f0: 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 allback(int ok,
2800: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a X509_STORE_CTX *
2810: 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f ctx) {. Tcl_O
2820: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
2830: 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28 53 SSL *ssl..= (S
2840: 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f 43 SL*)X509_STORE_C
2850: 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 63 TX_get_ex_data(c
2860: 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64 tx, SSL_get_ex_d
2870: 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43 ata_X509_STORE_C
2880: 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 58 TX_idx());. X
2890: 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 35 509 *cert..= X5
28a0: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 09_STORE_CTX_get
28b0: 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74 _current_cert(ct
28c0: 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 x);. State *s
28d0: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 tatePtr.= (State
28e0: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 *)SSL_get_app_da
28f0: 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c ta(ssl);. Tcl
2900: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
2910: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
2920: 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70 74 rp;. int dept
2930: 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f h..= X509_STORE_
2940: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64 65 CTX_get_error_de
2950: 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69 6e pth(ctx);. in
2960: 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53 54 t err..= X509_ST
2970: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f ORE_CTX_get_erro
2980: 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70 72 r(ctx);.. dpr
2990: 69 6e 74 66 28 22 56 65 72 69 66 79 3a 20 25 64 intf("Verify: %d
29a0: 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20 ", ok);.. if
29b0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 (statePtr->vcmd
29c0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
29d0: 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 74 65 50 L) {..if (stateP
29e0: 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 4c tr->vflags & SSL
29f0: 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f _VERIFY_FAIL_IF_
2a00: 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a NO_PEER_CERT) {.
2a10: 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a . return ok;.
2a20: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 .} else {.. r
2a30: 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 eturn 1;..}.
2a40: 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 } else if (cert
2a50: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20 3d == NULL || ssl =
2a60: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
2a70: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 n 0;. }..
2a80: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
2a90: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 d to eval */.
2aa0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
2ab0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
2ac0: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 Ptr->vcmd);.
2ad0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2ae0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2af0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
2b00: 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 StringObj("verif
2b10: 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 y", -1));. Tc
2b20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2b30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
2b40: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 mdPtr,..Tcl_NewS
2b50: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
2b60: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
2b70: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
2b80: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2b90: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2ba0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2bb0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 Tcl_NewIntObj(de
2bc0: 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c pth));. Tcl_L
2bd0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2be0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2bf0: 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f tr, Tls_NewX509O
2c00: 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 bj(interp, cert)
2c10: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2c20: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2c30: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2c40: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b Tcl_NewIntObj(ok
2c50: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2c60: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2c70: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2c80: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f ..Tcl_NewStringO
2c90: 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f 76 bj((char*)X509_v
2ca0: 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 erify_cert_error
2cb0: 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 _string(err), -1
2cc0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76 ));.. /* Prev
2cd0: 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 61 ent I/O while ca
2ce0: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 72 6f llback is in pro
2cf0: 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 gress */. /*
2d00: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
2d10: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 |= TLS_TCL_CALLB
2d20: 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 ACK; */.. /*
2d30: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
2d40: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
2d50: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
2d60: 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 dPtr);. ok =
2d70: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
2d80: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
2d90: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f mdPtr);. Tcl_
2da0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
2db0: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 73 74 Ptr);.. /* st
2dc0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d atePtr->flags &=
2dd0: 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 ~(TLS_TCL_CALLB
2de0: 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 ACK); */. ret
2df0: 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 urn(ok);./* By d
2e00: 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 efault, leave ve
2e10: 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 rification uncha
2e20: 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a nged. */.}.../*.
2e30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e70: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
2e80: 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 Error --. *. *.C
2e90: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 alls callback wi
2ea0: 74 68 20 6c 69 73 74 20 6f 66 20 65 72 72 6f 72 th list of error
2eb0: 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 s.. *. * Side ef
2ec0: 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 fects:. *.The er
2ed0: 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 r field of the c
2ee0: 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 urrently operati
2ef0: 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a ve State is set.
2f00: 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 *. to a string
2f10: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 describing the
2f20: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 SSL negotiation
2f30: 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 failure reason.
2f40: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f80: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
2f90: 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 .Tls_Error(State
2fa0: 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 *statePtr, char
2fb0: 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c *msg) {. Tcl
2fc0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
2fd0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
2fe0: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
2ff0: 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50 74 *cmdPtr, *listPt
3000: 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 r;. unsigned
3010: 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20 73 74 long err;. st
3020: 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 atePtr->err = ms
3030: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 g;.. dprintf(
3040: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
3050: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 if (statePtr->ca
3060: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f llback == (Tcl_O
3070: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 bj*)NULL)..retur
3080: 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 n;.. /* Creat
3090: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
30a0: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 l */. cmdPtr
30b0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
30c0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c bj(statePtr->cal
30d0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f lback);. Tcl_
30e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
30f0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3100: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
3110: 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d ngObj("error", -
3120: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
3130: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3140: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3150: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
3160: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
3170: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
3180: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
3190: 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20 21 3d ;. if (msg !=
31a0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 NULL) {..Tcl_Li
31b0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
31c0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
31d0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
31e0: 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a Obj(msg, -1));..
31f0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28 } else if ((
3200: 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 msg = Tcl_GetStr
3210: 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 ingFromObj(Tcl_G
3220: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
3230: 72 70 29 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a rp), (Tcl_Size *
3240: 29 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 )NULL)) != NULL)
3250: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
3260: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3270: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
3280: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 _NewStringObj(ms
3290: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 g, -1));.. }
32a0: 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72 20 else {..listPtr
32b0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
32c0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c (0, NULL);..whil
32d0: 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67 65 e ((err = ERR_ge
32e0: 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30 29 t_error()) != 0)
32f0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
3300: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3310: 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 (interp, listPtr
3320: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
3330: 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 bj(ERR_reason_er
3340: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c ror_string(err),
3350: 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c -1));..}..Tcl_L
3360: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
3370: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
3380: 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 tr, listPtr);.
3390: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c }.. /* Eval
33a0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
33b0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
33c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
33d0: 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 );. EvalCallb
33e0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ack(interp, stat
33f0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 ePtr, cmdPtr);.
3400: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
3410: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c unt(cmdPtr);.}..
3420: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
3470: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d KeyLogCallback -
3480: 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72 65 -. *. *.Write re
3490: 63 65 69 76 65 64 20 6b 65 79 20 64 61 74 61 20 ceived key data
34a0: 74 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a to log file.. *.
34b0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
34c0: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d . *.none. *. *--
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3510: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f -. */.void KeyLo
3520: 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 gCallback(const
3530: 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 SSL *ssl, const
3540: 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 char *line) {.
3550: 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 67 65 char *str = ge
3560: 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 tenv(SSLKEYLOGFI
3570: 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a 66 LE);. FILE *f
3580: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 d;.. dprintf(
3590: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
35a0: 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d if (str) {..fd =
35b0: 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29 fopen(str, "a")
35c0: 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22 ;..fprintf(fd, "
35d0: 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 %s\n",line);..fc
35e0: 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a lose(fd);. }.
35f0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
3640: 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c * Password Call
3650: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 back --. *. *.Ca
3660: 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 lled when a pass
3670: 77 6f 72 64 20 66 6f 72 20 61 20 70 72 69 76 61 word for a priva
3680: 74 65 20 6b 65 79 20 6c 6f 61 64 69 6e 67 2f 73 te key loading/s
3690: 74 6f 72 69 6e 67 20 61 20 50 45 4d 0a 20 2a 09 toring a PEM. *.
36a0: 63 65 72 74 69 66 69 63 61 74 65 20 77 69 74 68 certificate with
36b0: 20 65 6e 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 encryption. Eva
36c0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 ls callback scri
36d0: 70 74 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 20 pt and returns.
36e0: 2a 09 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 *.the result as
36f0: 74 68 65 20 70 61 73 73 77 6f 72 64 20 73 74 72 the password str
3700: 69 6e 67 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 ing in buf.. *.
3710: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
3720: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
3730: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 fects:. *.Calls
3740: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 callback (if def
3750: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 ined). *. * Retu
3760: 72 6e 73 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 rns:. *.Password
3770: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f size in bytes o
3780: 72 20 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f r -1 for an erro
3790: 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d r.. *. *--------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
37e0: 73 74 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 static int.Passw
37f0: 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 ordCallback(char
3800: 20 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c *buf, int size,
3810: 20 69 6e 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 int rwflag, voi
3820: 64 20 2a 75 64 61 74 61 29 20 7b 0a 20 20 20 20 d *udata) {.
3830: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 State *statePtr.
3840: 3d 20 28 53 74 61 74 65 20 2a 29 20 75 64 61 74 = (State *) udat
3850: 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 a;. Tcl_Inter
3860: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
3870: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
3880: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
3890: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b r;. int code;
38a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
38b0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a alled");.. /*
38c0: 20 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c If no callback,
38d0: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c use default cal
38e0: 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 lback */. if
38f0: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 (statePtr->passw
3900: 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ord == NULL) {..
3910: 69 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 if (Tcl_EvalEx(i
3920: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 nterp, "tls::pas
3930: 73 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f sword", -1, TCL_
3940: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 EVAL_GLOBAL) ==
3950: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 TCL_OK) {.. c
3960: 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 har *ret = (char
3970: 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e *) Tcl_GetStrin
3980: 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b gResult(interp);
3990: 0a 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 .. strncpy(bu
39a0: 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 f, ret, (size_t)
39b0: 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 size);.. ret
39c0: 75 72 6e 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 urn (int)strlen(
39d0: 72 65 74 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a ret);..} else {.
39e0: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a . return -1;.
39f0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
3a00: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 Create command
3a10: 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 to eval */. c
3a20: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c mdPtr = Tcl_Dupl
3a30: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 icateObj(statePt
3a40: 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20 20 r->password);.
3a50: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
3a60: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
3a70: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
3a80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61 73 ewStringObj("pas
3a90: 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20 20 sword", -1));.
3aa0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
3ab0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
3ac0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
3ad0: 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67 29 ewIntObj(rwflag)
3ae0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
3af0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3b00: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
3b10: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 69 Tcl_NewIntObj(si
3b20: 7a 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 ze));.. Tcl_P
3b30: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
3b40: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
3b50: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
3b60: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
3b70: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 ePtr);.. /* E
3b80: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d val callback com
3b90: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f mand */. Tcl_
3ba0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
3bb0: 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d Ptr);. code =
3bc0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 Tcl_EvalObjEx(i
3bd0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3be0: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b CL_EVAL_GLOBAL);
3bf0: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d . if (code !=
3c00: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 TCL_OK) {.#if (
3c10: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
3c20: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f N == 8) && (TCL_
3c30: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 MINOR_VERSION <
3c40: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6)..Tcl_Backgrou
3c50: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b ndError(interp);
3c60: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b .#else..Tcl_Back
3c70: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 groundException(
3c80: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 interp, code);.#
3c90: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 endif. }.
3ca0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
3cb0: 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 (cmdPtr);.. T
3cc0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
3cd0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
3ce0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 75 );.. /* If su
3cf0: 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20 62 ccessful, pass b
3d00: 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74 72 ack password str
3d10: 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74 65 ing and truncate
3d20: 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a if too long */.
3d30: 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 if (code ==
3d40: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53 TCL_OK) {..Tcl_S
3d50: 69 7a 65 20 6c 65 6e 3b 0a 09 63 68 61 72 20 2a ize len;..char *
3d60: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 ret = (char *) T
3d70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
3d80: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 Obj(Tcl_GetObjRe
3d90: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c sult(interp), &l
3da0: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 en);..if (len >
3db0: 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d (Tcl_Size) size-
3dc0: 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 1) {.. len =
3dd0: 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d (Tcl_Size) size-
3de0: 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 28 62 1;..}..strncpy(b
3df0: 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 uf, ret, (size_t
3e00: 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c 65 6e ) len);..buf[len
3e10: 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c 5f 52 ] = '\0';..Tcl_R
3e20: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
3e30: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 72 65 ta) interp);..re
3e40: 74 75 72 6e 28 28 69 6e 74 29 20 6c 65 6e 29 3b turn((int) len);
3e50: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 . }. Tcl_R
3e60: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
3e70: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 ta) interp);.
3e80: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a return -1;.}...
3e90: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 --------. *. * S
3ee0: 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 ession Callback
3ef0: 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 for Clients --.
3f00: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e *. *.Called when
3f10: 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 69 a new session i
3f20: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 s added to the c
3f30: 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e 33 ache. In TLS 1.3
3f40: 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 20 . *.this may be
3f50: 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c received multipl
3f60: 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 68 e times after th
3f70: 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f 72 e handshake. For
3f80: 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 73 . *.earlier vers
3f90: 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 ions, this will
3fa0: 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72 69 be received duri
3fb0: 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 ng the handshake
3fc0: 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68 65 .. *.This is the
3fd0: 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20 74 preferred way t
3fe0: 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75 6d o obtain a resum
3ff0: 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 2a able session.. *
4000: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
4010: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 None. *. * Side
4020: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c effects:. *.Call
4030: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 s callback (if d
4040: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 efined). *. * Re
4050: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 30 turn codes:. *.0
4060: 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20 73 = error where s
4070: 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 69 ession will be i
4080: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f 76 mmediately remov
4090: 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 ed from the inte
40a0: 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 31 rnal cache.. *.1
40b0: 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72 65 = success where
40c0: 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65 73 app retains ses
40d0: 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e 20 sion in session
40e0: 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 20 cache, and must
40f0: 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f 4e call SSL_SESSION
4100: 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f 6e _free() when don
4110: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a -----------. */.
4160: 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73 69 static int.Sessi
4170: 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 onCallback(const
4180: 20 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 SSL *ssl, SSL_S
4190: 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 ESSION *session)
41a0: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
41b0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a atePtr = (State*
41c0: 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 )SSL_get_app_dat
41d0: 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 a((SSL *)ssl);.
41e0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
41f0: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
4200: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 ->interp;. Tc
4210: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
4220: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 const unsigne
4230: 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a d char *ticket;.
4240: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
4250: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e ed char *session
4260: 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 _id;. size_t
4270: 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e len2;. unsign
4280: 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 ed int ulen;..
4290: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
42a0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
42b0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
42c0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
42d0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
42e0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
42f0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
4300: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ssl == NULL) {..
4310: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
4320: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
4330: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
4340: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
4350: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 l */. cmdPtr
4360: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
4370: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c bj(statePtr->cal
4380: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f lback);. Tcl_
4390: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
43a0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
43b0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
43c0: 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c ngObj("session",
43d0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
43e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
43f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
4400: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
4410: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 StringObj(Tcl_Ge
4420: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
4430: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 tePtr->self), -1
4440: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 ));.. /* Sess
4450: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 ion id */. se
4460: 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 ssion_id = SSL_S
4470: 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 ESSION_get_id(se
4480: 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 ssion, &ulen);.
4490: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
44a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
44b0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
44c0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 NewByteArrayObj(
44d0: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c session_id, (Tcl
44e0: 5f 53 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a _Size) ulen));..
44f0: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 /* Session t
4500: 69 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c icket */. SSL
4510: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 _SESSION_get0_ti
4520: 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 cket(session, &t
4530: 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 icket, &len2);.
4540: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
4550: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
4560: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
4570: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 NewByteArrayObj(
4580: 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a ticket, (Tcl_Siz
4590: 65 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 e) len2));..
45a0: 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 /* Lifetime - nu
45b0: 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 mber of seconds
45c0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f */. Tcl_ListO
45d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
45e0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
45f0: 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 .Tcl_NewLongObj(
4600: 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 (long) SSL_SESSI
4610: 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 ON_get_ticket_li
4620: 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 fetime_hint(sess
4630: 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 ion)));.. /*
4640: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
4650: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
4660: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
4670: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 dPtr);. EvalC
4680: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
4690: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
46a0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 );. Tcl_DecrR
46b0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
46c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d . return 0;.}
46d0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
4720: 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 * ALPN Callback
4730: 66 6f 72 20 53 65 72 76 65 72 73 20 61 6e 64 20 for Servers and
4740: 4e 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 NPN Callback for
4750: 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 Clients --. *.
4760: 2a 09 50 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 *.Perform protoc
4770: 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 ol (http/1.1, h2
4780: 2c 20 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 , h3, etc.) sele
4790: 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a ction for the. *
47a0: 09 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 .incoming connec
47b0: 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 tion. Called aft
47c0: 65 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 er Hello and ser
47d0: 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 ver callbacks..
47e0: 2a 09 57 68 65 72 65 20 27 6f 75 74 27 20 69 73 *.Where 'out' is
47f0: 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 selected protoc
4800: 6f 6c 20 61 6e 64 20 27 69 6e 27 20 69 73 20 74 ol and 'in' is t
4810: 68 65 20 70 65 65 72 20 61 64 76 65 72 74 69 73 he peer advertis
4820: 65 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 ed list.. *. * R
4830: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
4840: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
4850: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
4860: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
4870: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 d). *. * Return
4880: 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c codes:. *.SSL_TL
4890: 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 SEXT_ERR_OK: ALP
48a0: 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 N protocol selec
48b0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
48c0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
48d0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
48e0: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 _ALERT_FATAL: Th
48f0: 65 72 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c ere was no overl
4900: 61 70 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 ap between the c
4910: 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 lient's. *. s
4920: 75 70 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 upplied list and
4930: 20 74 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 the server conf
4940: 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 iguration. The c
4950: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 onnection will b
4960: 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 e aborted.. *.SS
4970: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
4980: 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f CK: ALPN protoco
4990: 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 l not selected,
49a0: 65 2e 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f e.g., because no
49b0: 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f ALPN. *. pro
49c0: 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 tocols are confi
49d0: 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 gured for this c
49e0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 onnection. The c
49f0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
4a00: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ues.. *. *------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 /.static int.ALP
4a60: 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 NCallback(const
4a70: 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 SSL *ssl, const
4a80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a unsigned char **
4a90: 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 out, unsigned ch
4aa0: 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e ar *outlen,..con
4ab0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
4ac0: 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 *in, unsigned i
4ad0: 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a nt inlen, void *
4ae0: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 arg) {. State
4af0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
4b00: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 ate*)arg;. Tc
4b10: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
4b20: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
4b30: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
4b40: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e *cmdPtr;. in
4b50: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 t code, res;..
4b60: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
4b70: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 d");.. if (ss
4b80: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 l == NULL || arg
4b90: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
4ba0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
4bb0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
4bc0: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 70 . /* Select p
4bd0: 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 rotocol */. i
4be0: 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 f (SSL_select_ne
4bf0: 78 74 5f 70 72 6f 74 6f 28 6f 75 74 2c 20 6f 75 xt_proto(out, ou
4c00: 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e tlen, statePtr->
4c10: 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50 74 72 protos, statePtr
4c20: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69 ->protos_len,..i
4c30: 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45 n, inlen) == OPE
4c40: 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41 NSSL_NPN_NEGOTIA
4c50: 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74 63 68 TED) {../* Match
4c60: 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73 20 3d found */..res =
4c70: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
4c80: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b OK;. } else {
4c90: 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e ../* OPENSSL_NPN
4ca0: 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20 4e 6f _NO_OVERLAP = No
4cb0: 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75 73 65 overlap, so use
4cc0: 20 66 69 72 73 74 20 69 74 65 6d 20 66 72 6f 6d first item from
4cd0: 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63 6f 6c client protocol
4ce0: 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20 3d 20 list */..res =
4cf0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
4d00: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 OACK;. }..
4d10: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
4d20: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a cmd == (Tcl_Obj*
4d30: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
4d40: 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 res;. }..
4d50: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
4d60: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
4d70: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
4d80: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
4d90: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
4da0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4db0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4dc0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
4dd0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e wStringObj("alpn
4de0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
4df0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
4e00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
4e10: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
4e20: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
4e30: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
4e40: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
4e50: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
4e60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4e70: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4e80: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
4e90: 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a Obj(*out, -1));.
4ea0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4eb0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4ec0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
4ed0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 _NewBooleanObj(r
4ee0: 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54 es == SSL_TLSEXT
4ef0: 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20 _ERR_OK));..
4f00: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
4f10: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
4f20: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
4f30: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 (cmdPtr);. if
4f40: 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 ((code = EvalCa
4f50: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 llback(interp, s
4f60: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 tatePtr, cmdPtr)
4f70: 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 ) > 1) {..res =
4f80: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
4f90: 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 OACK;. } else
4fa0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 if (code == 1)
4fb0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
4fc0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
4fd0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
4fe0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
4ff0: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20 LERT_FATAL;.
5000: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 }. Tcl_DecrRe
5010: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
5020: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a return res;.
5030: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
5080: 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 6f * Advertise Pro
5090: 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20 tocols Callback
50a0: 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f for Next Protoco
50b0: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e l Negotiation (N
50c0: 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 6c PN) in ServerHel
50d0: 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c lo --. *. *.call
50e0: 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 65 ed when a TLS se
50f0: 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 73 rver needs a lis
5100: 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 70 t of supported p
5110: 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78 rotocols for Nex
5120: 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65 t. *.Protocol Ne
5130: 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a gotiation.. *. *
5140: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
5150: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
5160: 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75 ects:. *. * Retu
5170: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c rn codes:. *.SSL
5180: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 _TLSEXT_ERR_OK:
5190: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c NPN protocol sel
51a0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 ected. The conne
51b0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
51c0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
51d0: 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72 RR_NOACK: NPN pr
51e0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 otocol not selec
51f0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
5200: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
5210: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5250: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 -------. */.#ifd
5260: 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69 ef USE_NPN.stati
5270: 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63 c int.NPNCallbac
5280: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
5290: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 , const unsigned
52a0: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 char **out, uns
52b0: 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65 igned int *outle
52c0: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a n, void *arg) {.
52d0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
52e0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
52f0: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 g;.. dprintf(
5300: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
5310: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 if (ssl == NULL
5320: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 || arg == NULL)
5330: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
5340: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
5350: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
5360: 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 t protocols list
5370: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
5380: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 ePtr->protos !=
5390: 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20 NULL) {..*out =
53a0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
53b0: 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61 ;..*outlen = sta
53c0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 tePtr->protos_le
53d0: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a n;. } else {.
53e0: 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a .*out = NULL;..*
53f0: 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74 outlen = 0;..ret
5400: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
5410: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
5420: 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 return SSL_T
5430: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a LSEXT_ERR_OK;.}.
5440: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d #endif.../*. *--
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5490: 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c -. *. * SNI Call
54a0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 back for Servers
54b0: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 --. *. *.Perfor
54c0: 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 4e m server-side SN
54d0: 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63 I hostname selec
54e0: 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 69 tion after recei
54f0: 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 69 ving SNI extensi
5500: 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20 on. *.in Client
5510: 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66 Hello. Called af
5520: 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 ter hello callba
5530: 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c ck but before AL
5540: 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a PN callback.. *.
5550: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
5560: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
5570: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
5580: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
5590: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 fined). *. * Ret
55a0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
55b0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a L_TLSEXT_ERR_OK:
55c0: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 SNI hostname is
55d0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 accepted. The c
55e0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
55f0: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 ues.. *.SSL_TLSE
5600: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 XT_ERR_ALERT_FAT
5610: 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 AL: SNI hostname
5620: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 is not accepted
5630: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
5640: 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74 . *. is abort
5650: 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20 ed. Default for
5660: 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f alert is SSL_AD_
5670: 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d UNRECOGNIZED_NAM
5680: 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 E.. *.SSL_TLSEXT
5690: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 _ERR_ALERT_WARNI
56a0: 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 NG: SNI hostname
56b0: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 is not accepted
56c0: 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a , warning alert.
56d0: 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 *. sent (not
56e0: 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c supported in TL
56f0: 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e Sv1.3). The conn
5700: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
5710: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
5720: 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 ERR_NOACK: SNI h
5730: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 ostname is not a
5740: 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 ccepted and not
5750: 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a acknowledged,. *
5760: 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 . e.g. if SNI
5770: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f has not been co
5780: 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f nfigured. The co
5790: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
57a0: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d es.. *. *-------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
57f0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 .static int.SNIC
5800: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
5810: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
5820: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
5830: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
5840: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
5850: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
5860: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
5870: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
5880: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
5890: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
58a0: 2c 20 72 65 73 3b 0a 20 20 20 20 63 68 61 72 20 , res;. char
58b0: 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 *servername = NU
58c0: 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 LL;.. dprintf
58d0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
58e0: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
58f0: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 || arg == NULL)
5900: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
5910: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
5920: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f . }.. /* O
5930: 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 54 4c nly works for TL
5940: 53 20 31 2e 32 20 61 6e 64 20 65 61 72 6c 69 65 S 1.2 and earlie
5950: 72 20 2a 2f 0a 20 20 20 20 73 65 72 76 65 72 6e r */. servern
5960: 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 ame = SSL_get_se
5970: 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c rvername(ssl, TL
5980: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f SEXT_NAMETYPE_ho
5990: 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 st_name);. if
59a0: 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c (!servername ||
59b0: 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d servername[0] =
59c0: 3d 20 27 5c 30 27 29 20 7b 0a 09 72 65 74 75 72 = '\0') {..retur
59d0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
59e0: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 _NOACK;. }..
59f0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
5a00: 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 >vcmd == (Tcl_Ob
5a10: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 j*)NULL) {..retu
5a20: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
5a30: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 R_OK;. }..
5a40: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
5a50: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
5a60: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
5a70: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
5a80: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
5a90: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5aa0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5ab0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
5ac0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 wStringObj("sni"
5ad0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
5ae0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5af0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
5b00: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
5b10: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 wStringObj(Tcl_G
5b20: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
5b30: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d atePtr->self), -
5b40: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
5b50: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
5b60: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
5b70: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
5b80: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 bj(servername ,
5b90: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 -1));.. /* Ev
5ba0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
5bb0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
5bc0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
5bd0: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f tr);. if ((co
5be0: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 de = EvalCallbac
5bf0: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 k(interp, stateP
5c00: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 tr, cmdPtr)) > 1
5c10: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 ) {..res = SSL_T
5c20: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
5c30: 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 WARNING;..*alert
5c40: 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f = SSL_AD_UNRECO
5c50: 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 GNIZED_NAME; /*
5c60: 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 Not supported by
5c70: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 TLS 1.3 */.
5c80: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 } else if (code
5c90: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 1) {..res = S
5ca0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
5cb0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
5cc0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
5cd0: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
5ce0: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f ;..*alert = SSL_
5cf0: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f AD_UNRECOGNIZED_
5d00: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 NAME; /* Not sup
5d10: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e ported by TLS 1.
5d20: 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 3 */. }. T
5d30: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
5d40: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 cmdPtr);. ret
5d50: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a urn res;.}.../*.
5d60: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5da0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 -----. *. * Clie
5db0: 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b ntHello Handshak
5dc0: 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 e Callback for S
5dd0: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 ervers --. *. *.
5de0: 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74 Used by server t
5df0: 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65 o examine the se
5e00: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 rver name indica
5e10: 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e tion (SNI) exten
5e20: 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 sion. *.provided
5e30: 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69 by the client i
5e40: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63 n order to selec
5e50: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 t an appropriate
5e60: 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a certificate to.
5e70: 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 *.present, and
5e80: 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 make other confi
5e90: 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d guration adjustm
5ea0: 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f ents relevant to
5eb0: 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09 that server. *.
5ec0: 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e name and its con
5ed0: 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 figuration. This
5ee0: 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69 includes swappi
5ef0: 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63 ng out the assoc
5f00: 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 iated. *.SSL_CTX
5f10: 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 pointer, modify
5f20: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 ing the server's
5f30: 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74 list of permitt
5f40: 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c ed TLS versions,
5f50: 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65 . *.changing the
5f60: 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72 server's cipher
5f70: 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 list in respons
5f80: 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 e to the client'
5f90: 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65 s cipher list, e
5fa0: 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65 tc.. *.Called be
5fb0: 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50 fore SNI and ALP
5fc0: 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a N callbacks.. *.
5fd0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
5fe0: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
5ff0: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
6000: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
6010: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 fined). *. * Ret
6020: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
6030: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 L_CLIENT_HELLO_R
6040: 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68 ETRY: suspend th
6050: 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 e handshake, and
6060: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 the handshake f
6070: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 unction will ret
6080: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a urn immediately.
6090: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 *.SSL_CLIENT_HE
60a0: 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75 LLO_ERROR: failu
60b0: 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f re, terminate co
60c0: 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c nnection. Set al
60d0: 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 ert to error cod
60e0: 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 e.. *.SSL_CLIENT
60f0: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20 _HELLO_SUCCESS:
6100: 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d success. *. *---
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6150: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
6160: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 63 6f HelloCallback(co
6170: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e nst SSL *ssl, in
6180: 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a t *alert, void *
6190: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 arg) {. State
61a0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
61b0: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 ate*)arg;. Tc
61c0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
61d0: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
61e0: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
61f0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e *cmdPtr;. in
6200: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 t code, res;.
6210: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72 const char *ser
6220: 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e vername;. con
6230: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
6240: 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 *p;. size_t
6250: 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b 0a len, remaining;.
6260: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
6270: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
6280: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 (statePtr->vcmd
6290: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
62a0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
62b0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 _CLIENT_HELLO_SU
62c0: 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 CCESS;. } els
62d0: 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 28 63 6f e if (ssl == (co
62e0: 6e 73 74 20 53 53 4c 20 2a 29 4e 55 4c 4c 20 7c nst SSL *)NULL |
62f0: 7c 20 61 72 67 20 3d 3d 20 28 76 6f 69 64 20 2a | arg == (void *
6300: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
6310: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
6320: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a O_ERROR;. }..
6330: 20 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d 65 73 /* Get names
6340: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c */. if (!SSL
6350: 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 _client_hello_ge
6360: 74 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c 53 45 t0_ext(ssl, TLSE
6370: 58 54 5f 54 59 50 45 5f 73 65 72 76 65 72 5f 6e XT_TYPE_server_n
6380: 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61 69 6e ame, &p, &remain
6390: 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e 69 6e ing) || remainin
63a0: 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 g <= 2) {..*aler
63b0: 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f t = SSL_R_SSLV3_
63c0: 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 ALERT_ILLEGAL_PA
63d0: 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e RAMETER;..return
63e0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
63f0: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a O_ERROR;. }..
6400: 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 /* Extract t
6410: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 he length of the
6420: 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 6f supplied list o
6430: 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 f names. */.
6440: 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c len = (*(p++) <<
6450: 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 8);. len +=
6460: 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 *(p++);. if (
6470: 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d 61 69 len + 2 != remai
6480: 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 ning) {..*alert
6490: 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c = SSL_R_SSLV3_AL
64a0: 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 ERT_ILLEGAL_PARA
64b0: 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 METER;..return S
64c0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
64d0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
64e0: 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e remaining = len
64f0: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 ;.. /* The li
6500: 73 74 20 69 6e 20 70 72 61 63 74 69 63 65 20 6f st in practice o
6510: 6e 6c 79 20 68 61 73 20 61 20 73 69 6e 67 6c 65 nly has a single
6520: 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77 65 20 element, so we
6530: 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20 74 68 only consider th
6540: 65 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a e first one. */.
6550: 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e if (remainin
6560: 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 g == 0 || *p++ !
6570: 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 = TLSEXT_NAMETYP
6580: 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b 0a 09 E_host_name) {..
6590: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 *alert = SSL_R_T
65a0: 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 LSV1_ALERT_INTER
65b0: 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 NAL_ERROR;..retu
65c0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
65d0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d LLO_ERROR;. }
65e0: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 2d 2d . remaining--
65f0: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 77 65 ;.. /* Now we
6600: 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70 75 6c can finally pul
6610: 6c 20 6f 75 74 20 74 68 65 20 62 79 74 65 20 61 l out the byte a
6620: 72 72 61 79 20 77 69 74 68 20 74 68 65 20 61 63 rray with the ac
6630: 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e 20 2a tual hostname. *
6640: 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e /. if (remain
6650: 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c ing <= 2) {..*al
6660: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 ert = SSL_R_TLSV
6670: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 1_ALERT_INTERNAL
6680: 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 _ERROR;..return
6690: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
66a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
66b0: 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 len = (*(p++)
66c0: 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b << 8);. len +
66d0: 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 = *(p++);. if
66e0: 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65 6d 61 (len + 2 > rema
66f0: 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 ining) {..*alert
6700: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
6710: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
6720: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c ROR;..return SSL
6730: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
6740: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ROR;. }. r
6750: 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a emaining = len;.
6760: 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d servername =
6770: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 (const char *)p
6780: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 ;.. /* Create
6790: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c command to eval
67a0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
67b0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
67c0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 j(statePtr->vcmd
67d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
67e0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
67f0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
6800: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
6810: 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a ("hello", -1));.
6820: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
6830: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
6840: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
6850: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
6860: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
6870: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
6880: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
6890: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
68a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
68b0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
68c0: 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 wStringObj(serve
68d0: 72 6e 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 rname, (Tcl_Size
68e0: 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a ) len));.. /*
68f0: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 Eval callback c
6900: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 ommand */. Tc
6910: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
6920: 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 mdPtr);. if (
6930: 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c (code = EvalCall
6940: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
6950: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 tePtr, cmdPtr))
6960: 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 > 1) {..res = SS
6970: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 L_CLIENT_HELLO_R
6980: 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 ETRY;..*alert =
6990: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
69a0: 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 T_USER_CANCELLED
69b0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
69c0: 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 (code == 1) {..r
69d0: 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f es = SSL_CLIENT_
69e0: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 HELLO_SUCCESS;.
69f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 } else {..res
6a00: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 = SSL_CLIENT_HE
6a10: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 LLO_ERROR;..*ale
6a20: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 rt = SSL_R_TLSV1
6a30: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f _ALERT_INTERNAL_
6a40: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
6a50: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
6a60: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 t(cmdPtr);. r
6a70: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f eturn res;.}.../
6a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6a90: 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 ****/./* Command
6aa0: 73 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a s */./**
6ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6ac0: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d **/../*. *------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
6b10: 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d . * CiphersObjCm
6b20: 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 d -- list availa
6b30: 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 ble ciphers. *.
6b40: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
6b50: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 is invoked to p
6b60: 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a rocess the "tls:
6b70: 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e :ciphers" comman
6b80: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 d. *.to list ava
6b90: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 ilable ciphers,
6ba0: 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f based upon proto
6bb0: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a col selected.. *
6bc0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
6bd0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
6be0: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 esult list.. *.
6bf0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
6c00: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e *.constructs an
6c10: 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 d destroys SSL c
6c20: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a ontext (CTX). *.
6c30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c70: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
6c80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f const char *pro
6c90: 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 tocols[] = {.."s
6ca0: 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 sl2", "ssl3", "t
6cb0: 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 ls1", "tls1.1",
6cc0: 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e "tls1.2", "tls1.
6cd0: 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 3", NULL.};.enum
6ce0: 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 protocol {.
6cf0: 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 TLS_SSL2, TLS_SS
6d00: 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c L3, TLS_TLS1, TL
6d10: 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c S_TLS1_1, TLS_TL
6d20: 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 S1_2, TLS_TLS1_3
6d30: 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 , TLS_NONE.};..s
6d40: 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 tatic int.Cipher
6d50: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 sObjCmd(ClientDa
6d60: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
6d70: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
6d80: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
6d90: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
6da0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []) {. Tcl_Ob
6db0: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c j *objPtr = NULL
6dc0: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 ;. SSL_CTX *c
6dd0: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 tx = NULL;. S
6de0: 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a SL *ssl = NULL;.
6df0: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c STACK_OF(SSL
6e00: 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 _CIPHER) *sk;.
6e10: 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 5b char *cp, buf[
6e20: 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 BUFSIZ];. int
6e30: 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20 index, verbose
6e40: 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 = 0, use_support
6e50: 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 ed = 0;. cons
6e60: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 t SSL_METHOD *me
6e70: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e thod;.. dprin
6e80: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
6e90: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 if ((objc < 2
6ea0: 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 ) || (objc > 4))
6eb0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
6ec0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
6ed0: 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 objv, "protocol
6ee0: 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f ?verbose? ?suppo
6ef0: 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e rted?");..return
6f00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
6f10: 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 }. if (Tcl_Ge
6f20: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e tIndexFromObj(in
6f30: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 terp, objv[1], p
6f40: 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f rotocols, "proto
6f50: 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 col", 0, &index)
6f60: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
6f70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
6f80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 . }. if ((
6f90: 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63 6c objc > 2) && Tcl
6fa0: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f _GetBooleanFromO
6fb0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
6fc0: 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d 2], &verbose) !=
6fd0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
6fe0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
6ff0: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a }. if ((obj
7000: 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 65 c > 3) && Tcl_Ge
7010: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 tBooleanFromObj(
7020: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c interp, objv[3],
7030: 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 &use_supported)
7040: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
7050: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7060: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
7070: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
7080: 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 switch ((enu
7090: 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 m protocol)index
70a0: 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 ) {..case TLS_SS
70b0: 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f L2:.#if OPENSSL_
70c0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e VERSION_NUMBER >
70d0: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c = 0x10100000L ||
70e0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 defined(NO_SSL2
70f0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
7100: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 NSSL_NO_SSL2)..
7110: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
7120: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
7130: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
7140: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
7150: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
7160: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
7170: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 _ERROR;.#else..
7180: 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 method = SSLv
7190: 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 2_method(); brea
71a0: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 k;.#endif..case
71b0: 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 TLS_SSL3:.#if de
71c0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c fined(NO_SSL3) |
71d0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
71e0: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 L_NO_SSL3) || de
71f0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7200: 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 _SSL3_METHOD)..
7210: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
7220: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
7230: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
7240: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
7250: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
7260: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
7270: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 _ERROR;.#else..
7280: 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 method = SSLv
7290: 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 3_method(); brea
72a0: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 k;.#endif..case
72b0: 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 TLS_TLS1:.#if de
72c0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c fined(NO_TLS1) |
72d0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
72e0: 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 L_NO_TLS1) || de
72f0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7300: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 _TLS1_METHOD)..
7310: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
7320: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
7330: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
7340: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
7350: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
7360: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
7370: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 _ERROR;.#else..
7380: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 method = TLSv
7390: 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 1_method(); brea
73a0: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 k;.#endif..case
73b0: 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 TLS_TLS1_1:.#if
73c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
73d0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
73e0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
73f0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7400: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 SSL_NO_TLS1_1_ME
7410: 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 THOD).. Tcl_A
7420: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
7430: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e rp, protocols[in
7440: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f dex], ": protoco
7450: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
7460: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 , NULL);.. re
7470: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7480: 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f #else.. metho
7490: 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 d = TLSv1_1_meth
74a0: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e od(); break;.#en
74b0: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c dif..case TLS_TL
74c0: 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 S1_2:.#if define
74d0: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 d(NO_TLS1_2) ||
74e0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
74f0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 NO_TLS1_2) || de
7500: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7510: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a _TLS1_2_METHOD).
7520: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
7530: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
7540: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
7550: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
7560: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
7570: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
7580: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
7590: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c . method = TL
75a0: 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 Sv1_2_method();
75b0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 break;.#endif..c
75c0: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a ase TLS_TLS1_3:.
75d0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
75e0: 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_3) || define
75f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
7600: 31 5f 33 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 1_3).. Tcl_Ap
7610: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
7620: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 p, protocols[ind
7630: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c ex], ": protocol
7640: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
7650: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
7660: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
7670: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 else.. method
7680: 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b = TLS_method();
7690: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
76a0: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 t_min_proto_vers
76b0: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
76c0: 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 VERSION);.. S
76d0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 SL_CTX_set_max_p
76e0: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
76f0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
7700: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 );.. break;.#
7710: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a endif..default:.
7720: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c . method = TL
7730: 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 S_method();..
7740: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 break;. }..
7750: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 ctx = SSL_CTX
7760: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 _new(method);.
7770: 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c if (ctx == NUL
7780: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
7790: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 Result(interp, R
77a0: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a EASON(), NULL);.
77b0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
77c0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 R;. }.. ss
77d0: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 l = SSL_new(ctx)
77e0: 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d ;. if (ssl ==
77f0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 NULL) {..Tcl_Ap
7800: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
7810: 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c p, REASON(), NUL
7820: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
7830: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
7840: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
7850: 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 .. /* Use lis
7860: 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 20 77 t and order as w
7870: 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 6e 20 ould be sent in
7880: 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 a ClientHello or
7890: 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 all available c
78a0: 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 iphers */. if
78b0: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 (use_supported)
78c0: 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 {..sk = SSL_get
78d0: 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 70 68 1_supported_ciph
78e0: 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 ers(ssl);. }
78f0: 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c else {..sk = SSL
7900: 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 73 6c _get_ciphers(ssl
7910: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 );. }.. if
7920: 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (sk != NULL) {.
7930: 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b .if (!verbose) {
7940: 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
7950: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
7960: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 NULL);.. for
7970: 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c (int i = 0; i <
7980: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e sk_SSL_CIPHER_n
7990: 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 um(sk); i++) {..
79a0: 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 .const SSL_CIPHE
79b0: 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 R *c = sk_SSL_CI
79c0: 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 PHER_value(sk, i
79d0: 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 );...if (c == NU
79e0: 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 LL) continue;...
79f0: 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d 65 20 ./* cipher name
7a00: 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 or (NONE) */...c
7a10: 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 p = SSL_CIPHER_g
7a20: 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 et_name(c);...if
7a30: 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 (cp == NULL) br
7a40: 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f eak;...Tcl_ListO
7a50: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
7a60: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
7a70: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
7a80: 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 (cp, -1));..
7a90: 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 }...} else {..
7aa0: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
7ab0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 ewStringObj("",0
7ac0: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 );.. for (int
7ad0: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 i = 0; i < sk_S
7ae0: 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b SL_CIPHER_num(sk
7af0: 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 ); i++) {...cons
7b00: 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 t SSL_CIPHER *c
7b10: 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f = sk_SSL_CIPHER_
7b20: 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 value(sk, i);...
7b30: 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 if (c == NULL) c
7b40: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 ontinue;..../* t
7b50: 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 extual descripti
7b60: 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 on of the cipher
7b70: 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 */...if (SSL_CI
7b80: 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e PHER_description
7b90: 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 (c, buf, sizeof(
7ba0: 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b buf)) != NULL) {
7bb0: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ... Tcl_Appen
7bc0: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 dToObj(objPtr, b
7bd0: 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 uf, (Tcl_Size) s
7be0: 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d trlen(buf));...}
7bf0: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 else {... Tc
7c00: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 l_AppendToObj(ob
7c10: 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e jPtr, "UNKNOWN\n
7c20: 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 ", 8);...}..
7c30: 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 }..}..if (use_su
7c40: 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20 pported) {..
7c50: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 sk_SSL_CIPHER_fr
7c60: 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d ee(sk);..}. }
7c70: 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 . SSL_free(ss
7c80: 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f l);. SSL_CTX_
7c90: 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 free(ctx);..
7ca0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
7cb0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
7cc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
7cd0: 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 _OK;..clientData
7ce0: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d = clientData;.}
7cf0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
7d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
7d40: 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d * ProtocolsObjCm
7d50: 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 d -- list availa
7d60: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a ble protocols. *
7d70: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
7d80: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f re is invoked to
7d90: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c process the "tl
7da0: 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f s::protocols" co
7db0: 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 mmand. *.to list
7dc0: 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f available proto
7dd0: 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 cols.. *. * Resu
7de0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
7df0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 rd Tcl result li
7e00: 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 st.. *. * Side e
7e10: 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a ffects:. *.none.
7e20: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
7e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
7e70: 74 69 63 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c tic int.Protocol
7e80: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 sObjCmd(ClientDa
7e90: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
7ea0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
7eb0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
7ec0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
7ed0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []) {. Tcl_Ob
7ee0: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 j *objPtr;..
7ef0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
7f00: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
7f10: 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 != 1) {..Tcl_Wr
7f20: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
7f30: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b p, 1, objv, "");
7f40: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
7f50: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 OR;. }.. E
7f60: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
7f70: 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 ;.. objPtr =
7f80: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
7f90: 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 , NULL);..#if OP
7fa0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
7fb0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
7fc0: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
7fd0: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
7fe0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
7ff0: 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 SL2). Tcl_Lis
8000: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
8010: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
8020: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
8030: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
8040: 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 _SSL2], -1));.#e
8050: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
8060: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 d(NO_SSL3) && !d
8070: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
8080: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
8090: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
80a0: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 SL3_METHOD).
80b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
80c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
80d0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
80e0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 StringObj(protoc
80f0: 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d ols[TLS_SSL3], -
8100: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 1));.#endif.#if
8110: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
8120: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
8130: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 ENSSL_NO_TLS1) &
8140: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
8150: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f SL_NO_TLS1_METHO
8160: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f D). Tcl_ListO
8170: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
8180: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
8190: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
81a0: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 (protocols[TLS_T
81b0: 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 LS1], -1));.#end
81c0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
81d0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 NO_TLS1_1) && !d
81e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
81f0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 O_TLS1_1) && !de
8200: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8210: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a _TLS1_1_METHOD).
8220: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
8230: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
8240: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
8250: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
8260: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 otocols[TLS_TLS1
8270: 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 _1], -1));.#endi
8280: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
8290: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
82a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
82b0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
82c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
82d0: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 TLS1_2_METHOD).
82e0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
82f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
8300: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
8310: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
8320: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f tocols[TLS_TLS1_
8330: 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 2], -1));.#endif
8340: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
8350: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 _TLS1_3) && !def
8360: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8370: 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f TLS1_3). Tcl_
8380: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
8390: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
83a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
83b0: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
83c0: 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 TLS_TLS1_3], -1)
83d0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 );.#endif.. T
83e0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
83f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
8400: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
8410: 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 OK;..clientData
8420: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a = clientData;.}.
8430: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
8480: 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 HandshakeObjCmd
8490: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 --. *. *.This c
84a0: 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 ommand is used t
84b0: 6f 20 76 65 72 69 66 79 20 77 68 65 74 68 65 72 o verify whether
84c0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 the handshake i
84d0: 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 s complete. *.or
84e0: 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 not.. *. * Resu
84f0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
8500: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 rd Tcl result. 1
8510: 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 means handshake
8520: 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 complete, 0 mea
8530: 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 ns pending.. *.
8540: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
8550: 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c *.May force SSL
8560: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 negotiation to
8570: 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 take place.. *.
8580: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
8590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85c0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
85d0: 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a int HandshakeObj
85e0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
85f0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
8600: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
8610: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
8620: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
8630: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
8640: 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f l chan; /
8650: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f * The channel to
8660: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 set a mode on.
8670: 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 */. State *st
8680: 61 74 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f atePtr; /
8690: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 * client state f
86a0: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f or ssl socket */
86b0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
86c0: 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a *errStr = NULL;.
86d0: 20 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b int ret = 1;
86e0: 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 . int err = 0
86f0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
8700: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
8710: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a f (objc != 2) {.
8720: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
8730: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
8740: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 v, "channel");..
8750: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
8760: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 );. }.. ER
8770: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b R_clear_error();
8780: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c .. chan = Tcl
8790: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
87a0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e rp, Tcl_GetStrin
87b0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d gFromObj(objv[1]
87c0: 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 4e 55 , (Tcl_Size *)NU
87d0: 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 LL), NULL);.
87e0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
87f0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
8800: 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 {..return(TCL_ER
8810: 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ROR);. }..
8820: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f /* Make sure to
8830: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
8840: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
8850: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
8860: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
8870: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 chan);. if (T
8880: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
8890: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
88a0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
88b0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
88c0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
88d0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
88e0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
88f0: 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 han),.. "\":
8900: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
8910: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f l", NULL);..Tcl_
8920: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
8930: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e erp, "TLS", "HAN
8940: 44 53 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 DSHAKE", "CHANNE
8950: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 L", "INVALID", (
8960: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
8970: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
8980: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 );. }. sta
8990: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
89a0: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 )Tcl_GetChannelI
89b0: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e nstanceData(chan
89c0: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 );.. dprintf(
89d0: 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 "Calling Tls_Wai
89e0: 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 tForConnect");.
89f0: 20 20 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 ret = Tls_Wai
8a00: 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 tForConnect(stat
8a10: 65 50 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a ePtr, &err, 1);.
8a20: 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 dprintf("Tls
8a30: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 _WaitForConnect
8a40: 72 65 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 returned: %i", r
8a50: 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 et);.. if (re
8a60: 74 20 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 t < 0 && ((state
8a70: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 Ptr->flags & TLS
8a80: 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 _TCL_ASYNC) && (
8a90: 65 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 err == EAGAIN)))
8aa0: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 {..dprintf("Asy
8ab0: 6e 63 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d nc set and err =
8ac0: 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 EAGAIN");..ret
8ad0: 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 = 0;. } else
8ae0: 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 if (ret < 0) {..
8af0: 6c 6f 6e 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 long result;..er
8b00: 72 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d rStr = statePtr-
8b10: 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 >err;..Tcl_Reset
8b20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
8b30: 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 .Tcl_SetErrno(er
8b40: 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 r);...if (!errSt
8b50: 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d r || (*errStr ==
8b60: 20 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 0)) {.. errS
8b70: 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 tr = Tcl_PosixEr
8b80: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a ror(interp);..}.
8b90: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
8ba0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 lt(interp, "hand
8bb0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c shake failed: ",
8bc0: 20 65 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a errStr, (char *
8bd0: 29 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 ) NULL);..if ((r
8be0: 65 73 75 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f esult = SSL_get_
8bf0: 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 verify_result(st
8c00: 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d atePtr->ssl)) !=
8c10: 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 X509_V_OK) {..
8c20: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
8c30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 20 64 75 ult(interp, " du
8c40: 65 20 74 6f 3a 20 22 2c 20 58 35 30 39 5f 76 65 e to: ", X509_ve
8c50: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f rify_cert_error_
8c60: 73 74 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 string(result),
8c70: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
8c80: 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 .}..Tcl_SetError
8c90: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
8ca0: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c S", "HANDSHAKE",
8cb0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
8cc0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 *) NULL);..dpri
8cd0: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 ntf("Returning T
8ce0: 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 CL_ERROR with ha
8cf0: 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 ndshake failed:
8d00: 25 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 %s", errStr);..r
8d10: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
8d20: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
8d30: 69 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a if (err != 0) {.
8d40: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f . dprintf("Go
8d50: 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 t an error with
8d60: 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 a completed hand
8d70: 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 shake: err = %i"
8d80: 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 , err);..}..ret
8d90: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 = 1;. }..
8da0: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
8db0: 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 ng TCL_OK with d
8dc0: 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 ata \"%i\"", ret
8dd0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 );. Tcl_SetOb
8de0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
8df0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 Tcl_NewIntObj(re
8e00: 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 t));. return(
8e10: 54 43 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 TCL_OK);..client
8e20: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
8e30: 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d a;.}../*. *-----
8e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
8e80: 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d *. * ImportObjCm
8e90: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 d --. *. *.This
8ea0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
8eb0: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
8ec0: 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e the "ssl" comman
8ed0: 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 d. *. *.The ssl
8ee0: 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 command pushes S
8ef0: 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 SL over a (newly
8f00: 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 connected) tcp
8f10: 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 socket. *. * Res
8f20: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
8f30: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
8f40: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
8f50: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 ts:. *.May modif
8f60: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f y the behavior o
8f70: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e f an IO channel.
8f80: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
8f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
8fd0: 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f atic int.ImportO
8fe0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
8ff0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
9000: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
9010: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
9020: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
9030: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e ) {. Tcl_Chan
9040: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 nel chan;../* Th
9050: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 e channel to set
9060: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 a mode on. */.
9070: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
9080: 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 tr;../* client s
9090: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 tate for ssl soc
90a0: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 ket */. SSL_C
90b0: 54 58 20 2a 63 74 78 09 20 20 20 20 20 20 20 20 TX *ctx.
90c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
90d0: 4f 62 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20 Obj *script.
90e0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
90f0: 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 Tcl_Obj *passwor
9100: 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c d. = NULL
9110: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 ;. Tcl_Obj *v
9120: 63 6d 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 cmd. = NU
9130: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 LL;. Tcl_DStr
9140: 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c ing upperChannel
9150: 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 Translation, upp
9160: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
9170: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 g, upperChannelE
9180: 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 ncoding, upperCh
9190: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 annelEOFChar;.
91a0: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 54 int idx;. T
91b0: 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 cl_Size len;.
91c0: 20 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20 20 int flags..
91d0: 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e = TLS_TCL_IN
91e0: 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 IT;. int serv
91f0: 65 72 09 09 20 20 20 20 20 20 20 20 3d 20 30 3b er.. = 0;
9200: 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f ./* is connectio
9210: 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 n incoming or ou
9220: 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 tgoing? */. c
9230: 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 20 har *keyfile.
9240: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
9250: 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09 char *certfile.
9260: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
9270: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
9280: 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b r *key .= NULL;
9290: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 . Tcl_Size ke
92a0: 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 y_len
92b0: 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 75 = 0;. u
92c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 nsigned char *ce
92d0: 72 74 20 20 20 20 20 20 20 20 20 3d 20 4e 55 4c rt = NUL
92e0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 L;. Tcl_Size
92f0: 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 20 20 20 cert_len
9300: 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 = 0;.
9310: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 09 20 char *ciphers.
9320: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
9330: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 char *ciphers
9340: 75 69 74 65 73 09 20 20 20 20 20 20 20 20 3d 20 uites. =
9350: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
9360: 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d CAfile. =
9370: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
9380: 2a 43 41 64 69 72 09 09 20 20 20 20 20 20 20 20 *CAdir..
9390: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
93a0: 20 2a 44 48 70 61 72 61 6d 73 09 20 20 20 20 20 *DHparams.
93b0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 = NULL;. c
93c0: 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 20 20 20 har *model..
93d0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
93e0: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 char *servername
93f0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
9400: 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 ./* hostname for
9410: 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 Server Name Ind
9420: 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 ication */. c
9430: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
9440: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 20 3d ar *session_id =
9450: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f NULL;. Tcl_O
9460: 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c bj *alpn..= NULL
9470: 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d ;. int ssl2 =
9480: 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 0, ssl3 = 0;.
9490: 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 int tls1 = 1,
94a0: 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 tls1_1 = 1, tls1
94b0: 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d _2 = 1, tls1_3 =
94c0: 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 1;. int prot
94d0: 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d o = 0, level = -
94e0: 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 1;. int verif
94f0: 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d y = 0, require =
9500: 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c 0, request = 1,
9510: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 post_handshake
9520: 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 = 0;.. dprint
9530: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 f("Called");..#i
9540: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
9550: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
9560: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 ENSSL_NO_TLS1).
9570: 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e tls1 = 0;.#en
9580: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
9590: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 NO_TLS1_1) || de
95a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
95b0: 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 _TLS1_1). tls
95c0: 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 1_1 = 0;.#endif.
95d0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
95e0: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
95f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
9600: 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 1_2). tls1_2
9610: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 0;.#endif.#if
9620: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
9630: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
9640: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
9650: 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b . tls1_3 = 0;
9660: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 .#endif.. if
9670: 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 (objc < 2) {..Tc
9680: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
9690: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
96a0: 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e "channel ?option
96b0: 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 s?");..return TC
96c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
96d0: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
96e0: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e ror();.. chan
96f0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
9700: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 l(interp, Tcl_Ge
9710: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
9720: 62 6a 76 5b 31 5d 2c 20 28 54 63 6c 5f 53 69 7a bjv[1], (Tcl_Siz
9730: 65 20 2a 29 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 e *)NULL), NULL)
9740: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
9750: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
9760: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
9770: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
9780: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
9790: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
97a0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
97b0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
97c0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
97d0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 nnel(chan);..
97e0: 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 for (idx = 2; i
97f0: 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b dx < objc; idx++
9800: 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d ) {..char *opt =
9810: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
9820: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c omObj(objv[idx],
9830: 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 4e 55 4c (Tcl_Size *)NUL
9840: 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d L);...if (opt[0]
9850: 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 != '-').. br
9860: 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d eak;...OPTOBJ("-
9870: 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f alpn", alpn);..O
9880: 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c 20 PTSTR("-cadir",
9890: 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 52 28 CAdir);..OPTSTR(
98a0: 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69 6c "-cafile", CAfil
98b0: 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 e);..OPTBYTE("-c
98c0: 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72 74 ert", cert, cert
98d0: 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 _len);..OPTSTR("
98e0: 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74 -certfile", cert
98f0: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 file);..OPTSTR("
9900: 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 -cipher", cipher
9910: 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 s);..OPTSTR("-ci
9920: 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 29 phers", ciphers)
9930: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 ;..OPTSTR("-ciph
9940: 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 65 ersuites", ciphe
9950: 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 rsuites);..OPTOB
9960: 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 J("-command", sc
9970: 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 ript);..OPTSTR("
9980: 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61 -dhparams", DHpa
9990: 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45 28 rams);..OPTBYTE(
99a0: 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 "-key", key, key
99b0: 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 _len);..OPTSTR("
99c0: 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 -keyfile", keyfi
99d0: 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d le);..OPTSTR("-m
99e0: 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 odel", model);..
99f0: 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 OPTOBJ("-passwor
9a00: 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 d", password);..
9a10: 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 OPTBOOL("-post_h
9a20: 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f andshake", post_
9a30: 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54 handshake);..OPT
9a40: 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 2c BOOL("-request",
9a50: 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 request);..OPTB
9a60: 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c 20 OOL("-require",
9a70: 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 49 4e require);..OPTIN
9a80: 54 28 22 2d 73 65 63 75 72 69 74 79 6c 65 76 65 T("-securityleve
9a90: 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 l", level);..OPT
9aa0: 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 BOOL("-server",
9ab0: 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 server);..OPTSTR
9ac0: 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 ("-servername",
9ad0: 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 servername);..OP
9ae0: 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 TSTR("-session_i
9af0: 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b d", session_id);
9b00: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 ..OPTBOOL("-ssl2
9b10: 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f ", ssl2);..OPTBO
9b20: 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 OL("-ssl3", ssl3
9b30: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c );..OPTBOOL("-tl
9b40: 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 s1", tls1);..OPT
9b50: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 BOOL("-tls1.1",
9b60: 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f tls1_1);..OPTBOO
9b70: 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 L("-tls1.2", tls
9b80: 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 1_2);..OPTBOOL("
9b90: 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 -tls1.3", tls1_3
9ba0: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c );..OPTOBJ("-val
9bb0: 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 idatecommand", v
9bc0: 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d cmd);..OPTOBJ("-
9bd0: 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 vcmd", vcmd);...
9be0: 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c OPTBAD("option",
9bf0: 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c "-alpn, -cadir,
9c00: 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c -cafile, -cert,
9c10: 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 -certfile, -cip
9c20: 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 her, -ciphersuit
9c30: 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 es, -command, -d
9c40: 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d hparams, -key, -
9c50: 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c keyfile, -model,
9c60: 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 -password, -pos
9c70: 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 t_handshake, -re
9c80: 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c quest, -require,
9c90: 20 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c 2c -securitylevel,
9ca0: 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 -server, -serve
9cb0: 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f rname, -session_
9cc0: 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 id, -ssl2, -ssl3
9cd0: 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 , -tls1, -tls1.1
9ce0: 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 , -tls1.2, -tls1
9cf0: 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 .3, or -validate
9d00: 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 command");...ret
9d10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
9d20: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 }. if (req
9d30: 75 65 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d uest)..verify |=
9d40: 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 SSL_VERIFY_CLIE
9d50: 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 NT_ONCE | SSL_VE
9d60: 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 RIFY_PEER;. i
9d70: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72 65 f (request && re
9d80: 71 75 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d quire).verify |=
9d90: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c SSL_VERIFY_FAIL
9da0: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 _IF_NO_PEER_CERT
9db0: 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 ;. if (reques
9dc0: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 t && post_handsh
9dd0: 61 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 ake).verify |= S
9de0: 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 SL_VERIFY_POST_H
9df0: 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 ANDSHAKE;. if
9e00: 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 (verify == 0)..
9e10: 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 verify = SSL_VER
9e20: 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 IFY_NONE;.. p
9e30: 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 roto |= (ssl2 ?
9e40: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a TLS_PROTO_SSL2 :
9e50: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 0);. proto |
9e60: 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 = (ssl3 ? TLS_PR
9e70: 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 OTO_SSL3 : 0);.
9e80: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 proto |= (tls
9e90: 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 1 ? TLS_PROTO_TL
9ea0: 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f S1 : 0);. pro
9eb0: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 to |= (tls1_1 ?
9ec0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 TLS_PROTO_TLS1_1
9ed0: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f : 0);. proto
9ee0: 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c |= (tls1_2 ? TL
9ef0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a S_PROTO_TLS1_2 :
9f00: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 0);. proto |
9f10: 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f = (tls1_3 ? TLS_
9f20: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 PROTO_TLS1_3 : 0
9f30: 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 );.. /* reset
9f40: 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e to NULL if blan
9f50: 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 k string provide
9f60: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 d */. if (cer
9f70: 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 t && !*cert)..
9f80: 20 20 20 20 20 20 63 65 72 74 09 20 20 20 20 20 cert.
9f90: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
9fa0: 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 f (key && !*key)
9fb0: 09 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 .. key.
9fc0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
9fd0: 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 if (certfile &
9fe0: 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 & !*certfile)
9ff0: 20 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d certfile.=
a000: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b NULL;. if (k
a010: 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 eyfile && !*keyf
a020: 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 ile)..keyfile.
a030: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
a040: 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26 if (ciphers &&
a050: 20 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 !*ciphers).
a060: 20 20 20 20 63 69 70 68 65 72 73 09 20 20 20 20 ciphers.
a070: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
a080: 69 66 20 28 63 69 70 68 65 72 73 75 69 74 65 73 if (ciphersuites
a090: 20 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 && !*ciphersuit
a0a0: 65 73 29 20 63 69 70 68 65 72 73 75 69 74 65 73 es) ciphersuites
a0b0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
a0c0: 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a if (CAfile && !*
a0d0: 43 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 CAfile).
a0e0: 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d CAfile. =
a0f0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 NULL;. if (C
a100: 41 64 69 72 20 26 26 20 21 2a 43 41 64 69 72 29 Adir && !*CAdir)
a110: 09 20 20 20 20 20 20 20 20 43 41 64 69 72 09 20 . CAdir.
a120: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
a130: 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 if (DHparams
a140: 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09 20 && !*DHparams).
a150: 20 20 20 20 20 20 20 44 48 70 61 72 61 6d 73 20 DHparams
a160: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a = NULL;..
a170: 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 /* new SSL s
a180: 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 tate */. stat
a190: 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20 2a ePtr..= (State *
a1a0: 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 ) ckalloc((unsig
a1b0: 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61 74 ned) sizeof(Stat
a1c0: 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 e));. memset(
a1d0: 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a statePtr, 0, siz
a1e0: 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 eof(State));..
a1f0: 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 statePtr->flag
a200: 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 s.= flags;. s
a210: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 tatePtr->interp.
a220: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 = interp;. st
a230: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d atePtr->vflags.=
a240: 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74 61 verify;. sta
a250: 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b tePtr->err.= "";
a260: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 .. /* allocat
a270: 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 e script */.
a280: 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09 28 if (script) {..(
a290: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 void) Tcl_GetStr
a2a0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 ingFromObj(scrip
a2b0: 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c t, &len);..if (l
a2c0: 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 en) {.. state
a2d0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 Ptr->callback =
a2e0: 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63 6c script;.. Tcl
a2f0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _IncrRefCount(st
a300: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
a310: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
a320: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 /* allocate pas
a330: 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 sword */. if
a340: 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 (password) {..(v
a350: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 oid) Tcl_GetStri
a360: 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f ngFromObj(passwo
a370: 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 rd, &len);..if (
a380: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 len) {.. stat
a390: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d ePtr->password =
a3a0: 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 password;..
a3b0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
a3c0: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 (statePtr->passw
a3d0: 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a ord);..}. }..
a3e0: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 /* allocate
a3f0: 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 validate command
a400: 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d 64 */. if (vcmd
a410: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f ) {..(void) Tcl_
a420: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
a430: 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 (vcmd, &len);..i
a440: 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 f (len) {.. s
a450: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 tatePtr->vcmd =
a460: 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 vcmd;.. Tcl_I
a470: 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ncrRefCount(stat
a480: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a ePtr->vcmd);..}.
a490: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d }.. if (m
a4a0: 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a odel != NULL) {.
a4b0: 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 .int mode;../* G
a4c0: 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 et the "model" c
a4d0: 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 ontext */..chan
a4e0: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
a4f0: 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 (interp, model,
a500: 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 61 &mode);..if (cha
a510: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
a520: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 l) NULL) {..
a530: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
a540: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
a550: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
a560: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 OR;..}.../*.. *
a570: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
a580: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
a590: 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f ost channel.. */
a5a0: 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 ..chan = Tcl_Get
a5b0: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
a5c0: 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 ;..if (Tcl_GetCh
a5d0: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
a5e0: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
a5f0: 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c pe()) {.. Tcl
a600: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
a610: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
a620: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
a630: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
a640: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 ,..."\": not a T
a650: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
a660: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
a670: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
a680: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
a690: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 ", "CHANNEL", "I
a6a0: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a NVALID", (char *
a6b0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c ) NULL);.. Tl
a6c0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
a6d0: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
a6e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a6f0: 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 ;..}..ctx = ((St
a700: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 ate *)Tcl_GetCha
a710: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
a720: 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 (chan))->ctx;.
a730: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 } else {..if (
a740: 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 (ctx = CTX_Init(
a750: 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 statePtr, server
a760: 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 , proto, keyfile
a770: 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c , certfile, key,
a780: 20 63 65 72 74 2c 20 28 69 6e 74 29 20 6b 65 79 cert, (int) key
a790: 5f 6c 65 6e 2c 0a 09 20 20 20 20 28 69 6e 74 29 _len,.. (int)
a7a0: 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69 72 cert_len, CAdir
a7b0: 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72 , CAfile, cipher
a7c0: 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 2c s, ciphersuites,
a7d0: 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 level, DHparams
a7e0: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 )) == NULL) {..
a7f0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
a800: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
a810: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
a820: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
a830: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 . statePtr->c
a840: 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f tx = ctx;.. /
a850: 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 *. * We need
a860: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 to make sure th
a870: 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 at the channel w
a880: 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 orks in binary (
a890: 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 for the. * e
a8a0: 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f ncryption not to
a8b0: 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e get goofed up).
a8c0: 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 . * We only
a8d0: 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74 want to adjust t
a8e0: 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20 he buffering in
a8f0: 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c pre-v2 channels,
a900: 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61 where. * ea
a910: 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 ch channel in th
a920: 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e e stack maintain
a930: 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65 ed its own buffe
a940: 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 rs.. */.
a950: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
a960: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 &upperChannelTra
a970: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 nslation);. T
a980: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
a990: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
a9a0: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 king);. Tcl_D
a9b0: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
a9c0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 rChannelEOFChar)
a9d0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
a9e0: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e gInit(&upperChan
a9f0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 nelEncoding);.
aa00: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c Tcl_GetChannel
aa10: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
aa20: 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c han, "-eofchar",
aa30: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f &upperChannelEO
aa40: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f FChar);. Tcl_
aa50: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e GetChannelOption
aa60: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
aa70: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 -encoding", &upp
aa80: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e erChannelEncodin
aa90: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 g);. Tcl_GetC
aaa0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
aab0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 erp, chan, "-tra
aac0: 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 nslation", &uppe
aad0: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
aae0: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 ion);. Tcl_Ge
aaf0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
ab00: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 nterp, chan, "-b
ab10: 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 locking", &upper
ab20: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 ChannelBlocking)
ab30: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
ab40: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
ab50: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 p, chan, "-trans
ab60: 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 lation", "binary
ab70: 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ");. Tcl_SetC
ab80: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
ab90: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f erp, chan, "-blo
aba0: 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b cking", "true");
abb0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f . dprintf("Co
abc0: 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e nsuming Tcl chan
abd0: 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 nel %s", Tcl_Get
abe0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
abf0: 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 ));. statePtr
ac00: 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 ->self = Tcl_Sta
ac10: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 ckChannel(interp
ac20: 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 , Tls_ChannelTyp
ac30: 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 e(), (ClientData
ac40: 29 20 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c ) statePtr, (TCL
ac50: 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f _READABLE | TCL_
ac60: 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 WRITABLE), chan)
ac70: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 ;. dprintf("C
ac80: 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e reated channel n
ac90: 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 amed %s", Tcl_Ge
aca0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
acb0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 tePtr->self));.
acc0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
acd0: 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 >self == (Tcl_Ch
ace0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
acf0: 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 /*.. * No use of
ad00: 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 Tcl_EventuallyF
ad10: 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 ree because no p
ad20: 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 ossible Tcl_Pres
ad30: 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f erve... */..Tls_
ad40: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
ad50: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e atePtr);..return
ad60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
ad70: 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 }.. Tcl_SetCh
ad80: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
ad90: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 rp, statePtr->se
ada0: 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f lf, "-translatio
adb0: 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 n", Tcl_DStringV
adc0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
add0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b elTranslation));
ade0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
adf0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
ae00: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
ae10: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 , "-encoding", T
ae20: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
ae30: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 &upperChannelEnc
ae40: 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c oding));. Tcl
ae50: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
ae60: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
ae70: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 tr->self, "-eofc
ae80: 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e har", Tcl_DStrin
ae90: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
aea0: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 nnelEOFChar));.
aeb0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
aec0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
aed0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 statePtr->self,
aee0: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c "-blocking", Tcl
aef0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
af00: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
af10: 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 ing));.. /*.
af20: 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 * SSL Initia
af30: 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f lization. */
af40: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 . statePtr->s
af50: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 sl = SSL_new(sta
af60: 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 tePtr->ctx);.
af70: 20 69 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e if (!statePtr->
af80: 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c ssl) {../* SSL l
af90: 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a ibrary error */.
afa0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
afb0: 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 t(interp, "could
afc0: 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 n't construct ss
afd0: 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 52 45 l session: ", RE
afe0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
aff0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c NULL);.. Tcl
b000: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
b010: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
b020: 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 PORT", "INIT", "
b030: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
b040: 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 ) NULL);..Tls_Fr
b050: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
b060: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 ePtr);..return T
b070: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
b080: 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 . /* Set host
b090: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a server name */.
b0a0: 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e 61 if (serverna
b0b0: 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74 me) {../* Sets t
b0c0: 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 he server name i
b0d0: 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 ndication (SNI)
b0e0: 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 in ClientHello e
b0f0: 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 xtension */../*
b100: 50 65 72 20 52 46 43 20 36 30 36 36 2c 20 68 6f Per RFC 6066, ho
b110: 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43 49 stname is a ASCI
b120: 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 I encoded string
b130: 2c 20 74 68 6f 75 67 68 20 52 46 43 20 34 33 36 , though RFC 436
b140: 36 20 73 61 79 73 20 55 54 46 2d 38 2e 20 2a 2f 6 says UTF-8. */
b150: 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 ..if (!SSL_set_t
b160: 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 lsext_host_name(
b170: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 statePtr->ssl, s
b180: 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65 ervername) && re
b190: 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63 quire) {.. Tc
b1a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
b1b0: 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 nterp, "setting
b1c0: 54 4c 53 20 68 6f 73 74 20 6e 61 6d 65 20 65 78 TLS host name ex
b1d0: 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c tension failed",
b1e0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b1f0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
b200: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
b210: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
b220: 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 2c "SNI", "FAILED",
b230: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b240: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
b250: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
b260: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
b270: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
b280: 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 * Set hostname f
b290: 6f 72 20 70 65 65 72 20 63 65 72 74 69 66 69 63 or peer certific
b2a0: 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 ate hostname ver
b2b0: 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 ification in cli
b2c0: 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 ents... Don't
b2d0: 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 use SSL_set1_hos
b2e0: 74 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 6c t since it has l
b2f0: 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 imitations. */..
b300: 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f if (!SSL_add1_ho
b310: 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c st(statePtr->ssl
b320: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b , servername)) {
b330: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
b340: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
b350: 73 65 74 74 69 6e 67 20 44 4e 53 20 68 6f 73 74 setting DNS host
b360: 20 6e 61 6d 65 20 66 61 69 6c 65 64 22 2c 20 28 name failed", (
b370: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
b380: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 Tcl_SetError
b390: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
b3a0: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 S", "IMPORT", "H
b3b0: 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 OSTNAME", "FAILE
b3c0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
b3d0: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 L);.. Tls_Fre
b3e0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
b3f0: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
b400: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
b410: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 }.. /* Re
b420: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 sume session id
b430: 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 */. if (sessi
b440: 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e 28 on_id && strlen(
b450: 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 session_id) <= S
b460: 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c SL_MAX_SID_CTX_L
b470: 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c ENGTH) {../* SSL
b480: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a _set_session() *
b490: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53 /..if (!SSL_SESS
b4a0: 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 ION_set1_id_cont
b4b0: 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 ext(SSL_get_sess
b4c0: 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ion(statePtr->ss
b4d0: 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 l), session_id,
b4e0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 (unsigned int) s
b4f0: 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 trlen(session_id
b500: 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 ))) {.. Tcl_A
b510: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
b520: 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73 73 rp, "Resume sess
b530: 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 73 69 6f ion id ", sessio
b540: 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 64 22 2c n_id, " failed",
b550: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b560: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
b570: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
b580: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
b590: 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c "SESSION", "FAIL
b5a0: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ED", (char *) NU
b5b0: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 LL);.. Tls_Fr
b5c0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
b5d0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
b5e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
b5f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 . }.. /* E
b600: 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f nable Applicatio
b610: 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c n-Layer Protocol
b620: 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 Negotiation. Ex
b630: 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 amples are: http
b640: 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c /1.0,..http/1.1,
b650: 20 68 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d h2, h3, ftp, im
b660: 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 ap, pop3, xmpp-c
b670: 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 lient, xmpp-serv
b680: 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 er, mqtt, irc, e
b690: 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 tc. */. if (a
b6a0: 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 lpn) {../* Conve
b6b0: 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e rt a TCL list in
b6c0: 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 to a protocol-li
b6d0: 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 st in wire-forma
b6e0: 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 t */..unsigned c
b6f0: 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b har *protos, *p;
b700: 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 ..unsigned int p
b710: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 rotos_len = 0;..
b720: 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b Tcl_Size cnt, i;
b730: 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 ..int j;..Tcl_Ob
b740: 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 j **list;...if (
b750: 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c Tcl_ListObjGetEl
b760: 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 ements(interp, a
b770: 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 lpn, &cnt, &list
b780: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
b790: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
b7a0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
b7b0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
b7c0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 _ERROR;..}.../*
b7d0: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 Determine the me
b7e0: 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f mory required fo
b7f0: 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c r the protocol-l
b800: 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d ist */..for (i =
b810: 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 0; i < cnt; i++
b820: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 ) {.. Tcl_Get
b830: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 StringFromObj(li
b840: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 st[i], &len);..
b850: 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 if (len > 255
b860: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 ) {...Tcl_Append
b870: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
b880: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 ALPN protocol na
b890: 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 me too long", (c
b8a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
b8b0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
b8c0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
b8d0: 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 "IMPORT", "ALPN"
b8e0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
b8f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c r *) NULL);...Tl
b900: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
b910: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 statePtr);...ret
b920: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
b930: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f }.. proto
b940: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e s_len += 1 + (in
b950: 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 t) len;..}.../*
b960: 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 Build the comple
b970: 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 te protocol-list
b980: 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b */..protos = ck
b990: 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e alloc(protos_len
b9a0: 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d );../* protocol-
b9b0: 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 lists consist of
b9c0: 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 8-bit length-pr
b9d0: 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 efixed, byte str
b9e0: 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 ings */..for (j
b9f0: 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b = 0, p = protos;
ba00: 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b j < cnt; j++) {
ba10: 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 .. char *str
ba20: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
ba30: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 romObj(list[j],
ba40: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b &len);.. *p++
ba50: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 = (unsigned cha
ba60: 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d r) len;.. mem
ba70: 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a cpy(p, str, (siz
ba80: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 e_t) len);..
ba90: 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f p += len;..}.../
baa0: 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 * SSL_set_alpn_p
bab0: 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f rotos makes a co
bac0: 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 py of the protoc
bad0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e ol-list */../* N
bae0: 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 ote: This functi
baf0: 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 68 65 ons reverses the
bb00: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f return value co
bb10: 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 nvention */..if
bb20: 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 (SSL_set_alpn_pr
bb30: 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 otos(statePtr->s
bb40: 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 sl, protos, prot
bb50: 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 os_len)) {..
bb60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
bb70: 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c 65 64 (interp, "failed
bb80: 20 74 6f 20 73 65 74 20 41 4c 50 4e 20 70 72 6f to set ALPN pro
bb90: 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 20 2a tocols", (char *
bba0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 ) NULL);.. Tc
bbb0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
bbc0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
bbd0: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 MPORT", "ALPN",
bbe0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
bbf0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
bc00: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
bc10: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
bc20: 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b ckfree(protos);
bc30: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
bc40: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 _ERROR;..}.../*
bc50: 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 Store protocols
bc60: 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 list */..statePt
bc70: 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 r->protos = prot
bc80: 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 os;..statePtr->p
bc90: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 rotos_len = prot
bca0: 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c os_len;. } el
bcb0: 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e se {..statePtr->
bcc0: 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 protos = NULL;..
bcd0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
bce0: 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a _len = 0;. }.
bcf0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 . /*. * S
bd00: 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 SL Callbacks.
bd10: 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 */. SSL_set
bd20: 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 _app_data(stateP
bd30: 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a tr->ssl, (void *
bd40: 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 )statePtr);./* p
bd50: 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 oint back to us
bd60: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 */. SSL_set_v
bd70: 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e erify(statePtr->
bd80: 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 ssl, verify, Ver
bd90: 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 ifyCallback);.
bda0: 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 SSL_set_info_c
bdb0: 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 allback(statePtr
bdc0: 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 ->ssl, InfoCallb
bdd0: 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 ack);.. /* Ca
bde0: 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 llback for obser
bdf0: 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 ving protocol me
be00: 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 ssages */.#ifnde
be10: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c f OPENSSL_NO_SSL
be20: 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f _TRACE. /* vo
be30: 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d id SSL_CTX_set_m
be40: 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 sg_callback_arg(
be50: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 statePtr->ctx, (
be60: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
be70: 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 ;. void SSL_C
be80: 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 TX_set_msg_callb
be90: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ack(statePtr->ct
bea0: 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 x, MessageCallba
beb0: 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f ck); */. SSL_
bec0: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b set_msg_callback
bed0: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 73 _arg(statePtr->s
bee0: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 sl, (void *)stat
bef0: 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 ePtr);. SSL_s
bf00: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 et_msg_callback(
bf10: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d statePtr->ssl, M
bf20: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b essageCallback);
bf30: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 .#endif.. /*
bf40: 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e Create Tcl_Chann
bf50: 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a el BIO Handler *
bf60: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e /. statePtr->
bf70: 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f p_bio.= BIO_new_
bf80: 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 tcl(statePtr, BI
bf90: 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 O_NOCLOSE);.
bfa0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 statePtr->bio.=
bfb0: 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 BIO_new(BIO_f_ss
bfc0: 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 l());.. if (s
bfd0: 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 erver) {../* Ser
bfe0: 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f ver callbacks */
bff0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c ..SSL_CTX_set_tl
c000: 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f sext_servername_
c010: 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 arg(statePtr->ct
c020: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 x, (void *)state
c030: 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 Ptr);..SSL_CTX_s
c040: 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 et_tlsext_server
c050: 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 name_callback(st
c060: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 atePtr->ctx, SNI
c070: 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f Callback);..SSL_
c080: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 CTX_set_client_h
c090: 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72 ello_cb(statePtr
c0a0: 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c ->ctx, HelloCall
c0b0: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 back, (void *)st
c0c0: 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74 atePtr);..if (st
c0d0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 atePtr->protos !
c0e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 = NULL) {.. S
c0f0: 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f SL_CTX_set_alpn_
c100: 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 select_cb(stateP
c110: 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c tr->ctx, ALPNCal
c120: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 lback, (void *)s
c130: 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66 tatePtr);.#ifdef
c140: 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 USE_NPN.. if
c150: 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 (tls1_2 == 0 &&
c160: 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a tls1_3 == 0) {.
c170: 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 ..SSL_CTX_set_ne
c180: 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 xt_protos_advert
c190: 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74 72 ised_cb(statePtr
c1a0: 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 ->ctx, NPNCallba
c1b0: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 ck, (void *)stat
c1c0: 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 ePtr);.. }.#e
c1d0: 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 ndif..}.../* Ena
c1e0: 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73 65 ble server to se
c1f0: 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74 20 nd cert request
c200: 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20 after handshake
c210: 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a (TLS 1.3 only) *
c220: 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 /../* A write op
c230: 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b eration must tak
c240: 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65 20 e place for the
c250: 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71 75 Certificate Requ
c260: 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73 65 est to be.. se
c270: 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 nt to the client
c280: 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64 6f , this can be do
c290: 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 ne with SSL_do_h
c2a0: 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 andshake(). */..
c2b0: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 if (request && p
c2c0: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 ost_handshake &&
c2d0: 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 tls1_3) {..
c2e0: 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e SSL_verify_clien
c2f0: 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 t_post_handshake
c300: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
c310: 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74 ..}.../* set aut
c320: 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65 6c omatic curve sel
c330: 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 ection */..SSL_s
c340: 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 61 et_ecdh_auto(sta
c350: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a tePtr->ssl, 1);.
c360: 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20 ../* Set server
c370: 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 mode */..statePt
c380: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f r->flags |= TLS_
c390: 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c TCL_SERVER;..SSL
c3a0: 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 _set_accept_stat
c3b0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
c3c0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
c3d0: 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 /* Client callba
c3e0: 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 cks */.#ifdef US
c3f0: 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65 E_NPN..if (state
c400: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e Ptr->protos != N
c410: 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d ULL && tls1_2 ==
c420: 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 0 && tls1_3 ==
c430: 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 0) {.. SSL_CT
c440: 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f X_set_next_proto
c450: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 _select_cb(state
c460: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 Ptr->ctx, ALPNCa
c470: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 llback, (void *)
c480: 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 statePtr);..}.#e
c490: 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f ndif.../* Sessio
c4a0: 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 n caching */..SS
c4b0: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f L_CTX_set_sessio
c4c0: 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 n_cache_mode(sta
c4d0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f tePtr->ctx, SSL_
c4e0: 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e SESS_CACHE_CLIEN
c4f0: 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 T | SSL_SESS_CAC
c500: 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 HE_NO_INTERNAL_S
c510: 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f TORE);..SSL_CTX_
c520: 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 sess_set_new_cb(
c530: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 statePtr->ctx, S
c540: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b essionCallback);
c550: 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 .../* Enable pos
c560: 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 t handshake Auth
c570: 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e entication exten
c580: 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e sion. TLS 1.3 on
c590: 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 ly, not http/2.
c5a0: 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 */..if (request
c5b0: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b && post_handshak
c5c0: 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 e) {.. SSL_se
c5d0: 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 t_post_handshake
c5e0: 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e _auth(statePtr->
c5f0: 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a ssl, 1);..}.../*
c600: 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 Set client mode
c610: 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e */..SSL_set_con
c620: 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 nect_state(state
c630: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
c640: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f . SSL_set_bio
c650: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
c660: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c statePtr->p_bio,
c670: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f statePtr->p_bio
c680: 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 );. BIO_set_s
c690: 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f sl(statePtr->bio
c6a0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c , statePtr->ssl,
c6b0: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a BIO_NOCLOSE);..
c6c0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e /*. * En
c6d0: 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 d of SSL Init.
c6e0: 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 */. dprint
c6f0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 f("Returning %s"
c700: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
c710: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
c720: 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 elf));. Tcl_S
c730: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
c740: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 (char *) Tcl_Ge
c750: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
c760: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 tePtr->self), TC
c770: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 L_VOLATILE);..
c780: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
c790: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 ..clientData = c
c7a0: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
c7b0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
c7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c7f0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e -------. *. * Un
c800: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a importObjCmd --.
c810: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
c820: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
c830: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f to remove the to
c840: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 pmost channel fi
c850: 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 lter.. *. * Resu
c860: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
c870: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
c880: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
c890: 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 s:. *.May modify
c8a0: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 the behavior of
c8b0: 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a an IO channel..
c8c0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
c8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c900: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
c910: 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 tic int.Unimport
c920: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
c930: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
c940: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
c950: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
c960: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
c970: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
c980: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 nnel chan;../* T
c990: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 he channel to se
c9a0: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a t a mode on. */.
c9b0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
c9c0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
c9d0: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
c9e0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
c9f0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
ca00: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 "channel");..re
ca10: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
ca20: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 }.. chan
ca30: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
ca40: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 (interp, Tcl_Get
ca50: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c String(objv[1]),
ca60: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 NULL);. if (
ca70: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
ca80: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
ca90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
caa0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
cab0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
cac0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
cad0: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
cae0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
caf0: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
cb00: 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 ;.. if (Tcl_G
cb10: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
cb20: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
cb30: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c elType()) {..Tcl
cb40: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
cb50: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
cb60: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
cb70: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
cb80: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 ,..."\": not a T
cb90: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
cba0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
cbb0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
cbc0: 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f , "TLS", "UNIMPO
cbd0: 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 RT", "CHANNEL",
cbe0: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 "INVALID", (char
cbf0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
cc00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
cc10: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c }.. if (Tcl
cc20: 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 _UnstackChannel(
cc30: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d interp, chan) ==
cc40: 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 TCL_ERROR) {..r
cc50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
cc60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 . }.. retu
cc70: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
cc80: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
cc90: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
cca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ccb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cce0: 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 -. *. * CTX_Init
ccf0: 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 -- construct a
cd00: 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 SSL_CTX instance
cd10: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
cd20: 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 *.A valid SSL_C
cd30: 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e TX instance or N
cd40: 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ULL.. *. * Side
cd50: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 effects:. *.cons
cd60: 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 tructs SSL conte
cd70: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d xt (CTX). *. *--
cd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cdc0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c -. */.static SSL
cdd0: 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 _CTX *.CTX_Init(
cde0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c State *statePtr,
cdf0: 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 int isServer, i
ce00: 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a nt proto, char *
ce10: 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 keyfile, char *c
ce20: 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 ertfile,. uns
ce30: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c igned char *key,
ce40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
ce50: 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 cert, int key_le
ce60: 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c n, int cert_len,
ce70: 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 char *CAdir,.
ce80: 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 char *CAfile,
ce90: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 char *ciphers, c
cea0: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 har *ciphersuite
ceb0: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 s, int level, ch
cec0: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a ar *DHparams) {.
ced0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
cee0: 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 interp = statePt
cef0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 r->interp;. S
cf00: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 SL_CTX *ctx = NU
cf10: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 LL;. Tcl_DStr
cf20: 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f ing ds;. Tcl_
cf30: 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 DString ds1;.
cf40: 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 int off = 0;.
cf50: 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 int load_priva
cf60: 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 te_key;. cons
cf70: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 t SSL_METHOD *me
cf80: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e thod;.. dprin
cf90: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
cfa0: 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b if (!proto) {
cfb0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
cfc0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 lt(interp, "no v
cfd0: 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 alid protocol se
cfe0: 6c 65 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a lected", (char *
cff0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
d000: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
d010: 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 /* create SSL
d020: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f context */.#if O
d030: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
d040: 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 UMBER >= 0x10100
d050: 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 000L || defined(
d060: 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 NO_SSL2) || defi
d070: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
d080: 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 SL2). if (ENA
d090: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
d0a0: 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 PROTO_SSL2)) {..
d0b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d0c0: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 (interp, "SSL2 p
d0d0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
d0e0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
d0f0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
d100: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
d110: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
d120: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e O_SSL3) || defin
d130: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
d140: 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 L3). if (ENAB
d150: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
d160: 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 ROTO_SSL3)) {..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 53 53 4c 33 20 70 72 interp, "SSL3 pr
d190: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
d1a0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
d1b0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
d1c0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
d1d0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
d1e0: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 _TLS1) || define
d1f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d200: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 1). if (ENABL
d210: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
d220: 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 OTO_TLS1)) {..Tc
d230: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d240: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 nterp, "TLS 1.0
d250: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
d260: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a ported", (char *
d270: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
d280: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
d290: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
d2a0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 NO_TLS1_1) || de
d2b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d2c0: 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 _TLS1_1). if
d2d0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
d2e0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 TLS_PROTO_TLS1_1
d2f0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
d300: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
d310: 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c TLS 1.1 protocol
d320: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
d330: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d340: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
d350: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
d360: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
d370: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
d380: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
d390: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
d3a0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
d3b0: 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 O_TLS1_2)) {..Tc
d3c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d3d0: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 nterp, "TLS 1.2
d3e0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
d3f0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a ported", (char *
d400: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
d410: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
d420: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
d430: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
d440: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d450: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 _TLS1_3). if
d460: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
d470: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
d480: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
d490: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
d4a0: 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c TLS 1.3 protocol
d4b0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
d4c0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d4d0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
d4e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 }.#endif.
d4f0: 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 if (proto == 0)
d500: 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 {../* Use full r
d510: 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 ange */..SSL_CTX
d520: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 _set_min_proto_v
d530: 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a ersion(ctx, 0);.
d540: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 .SSL_CTX_set_max
d550: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
d560: 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 tx, 0);. }..
d570: 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f switch (proto
d580: 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f ) {.#if OPENSSL_
d590: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
d5a0: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 0x10100000L &&
d5b0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 !defined(NO_SSL2
d5c0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
d5d0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 ENSSL_NO_SSL2).
d5e0: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
d5f0: 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 O_SSL2:..method
d600: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c = isServer ? SSL
d610: 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 v2_server_method
d620: 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e () : SSLv2_clien
d630: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
d640: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
d650: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
d660: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
d670: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 NSSL_NO_SSL3) &&
d680: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
d690: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 L_NO_SSL3_METHOD
d6a0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
d6b0: 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 ROTO_SSL3:..meth
d6c0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
d6d0: 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 SSLv3_server_met
d6e0: 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c hod() : SSLv3_cl
d6f0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
d700: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
d710: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
d720: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
d730: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
d740: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
d750: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 NSSL_NO_TLS1_MET
d760: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c HOD). case TL
d770: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d S_PROTO_TLS1:..m
d780: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
d790: 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f ? TLSv1_server_
d7a0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 method() : TLSv1
d7b0: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
d7c0: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
d7d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
d7e0: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 _TLS1_1) && !def
d7f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d800: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
d810: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d820: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 LS1_1_METHOD).
d830: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
d840: 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 _TLS1_1:..method
d850: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c = isServer ? TL
d860: 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 Sv1_1_server_met
d870: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f hod() : TLSv1_1_
d880: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
d890: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
d8a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
d8b0: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
d8c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d8d0: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
d8e0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
d8f0: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_2_METHOD).
d900: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
d910: 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 TLS1_2:..method
d920: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 = isServer ? TLS
d930: 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 v1_2_server_meth
d940: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 od() : TLSv1_2_c
d950: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
d960: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
d970: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
d980: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
d990: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
d9a0: 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 S1_3). case T
d9b0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a LS_PROTO_TLS1_3:
d9c0: 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e ../* Use the gen
d9d0: 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 eric method and
d9e0: 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 constraint range
d9f0: 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 after context i
da00: 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 s created */..me
da10: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
da20: 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 ? TLS_server_met
da30: 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 hod() : TLS_clie
da40: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
da50: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 eak;.#endif.
da60: 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 default:../* Neg
da70: 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 20 61 otiate highest a
da80: 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 vailable SSL/TLS
da90: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 version */..met
daa0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
dab0: 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 TLS_server_meth
dac0: 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e od() : TLS_clien
dad0: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 t_method();.#if
dae0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
daf0: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 NUMBER < 0x10100
db00: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 000L && !defined
db10: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 (NO_SSL2) && !de
db20: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
db30: 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 _SSL2)..off |= (
db40: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
db50: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 LS_PROTO_SSL2)
db60: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
db70: 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a _SSLv2);.#endif.
db80: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
db90: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
dba0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
dbb0: 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 3)..off |= (ENAB
dbc0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
dbd0: 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 ROTO_SSL3) ? 0
dbe0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c : SSL_OP_NO_SSL
dbf0: 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 v3);.#endif.#if
dc00: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
dc10: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
dc20: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 ENSSL_NO_TLS1)..
dc30: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
dc40: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
dc50: 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 _TLS1) ? 0 : S
dc60: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b SL_OP_NO_TLSv1);
dc70: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
dc80: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
dc90: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
dca0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 SSL_NO_TLS1_1)..
dcb0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
dcc0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
dcd0: 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 _TLS1_1) ? 0 : S
dce0: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 SL_OP_NO_TLSv1_1
dcf0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
dd00: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
dd10: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
dd20: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
dd30: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
dd40: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
dd50: 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a TO_TLS1_2) ? 0 :
dd60: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
dd70: 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 _2);.#endif.#if
dd80: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
dd90: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
dda0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
ddb0: 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 3)..off |= (ENAB
ddc0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
ddd0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 ROTO_TLS1_3) ? 0
dde0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
ddf0: 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 v1_3);.#endif..b
de00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 reak;. }..
de10: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 ERR_clear_error
de20: 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 ();.. ctx = S
de30: 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f SL_CTX_new(metho
de40: 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 d);. if (!ctx
de50: 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c ) {..return(NULL
de60: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 );. }.. if
de70: 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c (getenv(SSLKEYL
de80: 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f OGFILE)) {..SSL_
de90: 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 CTX_set_keylog_c
dea0: 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 allback(ctx, Key
deb0: 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 LogCallback);.
dec0: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 }..#if !define
ded0: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 d(NO_TLS1_3) &&
dee0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
def0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
df00: 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 if (proto == TLS
df10: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b _PROTO_TLS1_3) {
df20: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 ..SSL_CTX_set_mi
df30: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 n_proto_version(
df40: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 ctx, TLS1_3_VERS
df50: 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 ION);..SSL_CTX_s
df60: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 et_max_proto_ver
df70: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 sion(ctx, TLS1_3
df80: 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d _VERSION);. }
df90: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 .#endif.. /*
dfa0: 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c Force cipher sel
dfb0: 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 ection order by
dfc0: 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 server */. if
dfd0: 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 (!isServer) {..
dfe0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
dff0: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f ons(ctx, SSL_OP_
e000: 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 CIPHER_SERVER_PR
e010: 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d EFERENCE);. }
e020: 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
e030: 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 t_app_data(ctx,
e040: 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 (void*)interp);.
e050: 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 /* remember the
e060: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 interpreter */.
e070: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f SSL_CTX_set_o
e080: 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f ptions(ctx, SSL_
e090: 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 OP_ALL);./* all
e0a0: 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 SSL bug workarou
e0b0: 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 nds */. SSL_C
e0c0: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 TX_set_options(c
e0d0: 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f tx, SSL_OP_NO_CO
e0e0: 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 MPRESSION);./* d
e0f0: 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 isable compressi
e100: 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f on even if suppo
e110: 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f rted */. SSL_
e120: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 CTX_set_options(
e130: 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 ctx, off);../* d
e140: 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 isable protocol
e150: 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 versions */.#if
e160: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
e170: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 NUMBER < 0x10101
e180: 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 000L. SSL_CTX
e190: 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 _set_mode(ctx, S
e1a0: 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 SL_MODE_AUTO_RET
e1b0: 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e RY);./* handle n
e1c0: 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e ew handshakes in
e1d0: 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 background. On
e1e0: 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 by default in Op
e1f0: 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a enSSL 1.1.1. */.
e200: 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 #endif. SSL_C
e210: 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 TX_sess_set_cach
e220: 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 e_size(ctx, 128)
e230: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 ;.. /* Set us
e240: 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 er defined ciphe
e250: 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 rs, cipher suite
e260: 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 s, and security
e270: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 level */. if
e280: 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c ((ciphers != NUL
e290: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 L) && !SSL_CTX_s
e2a0: 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 et_cipher_list(c
e2b0: 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a tx, ciphers)) {.
e2c0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
e2d0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 t(interp, "Set c
e2e0: 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e iphers failed: N
e2f0: 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 o valid ciphers"
e300: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
e310: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ;..SSL_CTX_free(
e320: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ctx);..return NU
e330: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
e340: 20 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 ((ciphersuites
e350: 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c != NULL) && !SSL
e360: 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 _CTX_set_ciphers
e370: 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 uites(ctx, ciphe
e380: 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c rsuites)) {..Tcl
e390: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
e3a0: 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 terp, "Set ciphe
e3b0: 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a r suites failed:
e3c0: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 No valid cipher
e3d0: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c s", (char *) NUL
e3e0: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
e3f0: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
e400: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
e410: 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 /* Set security
e420: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 level */. if
e430: 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 (level > -1 &&
e440: 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a level < 6) {../*
e450: 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 SSL_set_securit
e460: 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f y_level */..SSL_
e470: 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 CTX_set_security
e480: 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 _level(ctx, leve
e490: 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f l);. }.. /
e4a0: 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 * set some callb
e4b0: 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f acks */. SSL_
e4c0: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
e4d0: 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 passwd_cb(ctx, P
e4e0: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 asswordCallback)
e4f0: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 ;. SSL_CTX_se
e500: 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 t_default_passwd
e510: 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 _cb_userdata(ctx
e520: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
e530: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 tr);.. /* rea
e540: 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d d a Diffie-Hellm
e550: 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 an parameters fi
e560: 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 le, or use the b
e570: 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 uilt-in one */.#
e580: 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f ifdef OPENSSL_NO
e590: 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 _DH. if (DHpa
e5a0: 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a rams != NULL) {.
e5b0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
e5c0: 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 t(interp, "DH pa
e5d0: 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 rameter support
e5e0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 not available",
e5f0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
e600: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
e610: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c x);..return NULL
e620: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 ;. }.#else.
e630: 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 {..DH* dh;..if
e640: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 (DHparams != NU
e650: 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a LL) {.. BIO *
e660: 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 bio;.. Tcl_DS
e670: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a tringInit(&ds);.
e680: 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e . bio = BIO_n
e690: 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 ew_file(F2N(DHpa
e6a0: 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 rams, &ds), "r")
e6b0: 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 ;.. if (!bio)
e6c0: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 {...Tcl_DString
e6d0: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c Free(&ds);...Tcl
e6e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
e6f0: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 terp, "Could not
e700: 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 find DH paramet
e710: 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 ers file", (char
e720: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c *) NULL);...SSL
e730: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
e740: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
e750: 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d }... dh =
e760: 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 PEM_read_bio_DH
e770: 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c params(bio, NULL
e780: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 , NULL, NULL);..
e790: 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f BIO_free(bio
e7a0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 );.. Tcl_DStr
e7b0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
e7c0: 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 if (!dh) {...
e7d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
e7e0: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 (interp, "Could
e7f0: 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 61 not read DH para
e800: 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 meters from file
e810: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
e820: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 );...SSL_CTX_fre
e830: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e e(ctx);...return
e840: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d NULL;.. }..}
e850: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 68 20 else {.. dh
e860: 3d 20 67 65 74 5f 64 68 50 61 72 61 6d 73 28 29 = get_dhParams()
e870: 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65 ;..}..SSL_CTX_se
e880: 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 t_tmp_dh(ctx, dh
e890: 29 3b 0a 09 44 48 5f 66 72 65 65 28 64 68 29 3b );..DH_free(dh);
e8a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 . }.#endif..
e8b0: 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 /* set our ce
e8c0: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 rtificate */.
e8d0: 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 load_private_ke
e8e0: 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 y = 0;. if (c
e8f0: 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 ertfile != NULL)
e900: 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 {..load_private
e910: 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f _key = 1;...Tcl_
e920: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 DStringInit(&ds)
e930: 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f ;...if (SSL_CTX_
e940: 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f use_certificate_
e950: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 file(ctx, F2N(ce
e960: 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 rtfile, &ds), SS
e970: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 L_FILETYPE_PEM)
e980: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c <= 0) {.. Tcl
e990: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
e9a0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 );.. Tcl_Appe
e9b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
e9c0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
e9d0: 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 certificate file
e9e0: 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a ", certfile, ":
e9f0: 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 ",.... REAS
ea00: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
ea10: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
ea20: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
ea30: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
ea40: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 .}. } else if
ea50: 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 (cert != NULL)
ea60: 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f {..load_private_
ea70: 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 key = 1;..if (SS
ea80: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 L_CTX_use_certif
ea90: 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 icate_ASN1(ctx,
eaa0: 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 cert_len, cert)
eab0: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c <= 0) {.. Tcl
eac0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
ead0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 );.. Tcl_Appe
eae0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
eaf0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
eb00: 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a certificate: ",.
eb10: 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 ... REASON()
eb20: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
eb30: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
eb40: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
eb50: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 eturn NULL;..}.
eb60: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 } else {..cer
eb70: 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 tfile = (char*)X
eb80: 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 509_get_default_
eb90: 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 cert_file();...i
eba0: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 f (SSL_CTX_use_c
ebb0: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 ertificate_file(
ebc0: 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 ctx, certfile, S
ebd0: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 SL_FILETYPE_PEM)
ebe0: 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 <= 0) {.#if 0..
ebf0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
ec00: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 ree(&ds);.. T
ec10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
ec20: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
ec30: 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 to use default c
ec40: 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 ertificate file
ec50: 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 ", certfile, ":
ec60: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f ",.... REASO
ec70: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
ec80: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
ec90: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
eca0: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 return NULL;.#
ecb0: 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a endif..}. }..
ecc0: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 /* set our p
ecd0: 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 rivate key */.
ece0: 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 if (load_priva
ecf0: 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b te_key) {..if (k
ed00: 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 eyfile == NULL &
ed10: 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b & key == NULL) {
ed20: 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 .. keyfile =
ed30: 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 certfile;..}...i
ed40: 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 f (keyfile != NU
ed50: 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 LL) {.. /* ge
ed60: 74 20 74 68 65 20 70 72 69 76 61 74 65 20 6b 65 t the private ke
ed70: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 y associated wit
ed80: 68 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61 h this certifica
ed90: 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b te */.. if (k
eda0: 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 eyfile == NULL)
edb0: 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 {...keyfile = ce
edc0: 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a rtfile;.. }..
edd0: 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 . if (SSL_CTX
ede0: 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f _use_PrivateKey_
edf0: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 file(ctx, F2N(ke
ee00: 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c yfile, &ds), SSL
ee10: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c _FILETYPE_PEM) <
ee20: 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 = 0) {...Tcl_DSt
ee30: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
ee40: 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 ./* flush the pa
ee50: 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d ssphrase which m
ee60: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 ight be left in
ee70: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 the result */...
ee80: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
ee90: 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f terp, NULL, TCL_
eea0: 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 STATIC);...Tcl_A
eeb0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
eec0: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
eed0: 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 et public key fi
eee0: 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 le ", keyfile, "
eef0: 20 22 2c 0a 09 09 09 20 20 20 20 20 20 20 20 20 ",....
ef00: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
ef10: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f *) NULL);...SSL_
ef20: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
ef30: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 .return NULL;..
ef40: 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 }.. Tcl_DS
ef50: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
ef60: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 ..} else if (key
ef70: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
ef80: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 if (SSL_CTX_use
ef90: 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 _PrivateKey_ASN1
efa0: 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 (EVP_PKEY_RSA, c
efb0: 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 tx, key,key_len)
efc0: 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 <= 0) {...Tcl_D
efd0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
efe0: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 .../* flush the
eff0: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 passphrase which
f000: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 might be left i
f010: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a n the result */.
f020: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 ..Tcl_SetResult(
f030: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 interp, NULL, TC
f040: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c L_STATIC);...Tcl
f050: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
f060: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
f070: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a set public key:
f080: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 ", REASON(), (c
f090: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
f0a0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
f0b0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c );...return NULL
f0c0: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 ;.. }..}../*
f0d0: 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 Now we know that
f0e0: 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 a key and cert
f0f0: 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 have been set ag
f100: 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 ainst.. * the SS
f110: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 L context */..if
f120: 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b (!SSL_CTX_check
f130: 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 _private_key(ctx
f140: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 )) {.. Tcl_Ap
f150: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
f160: 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 p, "private key
f170: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 does not match t
f180: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 70 he certificate p
f190: 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 ublic key",....
f1a0: 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (char *) NUL
f1b0: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
f1c0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
f1d0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d return NULL;..}
f1e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
f1f0: 65 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 et verification
f200: 43 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 CAs */. Tcl_D
f210: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b StringInit(&ds);
f220: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
f230: 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20 20 Init(&ds1);.
f240: 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 /* There is one
f250: 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 default director
f260: 79 2c 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 66 y, one default f
f270: 69 6c 65 2c 20 61 6e 64 20 6f 6e 65 20 64 65 66 ile, and one def
f280: 61 75 6c 74 20 73 74 6f 72 65 2e 0a 09 54 68 65 ault store...The
f290: 20 64 65 66 61 75 6c 74 20 43 41 20 63 65 72 74 default CA cert
f2a0: 69 66 69 63 61 74 65 73 20 64 69 72 65 63 74 6f ificates directo
f2b0: 72 79 20 28 61 6e 64 20 64 65 66 61 75 6c 74 20 ry (and default
f2c0: 73 74 6f 72 65 29 20 69 73 20 69 6e 20 74 68 65 store) is in the
f2d0: 20 4f 70 65 6e 53 53 4c 0a 09 63 65 72 74 73 20 OpenSSL..certs
f2e0: 64 69 72 65 63 74 6f 72 79 2e 20 49 74 20 63 61 directory. It ca
f2f0: 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 n be overridden
f300: 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f by the SSL_CERT_
f310: 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68 65 DIR env var. The
f320: 0a 09 64 65 66 61 75 6c 74 20 43 41 20 63 65 72 ..default CA cer
f330: 74 69 66 69 63 61 74 65 73 20 66 69 6c 65 20 69 tificates file i
f340: 73 20 63 61 6c 6c 65 64 20 63 65 72 74 2e 70 65 s called cert.pe
f350: 6d 20 69 6e 20 74 68 65 20 64 65 66 61 75 6c 74 m in the default
f360: 20 4f 70 65 6e 53 53 4c 0a 09 64 69 72 65 63 74 OpenSSL..direct
f370: 6f 72 79 2e 20 49 74 20 63 61 6e 20 62 65 20 6f ory. It can be o
f380: 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 verridden by the
f390: 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 SSL_CERT_FILE e
f3a0: 6e 76 20 76 61 72 2e 20 2a 2f 0a 09 2f 2a 20 69 nv var. */../* i
f3b0: 6e 74 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 nt SSL_CTX_set_d
f3c0: 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 64 69 efault_verify_di
f3d0: 72 28 53 53 4c 5f 43 54 58 20 2a 63 74 78 29 20 r(SSL_CTX *ctx)
f3e0: 61 6e 64 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f and int SSL_CTX_
f3f0: 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 set_default_veri
f400: 66 79 5f 66 69 6c 65 28 53 53 4c 5f 43 54 58 20 fy_file(SSL_CTX
f410: 2a 63 74 78 29 20 2a 2f 0a 20 20 20 20 69 66 20 *ctx) */. if
f420: 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 (!SSL_CTX_load_v
f430: 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 erify_locations(
f440: 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c ctx, F2N(CAfile,
f450: 20 26 64 73 29 2c 20 46 32 4e 28 43 41 64 69 72 &ds), F2N(CAdir
f460: 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 , &ds1)) ||..!SS
f470: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c L_CTX_set_defaul
f480: 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 t_verify_paths(c
f490: 74 78 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 tx)) {.#if 0..Tc
f4a0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
f4b0: 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 s);..Tcl_DString
f4c0: 46 72 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 Free(&ds1);../*
f4d0: 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 20 Don't currently
f4e0: 63 61 72 65 20 69 66 20 74 68 69 73 20 66 61 69 care if this fai
f4f0: 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e ls */..Tcl_Appen
f500: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
f510: 22 53 53 4c 20 64 65 66 61 75 6c 74 20 76 65 72 "SSL default ver
f520: 69 66 79 20 70 61 74 68 73 3a 20 22 2c 20 52 45 ify paths: ", RE
f530: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
f540: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
f550: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
f560: 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 urn NULL;.#endif
f570: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 68 . }.. /* h
f580: 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 ttps://sourcefor
f590: 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 ge.net/p/tls/bug
f5a0: 73 2f 35 37 2f 20 2a 2f 0a 20 20 20 20 2f 2a 20 s/57/ */. /*
f5b0: 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 XXX:TODO: Let th
f5c0: 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 e user supply va
f5d0: 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 lues here instea
f5e0: 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 d of something t
f5f0: 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 hat exists on th
f600: 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a e filesystem */.
f610: 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 21 if (CAfile !
f620: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 53 54 41 43 4b = NULL) {..STACK
f630: 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a _OF(X509_NAME) *
f640: 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f certNames = SSL_
f650: 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 load_client_CA_f
f660: 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 ile(F2N(CAfile,
f670: 26 64 73 29 29 3b 0a 09 69 66 20 28 63 65 72 74 &ds));..if (cert
f680: 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b Names != NULL) {
f690: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
f6a0: 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 t_client_CA_list
f6b0: 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 (ctx, certNames)
f6c0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
f6d0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
f6e0: 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 &ds);. Tcl_DS
f6f0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b tringFree(&ds1);
f700: 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b . return ctx;
f710: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
f720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
f760: 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 . * StatusObjCmd
f770: 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 -- return certi
f780: 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 ficate for conne
f790: 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a cted peer.. *. *
f7a0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
f7b0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
f7c0: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
f7d0: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
f7e0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
f7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
f830: 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f atic int.StatusO
f840: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
f850: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
f860: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
f870: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
f880: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
f890: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
f8a0: 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 tatePtr;. X50
f8b0: 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 9 *peer;. Tcl
f8c0: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 _Obj *objPtr;.
f8d0: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
f8e0: 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 an;. char *ch
f8f0: 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 annelName, *ciph
f900: 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 ers;. int mod
f910: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 e;. const uns
f920: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 igned char *prot
f930: 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 o;. unsigned
f940: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 int len;. int
f950: 20 6e 69 64 2c 20 72 65 73 3b 0a 0a 20 20 20 20 nid, res;..
f960: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
f970: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
f980: 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 < 2 || objc > 3
f990: 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 || (objc == 3 &
f9a0: 26 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 & !strcmp(Tcl_Ge
f9b0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 tString(objv[1])
f9c0: 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a , "-local"))) {.
f9d0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
f9e0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
f9f0: 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 v, "?-local? cha
fa00: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 nnel");..return
fa10: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
fa20: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 .. /* Get cha
fa30: 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 nnel Id */. c
fa40: 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c hannelName = Tcl
fa50: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
fa60: 6a 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 j(objv[(objc ==
fa70: 32 20 3f 20 31 20 3a 20 32 29 5d 2c 20 28 54 63 2 ? 1 : 2)], (Tc
fa80: 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 3b l_Size *) NULL);
fa90: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
faa0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
fab0: 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 p, channelName,
fac0: 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 &mode);. if (
fad0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
fae0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
faf0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
fb00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
fb10: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
fb20: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
fb30: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
fb40: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
fb50: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
fb60: 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 ;. if (Tcl_Ge
fb70: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 tChannelType(cha
fb80: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 n) != Tls_Channe
fb90: 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f lType()) {..Tcl_
fba0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
fbb0: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
fbc0: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
fbd0: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
fbe0: 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c ..."\": not a TL
fbf0: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c S channel", NULL
fc00: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 );..Tcl_SetError
fc10: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
fc20: 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43 S", "STATUS", "C
fc30: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 HANNEL", "INVALI
fc40: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
fc50: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
fc60: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
fc70: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
fc80: 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 te *) Tcl_GetCha
fc90: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
fca0: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 (chan);.. /*
fcb0: 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 Get certificate
fcc0: 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66 for peer or self
fcd0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 */. if (objc
fce0: 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d == 2) {..peer =
fcf0: 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 SSL_get_peer_ce
fd00: 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 rtificate(stateP
fd10: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 tr->ssl);. }
fd20: 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 else {..peer = S
fd30: 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 SL_get_certifica
fd40: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
fd50: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 );. }. /*
fd60: 47 65 74 20 58 35 30 39 20 63 65 72 74 69 66 69 Get X509 certifi
fd70: 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 cate info */.
fd80: 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 if (peer) {..ob
fd90: 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 jPtr = Tls_NewX5
fda0: 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 09Obj(interp, pe
fdb0: 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d er);..if (objc =
fdc0: 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30 39 = 2) {.. X509
fdd0: 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20 20 _free(peer);..
fde0: 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 peer = NULL;..
fdf0: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 }. } else {..
fe00: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
fe10: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
fe20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
fe30: 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 Peer name */.
fe40: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
fe50: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65 erp, objPtr, "pe
fe60: 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 ername", SSL_get
fe70: 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65 0_peername(state
fe80: 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a Ptr->ssl), -1);.
fe90: 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 LAPPEND_INT(
fea0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
feb0: 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 74 "sbits", SSL_get
fec0: 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 _cipher_bits(sta
fed0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c tePtr->ssl, NULL
fee0: 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 ));.. ciphers
fef0: 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 = (char*)SSL_ge
ff00: 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 t_cipher(statePt
ff10: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50 r->ssl);. LAP
ff20: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
ff30: 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 objPtr, "cipher
ff40: 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29 3b ", ciphers, -1);
ff50: 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 .. /* Verify
ff60: 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66 69 the X509 certifi
ff70: 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 cate presented b
ff80: 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 y the peer */.
ff90: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
ffa0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 terp, objPtr, "v
ffb0: 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 58 erifyResult",..X
ffc0: 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 509_verify_cert_
ffd0: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c error_string(SSL
ffe0: 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 _get_verify_resu
fff0: 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c lt(statePtr->ssl
10000 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a )), -1);.. /*
10010 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a Verify mode */.
10020 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 mode = SSL_g
10030 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 et_verify_mode(s
10040 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
10050 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20 53 if (mode && S
10060 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 SL_VERIFY_NONE)
10070 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 {..LAPPEND_STR(i
10080 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10090 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f verifyMode", "no
100a0 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 ne", -1);. }
100b0 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 else {..Tcl_Obj
100c0 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 *listObjPtr = Tc
100d0 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
100e0 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 NULL);..if (mode
100f0 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 && SSL_VERIFY_P
10100 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f EER) {.. Tcl_
10110 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10120 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
10130 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 tObjPtr, Tcl_New
10140 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 StringObj("peer"
10150 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
10160 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
10170 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
10180 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 ER_CERT) {..
10190 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
101a0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
101b0 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c listObjPtr, Tcl
101c0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 _NewStringObj("f
101d0 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 63 ail if no peer c
101e0 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 ert", -1));..}..
101f0 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f if (mode && SSL_
10200 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e VERIFY_CLIENT_ON
10210 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c CE) {.. Tcl_L
10220 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10230 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 ent(interp, list
10240 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 ObjPtr, Tcl_NewS
10250 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 tringObj("client
10260 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d once", -1));..}
10270 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 ..if (mode && SS
10280 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 L_VERIFY_POST_HA
10290 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 NDSHAKE) {..
102a0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
102b0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
102c0 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c listObjPtr, Tcl
102d0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 _NewStringObj("p
102e0 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 ost handshake",
102f0 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e -1));..}..LAPPEN
10300 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 D_OBJ(interp, ob
10310 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 jPtr, "verifyMod
10320 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 0a e", listObjPtr).
10330 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 }.. /* Ve
10340 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68 20 rify mode depth
10350 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 */. LAPPEND_I
10360 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
10370 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 68 22 r, "verifyDepth"
10380 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 , SSL_get_verify
10390 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 72 2d _depth(statePtr-
103a0 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 >ssl));.. /*
103b0 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 Report the selec
103c0 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 ted protocol as
103d0 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 a result of the
103e0 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 negotiation */.
103f0 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e SSL_get0_alpn
10400 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 _selected(stateP
10410 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c tr->ssl, &proto,
10420 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 &len);. LAPP
10430 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
10440 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 objPtr, "alpn",
10450 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 (char *)proto, (
10460 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b 0a Tcl_Size) len);.
10470 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
10480 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10490 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f "protocol", SSL_
104a0 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 get_version(stat
104b0 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b ePtr->ssl), -1);
104c0 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 .. /* Valid f
104d0 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 or non-RSA signa
104e0 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 ture and TLS 1.3
104f0 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 */. if (objc
10500 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 == 2) {..res =
10510 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 SSL_get_peer_sig
10520 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 nature_nid(state
10530 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b Ptr->ssl, &nid);
10540 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 . } else {..r
10550 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 es = SSL_get_sig
10560 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 nature_nid(state
10570 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b Ptr->ssl, &nid);
10580 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 . }. if (!
10590 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a res) {nid = 0;}.
105a0 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
105b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
105c0 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41 6c "signatureHashAl
105d0 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 gorithm", OBJ_ni
105e0 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a d2ln(nid), -1);.
105f0 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d . if (objc ==
10600 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 2) {..res = SSL
10610 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 _get_peer_signat
10620 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 ure_type_nid(sta
10630 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 tePtr->ssl, &nid
10640 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
10650 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 .res = SSL_get_s
10660 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 ignature_type_ni
10670 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c d(statePtr->ssl,
10680 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 &nid);. }.
10690 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 if (!res) {nid
106a0 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 = 0;}. LAPPE
106b0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
106c0 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 bjPtr, "signatur
106d0 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 eType", OBJ_nid2
106e0 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 ln(nid), -1);..
106f0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
10700 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ult(interp, objP
10710 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
10720 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 TCL_OK;..clientD
10730 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 ata = clientData
10740 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
10750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
10790 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 *. * ConnectionI
107a0 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 nfoObjCmd -- ret
107b0 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 urn connection i
107c0 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c nfo from OpenSSL
107d0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
107e0 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f . *.A list of co
107f0 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 nnection info.
10800 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
10810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10840 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 -------. */..sta
10850 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 tic int Connecti
10860 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 onInfoObjCmd(Cli
10870 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
10880 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
10890 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
108a0 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
108b0 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
108c0 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
108d0 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c ../* The channel
108e0 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f to set a mode o
108f0 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a n */. State *
10900 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c statePtr;../* cl
10910 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 ient state for s
10920 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 sl socket */.
10930 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 Tcl_Obj *objPtr
10940 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 , *listPtr;.
10950 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a const SSL *ssl;.
10960 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 const SSL_CI
10970 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 PHER *cipher;.
10980 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 const SSL_SESS
10990 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 ION *session;.
109a0 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a const EVP_MD *
109b0 6d 64 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a md;.. if (obj
109c0 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
109d0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
109e0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
109f0 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
10a00 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
10a10 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
10a20 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
10a30 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
10a40 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
10a50 31 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 1], (Tcl_Size *)
10a60 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 NULL), NULL);.
10a70 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 if (chan == (T
10a80 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
10a90 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f ) {..return(TCL_
10aa0 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 ERROR);. }..
10ab0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
10ac0 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
10ad0 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
10ae0 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 l */. chan =
10af0 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
10b00 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 l(chan);. if
10b10 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
10b20 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 ype(chan) != Tls
10b30 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 _ChannelType())
10b40 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
10b50 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
10b60 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
10b70 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
10b80 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 (chan),.. "\"
10b90 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
10ba0 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 nel", NULL);..Tc
10bb0 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
10bc0 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 nterp, "TLS", "C
10bd0 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 ONNECTION", "CHA
10be0 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 NNEL", "INVALID"
10bf0 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
10c00 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 ;..return(TCL_ER
10c10 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ROR);. }..
10c20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 objPtr = Tcl_Ne
10c30 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
10c40 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 );.. /* Conne
10c50 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 ction info */.
10c60 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 statePtr = (St
10c70 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 ate *)Tcl_GetCha
10c80 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
10c90 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 (chan);. ssl
10ca0 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b = statePtr->ssl;
10cb0 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 . if (ssl !=
10cc0 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e NULL) {../* conn
10cd0 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a ection state */.
10ce0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
10cf0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 erp, objPtr, "st
10d00 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f ate", SSL_state_
10d10 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 string_long(ssl)
10d20 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 , -1);.../* Get
10d30 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 65 SNI requested se
10d40 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 rver name */..LA
10d50 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
10d60 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65 , objPtr, "serve
10d70 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f rname", SSL_get_
10d80 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 servername(ssl,
10d90 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f TLSEXT_NAMETYPE_
10da0 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b host_name), -1);
10db0 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 .../* Get protoc
10dc0 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 ol */..LAPPEND_S
10dd0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
10de0 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 r, "protocol", S
10df0 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 SL_get_version(s
10e00 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 sl), -1);.../* R
10e10 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c enegotiation all
10e20 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 owed */..LAPPEND
10e30 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
10e40 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 jPtr, "renegotia
10e50 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 tion_allowed", S
10e60 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 SL_get_secure_re
10e70 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 negotiation_supp
10e80 6f 72 74 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 ort(ssl));.../*
10e90 47 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 Get security lev
10ea0 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 el */..LAPPEND_I
10eb0 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
10ec0 72 2c 20 22 73 65 63 75 72 69 74 79 6c 65 76 65 r, "securityleve
10ed0 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 l", SSL_get_secu
10ee0 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 rity_level(ssl))
10ef0 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 ;.../* Session i
10f00 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f nfo */..LAPPEND_
10f10 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
10f20 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 65 Ptr, "session_re
10f30 75 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 69 used", SSL_sessi
10f40 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 3b on_reused(ssl));
10f50 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 .../* Is server
10f60 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 info */..LAPPEND
10f70 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
10f80 6a 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65 72 jPtr, "is_server
10f90 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 ", SSL_is_server
10fa0 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 (ssl));.../* Is
10fb0 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 DTLS */..LAPPEND
10fc0 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
10fd0 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 2c jPtr, "is_dtls",
10fe0 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 6c SSL_is_dtls(ssl
10ff0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ));. }.. /
11000 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f * Cipher info */
11010 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 . cipher = SS
11020 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 L_get_current_ci
11030 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 pher(ssl);. i
11040 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c f (cipher != NUL
11050 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 L) {..char buf[B
11060 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 UFSIZ] = {0};..i
11070 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 nt bits, alg_bit
11080 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e s;.../* Cipher n
11090 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ame */..LAPPEND_
110a0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
110b0 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53 53 tr, "cipher", SS
110c0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d L_CIPHER_get_nam
110d0 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a e(cipher), -1);.
110e0 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66 ../* RFC name of
110f0 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 cipher */..LAPP
11100 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11110 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 72 objPtr, "standar
11120 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50 d_name", SSL_CIP
11130 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d HER_standard_nam
11140 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a e(cipher), -1);.
11150 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d ../* OpenSSL nam
11160 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 e of cipher */..
11170 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11180 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65 rp, objPtr, "ope
11190 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e nssl_name", OPEN
111a0 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28 SSL_cipher_name(
111b0 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 SSL_CIPHER_stand
111c0 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 ard_name(cipher)
111d0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d ), -1);.../* num
111e0 62 65 72 20 6f 66 20 73 65 63 72 65 74 20 62 69 ber of secret bi
111f0 74 73 20 75 73 65 64 20 66 6f 72 20 63 69 70 68 ts used for ciph
11200 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53 er */..bits = SS
11210 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 L_CIPHER_get_bit
11220 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 s(cipher, &alg_b
11230 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 its);..LAPPEND_I
11240 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
11250 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73 22 r, "secret_bits"
11260 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e , bits);..LAPPEN
11270 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
11280 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d jPtr, "algorithm
11290 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 73 _bits", alg_bits
112a0 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 );../* alg_bits
112b0 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 is actual key se
112c0 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 cret bits. If us
112d0 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 e bits and secre
112e0 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 t (algorithm) bi
112f0 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74 ts differ,.. t
11300 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 he rest of the b
11310 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 its are fixed, i
11320 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 .e. for limited
11330 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 export ciphers (
11340 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 bits < 56) */...
11350 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68 69 /* Indicates whi
11360 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f ch SSL/TLS proto
11370 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 73 col version firs
11380 74 20 64 65 66 69 6e 65 64 20 74 68 65 20 63 69 t defined the ci
11390 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 pher */..LAPPEND
113a0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
113b0 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f Ptr, "min_versio
113c0 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 n", SSL_CIPHER_g
113d0 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 et_version(ciphe
113e0 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 r), -1);.../* Ci
113f0 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 pher NID */..LAP
11400 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11410 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 objPtr, "cipher
11420 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 NID", (char *)OB
11430 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 J_nid2ln(SSL_CIP
11440 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e HER_get_cipher_n
11450 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 id(cipher)), -1)
11460 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
11470 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11480 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68 61 digestNID", (cha
11490 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 r *)OBJ_nid2ln(S
114a0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 69 SL_CIPHER_get_di
114b0 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72 29 gest_nid(cipher)
114c0 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 ), -1);..LAPPEND
114d0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
114e0 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 Ptr, "keyExchang
114f0 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f eNID", (char *)O
11500 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 BJ_nid2ln(SSL_CI
11510 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 PHER_get_kx_nid(
11520 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 cipher)), -1);..
11530 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11540 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 rp, objPtr, "aut
11550 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c henticationNID",
11560 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 (char *)OBJ_nid
11570 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 2ln(SSL_CIPHER_g
11580 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 68 et_auth_nid(ciph
11590 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 er)), -1);.../*
115a0 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 69 message authenti
115b0 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 cation code - Ci
115c0 70 68 65 72 20 69 73 20 41 45 41 44 20 28 65 2e pher is AEAD (e.
115d0 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68 61 g. GCM or ChaCha
115e0 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 20/Poly1305) or
115f0 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 not */../* Authe
11600 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79 70 74 nticated Encrypt
11610 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69 61 ion with associa
11620 74 65 64 20 64 61 74 61 20 28 41 45 41 44 29 20 ted data (AEAD)
11630 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e check */..LAPPEN
11640 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
11650 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 bjPtr, "cipher_i
11660 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 s_aead", SSL_CIP
11670 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70 68 HER_is_aead(ciph
11680 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 73 er));.../* Diges
11690 74 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 68 t used during th
116a0 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68 e SSL/TLS handsh
116b0 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 74 ake when using t
116c0 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d he cipher. */..m
116d0 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 d = SSL_CIPHER_g
116e0 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 et_handshake_dig
116f0 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c 41 est(cipher);..LA
11700 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11710 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 73 , objPtr, "hands
11720 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 63 hake_digest", (c
11730 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d har *)EVP_MD_nam
11740 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a e(md), -1);.../*
11750 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 Get OpenSSL-spe
11760 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 cific ID, not IA
11770 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e NA ID */..LAPPEN
11780 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
11790 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 64 jPtr, "cipher_id
117a0 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 ", (int) SSL_CIP
117b0 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 HER_get_id(ciphe
117c0 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 r));.../* Two-by
117d0 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 68 te ID used in th
117e0 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f e TLS protocol o
117f0 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 68 f the given ciph
11800 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 er */..LAPPEND_I
11810 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
11820 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 r, "protocol_id"
11830 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 , (int) SSL_CIPH
11840 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f ER_get_protocol_
11850 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f id(cipher));.../
11860 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 69 * Textual descri
11870 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 ption of the cip
11880 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f her */..if (SSL_
11890 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 CIPHER_descripti
118a0 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 on(cipher, buf,
118b0 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 sizeof(buf)) !=
118c0 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50 NULL) {.. LAP
118d0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
118e0 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72 69 objPtr, "descri
118f0 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29 ption", buf, -1)
11900 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
11910 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 /* Session info
11920 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d */. session =
11930 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e SSL_get_session
11940 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 (ssl);. if (s
11950 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 ession != NULL)
11960 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 {..const unsigne
11970 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a d char *ticket;.
11980 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 .size_t len2;..u
11990 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e nsigned int ulen
119a0 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 ;..const unsigne
119b0 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f d char *session_
119c0 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 63 68 61 id, *proto;..cha
119d0 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 r buffer[SSL_MAX
119e0 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 _MASTER_KEY_LENG
119f0 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 TH];.../* Report
11a00 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 the selected pr
11a10 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 otocol as a resu
11a20 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e lt of the ALPN n
11a30 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 egotiation */..S
11a40 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f SL_SESSION_get0_
11a50 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 alpn_selected(se
11a60 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 ssion, &proto, &
11a70 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f len2);..LAPPEND_
11a80 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11a90 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 tr, "alpn", (cha
11aa0 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c r *) proto, (Tcl
11ab0 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 _Size) len2);...
11ac0 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 /* Report the se
11ad0 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
11ae0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 as a result of t
11af0 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 he NPN negotiati
11b00 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 on */.#ifdef USE
11b10 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e _NPN..SSL_get0_n
11b20 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 ext_proto_negoti
11b30 61 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f ated(ssl, &proto
11b40 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 , &ulen);..LAPPE
11b50 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11b60 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 bjPtr, "npn", (c
11b70 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 har *) proto, (T
11b80 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a cl_Size) ulen);.
11b90 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 #endif.../* Resu
11ba0 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f mable session */
11bb0 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
11bc0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11bd0 72 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f resumable", SSL_
11be0 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d SESSION_is_resum
11bf0 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a able(session));.
11c00 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 ../* Session sta
11c10 72 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 rt time (seconds
11c20 20 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f since epoch) */
11c30 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 ..LAPPEND_LONG(i
11c40 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11c50 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c start_time", SSL
11c60 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d _SESSION_get_tim
11c70 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f e(session));.../
11c80 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 * Timeout value
11c90 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 - SSL_CTX_get_ti
11ca0 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 meout (in second
11cb0 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c s) */..LAPPEND_L
11cc0 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ONG(interp, objP
11cd0 74 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 tr, "timeout", S
11ce0 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 SL_SESSION_get_t
11cf0 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 imeout(session))
11d00 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 ;.../* Session i
11d10 64 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 d - TLSv1.2 and
11d20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 below only */..s
11d30 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f ession_id = SSL_
11d40 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 SESSION_get_id(s
11d50 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a ession, &ulen);.
11d60 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
11d70 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11d80 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 "session_id", se
11d90 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 ssion_id, (Tcl_S
11da0 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a ize) ulen);.../*
11db0 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 Session context
11dc0 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 */..session_id
11dd0 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 = SSL_SESSION_ge
11de0 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 t0_id_context(se
11df0 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 ssion, &ulen);..
11e00 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 LAPPEND_BARRAY(i
11e10 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11e20 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 session_context"
11e30 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 , session_id, (T
11e40 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a cl_Size) ulen);.
11e50 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 ../* Session tic
11e60 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c ket - client onl
11e70 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f y */..SSL_SESSIO
11e80 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 N_get0_ticket(se
11e90 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 ssion, &ticket,
11ea0 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 &len2);..LAPPEND
11eb0 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 _BARRAY(interp,
11ec0 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e objPtr, "session
11ed0 5f 74 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 _ticket", ticket
11ee0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e , (Tcl_Size) len
11ef0 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 2);.../* Session
11f00 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 ticket lifetime
11f10 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 hint (in second
11f20 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c s) */..LAPPEND_L
11f30 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ONG(interp, objP
11f40 74 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 tr, "lifetime",
11f50 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
11f60 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f ticket_lifetime_
11f70 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a hint(session));.
11f80 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20 ../* Ticket app
11f90 64 61 74 61 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 data */..SSL_SES
11fa0 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 SION_get0_ticket
11fb0 5f 61 70 70 64 61 74 61 28 73 65 73 73 69 6f 6e _appdata(session
11fc0 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 , &ticket, &len2
11fd0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 );..LAPPEND_BARR
11fe0 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 AY(interp, objPt
11ff0 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 r, "ticket_app_d
12000 61 74 61 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 ata", ticket, (T
12010 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a cl_Size) len2);.
12020 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 ../* Get master
12030 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 key */..len2 = S
12040 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d SL_SESSION_get_m
12050 61 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f aster_key(sessio
12060 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d n, buffer, SSL_M
12070 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 AX_MASTER_KEY_LE
12080 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f NGTH);..LAPPEND_
12090 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f BARRAY(interp, o
120a0 62 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b bjPtr, "master_k
120b0 65 79 22 2c 20 62 75 66 66 65 72 2c 20 28 54 63 ey", buffer, (Tc
120c0 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a l_Size) len2);..
120d0 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 ./* Compression
120e0 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 id */..unsigned
120f0 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 int id = SSL_SES
12100 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 SION_get_compres
12110 73 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 s_id(session);..
12120 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
12130 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d rp, objPtr, "com
12140 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 pression_id", id
12150 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a == 1 ? "zlib" :
12160 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 "none", -1);.
12170 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 }.. /* Comp
12180 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a ression info */.
12190 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e if (ssl != N
121a0 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 ULL) {.#ifdef HA
121b0 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 VE_SSL_COMPRESSI
121c0 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d ON..const COMP_M
121d0 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 ETHOD *comp, *ex
121e0 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f pn;..comp = SSL_
121f0 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 get_current_comp
12200 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 ression(ssl);..e
12210 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 xpn = SSL_get_cu
12220 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 rrent_expansion(
12230 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f ssl);...LAPPEND_
12240 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12250 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e tr, "compression
12260 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f ", comp ? SSL_CO
12270 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 MP_get_name(comp
12280 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b ) : "none", -1);
12290 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
122a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 terp, objPtr, "e
122b0 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 xpansion", expn
122c0 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e ? SSL_COMP_get_n
122d0 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e ame(expn) : "non
122e0 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 e", -1);.#else..
122f0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
12300 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d rp, objPtr, "com
12310 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 pression", "none
12320 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 ", -1);..LAPPEND
12330 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12340 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 Ptr, "expansion"
12350 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 , "none", -1);.#
12360 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 endif. }..
12370 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 /* Server info
12380 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d */. {..long m
12390 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 ode = SSL_CTX_ge
123a0 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f t_session_cache_
123b0 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 mode(statePtr->c
123c0 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b tx);..char *msg;
123d0 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 ...if (mode & SS
123e0 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 L_SESS_CACHE_OFF
123f0 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 ) {.. msg = "
12400 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 off";..} else if
12410 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 (mode & SSL_SES
12420 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 S_CACHE_CLIENT)
12430 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c {.. msg = "cl
12440 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 ient";..} else i
12450 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 f (mode & SSL_SE
12460 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 SS_CACHE_SERVER)
12470 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73 {.. msg = "s
12480 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 erver";..} else
12490 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 if (mode & SSL_S
124a0 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 ESS_CACHE_BOTH)
124b0 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f {.. msg = "bo
124c0 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 th";..} else {..
124d0 20 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f msg = "unkno
124e0 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 wn";..}..LAPPEND
124f0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12500 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 Ptr, "session_ca
12510 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 che_mode", msg,
12520 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 -1);. }..
12530 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 /* CA List */.
12540 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 /* IF not a se
12550 72 76 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53 rver, same as SS
12560 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c L_get0_peer_CA_l
12570 69 73 74 2e 20 49 66 20 73 65 72 76 65 72 20 73 ist. If server s
12580 61 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 ame as SSL_CTX_g
12590 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 et_client_CA_lis
125a0 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 t */. listPtr
125b0 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
125c0 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 j(0, NULL);.
125d0 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 STACK_OF(X509_NA
125e0 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 ME) *ca_list;.
125f0 20 20 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d if ((ca_list =
12600 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f SSL_get_client_
12610 43 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d CA_list(ssl)) !=
12620 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 NULL) {..char b
12630 75 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 uffer[BUFSIZ];..
12640 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 for (int i = 0;
12650 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 i < sk_X509_NAME
12660 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 _num(ca_list); i
12670 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f ++) {.. X509_
12680 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f NAME *name = sk_
12690 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 X509_NAME_value(
126a0 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 ca_list, i);..
126b0 20 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 if (name) {...
126c0 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e X509_NAME_onelin
126d0 65 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 e(name, buffer,
126e0 42 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c BUFSIZ);...Tcl_L
126f0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
12700 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 ent(interp, list
12710 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
12720 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 ngObj(buffer, -1
12730 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 ));.. }..}.
12740 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f }. LAPPEND_
12750 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OBJ(interp, objP
12760 74 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 tr, "caList", li
12770 73 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 stPtr);. LAPP
12780 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 END_INT(interp,
12790 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 43 objPtr, "caListC
127a0 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e ount", sk_X509_N
127b0 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 AME_num(ca_list)
127c0 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f );.. Tcl_SetO
127d0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
127e0 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 objPtr);. re
127f0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c turn TCL_OK;..cl
12800 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
12810 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a tData;.}.../*. *
12820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12860 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f ---. *. * Versio
12870 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 nObjCmd -- retur
12880 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 n version string
12890 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 from OpenSSL..
128a0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
128b0 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
128c0 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
128d0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
128e0 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
128f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
12930 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 /.static int.Ver
12940 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e sionObjCmd(Clien
12950 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
12960 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
12970 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
12980 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
12990 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
129a0 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 _Obj *objPtr;..
129b0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
129c0 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 ed");.. objPt
129d0 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e r = Tcl_NewStrin
129e0 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 gObj(OPENSSL_VER
129f0 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a SION_TEXT, -1);.
12a00 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
12a10 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
12a20 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 Ptr);.. retur
12a30 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e n TCL_OK;..clien
12a40 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 tData = clientDa
12a50 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 ta;..objc = objc
12a60 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a ;..objv = objv;.
12a70 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d ----------------
12ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
12ac0 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d * MiscObjCmd --
12ad0 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 misc commands.
12ae0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
12af0 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
12b00 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
12b10 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
12b20 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
12b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
12b70 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 /.static int.Mis
12b80 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 cObjCmd(ClientDa
12b90 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
12ba0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
12bb0 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
12bc0 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
12bd0 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 []) {. static
12be0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d const char *com
12bf0 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 mands [] = { "re
12c00 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55 q", "strreq", NU
12c10 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 LL };. enum c
12c20 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 ommand { C_REQ,
12c30 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d C_STRREQ, C_DUMM
12c40 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a Y };. Tcl_Siz
12c50 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69 e cmd;. int i
12c60 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20 62 sStr;. char b
12c70 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 uffer[16384];..
12c80 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
12c90 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
12ca0 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f bjc < 2) {..Tcl_
12cb0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
12cc0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 erp, 1, objv, "s
12cd0 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f ubcommand ?args?
12ce0 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
12cf0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
12d00 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 if (Tcl_GetInde
12d10 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c xFromObj(interp,
12d20 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e objv[1], comman
12d30 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 ds, "command", 0
12d40 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f , &cmd) != TCL_O
12d50 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
12d60 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
12d70 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 ERR_clear_err
12d80 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 or();.. isStr
12d90 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 = (cmd == C_STR
12da0 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 REQ);. switch
12db0 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 ((enum command)
12dc0 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f cmd) {..case C_
12dd0 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 REQ:..case C_STR
12de0 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f REQ: {.. EVP_
12df0 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b PKEY *pkey=NULL;
12e00 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 .. X509 *cert
12e10 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 =NULL;.. X509
12e20 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c _NAME *name=NULL
12e30 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a ;.. Tcl_Obj *
12e40 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63 6c *listv;.. Tcl
12e50 5f 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20 _Size listc;..
12e60 20 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42 int i;... B
12e70 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 IO *out=NULL;...
12e80 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 char *k_C=""
12e90 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 ,*k_ST="",*k_L="
12ea0 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d ",*k_O="",*k_OU=
12eb0 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 "",*k_CN="",*k_E
12ec0 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 mail="";.. ch
12ed0 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f ar *keyout,*pemo
12ee0 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e ut,*str;.. in
12ef0 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c t keysize,serial
12f00 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 =0,days=365;..#i
12f10 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
12f20 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
12f30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 00000L.. BIGN
12f40 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a UM *bne = NULL;.
12f50 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 . RSA *rsa =
12f60 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 NULL;.#else..
12f70 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 EVP_PKEY_CTX *c
12f80 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 tx = NULL;.#endi
12f90 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a f... if ((obj
12fa0 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 c<5) || (objc>6)
12fb0 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e ) {...Tcl_WrongN
12fc0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 umArgs(interp, 2
12fd0 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 , objv, "keysize
12fe0 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c keyfile certfil
12ff0 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 e ?info?");...re
13000 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
13010 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 . }... if
13020 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f (Tcl_GetIntFromO
13030 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
13040 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 2], &keysize) !=
13050 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 TCL_OK) {...ret
13060 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
13070 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 }.. keyou
13080 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 t=Tcl_GetString(
13090 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 objv[3]);.. p
130a0 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 emout=Tcl_GetStr
130b0 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 ing(objv[4]);..
130c0 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a if (isStr) {.
130d0 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 ..Tcl_SetVar(int
130e0 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 erp,keyout,"",0)
130f0 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 ;...Tcl_SetVar(i
13100 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c nterp,pemout,"",
13110 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 0);.. }...
13120 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a if (objc>=6) {.
13130 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 ..if (Tcl_ListOb
13140 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 jGetElements(int
13150 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c erp, objv[5], &l
13160 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d istc, &listv) !=
13170 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 TCL_OK) {...
13180 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
13190 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c R;...}....if ((l
131a0 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a istc%2) != 0) {.
131b0 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 .. Tcl_SetRes
131c0 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f ult(interp,"Info
131d0 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 rmation list mus
131e0 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 t have even numb
131f0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 er of arguments"
13200 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 ,NULL);... re
13210 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
13220 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 ..}...for (i=0;
13230 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b i<listc; i+=2) {
13240 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 ... str=Tcl_G
13250 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
13260 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 ]);... if (st
13270 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 rcmp(str,"days")
13280 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 ==0) {....if (Tc
13290 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 l_GetIntFromObj(
132a0 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 interp,listv[i+1
132b0 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b ],&days)!=TCL_OK
132c0 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 ).... return
132d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 TCL_ERROR;...
132e0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
132f0 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 mp(str,"serial")
13300 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 ==0) {....if (Tc
13310 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 l_GetIntFromObj(
13320 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 interp,listv[i+1
13330 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f ],&serial)!=TCL_
13340 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 OK).... retur
13350 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 n TCL_ERROR;...
13360 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
13370 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 rcmp(str,"C")==0
13380 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 ) {....k_C=Tcl_G
13390 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
133a0 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
133b0 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
133c0 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 r,"ST")==0) {...
133d0 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 .k_ST=Tcl_GetStr
133e0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
133f0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
13400 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 (strcmp(str,"L"
13410 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 )==0) {....k_L=T
13420 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
13430 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
13440 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
13450 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b p(str,"O")==0) {
13460 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 ....k_O=Tcl_GetS
13470 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
13480 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
13490 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
134a0 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f OU")==0) {....k_
134b0 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 OU=Tcl_GetString
134c0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
134d0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
134e0 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d trcmp(str,"CN")=
134f0 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 =0) {....k_CN=Tc
13500 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
13510 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
13520 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
13530 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 (str,"Email")==0
13540 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 ) {....k_Email=T
13550 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
13560 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
13570 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f } else {....Tcl_
13580 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
13590 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 ,"Unknown parame
135a0 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 ter",NULL);....r
135b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
135c0 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 ... }...}..
135d0 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c }..#if OPENSSL
135e0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
135f0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 < 0x30000000L..
13600 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 bne = BN_new(
13610 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 );.. rsa = RS
13620 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b A_new();.. pk
13630 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 ey = EVP_PKEY_ne
13640 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e w();.. if (bn
13650 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 e == NULL || rsa
13660 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 == NULL || pkey
13670 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f == NULL || !BN_
13680 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 set_word(bne,RSA
13690 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 _F4) ||...!RSA_g
136a0 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 enerate_key_ex(r
136b0 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 sa, keysize, bne
136c0 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f , NULL) || !EVP_
136d0 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 PKEY_assign_RSA(
136e0 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 pkey, rsa)) {...
136f0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
13700 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 ey);.../* RSA_fr
13710 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 ee(rsa); freed b
13720 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 y EVP_PKEY_free
13730 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 */...BN_free(bne
13740 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b );.#else.. pk
13750 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e ey = EVP_RSA_gen
13760 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 ((unsigned int)
13770 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 keysize);.. c
13780 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 tx = EVP_PKEY_CT
13790 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 X_new(pkey,NULL)
137a0 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 ;.. if (pkey
137b0 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d == NULL || ctx =
137c0 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 = NULL || !EVP_P
137d0 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 KEY_keygen_init(
137e0 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 ctx) ||...!EVP_P
137f0 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f KEY_CTX_set_rsa_
13800 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c keygen_bits(ctx,
13810 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 keysize) || !EV
13820 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 P_PKEY_keygen(ct
13830 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 x, &pkey)) {...E
13840 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 VP_PKEY_free(pke
13850 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 y);...EVP_PKEY_C
13860 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 TX_free(ctx);.#e
13870 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 ndif...Tcl_SetRe
13880 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 sult(interp,"Err
13890 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 or generating pr
138a0 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 ivate key",NULL)
138b0 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ;...return TCL_E
138c0 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 RROR;.. } els
138d0 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 e {...if (isStr)
138e0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
138f0 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 _new(BIO_s_mem()
13900 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 );... PEM_wri
13910 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 te_bio_PrivateKe
13920 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c y(out,pkey,NULL,
13930 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c NULL,0,NULL,NULL
13940 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 );... i=BIO_r
13950 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 ead(out,buffer,s
13960 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 izeof(buffer)-1)
13970 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 ;... i=(i<0)
13980 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 ? 0 : i;... b
13990 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 uffer[i]='\0';..
139a0 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 . Tcl_SetVar(
139b0 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 interp,keyout,bu
139c0 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 ffer,0);... B
139d0 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 IO_flush(out);..
139e0 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 . BIO_free(ou
139f0 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 t);...} else {..
13a00 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
13a10 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a (BIO_s_file());.
13a20 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f .. BIO_write_
13a30 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 filename(out,key
13a40 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f out);... PEM_
13a50 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 write_bio_Privat
13a60 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 eKey(out,pkey,NU
13a70 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e LL,NULL,0,NULL,N
13a80 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 ULL);... /* P
13a90 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 EM_write_bio_RSA
13aa0 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 PrivateKey(out,
13ab0 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c rsa, NULL, NULL,
13ac0 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0, NULL, NULL);
13ad0 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 */... BIO_fr
13ae0 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 ee_all(out);.. .
13af0 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 }....if ((cert=X
13b00 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 509_new())==NULL
13b10 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 ) {... Tcl_Se
13b20 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
13b30 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 Error generating
13b40 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71 certificate req
13b50 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 uest",NULL);...
13b60 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 EVP_PKEY_free
13b70 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e (pkey);.#if OPEN
13b80 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
13b90 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
13ba0 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 ... BN_free(b
13bb0 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 ne);.#endif...
13bc0 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 return(TCL_ERR
13bd0 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 OR);...}....X509
13be0 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 _set_version(cer
13bf0 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 t,2);...ASN1_INT
13c00 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 EGER_set(X509_ge
13c10 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 t_serialNumber(c
13c20 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 ert),serial);...
13c30 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 X509_gmtime_adj(
13c40 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 X509_getm_notBef
13c50 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 ore(cert),0);...
13c60 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 X509_gmtime_adj(
13c70 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 X509_getm_notAft
13c80 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 er(cert),(long)6
13c90 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 0*60*24*days);..
13ca0 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 .X509_set_pubkey
13cb0 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 (cert,pkey);....
13cc0 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 name=X509_get_su
13cd0 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 bject_name(cert)
13ce0 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 ;....X509_NAME_a
13cf0 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
13d00 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 name,"C", MBSTRI
13d10 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
13d20 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
13d30 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b k_C, -1, -1, 0);
13d40 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
13d50 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
13d60 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e me,"ST", MBSTRIN
13d70 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
13d80 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
13d90 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b _ST, -1, -1, 0);
13da0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
13db0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
13dc0 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 me,"L", MBSTRING
13dd0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
13de0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
13df0 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 L, -1, -1, 0);..
13e00 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
13e10 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
13e20 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 ,"O", MBSTRING_A
13e30 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
13e40 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c ned char *) k_O,
13e50 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
13e60 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
13e70 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
13e80 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 OU", MBSTRING_AS
13e90 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
13ea0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c ed char *) k_OU,
13eb0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
13ec0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
13ed0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
13ee0 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 CN", MBSTRING_AS
13ef0 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
13f00 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c ed char *) k_CN,
13f10 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
13f20 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
13f30 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
13f40 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 Email", MBSTRING
13f50 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
13f60 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
13f70 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 Email, -1, -1, 0
13f80 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 );....X509_set_s
13f90 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 ubject_name(cert
13fa0 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 ,name);....if (!
13fb0 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 X509_sign(cert,p
13fc0 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 key,EVP_sha256()
13fd0 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f )) {... X509_
13fe0 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 free(cert);...
13ff0 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 EVP_PKEY_free(
14000 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 pkey);.#if OPENS
14010 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
14020 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
14030 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e .. BN_free(bn
14040 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 e);.#endif...
14050 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 Tcl_SetResult(i
14060 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 nterp,"Error sig
14070 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 ning certificate
14080 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 ",NULL);... r
14090 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
140a0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 ...}....if (isSt
140b0 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 r) {... out=B
140c0 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d IO_new(BIO_s_mem
140d0 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ());... PEM_w
140e0 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 rite_bio_X509(ou
140f0 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 t,cert);... i
14100 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 =BIO_read(out,bu
14110 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 ffer,sizeof(buff
14120 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d er)-1);... i=
14130 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 (i<0) ? 0 : i;..
14140 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 . buffer[i]='
14150 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 \0';... Tcl_S
14160 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d etVar(interp,pem
14170 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 out,buffer,0);..
14180 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f . BIO_flush(o
14190 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 ut);... BIO_f
141a0 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c ree(out);...} el
141b0 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 se {... out=B
141c0 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c IO_new(BIO_s_fil
141d0 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f e());... BIO_
141e0 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f write_filename(o
141f0 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 ut,pemout);...
14200 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f PEM_write_bio_
14210 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a X509(out,cert);.
14220 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 .. BIO_free_a
14230 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 ll(out);...}....
14240 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b X509_free(cert);
14250 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
14260 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e (pkey);.#if OPEN
14270 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
14280 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
14290 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b ...BN_free(bne);
142a0 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 .#endif.. }..
142b0 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 }..break;. de
142c0 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 fault:..break;.
142d0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
142e0 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 TCL_OK;..clientD
142f0 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 ata = clientData
14300 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a ;.}.../*********
14310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 ***********/./*
14320 49 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 Init
14330 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./***********
14340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 *********/../*.
14350 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
14360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14390 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 ----. *. * Tls_F
143a0 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 ree --. *. *.Thi
143b0 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 s procedure clea
143c0 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c ns up when a SSL
143d0 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 socket based ch
143e0 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 annel. *.is clos
143f0 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 ed and its refer
14400 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 ence count falls
14410 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 below 1. *. * R
14420 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a esults:. *.none.
14430 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
14440 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c ts:. *.Frees all
14450 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a the state. *. *
14460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144a0 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 ---. */.void.Tls
144b0 5f 46 72 65 65 28 63 68 61 72 20 2a 62 6c 6f 63 _Free(char *bloc
144c0 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 kPtr) {. Stat
144d0 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
144e0 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b tate *)blockPtr;
144f0 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
14500 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c alled");.. Tl
14510 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 s_Clean(statePtr
14520 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c );. ckfree(bl
14530 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a ockPtr);.}.../*.
14540 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
14550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14580 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
14590 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 Clean --. *. *.T
145a0 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c his procedure cl
145b0 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 eans up when a S
145c0 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 SL socket based
145d0 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c channel. *.is cl
145e0 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 osed and its ref
145f0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c erence count fal
14600 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 ls below 1. Thi
14610 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 s should. *.be c
14620 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 alled synchronou
14630 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 sly by the Close
14640 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 Proc, not in the
14650 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 . *.EventuallyFr
14660 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a ee callback.. *.
14670 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e * Results:. *.n
14680 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
14690 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 ffects:. *.Frees
146a0 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 all the state.
146b0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
146c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
146d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
146e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
146f0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
14700 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 Tls_Clean(State
14710 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 *statePtr) {.
14720 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
14730 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 d");.. /*.
14740 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 * we're assumi
14750 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27 ng here that we'
14760 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 re single-thread
14770 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 ed. */. i
14780 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d f (statePtr->tim
14790 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 er != (Tcl_Timer
147a0 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 Token) NULL) {..
147b0 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 Tcl_DeleteTimerH
147c0 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d andler(statePtr-
147d0 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 >timer);..stateP
147e0 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c tr->timer = NULL
147f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
14800 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
14810 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 s) {..ckfree(sta
14820 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a tePtr->protos);.
14830 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
14840 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a s = NULL;. }.
14850 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
14860 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 ->bio) {../* Thi
14870 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f s will call SSL_
14880 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 shutdown. Bug 14
14890 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 14045 */..dprint
148a0 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 f("BIO_free_all(
148b0 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e %p)", statePtr->
148c0 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f bio);..BIO_free_
148d0 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 all(statePtr->bi
148e0 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 o);..statePtr->b
148f0 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d io = NULL;. }
14900 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
14910 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e r->ssl) {..dprin
14920 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 tf("SSL_free(%p)
14930 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ", statePtr->ssl
14940 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 );..SSL_free(sta
14950 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 tePtr->ssl);..st
14960 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 atePtr->ssl = NU
14970 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
14980 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 (statePtr->ctx)
14990 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 {..SSL_CTX_free
149a0 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b (statePtr->ctx);
149b0 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 ..statePtr->ctx
149c0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
149d0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
149e0 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c callback) {..Tcl
149f0 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _DecrRefCount(st
14a00 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
14a10 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 );..statePtr->ca
14a20 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 llback = NULL;.
14a30 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
14a40 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 tePtr->password)
14a50 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 {..Tcl_DecrRefC
14a60 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 ount(statePtr->p
14a70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 assword);..state
14a80 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 Ptr->password =
14a90 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
14aa0 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 if (statePtr->vc
14ab0 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 md) {..Tcl_DecrR
14ac0 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
14ad0 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 ->vcmd);..stateP
14ae0 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b tr->vcmd = NULL;
14af0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 . }.. dpri
14b00 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 ntf("Returning")
14b10 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
14b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
14b60 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d *. * Tls_Init --
14b70 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 . *. *.This is a
14b80 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c package initial
14b90 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 ization procedur
14ba0 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c e, which is call
14bb0 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 ed. *.by Tcl whe
14bc0 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 n this package i
14bd0 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f s to be added to
14be0 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e an interpreter.
14bf0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 . *. * Results:
14c00 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 Ssl configured
14c10 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a and loaded. *. *
14c20 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
14c30 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73 *. create the ss
14c40 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 l command, initi
14c50 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 alize ssl contex
14c60 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d t. *. *---------
14c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 ----------. */.D
14cb0 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 LLEXPORT int Tls
14cc0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 _Init(Tcl_Interp
14cd0 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 *interp) {.
14ce0 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 const char tlsTc
14cf0 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 lInitScript[] =
14d00 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e {.#include "tls.
14d10 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 tcl.h"..0x00.
14d20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 };.. dprintf
14d30 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 ("Called");..#if
14d40 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 TCL_MAJOR_VERSI
14d50 4f 4e 20 3e 20 38 0a 23 69 66 64 65 66 20 55 53 ON > 8.#ifdef US
14d60 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 20 E_TCL_STUBS.
14d70 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 if (Tcl_InitStub
14d80 73 28 69 6e 74 65 72 70 2c 20 22 39 2e 30 22 2c s(interp, "9.0",
14d90 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 0) == NULL) {..
14da0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
14db0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 ;. }.#endif.
14dc0 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 if (Tcl_PkgRe
14dd0 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 54 quire(interp, "T
14de0 63 6c 22 2c 20 22 39 2e 30 2d 22 2c 20 30 29 20 cl", "9.0-", 0)
14df0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
14e00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
14e10 20 20 7d 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 }.#else.#ifdef
14e20 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 USE_TCL_STUBS.
14e30 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 if (Tcl_InitS
14e40 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e tubs(interp, "8.
14e50 35 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 5", 0) == NULL)
14e60 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
14e70 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ROR;. }.#endi
14e80 66 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b f. if (Tcl_Pk
14e90 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c gRequire(interp,
14ea0 20 22 54 63 6c 22 2c 20 22 38 2e 35 2d 22 2c 20 "Tcl", "8.5-",
14eb0 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 0) == NULL) {..r
14ec0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
14ed0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 . }.#endif..
14ee0 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 if (TlsLibIni
14ef0 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 t(0) != TCL_OK)
14f00 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
14f10 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 ult(interp, "cou
14f20 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a ld not initializ
14f30 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 e SSL library",
14f40 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
14f50 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
14f60 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 R;. }.. Tc
14f70 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
14f80 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
14f90 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 65 :ciphers", Ciphe
14fa0 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e rsObjCmd, (Clien
14fb0 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
14fc0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
14fd0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
14fe0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
14ff0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f interp, "tls::co
15000 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 nnection", Conne
15010 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c ctionInfoObjCmd,
15020 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
15030 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
15040 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
15050 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
15060 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
15070 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c tls::handshake",
15080 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 HandshakeObjCmd
15090 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
150a0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
150b0 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
150c0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
150d0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
150e0 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 "tls::import", I
150f0 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c mportObjCmd, (Cl
15100 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
15110 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
15120 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
15130 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
15140 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
15150 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d :unimport", Unim
15160 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 portObjCmd, (Cli
15170 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
15180 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
15190 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
151a0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
151b0 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
151c0 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f status", StatusO
151d0 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
151e0 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
151f0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
15200 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
15210 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
15220 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69 erp, "tls::versi
15230 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 on", VersionObjC
15240 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
15250 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
15260 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
15270 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
15280 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
15290 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d , "tls::misc", M
152a0 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 iscObjCmd, (Clie
152b0 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
152c0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
152d0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
152e0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
152f0 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 (interp, "tls::p
15300 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f rotocols", Proto
15310 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 colsObjCmd, (Cli
15320 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
15330 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
15340 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 ) NULL);.. if
15350 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 63 6c (interp) {..Tcl
15360 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c _Eval(interp, tl
15370 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 3b sTclInitScript);
15380 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 . }.. retu
15390 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 rn Tcl_PkgProvid
153a0 65 28 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47 e(interp, PACKAG
153b0 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45 5f E_NAME, PACKAGE_
153c0 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a VERSION);.}../*.
153d0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
153e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
153f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15400 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
15410 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a Tls_SafeInit --.
15420 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *.----------
15430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15450 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 ------*. *.Stand
15460 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 72 65 ard procedure re
15470 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64 27 quired by 'load'
15480 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 .. *.Initializes
15490 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 this extension
154a0 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65 72 for a safe inter
154b0 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d preter.. *.-----
154c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
154d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
154e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a -----------*. *.
154f0 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a *.Side effects:
15500 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 5f . *..As of 'Tls_
15510 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 Init'. *. *.Resu
15520 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 lt:. *..A standa
15530 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 rd Tcl error cod
15540 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
15550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
15580 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e */.DLLEXPORT in
15590 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 t Tls_SafeInit(T
155a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
155b0 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 p) {. dprintf
155c0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 ("Called");.
155d0 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28 return(Tls_Init(
155e0 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a interp));.}../*.
155f0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
15600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15620 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
15630 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a TlsLibInit --. *
15640 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.------------
15650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15670 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c ----*. *.Initial
15680 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 izes SSL library
15690 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63 once per applic
156a0 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d ation. *.-------
156b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
156c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
156d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a ---------*. *. *
156e0 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 .Side effects:.
156f0 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 *..initializes S
15700 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a SL library. *. *
15710 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e .Result:. *..non
15720 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
15730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
15760 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c */.static int Tl
15770 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 sLibInit(int uni
15780 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 nitialize) {.
15790 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 static int init
157a0 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 ialized = 0;.
157b0 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20 54 43 int status = TC
157c0 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 L_OK;.#if define
157d0 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
157e0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
157f0 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 73 L_THREADS). s
15800 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b ize_t num_locks;
15810 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 .#endif.. if
15820 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b (uninitialize) {
15830 0a 09 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a ..if (!initializ
15840 65 64 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e ed) {.. dprin
15850 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 tf("Asked to uni
15860 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 nitialize, but w
15870 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 e are not initia
15880 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20 20 20 72 lized");... r
15890 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 eturn(TCL_OK);..
158a0 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 41 73 6b }...dprintf("Ask
158b0 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 ed to uninitiali
158c0 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e ze");..#if defin
158d0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
158e0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
158f0 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c CL_THREADS)..Tcl
15900 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 _MutexLock(&init
15910 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b _mx);...if (lock
15920 73 29 20 7b 0a 09 20 20 20 20 66 72 65 65 28 6c s) {.. free(l
15930 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f 63 6b ocks);.. lock
15940 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c s = NULL;.. l
15950 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 ocksCount = 0;..
15960 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 69 61 }.#endif..initia
15970 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20 lized = 0;..#if
15980 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
15990 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
159a0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
159b0 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 ..Tcl_MutexUnloc
159c0 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e k(&init_mx);.#en
159d0 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c dif...return(TCL
159e0 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 _OK);. }..
159f0 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 64 if (initialized
15a00 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 61 ) {..dprintf("Ca
15a10 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67 20 lled, but using
15a20 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b 0a cached value");.
15a30 09 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b .return(status);
15a40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 . }.. dpri
15a50 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
15a60 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
15a70 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
15a80 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
15a90 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 ADS). Tcl_Mut
15aa0 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 exLock(&init_mx)
15ab0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 ;.#endif. ini
15ac0 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 tialized = 1;..#
15ad0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
15ae0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
15af0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
15b00 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b DS). num_lock
15b10 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 s = 1;. locks
15b20 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75 Count = (int) nu
15b30 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 m_locks;. loc
15b40 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 ks = malloc(size
15b50 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d of(*locks) * num
15b60 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d _locks);. mem
15b70 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 set(locks, 0, si
15b80 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e zeof(*locks) * n
15b90 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 um_locks);.#endi
15ba0 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 f.. /* Initia
15bb0 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79 lize BOTH libcry
15bc0 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 pto and libssl.
15bd0 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 */. OPENSSL_i
15be0 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f nit_ssl(OPENSSL_
15bf0 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 INIT_LOAD_SSL_ST
15c00 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f RINGS | OPENSSL_
15c10 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f INIT_LOAD_CRYPTO
15c20 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e _STRINGS..| OPEN
15c30 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c SSL_INIT_ADD_ALL
15c40 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 _CIPHERS | OPENS
15c50 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f SL_INIT_ADD_ALL_
15c60 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a DIGESTS, NULL);.
15c70 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c . BIO_new_tcl
15c80 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 (NULL, 0);..#if
15c90 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 0. /*. *
15ca0 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 XXX:TODO: Remove
15cb0 20 74 68 69 73 20 63 6f 64 65 20 61 6e 64 20 72 this code and r
15cc0 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 eplace it with a
15cd0 20 63 68 65 63 6b 0a 20 20 20 20 20 2a 20 66 6f check. * fo
15ce0 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f 70 79 r enough entropy
15cf0 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72 79 20 and do not try
15d00 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 to create our ow
15d10 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 69 62 6c n. * terribl
15d20 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 20 20 2a e entropy. *
15d30 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 /. /*. *
15d40 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 Seed the random
15d50 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 number generator
15d60 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72 in the SSL libr
15d70 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 69 6e ary,. * usin
15d80 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 20 63 g the do/while c
15d90 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75 73 65 onstruct because
15da0 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f 74 65 of the bug note
15db0 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20 4f in the. * O
15dc0 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20 68 74 penSSL FAQ at ht
15dd0 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 73 6c tp://www.openssl
15de0 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 61 71 .org/support/faq
15df0 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 20 20 .html#USER1.
15e00 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 63 72 *. * The cr
15e10 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62 6c 65 ux of the proble
15e20 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61 72 69 m is that Solari
15e30 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 s 7 does not hav
15e40 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 65 76 2f e a. * /dev/
15e50 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 random or /dev/u
15e60 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 73 6f random device so
15e70 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 68 65 it cannot gathe
15e80 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 2a 20 r enough. *
15e90 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 68 65 entropy from the
15ea0 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77 68 65 RAND_seed() whe
15eb0 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 7a 65 n TLS initialize
15ec0 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a 20 20 s and refuses.
15ed0 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 * to go furth
15ee0 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65 72 73 er. Earlier vers
15ef0 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 4c 20 ions of OpenSSL
15f00 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67 61 72 carried on regar
15f10 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 dless.. */.
15f20 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69 67 6e srand((unsign
15f30 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28 74 69 ed int) time((ti
15f40 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a me_t *) NULL));.
15f50 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 28 69 do {..for (i
15f60 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 69 2b = 0; i < 16; i+
15f70 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f 73 65 +) {.. rnd_se
15f80 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 68 61 ed[i] = 1 + (cha
15f90 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61 6e 64 r) (255.0 * rand
15fa0 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 ()/(RAND_MAX+1.0
15fb0 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 65 65 ));..}..RAND_see
15fc0 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65 d(rnd_seed, size
15fd0 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b 0a 20 of(rnd_seed));.
15fe0 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41 4e 44 } while (RAND
15ff0 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31 29 3b _status() != 1);
16000 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 .#endif..#if def
16010 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 ined(OPENSSL_THR
16020 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 EADS) && defined
16030 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 (TCL_THREADS)..T
16040 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 cl_MutexUnlock(&
16050 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 init_mx);.#endif
16060 0a 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75 73 ...return(status
16070 29 3b 0a 7d 0a );.}.