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: 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 .static SSL_CTX
04f0: 2a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 *CTX_Init(State
0500: 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 *statePtr, int i
0510: 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f sServer, int pro
0520: 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09 to, char *key,..
0530: 09 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c .char *certfile,
0540: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
0550: 6b 65 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67 6e key_asn1, unsign
0560: 65 64 20 63 68 61 72 20 2a 63 65 72 74 5f 61 73 ed char *cert_as
0570: 6e 31 2c 0a 09 09 69 6e 74 20 6b 65 79 5f 61 73 n1,...int key_as
0580: 6e 31 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 n1_len, int cert
0590: 5f 61 73 6e 31 5f 6c 65 6e 2c 20 63 68 61 72 20 _asn1_len, char
05a0: 2a 43 41 70 61 74 68 2c 20 63 68 61 72 20 2a 43 *CApath, char *C
05b0: 41 66 69 6c 65 2c 0a 09 09 63 68 61 72 20 2a 63 Afile,...char *c
05c0: 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 iphers, char *ci
05d0: 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20 phersuites, int
05e0: 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 level, char *DHp
05f0: 61 72 61 6d 73 29 3b 0a 0a 73 74 61 74 69 63 20 arams);..static
0600: 69 6e 74 09 54 6c 73 4c 69 62 49 6e 69 74 28 69 int.TlsLibInit(i
0610: 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 nt uninitialize)
0620: 3b 0a 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 ;..#define TLS_P
0630: 52 4f 54 4f 5f 53 53 4c 32 09 09 30 78 30 31 0a ROTO_SSL2..0x01.
0640: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 #define TLS_PROT
0650: 4f 5f 53 53 4c 33 09 09 30 78 30 32 0a 23 64 65 O_SSL3..0x02.#de
0660: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 fine TLS_PROTO_T
0670: 4c 53 31 09 09 30 78 30 34 0a 23 64 65 66 69 6e LS1..0x04.#defin
0680: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
0690: 5f 31 09 30 78 30 38 0a 23 64 65 66 69 6e 65 20 _1.0x08.#define
06a0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 TLS_PROTO_TLS1_2
06b0: 09 30 78 31 30 0a 23 64 65 66 69 6e 65 20 54 4c .0x10.#define TL
06c0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 30 S_PROTO_TLS1_3.0
06d0: 78 32 30 0a 23 64 65 66 69 6e 65 20 45 4e 41 42 x20.#define ENAB
06e0: 4c 45 44 28 66 6c 61 67 2c 20 6d 61 73 6b 29 09 LED(flag, mask).
06f0: 28 28 28 66 6c 61 67 29 20 26 20 28 6d 61 73 6b (((flag) & (mask
0700: 29 29 20 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a 23 )) == (mask))..#
0710: 64 65 66 69 6e 65 20 53 53 4c 4b 45 59 4c 4f 47 define SSLKEYLOG
0720: 46 49 4c 45 09 09 22 53 53 4c 4b 45 59 4c 4f 47 FILE.."SSLKEYLOG
0730: 46 49 4c 45 22 0a 0a 2f 2a 0a 20 2a 20 54 68 72 FILE"../*. * Thr
0740: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64 ead-Safe TLS Cod
0750: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 e. */..#ifdef TC
0760: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e L_THREADS.#defin
0770: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 e OPENSSL_THREAD
0780: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64 _DEFINES.#includ
0790: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 e <openssl/opens
07a0: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65 slconf.h>..#ifde
07b0: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 f OPENSSL_THREAD
07c0: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e S.#include <open
07d0: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69 ssl/crypto.h>.#i
07e0: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
07f0: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 ssl.h>../*. * Th
0800: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e readed operation
0810: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e requires lockin
0820: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42 g callbacks. * B
0830: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74 ased from /crypt
0840: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20 o/cryptlib.c of
0850: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70 OpenSSL and NSOp
0860: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74 enSSL.. */..stat
0870: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f ic Tcl_Mutex *lo
0880: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 cks = NULL;.stat
0890: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e ic int locksCoun
08a0: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63 t = 0;.static Tc
08b0: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b l_Mutex init_mx;
08c0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53 .#endif /* OPENS
08d0: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65 SL_THREADS */.#e
08e0: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45 ndif /* TCL_THRE
08f0: 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a ADS */..../*****
0900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
0910: 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20 ./* Callbacks
0920: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a */./*******
0930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
0940: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0980: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 --------. *. * E
0990: 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d val Callback Com
09a0: 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76 mand --. *. *.Ev
09b0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
09c0: 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 6e and and catch an
09d0: 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52 y errors. *. * R
09e0: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43 esults:. *.0 = C
09f0: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20 ommand returned
0a00: 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 74 fail or eval ret
0a10: 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a urned TCL_ERROR.
0a20: 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 *.1 = Command r
0a30: 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 20 eturned success
0a40: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64 or eval returned
0a50: 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69 TCL_OK. *. * Si
0a60: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45 de effects:. *.E
0a70: 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 63 valuates callbac
0a80: 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d k command. *. *-
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ad0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
0ae0: 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54 t.EvalCallback(T
0af0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
0b00: 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 p, State *stateP
0b10: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 tr, Tcl_Obj *cmd
0b20: 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 63 Ptr) {. int c
0b30: 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20 ode, ok = 0;..
0b40: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
0b50: 64 22 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 d");.. Tcl_Pr
0b60: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
0b70: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 ta) interp);.
0b80: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 Tcl_Preserve((C
0b90: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
0ba0: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 Ptr);.. /* Ev
0bb0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 al callback with
0bc0: 20 73 75 63 63 65 73 73 20 66 6f 72 20 6f 6b 20 success for ok
0bd0: 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 or return value
0be0: 31 2c 20 66 61 69 6c 20 66 6f 72 20 65 72 72 6f 1, fail for erro
0bf0: 72 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 r or return valu
0c00: 65 20 30 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 e 0 */. Tcl_R
0c10: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 esetResult(inter
0c20: 70 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 p);. code = T
0c30: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 cl_EvalObjEx(int
0c40: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c erp, cmdPtr, TCL
0c50: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 _EVAL_GLOBAL);.
0c60: 20 20 20 64 70 72 69 6e 74 66 28 22 45 76 61 6c dprintf("Eval
0c70: 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 63 Callback: %d", c
0c80: 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 6f ode);. if (co
0c90: 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a de == TCL_OK) {.
0ca0: 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c 74 ./* Check result
0cb0: 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 for return valu
0cc0: 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 e */..Tcl_Obj *r
0cd0: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f esult = Tcl_GetO
0ce0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 bjResult(interp)
0cf0: 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d ;..if (result ==
0d00: 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 NULL || Tcl_Get
0d10: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 IntFromObj(inter
0d20: 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 p, result, &ok)
0d30: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 != TCL_OK) {..
0d40: 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 ok = 1;..}..dp
0d50: 72 69 6e 74 66 28 22 52 65 73 75 6c 74 3a 20 25 rintf("Result: %
0d60: 64 22 2c 20 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 d", ok);. } e
0d70: 6c 73 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 lse {../* Error
0d80: 2d 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 - reject the cer
0d90: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 64 70 72 tificate */..dpr
0da0: 69 6e 74 66 28 22 54 63 6c 5f 42 61 63 6b 67 72 intf("Tcl_Backgr
0db0: 6f 75 6e 64 45 72 72 6f 72 22 29 3b 0a 23 69 66 oundError");.#if
0dc0: 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 (TCL_MAJOR_VERS
0dd0: 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 ION == 8) && (TC
0de0: 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MINOR_VERSION
0df0: 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 < 6)..Tcl_Backgr
0e00: 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 oundError(interp
0e10: 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 );.#else..Tcl_Ba
0e20: 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f ckgroundExceptio
0e30: 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b n(interp, code);
0e40: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 .#endif. }..
0e50: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
0e60: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
0e70: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 ePtr);. Tcl_R
0e80: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
0e90: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 ta) interp);.
0ea0: 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a return ok;.}...
0eb0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 --------. *. * I
0f00: 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 nfoCallback --.
0f10: 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 *. *.Monitors SS
0f20: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f L connection pro
0f30: 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c cess. *. * Resul
0f40: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
0f50: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
0f60: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
0f70: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
0f80: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
0fd0: 69 63 20 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c ic void.InfoCall
0fe0: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a back(const SSL *
0ff0: 73 73 6c 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 ssl, int where,
1000: 69 6e 74 20 72 65 74 29 20 7b 0a 20 20 20 20 53 int ret) {. S
1010: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
1020: 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 (State*)SSL_get
1030: 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20 2a _app_data((SSL *
1040: 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 )ssl);. Tcl_I
1050: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
1060: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
1070: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
1080: 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 mdPtr;. char
1090: 2a 6d 61 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 *major; char *mi
10a0: 6e 6f 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 nor;.. dprint
10b0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
10c0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
10d0: 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c callback == (Tcl
10e0: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 _Obj*)NULL)..ret
10f0: 75 72 6e 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 urn;.. if (wh
1100: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e ere & SSL_CB_HAN
1110: 44 53 48 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a DSHAKE_START) {.
1120: 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 .major = "handsh
1130: 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 ake";..minor = "
1140: 73 74 61 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c start";. } el
1150: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
1160: 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f SL_CB_HANDSHAKE_
1170: 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d DONE) {..major =
1180: 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d "handshake";..m
1190: 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 inor = "done";.
11a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
11b0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
11c0: 41 4c 45 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20 ALERT)..major =
11d0: 22 61 6c 65 72 74 22 3b 0a 09 65 6c 73 65 20 69 "alert";..else i
11e0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 f (where & SSL_S
11f0: 54 5f 43 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 T_CONNECT).major
1200: 20 3d 20 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 = "connect";..e
1210: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 lse if (where &
1220: 53 53 4c 5f 53 54 5f 41 43 43 45 50 54 29 09 09 SSL_ST_ACCEPT)..
1230: 6d 61 6a 6f 72 20 3d 20 22 61 63 63 65 70 74 22 major = "accept"
1240: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f ;..else.....majo
1250: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a r = "unknown";..
1260: 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c .if (where & SSL
1270: 5f 43 42 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72 _CB_READ)..minor
1280: 20 3d 20 22 72 65 61 64 22 3b 0a 09 65 6c 73 65 = "read";..else
1290: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c if (where & SSL
12a0: 5f 43 42 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f _CB_WRITE)..mino
12b0: 72 20 3d 20 22 77 72 69 74 65 22 3b 0a 09 65 6c r = "write";..el
12c0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
12d0: 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e SL_CB_LOOP)..min
12e0: 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c or = "loop";..el
12f0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
1300: 53 4c 5f 43 42 5f 45 58 49 54 29 09 09 6d 69 6e SL_CB_EXIT)..min
1310: 6f 72 20 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c or = "exit";..el
1320: 73 65 09 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22 se.....minor = "
1330: 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a unknown";. }.
1340: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
1350: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 ommand to eval w
1360: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 6d 61 ith fn, chan, ma
1370: 6a 6f 72 2c 20 6d 69 6e 6f 72 2c 20 6d 65 73 73 jor, minor, mess
1380: 61 67 65 2c 20 61 6e 64 20 74 79 70 65 20 61 72 age, and type ar
1390: 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 gs */. cmdPtr
13a0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
13b0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 Obj(statePtr->ca
13c0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c llback);. Tcl
13d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
13e0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
13f0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
1400: 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d ingObj("info", -
1410: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
1420: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1430: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
1440: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
1450: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
1460: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
1470: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
1480: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
1490: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
14a0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
14b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
14c0: 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 20 major, -1));.
14d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
14e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
14f0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
1500: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72 wStringObj(minor
1510: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 20 , -1));.. if
1520: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1530: 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c 69 ALERT) {..Tcl_Li
1540: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1550: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1560: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
1570: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 tringObj(SSL_ale
1580: 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c rt_desc_string_l
1590: 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a ong(ret), -1));.
15a0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
15b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
15c0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
15d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
15e0: 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73 SSL_alert_type_s
15f0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c tring_long(ret),
1600: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 -1));. } els
1610: 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a e {..Tcl_ListObj
1620: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1630: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
1640: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
1650: 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 Obj(SSL_state_st
1660: 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 ring_long(ssl),
1670: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
1680: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1690: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
16a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
16b0: 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 ("info", -1));.
16c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 }.. /* Eva
16d0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
16e0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
16f0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
1700: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c r);. EvalCall
1710: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
1720: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
1730: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
1740: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a ount(cmdPtr);.}.
1750: 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d ----------------
1780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
17a0: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b MessageCallback
17b0: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f --. *. *.Monito
17c0: 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20 rs SSL protocol
17d0: 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52 messages. *. * R
17e0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
17f0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
1800: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
1810: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
1820: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d d). *. *--------
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 2d 2d 2d 2d 2d ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
1870: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f #ifndef OPENSSL_
1880: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 73 74 61 NO_SSL_TRACE.sta
1890: 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 61 67 65 tic void.Message
18a0: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 77 72 69 Callback(int wri
18b0: 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 73 69 6f te_p, int versio
18c0: 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e 74 5f 74 n, int content_t
18d0: 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 ype, const void
18e0: 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 6c 65 6e *buf, size_t len
18f0: 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 6f 69 64 , SSL *ssl, void
1900: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 *arg) {. Sta
1910: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
1920: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 State*)arg;.
1930: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
1940: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
1950: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
1960: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
1970: 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 79 70 65 char *ver, *type
1980: 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a ;. BIO *bio;.
1990: 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b char buffer[
19a0: 31 35 30 30 30 5d 3b 0a 20 20 20 20 62 75 66 66 15000];. buff
19b0: 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 er[0] = 0;..
19c0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
19d0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
19e0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
19f0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
1a00: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 )..return;..
1a10: 73 77 69 74 63 68 28 76 65 72 73 69 6f 6e 29 20 switch(version)
1a20: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 {.#if OPENSSL_VE
1a30: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
1a40: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 x10100000L && !d
1a50: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
1a60: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
1a70: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
1a80: 20 63 61 73 65 20 53 53 4c 32 5f 56 45 52 53 49 case SSL2_VERSI
1a90: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c 76 ON:..ver = "SSLv
1aa0: 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 2";..break;.#end
1ab0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
1ac0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
1ad0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
1ae0: 53 53 4c 33 29 0a 20 20 20 20 63 61 73 65 20 53 SSL3). case S
1af0: 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 SL3_VERSION:..ve
1b00: 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a 09 62 72 r = "SSLv3";..br
1b10: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 eak;.#endif.
1b20: 63 61 73 65 20 54 4c 53 31 5f 56 45 52 53 49 4f case TLS1_VERSIO
1b30: 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 N:..ver = "TLSv1
1b40: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 ";..break;. c
1b50: 61 73 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 ase TLS1_1_VERSI
1b60: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 ON:..ver = "TLSv
1b70: 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 1.1";..break;.
1b80: 20 20 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 case TLS1_2_VE
1b90: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 RSION:..ver = "T
1ba0: 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b LSv1.2";..break;
1bb0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 33 . case TLS1_3
1bc0: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d _VERSION:..ver =
1bd0: 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 "TLSv1.3";..bre
1be0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a ak;. case 0:.
1bf0: 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 .ver = "none";..
1c00: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 break;. defau
1c10: 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e lt:..ver = "unkn
1c20: 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 own";..break;.
1c30: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 }.. switch
1c40: 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b (content_type) {
1c50: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 . case SSL3_R
1c60: 54 5f 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20 T_HEADER:..type
1c70: 3d 20 22 48 65 61 64 65 72 22 3b 0a 09 62 72 65 = "Header";..bre
1c80: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c ak;. case SSL
1c90: 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 3_RT_INNER_CONTE
1ca0: 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d NT_TYPE:..type =
1cb0: 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 "Inner Content
1cc0: 54 79 70 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 Type";..break;.
1cd0: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f case SSL3_RT_
1ce0: 43 48 41 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 CHANGE_CIPHER_SP
1cf0: 45 43 3a 0a 09 74 79 70 65 20 3d 20 22 43 68 61 EC:..type = "Cha
1d00: 6e 67 65 20 43 69 70 68 65 72 22 3b 0a 09 62 72 nge Cipher";..br
1d10: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 eak;. case SS
1d20: 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 L3_RT_ALERT:..ty
1d30: 70 65 20 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 pe = "Alert";..b
1d40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 reak;. case S
1d50: 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 SL3_RT_HANDSHAKE
1d60: 3a 0a 09 74 79 70 65 20 3d 20 22 48 61 6e 64 73 :..type = "Hands
1d70: 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 hake";..break;.
1d80: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f case SSL3_RT_
1d90: 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 APPLICATION_DATA
1da0: 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 70 20 44 :..type = "App D
1db0: 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 ata";..break;.#i
1dc0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
1dd0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
1de0: 30 30 30 30 30 4c 0a 20 20 20 20 63 61 73 65 20 00000L. case
1df0: 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45 DTLS1_RT_HEARTBE
1e00: 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 AT:..type = "Hea
1e10: 72 74 62 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b rtbeat";..break;
1e20: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 .#endif. defa
1e30: 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e ult:..type = "un
1e40: 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 known";. }..
1e50: 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 /* Needs comp
1e60: 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 ile time option
1e70: 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 "enable-ssl-trac
1e80: 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 e". */. if ((
1e90: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 bio = BIO_new(BI
1ea0: 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e O_s_mem())) != N
1eb0: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 ULL) {..int n;..
1ec0: 53 53 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f SSL_trace(write_
1ed0: 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 p, version, cont
1ee0: 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c ent_type, buf, l
1ef0: 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a en, ssl, (void *
1f00: 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f )bio);..n = BIO_
1f10: 72 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72 read(bio, buffer
1f20: 2c 20 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 , BIO_pending(bi
1f30: 6f 29 20 3c 20 31 35 30 30 30 20 3f 20 42 49 4f o) < 15000 ? BIO
1f40: 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 20 3a 20 _pending(bio) :
1f50: 31 34 39 39 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 14999);..n = (n<
1f60: 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66 0) ? 0 : n;..buf
1f70: 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f fer[n] = 0;..(vo
1f80: 69 64 29 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f id)BIO_flush(bio
1f90: 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28 62 69 6f );..BIO_free(bio
1fa0: 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 );. }.. /*
1fb0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
1fc0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
1fd0: 63 68 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e 2c chan, direction,
1fe0: 20 76 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c 20 version, type,
1ff0: 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 73 and message args
2000: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
2010: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
2020: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c j(statePtr->call
2030: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c back);. Tcl_L
2040: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2050: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2060: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
2070: 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20 gObj("message",
2080: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
2090: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
20a0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
20b0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
20c0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
20d0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
20e0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
20f0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2100: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2110: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2120: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2130: 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74 (write_p ? "Sent
2140: 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20 " : "Received",
2150: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
2160: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2170: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2180: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
2190: 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20 Obj(ver, -1));.
21a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
21b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
21c0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
21d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70 NewStringObj(typ
21e0: 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c e, -1));. Tcl
21f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
2200: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
2210: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
2220: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d ingObj(buffer, -
2230: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 1));.. /* Eva
2240: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
2250: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
2260: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
2270: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c r);. EvalCall
2280: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
2290: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
22a0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
22b0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a ount(cmdPtr);.}.
22c0: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d #endif.../*. *--
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2310: 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 -. *. * VerifyCa
2320: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 llback --. *. *.
2330: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 Monitors SSL cer
2340: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 tificate validat
2350: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65 ion process. Use
2360: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 d to control the
2370: 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65 . *.behavior whe
2380: 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59 n the SSL_VERIFY
2390: 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65 _PEER flag is se
23a0: 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 t. This is calle
23b0: 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20 d. *.whenever a
23c0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 certificate is i
23d0: 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69 nspected or deci
23e0: 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c ded invalid. Cal
23f0: 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20 led for. *.each
2400: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74 certificate in t
2410: 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20 he cert chain..
2420: 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09 *. * Checks:. *.
2430: 63 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69 certificate chai
2440: 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61 n is checked sta
2450: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64 rting with the d
2460: 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c eepest nesting l
2470: 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72 evel. *. (the r
2480: 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61 oot CA certifica
2490: 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75 te) and worked u
24a0: 70 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65 pward to the pee
24b0: 72 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e r's certificate.
24c0: 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72 . *.All signatur
24d0: 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75 es are valid, cu
24e0: 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69 rrent time is wi
24f0: 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c thin first and l
2500: 61 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d ast validity tim
2510: 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74 e.. *.Check that
2520: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
2530: 20 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68 is issued by th
2540: 65 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69 e issuer certifi
2550: 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09 cate issuer.. *.
2560: 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61 Check the revoca
2570: 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20 tion status for
2580: 65 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65 each certificate
2590: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76 .. *.Check the v
25a0: 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67 alidity of the g
25b0: 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65 iven CRL and the
25c0: 20 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e cert revocation
25d0: 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63 status.. *.Chec
25e0: 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f k the policies o
25f0: 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66 f all the certif
2600: 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67 icates. *. * Arg
2610: 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f s. *.preverify_o
2620: 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74 k indicates whet
2630: 68 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63 her the certific
2640: 61 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e ate verification
2650: 20 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e passed (1) or n
2660: 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73 ot (0). *. * Res
2670: 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 ults:. *.A callb
2680: 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 ack bound to the
2690: 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 socket may retu
26a0: 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 rn one of:. *.
26b0: 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 0...- the cert
26c0: 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 ificate is deeme
26d0: 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20 d invalid, send
26e0: 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09 verification. *.
26f0: 09 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65 ... failure ale
2700: 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20 rt to peer, and
2710: 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68 terminate handsh
2720: 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09 ake.. *. 1...
2730: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 - the certificat
2740: 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69 e is deemed vali
2750: 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 d, continue with
2760: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 handshake.. *.
2770: 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09 empty string.
2780: 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 - no change to c
2790: 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 ertificate valid
27a0: 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 ation. *. * Side
27b0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 effects:. *.The
27c0: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 err field of th
27d0: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 e currently oper
27e0: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 ative State is s
27f0: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 et. *. to a str
2800: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 ing describing t
2810: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 he SSL negotiati
2820: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f on failure reaso
2830: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d n. *. *---------
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
2880: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79 tatic int.Verify
2890: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c Callback(int ok,
28a0: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20 X509_STORE_CTX
28b0: 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f *ctx) {. Tcl_
28c0: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 Obj *cmdPtr;.
28d0: 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28 SSL *ssl..= (
28e0: 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f SSL*)X509_STORE_
28f0: 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 CTX_get_ex_data(
2900: 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f ctx, SSL_get_ex_
2910: 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f data_X509_STORE_
2920: 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 CTX_idx());.
2930: 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 X509 *cert..= X
2940: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 509_STORE_CTX_ge
2950: 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 t_current_cert(c
2960: 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a tx);. State *
2970: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 statePtr.= (Stat
2980: 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 e*)SSL_get_app_d
2990: 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63 ata(ssl);. Tc
29a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
29b0: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
29c0: 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70 erp;. int dep
29d0: 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 th..= X509_STORE
29e0: 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64 _CTX_get_error_d
29f0: 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69 epth(ctx);. i
2a00: 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53 nt err..= X509_S
2a10: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 TORE_CTX_get_err
2a20: 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70 or(ctx);.. dp
2a30: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
2a40: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 . dprintf("Ve
2a50: 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 25 64 rifyCallback: %d
2a60: 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20 ", ok);.. if
2a70: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 (statePtr->vcmd
2a80: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
2a90: 4c 29 20 7b 0a 09 2f 2a 20 55 73 65 20 6f 6b 20 L) {../* Use ok
2aa0: 76 61 6c 75 65 20 69 66 20 76 65 72 69 66 69 63 value if verific
2ab0: 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 ation is require
2ac0: 64 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50 d */..if (stateP
2ad0: 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 4c tr->vflags & SSL
2ae0: 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f _VERIFY_FAIL_IF_
2af0: 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a NO_PEER_CERT) {.
2b00: 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a . return ok;.
2b10: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 .} else {.. r
2b20: 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 eturn 1;..}.
2b30: 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 } else if (cert
2b40: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20 3d == NULL || ssl =
2b50: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
2b60: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 n 0;. }..
2b70: 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 dprintf("VerifyC
2b80: 61 6c 6c 62 61 63 6b 3a 20 65 76 61 6c 20 63 61 allback: eval ca
2b90: 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 20 20 2f llback");.. /
2ba0: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 * Create command
2bb0: 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e to eval with fn
2bc0: 2c 20 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 , chan, depth, c
2bd0: 65 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 ert info list, s
2be0: 74 61 74 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 tatus, and error
2bf0: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 args */. cmd
2c00: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
2c10: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
2c20: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f >vcmd);. Tcl_
2c30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
2c40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
2c50: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
2c60: 6e 67 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20 ngObj("verify",
2c70: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
2c80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2c90: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2ca0: 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e r,..Tcl_NewStrin
2cb0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e gObj(Tcl_GetChan
2cc0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
2cd0: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 ->self), -1));.
2ce0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2cf0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2d00: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
2d10: 4e 65 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 NewIntObj(depth)
2d20: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2d30: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2d40: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2d50: 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 Tls_NewX509Obj(i
2d60: 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 nterp, cert));.
2d70: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2d80: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2d90: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
2da0: 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a NewIntObj(ok));.
2db0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2dc0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2dd0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 erp, cmdPtr,..Tc
2de0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 l_NewStringObj((
2df0: 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69 66 char*)X509_verif
2e00: 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 y_cert_error_str
2e10: 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a ing(err), -1));.
2e20: 0a 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 . /* Prevent
2e30: 49 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 I/O while callba
2e40: 63 6b 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 ck is in progres
2e50: 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 s */. /* stat
2e60: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 ePtr->flags |= T
2e70: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b LS_TCL_CALLBACK;
2e80: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c */.. /* Eval
2e90: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
2ea0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
2eb0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
2ec0: 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c );. ok = Eval
2ed0: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c Callback(interp,
2ee0: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 statePtr, cmdPt
2ef0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 r);. Tcl_Decr
2f00: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
2f10: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
2f20: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 VerifyCallback:
2f30: 63 6f 6d 6d 61 6e 64 20 72 65 73 75 6c 74 20 3d command result =
2f40: 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 %d", ok);..
2f50: 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 /* statePtr->fla
2f60: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f gs &= ~(TLS_TCL_
2f70: 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a 20 20 CALLBACK); */.
2f80: 20 20 72 65 74 75 72 6e 20 6f 6b 3b 09 2f 2a 20 return ok;./*
2f90: 42 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 61 76 By default, leav
2fa0: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75 e verification u
2fb0: 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c nchanged. */.}..
2fc0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
3010: 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a Tls_Error --. *.
3020: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
3030: 6b 20 77 69 74 68 20 6c 69 73 74 20 6f 66 20 65 k with list of e
3040: 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 rrors.. *. * Sid
3050: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 e effects:. *.Th
3060: 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 e err field of t
3070: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 he currently ope
3080: 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 rative State is
3090: 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 set. *. to a st
30a0: 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 ring describing
30b0: 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 the SSL negotiat
30c0: 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 ion failure reas
30d0: 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d on. *. *--------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
3120: 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 void.Tls_Error(S
3130: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 tate *statePtr,
3140: 63 68 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20 char *msg) {.
3150: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
3160: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e erp.= statePtr->
3170: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f interp;. Tcl_
3180: 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 Obj *cmdPtr, *li
3190: 73 74 50 74 72 3b 0a 20 20 20 20 75 6e 73 69 67 stPtr;. unsig
31a0: 6e 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 ned long err;.
31b0: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20 statePtr->err
31c0: 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72 69 = msg;.. dpri
31d0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
31e0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
31f0: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 ->callback == (T
3200: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 cl_Obj*)NULL)..r
3210: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 eturn;.. /* C
3220: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
3230: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 eval with fn, c
3240: 68 61 6e 2c 20 61 6e 64 20 6d 65 73 73 61 67 65 han, and message
3250: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 args */. cmd
3260: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
3270: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
3280: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 >callback);.
3290: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
32a0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
32b0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
32c0: 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72 StringObj("error
32d0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
32e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
32f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3300: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
3310: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
3320: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
3330: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
3340: 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6d 73 -1));. if (ms
3350: 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 g != NULL) {..Tc
3360: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3370: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
3380: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
3390: 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 ringObj(msg, -1)
33a0: 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 );.. } else i
33b0: 66 20 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47 65 f ((msg = Tcl_Ge
33c0: 74 53 74 72 69 6e 67 28 54 63 6c 5f 47 65 74 4f tString(Tcl_GetO
33d0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 bjResult(interp)
33e0: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 )) != NULL) {..T
33f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3400: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
3410: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
3420: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 tringObj(msg, -1
3430: 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 ));.. } else
3440: 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63 6c {..listPtr = Tcl
3450: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
3460: 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 65 ULL);..while ((e
3470: 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 rr = ERR_get_err
3480: 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 20 or()) != 0) {..
3490: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
34a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
34b0: 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c rp, listPtr, Tcl
34c0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 52 _NewStringObj(ER
34d0: 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 R_reason_error_s
34e0: 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 tring(err), -1))
34f0: 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 ;..}..Tcl_ListOb
3500: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3510: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 6c nterp, cmdPtr, l
3520: 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a istPtr);. }..
3530: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
3540: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
3550: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
3560: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
3570: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 EvalCallback(i
3580: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
3590: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 cmdPtr);. Tc
35a0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
35b0: 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 mdPtr);.}.../*.
35c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3600: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f ----. *. * KeyLo
3610: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a gCallback --. *.
3620: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65 *.Write receive
3630: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f d key data to lo
3640: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 g file.. *. * Si
3650: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e de effects:. *.n
3660: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d one. *. *-------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
36b0: 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c .void KeyLogCall
36c0: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a back(const SSL *
36d0: 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 ssl, const char
36e0: 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 *line) {. cha
36f0: 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28 r *str = getenv(
3700: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a SSLKEYLOGFILE);.
3710: 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 FILE *fd;..
3720: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
3730: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
3740: 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 tr) {..fd = fope
3750: 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 n(str, "a");..fp
3760: 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 rintf(fd, "%s\n"
3770: 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 ,line);..fclose(
3780: 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f fd);. }.}.../
3790: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 -------. *. * Pa
37e0: 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 ssword Callback
37f0: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
3800: 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 when a password
3810: 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65 for a private ke
3820: 79 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 69 6e y loading/storin
3830: 67 20 61 20 50 45 4d 0a 20 2a 09 63 65 72 74 69 g a PEM. *.certi
3840: 66 69 63 61 74 65 20 77 69 74 68 20 65 6e 63 72 ficate with encr
3850: 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 yption. Evals ca
3860: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 61 6e llback script an
3870: 64 20 72 65 74 75 72 6e 73 0a 20 2a 09 74 68 65 d returns. *.the
3880: 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 70 result as the p
3890: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 69 assword string i
38a0: 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 n buf.. *. * Res
38b0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
38c0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
38d0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
38e0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
38f0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
3900: 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69 7a 65 *.Password size
3910: 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 20 in bytes or -1
3920: 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a for an error.. *
3930: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3970: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
3980: 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 c int.PasswordCa
3990: 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 llback(char *buf
39a0: 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 , int size, int
39b0: 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 rwflag, void *ud
39c0: 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 ata) {. State
39d0: 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 *statePtr.= (St
39e0: 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 ate *) udata;.
39f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
3a00: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
3a10: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
3a20: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
3a30: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 int code;..
3a40: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
3a50: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e ");.. /* If n
3a60: 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 o callback, use
3a70: 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b default callback
3a80: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
3a90: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d ePtr->password =
3aa0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 = NULL) {..if (T
3ab0: 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 cl_EvalEx(interp
3ac0: 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 , "tls::password
3ad0: 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f ", -1, TCL_EVAL_
3ae0: 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f GLOBAL) == TCL_O
3af0: 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a K) {.. char *
3b00: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 ret = (char *) T
3b10: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 cl_GetStringResu
3b20: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 lt(interp);..
3b30: 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 strncpy(buf, re
3b40: 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 t, (size_t) size
3b50: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 );.. return (
3b60: 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b int)strlen(ret);
3b70: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
3b80: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 return -1;..}.
3b90: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
3ba0: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
3bb0: 61 6c 20 77 69 74 68 20 66 6e 2c 20 72 77 66 6c al with fn, rwfl
3bc0: 61 67 2c 20 61 6e 64 20 73 69 7a 65 20 61 72 67 ag, and size arg
3bd0: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 s */. cmdPtr
3be0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
3bf0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 bj(statePtr->pas
3c00: 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 6c 5f sword);. Tcl_
3c10: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3c20: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3c30: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
3c40: 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 64 22 ngObj("password"
3c50: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
3c60: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3c70: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3c80: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
3c90: 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 20 20 bj(rwflag));.
3ca0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
3cb0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3cc0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
3cd0: 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 3b 0a wIntObj(size));.
3ce0: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 . Tcl_Preserv
3cf0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
3d00: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f nterp);. Tcl_
3d10: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
3d20: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
3d30: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
3d40: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
3d50: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
3d60: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
3d70: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 code = Tcl_E
3d80: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c valObjEx(interp,
3d90: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 cmdPtr, TCL_EVA
3da0: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 L_GLOBAL);. i
3db0: 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f f (code != TCL_O
3dc0: 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 K) {.#if (TCL_MA
3dd0: 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 JOR_VERSION == 8
3de0: 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f ) && (TCL_MINOR_
3df0: 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 VERSION < 6)..Tc
3e00: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f l_BackgroundErro
3e10: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 r(interp);.#else
3e20: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
3e30: 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 Exception(interp
3e40: 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a , code);.#endif.
3e50: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 }. Tcl_De
3e60: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
3e70: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c r);.. Tcl_Rel
3e80: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 ease((ClientData
3e90: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 ) statePtr);..
3ea0: 20 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73 66 /* If successf
3eb0: 75 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70 61 ul, pass back pa
3ec0: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61 6e ssword string an
3ed0: 64 20 74 72 75 6e 63 61 74 65 20 69 66 20 74 6f d truncate if to
3ee0: 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 o long */. if
3ef0: 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b (code == TCL_OK
3f00: 29 20 7b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c 65 ) {..Tcl_Size le
3f10: 6e 3b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 n;..char *ret =
3f20: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
3f30: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 StringFromObj(Tc
3f40: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
3f50: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 nterp), &len);..
3f60: 69 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 if (len > (Tcl_S
3f70: 69 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 ize) size-1) {..
3f80: 20 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 len = (Tcl_S
3f90: 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a ize) size-1;..}.
3fa0: 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 .strncpy(buf, re
3fb0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 t, (size_t) len)
3fc0: 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c ;..buf[len] = '\
3fd0: 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 0';..Tcl_Release
3fe0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
3ff0: 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 20 28 terp);..return (
4000: 69 6e 74 29 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a int) len;. }.
4010: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
4020: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 (ClientData) int
4030: 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e erp);. return
4040: 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d -1;.}.../*. *--
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4090: 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 -. *. * Session
40a0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 Callback for Cli
40b0: 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 ents --. *. *.Ca
40c0: 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 lled when a new
40d0: 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64 session is added
40e0: 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49 to the cache. I
40f0: 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 n TLS 1.3. *.thi
4100: 73 20 6d 61 79 20 62 65 20 72 65 63 65 69 76 65 s may be receive
4110: 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 d multiple times
4120: 20 61 66 74 65 72 20 74 68 65 20 68 61 6e 64 73 after the hands
4130: 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 hake. For. *.ear
4140: 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 lier versions, t
4150: 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65 his will be rece
4160: 69 76 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 ived during the
4170: 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 handshake.. *.Th
4180: 69 73 20 69 73 20 74 68 65 20 70 72 65 66 65 72 is is the prefer
4190: 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69 red way to obtai
41a0: 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65 n a resumable se
41b0: 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 ssion.. *. * Res
41c0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
41d0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
41e0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
41f0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
4200: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
4210: 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f des:. *.0 = erro
4220: 72 20 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20 r where session
4230: 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 will be immediat
4240: 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d ely removed from
4250: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 the internal ca
4260: 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 che.. *.1 = succ
4270: 65 73 73 20 77 68 65 72 65 20 61 70 70 20 72 65 ess where app re
4280: 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e tains session in
4290: 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 session cache,
42a0: 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 and must call SS
42b0: 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 L_SESSION_free()
42c0: 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 when done.. *.
42d0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4310: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
4320: 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 int.SessionCallb
4330: 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53 ack(SSL *ssl, SS
4340: 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 L_SESSION *sessi
4350: 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 on) {. State
4360: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
4370: 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f te*)SSL_get_app_
4380: 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 data((SSL *)ssl)
4390: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ;. Tcl_Interp
43a0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
43b0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
43c0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
43d0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 ;. const unsi
43e0: 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 gned char *ticke
43f0: 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 t;. const uns
4400: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 igned char *sess
4410: 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 ion_id;. size
4420: 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 _t len2;. uns
4430: 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a igned int ulen;.
4440: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
4450: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
4460: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
4470: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a ack == (Tcl_Obj*
4480: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
4490: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
44a0: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 OK;. } else i
44b0: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 f (ssl == NULL)
44c0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
44d0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
44e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
44f0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
4500: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 eval with fn, ch
4510: 61 6e 2c 20 73 65 73 73 69 6f 6e 20 69 64 2c 20 an, session id,
4520: 73 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20 session ticket,
4530: 61 6e 64 20 6c 69 66 65 74 69 6d 65 20 61 72 67 and lifetime arg
4540: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 s */. cmdPtr
4550: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
4560: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c bj(statePtr->cal
4570: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f lback);. Tcl_
4580: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
4590: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
45a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
45b0: 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c ngObj("session",
45c0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
45d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
45e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
45f0: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
4600: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 StringObj(Tcl_Ge
4610: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
4620: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 tePtr->self), -1
4630: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 ));.. /* Sess
4640: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 ion id */. se
4650: 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 ssion_id = SSL_S
4660: 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 ESSION_get_id(se
4670: 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 ssion, &ulen);.
4680: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
4690: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
46a0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
46b0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 NewByteArrayObj(
46c0: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c session_id, (Tcl
46d0: 5f 53 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a _Size) ulen));..
46e0: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 /* Session t
46f0: 69 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c icket */. SSL
4700: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 _SESSION_get0_ti
4710: 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 cket(session, &t
4720: 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 icket, &len2);.
4730: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
4740: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
4750: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
4760: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 NewByteArrayObj(
4770: 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a ticket, (Tcl_Siz
4780: 65 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 e) len2));..
4790: 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 /* Lifetime - nu
47a0: 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 mber of seconds
47b0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f */. Tcl_ListO
47c0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
47d0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
47e0: 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 .Tcl_NewLongObj(
47f0: 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 (long) SSL_SESSI
4800: 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 ON_get_ticket_li
4810: 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 fetime_hint(sess
4820: 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 ion)));.. /*
4830: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
4840: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
4850: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
4860: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 dPtr);. EvalC
4870: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
4880: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
4890: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 );. Tcl_DecrR
48a0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
48b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d . return 0;.}
48c0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
4910: 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 * ALPN Callback
4920: 66 6f 72 20 53 65 72 76 65 72 73 20 61 6e 64 20 for Servers and
4930: 4e 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 NPN Callback for
4940: 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 Clients --. *.
4950: 2a 09 50 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 *.Perform protoc
4960: 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 ol (http/1.1, h2
4970: 2c 20 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 , h3, etc.) sele
4980: 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a ction for the. *
4990: 09 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 .incoming connec
49a0: 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 tion. Called aft
49b0: 65 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 er Hello and ser
49c0: 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 ver callbacks..
49d0: 2a 09 57 68 65 72 65 20 27 6f 75 74 27 20 69 73 *.Where 'out' is
49e0: 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 selected protoc
49f0: 6f 6c 20 61 6e 64 20 27 69 6e 27 20 69 73 20 74 ol and 'in' is t
4a00: 68 65 20 70 65 65 72 20 61 64 76 65 72 74 69 73 he peer advertis
4a10: 65 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 ed list.. *. * R
4a20: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
4a30: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
4a40: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
4a50: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
4a60: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 d). *. * Return
4a70: 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c codes:. *.SSL_TL
4a80: 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 SEXT_ERR_OK: ALP
4a90: 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 N protocol selec
4aa0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
4ab0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
4ac0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
4ad0: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 _ALERT_FATAL: Th
4ae0: 65 72 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c ere was no overl
4af0: 61 70 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 ap between the c
4b00: 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 lient's. *. s
4b10: 75 70 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 upplied list and
4b20: 20 74 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 the server conf
4b30: 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 iguration. The c
4b40: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 onnection will b
4b50: 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 e aborted.. *.SS
4b60: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
4b70: 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f CK: ALPN protoco
4b80: 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 l not selected,
4b90: 65 2e 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f e.g., because no
4ba0: 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f ALPN. *. pro
4bb0: 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 tocols are confi
4bc0: 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 gured for this c
4bd0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 onnection. The c
4be0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
4bf0: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ues.. *. *------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4c40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 /.static int.ALP
4c50: 4e 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 NCallback(SSL *s
4c60: 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e sl, const unsign
4c70: 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 ed char **out, u
4c80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 nsigned char *ou
4c90: 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 tlen,..const uns
4ca0: 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 igned char *in,
4cb0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c unsigned int inl
4cc0: 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b en, void *arg) {
4cd0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
4ce0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
4cf0: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
4d00: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
4d10: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
4d20: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
4d30: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
4d40: 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 , res;.. dpri
4d50: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
4d60: 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e if (ssl == N
4d70: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 ULL || arg == NU
4d80: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
4d90: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
4da0: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f CK;. }.. /
4db0: 2a 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f * Select protoco
4dc0: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c l */. if (SSL
4dd0: 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f _select_next_pro
4de0: 74 6f 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 to((unsigned cha
4df0: 72 20 2a 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 r **) out, outle
4e00: 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f n, statePtr->pro
4e10: 74 6f 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 tos, statePtr->p
4e20: 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 rotos_len,..in,
4e30: 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 inlen) == OPENSS
4e40: 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 L_NPN_NEGOTIATED
4e50: 29 20 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f ) {../* Match fo
4e60: 75 6e 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 und */..res = SS
4e70: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
4e80: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f . } else {../
4e90: 2a 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f * OPENSSL_NPN_NO
4ea0: 5f 4f 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 _OVERLAP = No ov
4eb0: 65 72 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69 erlap, so use fi
4ec0: 72 73 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c rst item from cl
4ed0: 69 65 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 ient protocol li
4ee0: 73 74 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c st */..res = SSL
4ef0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
4f00: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 K;. }.. if
4f10: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 (statePtr->vcmd
4f20: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
4f30: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 LL) {..return re
4f40: 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a s;. }.. /*
4f50: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 Create command
4f60: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c to eval with fn,
4f70: 20 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 chan, depth, ce
4f80: 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 rt info list, st
4f90: 61 74 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 atus, and error
4fa0: 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 args */. cmdP
4fb0: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
4fc0: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
4fd0: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c vcmd);. Tcl_L
4fe0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
4ff0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
5000: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
5010: 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 gObj("alpn", -1)
5020: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
5030: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
5040: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
5050: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
5060: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 ngObj(Tcl_GetCha
5070: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
5080: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a r->self), -1));.
5090: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
50a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
50b0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
50c0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 _NewStringObj((c
50d0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 2a 6f 75 onst char *) *ou
50e0: 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c t, -1));. Tcl
50f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
5100: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
5110: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f dPtr, Tcl_NewBoo
5120: 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 leanObj(res == S
5130: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
5140: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c ));.. /* Eval
5150: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
5160: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
5170: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
5180: 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 );. if ((code
5190: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 = EvalCallback(
51a0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
51b0: 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 , cmdPtr)) > 1)
51c0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
51d0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
51e0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f } else if (co
51f0: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 de == 1) {..res
5200: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 = SSL_TLSEXT_ERR
5210: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 _OK;. } else
5220: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
5230: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 EXT_ERR_ALERT_FA
5240: 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 TAL;. }. T
5250: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
5260: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 cmdPtr);. ret
5270: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a urn res;.}.../*.
5280: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52c0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 -----. *. * Adve
52d0: 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 rtise Protocols
52e0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 Callback for Nex
52f0: 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 t Protocol Negot
5300: 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 iation (NPN) in
5310: 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 ServerHello --.
5320: 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e *. *.called when
5330: 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e 65 a TLS server ne
5340: 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73 75 eds a list of su
5350: 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c pported protocol
5360: 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 s for Next. *.Pr
5370: 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 otocol Negotiati
5380: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 on.. *. * Result
5390: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
53a0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
53b0: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 *. * Return code
53c0: 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s:. *.SSL_TLSEXT
53d0: 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f _ERR_OK: NPN pro
53e0: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 tocol selected.
53f0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
5400: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c ontinues.. *.SSL
5410: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
5420: 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 K: NPN protocol
5430: 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54 68 not selected. Th
5440: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
5450: 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d tinues.. *. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54a0: 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f . */.#ifdef USE_
54b0: 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e NPN.static int.N
54c0: 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 PNCallback(const
54d0: 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 SSL *ssl, const
54e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
54f0: 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 *out, unsigned i
5500: 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 nt *outlen, void
5510: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 *arg) {. Sta
5520: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
5530: 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 State*)arg;..
5540: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
5550: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c ");.. if (ssl
5560: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 == NULL || arg
5570: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
5580: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
5590: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a R_NOACK;. }..
55a0: 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f /* Set proto
55b0: 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 cols list */.
55c0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
55d0: 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b rotos != NULL) {
55e0: 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 74 ..*out = statePt
55f0: 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 r->protos;..*out
5600: 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d 3e len = statePtr->
5610: 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 protos_len;.
5620: 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d } else {..*out =
5630: 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 NULL;..*outlen
5640: 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c = 0;..return SSL
5650: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
5660: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 K;. }. ret
5670: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
5680: 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a RR_OK;.}.#endif.
5690: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
56a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
56e0: 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f SNI Callback fo
56f0: 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a r Servers --. *.
5700: 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65 *.Perform serve
5710: 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74 6e r-side SNI hostn
5720: 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 ame selection af
5730: 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 53 4e ter receiving SN
5740: 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 I extension. *.i
5750: 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 n Client Hello.
5760: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 6c Called after hel
5770: 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 lo callback but
5780: 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c before ALPN call
5790: 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 back.. *. * Resu
57a0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
57b0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
57c0: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
57d0: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
57e0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
57f0: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es:. *.SSL_TLSEX
5800: 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f T_ERR_OK: SNI ho
5810: 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74 stname is accept
5820: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 ed. The connecti
5830: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
5840: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
5850: 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 ALERT_FATAL: SNI
5860: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 hostname is not
5870: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 accepted. The c
5880: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 onnection. *.
5890: 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66 is aborted. Def
58a0: 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69 ault for alert i
58b0: 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 s SSL_AD_UNRECOG
58c0: 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 NIZED_NAME.. *.S
58d0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
58e0: 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 ERT_WARNING: SNI
58f0: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 hostname is not
5900: 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69 accepted, warni
5910: 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 ng alert. *.
5920: 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 sent (not suppor
5930: 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e ted in TLSv1.3).
5940: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
5950: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
5960: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
5970: 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 CK: SNI hostname
5980: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 is not accepted
5990: 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c and not acknowl
59a0: 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e edged,. *. e.
59b0: 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e 6f g. if SNI has no
59c0: 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 t been configure
59d0: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f d. The connectio
59e0: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a n continues.. *.
59f0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a30: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
5a40: 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b int.SNICallback
5a50: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c (const SSL *ssl,
5a60: 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 int *alert, voi
5a70: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 d *arg) {. St
5a80: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
5a90: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 (State*)arg;.
5aa0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
5ab0: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e erp.= statePtr->
5ac0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f interp;. Tcl_
5ad0: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 Obj *cmdPtr;.
5ae0: 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a int code, res;.
5af0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
5b00: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c servername = NUL
5b10: 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 L;.. dprintf(
5b20: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
5b30: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 if (ssl == NULL
5b40: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 || arg == NULL)
5b50: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
5b60: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
5b70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e }.. /* On
5b80: 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 ly works for TLS
5b90: 20 31 2e 32 20 61 6e 64 20 65 61 72 6c 69 65 72 1.2 and earlier
5ba0: 20 2a 2f 0a 20 20 20 20 73 65 72 76 65 72 6e 61 */. serverna
5bb0: 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 me = SSL_get_ser
5bc0: 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 vername(ssl, TLS
5bd0: 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 EXT_NAMETYPE_hos
5be0: 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 t_name);. if
5bf0: 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 (!servername ||
5c00: 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d servername[0] ==
5c10: 20 27 5c 30 27 29 20 7b 0a 09 72 65 74 75 72 6e '\0') {..return
5c20: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5c30: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 NOACK;. }..
5c40: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
5c50: 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a vcmd == (Tcl_Obj
5c60: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 *)NULL) {..retur
5c70: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
5c80: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 _OK;. }..
5c90: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
5ca0: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 d to eval with f
5cb0: 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 n, chan, and ser
5cc0: 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f ver name args */
5cd0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 . cmdPtr = Tc
5ce0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 l_DuplicateObj(s
5cf0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a tatePtr->vcmd);.
5d00: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
5d10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
5d20: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
5d30: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 _NewStringObj("s
5d40: 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 ni", -1));. T
5d50: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
5d60: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
5d70: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
5d80: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
5d90: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
5da0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
5db0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
5dc0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5dd0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
5de0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
5df0: 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 ngObj(servername
5e00: 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a , -1));.. /*
5e10: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 Eval callback c
5e20: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 ommand */. Tc
5e30: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
5e40: 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 mdPtr);. if (
5e50: 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c (code = EvalCall
5e60: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
5e70: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 tePtr, cmdPtr))
5e80: 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 > 1) {..res = SS
5e90: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 L_TLSEXT_ERR_ALE
5ea0: 52 54 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c RT_WARNING;..*al
5eb0: 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 ert = SSL_AD_UNR
5ec0: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 ECOGNIZED_NAME;
5ed0: 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 /* Not supported
5ee0: 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 by TLS 1.3 */.
5ef0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f } else if (co
5f00: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 de == 1) {..res
5f10: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 = SSL_TLSEXT_ERR
5f20: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 _OK;. } else
5f30: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
5f40: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 EXT_ERR_ALERT_FA
5f50: 54 41 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 TAL;..*alert = S
5f60: 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a SL_AD_UNRECOGNIZ
5f70: 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 ED_NAME; /* Not
5f80: 73 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 supported by TLS
5f90: 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 1.3 */. }.
5fa0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
5fb0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
5fc0: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a return res;.}...
5fd0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
5fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6010: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
6020: 6c 69 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 lientHello Hands
6030: 68 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f hake Callback fo
6040: 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a r Servers --. *.
6050: 20 2a 09 55 73 65 64 20 62 79 20 73 65 72 76 65 *.Used by serve
6060: 72 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 r to examine the
6070: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 server name ind
6080: 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 ication (SNI) ex
6090: 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 tension. *.provi
60a0: 64 65 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e ded by the clien
60b0: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 t in order to se
60c0: 6c 65 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69 lect an appropri
60d0: 61 74 65 20 63 65 72 74 69 66 69 63 61 74 65 20 ate certificate
60e0: 74 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 to. *.present, a
60f0: 6e 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f nd make other co
6100: 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 nfiguration adju
6110: 73 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 stments relevant
6120: 20 74 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a to that server.
6130: 20 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 *.name and its
6140: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 configuration. T
6150: 68 69 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61 his includes swa
6160: 70 70 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73 pping out the as
6170: 73 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f sociated. *.SSL_
6180: 43 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 CTX pointer, mod
6190: 69 66 79 69 6e 67 20 74 68 65 20 73 65 72 76 65 ifying the serve
61a0: 72 27 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d r's list of perm
61b0: 69 74 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f itted TLS versio
61c0: 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 ns,. *.changing
61d0: 74 68 65 20 73 65 72 76 65 72 27 73 20 63 69 70 the server's cip
61e0: 68 65 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70 her list in resp
61f0: 6f 6e 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65 onse to the clie
6200: 6e 74 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 nt's cipher list
6210: 2c 20 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 , etc.. *.Called
6220: 20 62 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 before SNI and
6230: 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a ALPN callbacks..
6240: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
6250: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
6260: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 e effects:. *.Ca
6270: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 lls callback (if
6280: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 defined). *. *
6290: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a Return codes:. *
62a0: 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c .SSL_CLIENT_HELL
62b0: 4f 5f 52 45 54 52 59 3a 20 73 75 73 70 65 6e 64 O_RETRY: suspend
62c0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 the handshake,
62d0: 61 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b and the handshak
62e0: 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 e function will
62f0: 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 return immediate
6300: 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 ly. *.SSL_CLIENT
6310: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 _HELLO_ERROR: fa
6320: 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 ilure, terminate
6330: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 connection. Set
6340: 20 61 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20 alert to error
6350: 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 code.. *.SSL_CLI
6360: 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 ENT_HELLO_SUCCES
6370: 53 3a 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a S: success. *. *
6380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
63a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
63b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
63c0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
63d0: 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b nt.HelloCallback
63e0: 28 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a (SSL *ssl, int *
63f0: 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 alert, void *arg
6400: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
6410: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
6420: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 *)arg;. Tcl_I
6430: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
6440: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
6450: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
6460: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 mdPtr;. int c
6470: 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f ode, res;. co
6480: 6e 73 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 nst char *server
6490: 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 name;. const
64a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 unsigned char *p
64b0: 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e ;. size_t len
64c0: 2c 20 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 , remaining;..
64d0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
64e0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
64f0: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 atePtr->vcmd ==
6500: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 (Tcl_Obj*)NULL)
6510: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c {..return SSL_CL
6520: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 IENT_HELLO_SUCCE
6530: 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 SS;. } else i
6540: 66 20 28 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 f (ssl == (const
6550: 20 53 53 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 SSL *)NULL || a
6560: 72 67 20 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 rg == (void *)NU
6570: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
6580: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
6590: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
65a0: 20 2f 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f /* Get names */
65b0: 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c . if (!SSL_cl
65c0: 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f ient_hello_get0_
65d0: 65 78 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f ext(ssl, TLSEXT_
65e0: 54 59 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 TYPE_server_name
65f0: 2c 20 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 , &p, &remaining
6600: 29 20 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c ) || remaining <
6610: 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d = 2) {..*alert =
6620: 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 SSL_R_SSLV3_ALE
6630: 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d RT_ILLEGAL_PARAM
6640: 45 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 ETER;..return SS
6650: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
6660: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
6670: 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 /* Extract the
6680: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75 length of the su
6690: 70 70 6c 69 65 64 20 6c 69 73 74 20 6f 66 20 6e pplied list of n
66a0: 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e ames. */. len
66b0: 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 = (*(p++) << 8)
66c0: 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 ;. len += *(p
66d0: 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e ++);. if (len
66e0: 20 2b 20 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e + 2 != remainin
66f0: 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 g) {..*alert = S
6700: 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 SL_R_SSLV3_ALERT
6710: 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 _ILLEGAL_PARAMET
6720: 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ER;..return SSL_
6730: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
6740: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 OR;. }. re
6750: 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a maining = len;..
6760: 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 /* The list
6770: 69 6e 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 in practice only
6780: 20 68 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c has a single el
6790: 65 6d 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c ement, so we onl
67a0: 79 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 y consider the f
67b0: 69 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 irst one. */.
67c0: 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d if (remaining =
67d0: 3d 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 = 0 || *p++ != T
67e0: 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 LSEXT_NAMETYPE_h
67f0: 6f 73 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c ost_name) {..*al
6800: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 ert = SSL_R_TLSV
6810: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 1_ALERT_INTERNAL
6820: 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 _ERROR;..return
6830: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
6840: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
6850: 20 20 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a remaining--;..
6860: 20 20 20 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 /* Now we ca
6870: 6e 20 66 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f n finally pull o
6880: 75 74 20 74 68 65 20 62 79 74 65 20 61 72 72 61 ut the byte arra
6890: 79 20 77 69 74 68 20 74 68 65 20 61 63 74 75 61 y with the actua
68a0: 6c 20 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 l hostname. */.
68b0: 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 if (remaining
68c0: 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 <= 2) {..*alert
68d0: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
68e0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
68f0: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c ROR;..return SSL
6900: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
6910: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c ROR;. }. l
6920: 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 en = (*(p++) <<
6930: 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 8);. len += *
6940: 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c (p++);. if (l
6950: 65 6e 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 en + 2 > remaini
6960: 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 ng) {..*alert =
6970: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
6980: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 T_INTERNAL_ERROR
6990: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
69a0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
69b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 ;. }. rema
69c0: 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 ining = len;.
69d0: 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 servername = (c
69e0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a onst char *)p;..
69f0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f /* Create co
6a00: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 mmand to eval wi
6a10: 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 th fn, chan, and
6a20: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 61 72 67 server name arg
6a30: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 s */. cmdPtr
6a40: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
6a50: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d bj(statePtr->vcm
6a60: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 d);. Tcl_List
6a70: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
6a80: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
6a90: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
6aa0: 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b j("hello", -1));
6ab0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
6ac0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
6ad0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
6ae0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
6af0: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e Obj(Tcl_GetChann
6b00: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
6b10: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 >self), -1));.
6b20: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
6b30: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
6b40: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
6b50: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 ewStringObj(serv
6b60: 65 72 6e 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a ername, (Tcl_Siz
6b70: 65 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f e) len));.. /
6b80: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
6b90: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
6ba0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
6bb0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 cmdPtr);. if
6bc0: 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c ((code = EvalCal
6bd0: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
6be0: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 atePtr, cmdPtr))
6bf0: 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 > 1) {..res = S
6c00: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
6c10: 52 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d RETRY;..*alert =
6c20: 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 SSL_R_TLSV1_ALE
6c30: 52 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 RT_USER_CANCELLE
6c40: 44 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 D;. } else if
6c50: 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 (code == 1) {..
6c60: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 res = SSL_CLIENT
6c70: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a _HELLO_SUCCESS;.
6c80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 } else {..re
6c90: 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 s = SSL_CLIENT_H
6ca0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c ELLO_ERROR;..*al
6cb0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 ert = SSL_R_TLSV
6cc0: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 1_ALERT_INTERNAL
6cd0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
6ce0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
6cf0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
6d00: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a return res;.}...
6d10: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
6d20: 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e *****/./* Comman
6d30: 64 73 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a ds */./*
6d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6d50: 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ***/../*. *-----
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
6da0: 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 *. * CiphersObjC
6db0: 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c md -- list avail
6dc0: 61 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a able ciphers. *.
6dd0: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
6de0: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 e is invoked to
6df0: 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 process the "tls
6e00: 3a 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 ::ciphers" comma
6e10: 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 nd. *.to list av
6e20: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c ailable ciphers,
6e30: 20 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 based upon prot
6e40: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 ocol selected..
6e50: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
6e60: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
6e70: 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a result list.. *.
6e80: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
6e90: 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 . *.constructs a
6ea0: 6e 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 nd destroys SSL
6eb0: 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a context (CTX). *
6ec0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f00: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
6f10: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 c const char *pr
6f20: 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 otocols[] = {.."
6f30: 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 ssl2", "ssl3", "
6f40: 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c tls1", "tls1.1",
6f50: 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 "tls1.2", "tls1
6f60: 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 .3", NULL.};.enu
6f70: 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 m protocol {.
6f80: 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 TLS_SSL2, TLS_S
6f90: 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 SL3, TLS_TLS1, T
6fa0: 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 LS_TLS1_1, TLS_T
6fb0: 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f LS1_2, TLS_TLS1_
6fc0: 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 3, TLS_NONE.};..
6fd0: 73 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 static int.Ciphe
6fe0: 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 rsObjCmd(ClientD
6ff0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
7000: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
7010: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
7020: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
7030: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f v[]) {. Tcl_O
7040: 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c bj *objPtr = NUL
7050: 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a L;. SSL_CTX *
7060: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ctx = NULL;.
7070: 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b SSL *ssl = NULL;
7080: 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 . STACK_OF(SS
7090: 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 L_CIPHER) *sk;.
70a0: 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 char *cp, buf
70b0: 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e [BUFSIZ];. in
70c0: 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 t index, verbose
70d0: 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 = 0, use_suppor
70e0: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e ted = 0;. con
70f0: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d st SSL_METHOD *m
7100: 65 74 68 6f 64 3b 0a 20 20 20 20 28 76 6f 69 64 ethod;. (void
7110: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
7120: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
7130: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 ed");.. if ((
7140: 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62 objc < 2) || (ob
7150: 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f jc > 4)) {..Tcl_
7160: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
7170: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70 erp, 1, objv, "p
7180: 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65 rotocol ?verbose
7190: 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29 3b ? ?supported?");
71a0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
71b0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
71c0: 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 (Tcl_GetIndexFr
71d0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
71e0: 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 jv[1], protocols
71f0: 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c , "protocol", 0,
7200: 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f &index) != TCL_
7210: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
7220: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
7230: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 32 if ((objc > 2
7240: 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c ) && Tcl_GetBool
7250: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 eanFromObj(inter
7260: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72 p, objv[2], &ver
7270: 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 bose) != TCL_OK)
7280: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
7290: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
72a0: 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20 26 if ((objc > 3) &
72b0: 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e & Tcl_GetBoolean
72c0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
72d0: 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 75 objv[3], &use_su
72e0: 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c 5f pported) != TCL_
72f0: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
7300: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
7310: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
7320: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69 74 ror();.. swit
7330: 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 ch ((enum protoc
7340: 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 73 ol)index) {..cas
7350: 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 e TLS_SSL2:.#if
7360: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
7370: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 NUMBER >= 0x1010
7380: 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 0000L || defined
7390: 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 (NO_SSL2) || def
73a0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
73b0: 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f 41 SSL2).. Tcl_A
73c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
73d0: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e rp, protocols[in
73e0: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f dex], ": protoco
73f0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
7400: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
7410: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
7420: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
7430: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c method = SSL
7440: 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 v2_method(); bre
7450: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 ak;.#endif..case
7460: 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 TLS_SSL3:.#if d
7470: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 efined(NO_SSL3)
7480: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
7490: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 SL_NO_SSL3) || d
74a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
74b0: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 O_SSL3_METHOD)..
74c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
74d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
74e0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
74f0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
7500: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
7510: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
7520: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7530: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 ;.#else.. met
7540: 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 hod = SSLv3_meth
7550: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e od(); break;.#en
7560: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c dif..case TLS_TL
7570: 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 S1:.#if defined(
7580: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 NO_TLS1) || defi
7590: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
75a0: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
75b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
75c0: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c METHOD).. Tcl
75d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
75e0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
75f0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
7600: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
7610: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
7620: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
7630: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
7640: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 .. method = T
7650: 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 LSv1_method(); b
7660: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 reak;.#endif..ca
7670: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 se TLS_TLS1_1:.#
7680: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
7690: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_1) || defined
76a0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
76b0: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
76c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
76d0: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 _METHOD).. Tc
76e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
76f0: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
7700: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
7710: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
7720: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ed", (char *) NU
7730: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e LL);.. return
7740: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 TCL_ERROR;.#els
7750: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 e.. method =
7760: 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 TLSv1_1_method()
7770: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ; break;.#endif.
7780: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 .case TLS_TLS1_2
7790: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f :.#if defined(NO
77a0: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
77b0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
77c0: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
77d0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
77e0: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 1_2_METHOD)..
77f0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
7800: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
7810: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
7820: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
7830: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
7840: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
7850: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
7860: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 else.. method
7870: 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f = TLSv1_2_metho
7880: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 d(); break;.#end
7890: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 if..case TLS_TLS
78a0: 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 1_3:.#if defined
78b0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 (NO_TLS1_3) || d
78c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
78d0: 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 54 O_TLS1_3).. T
78e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
78f0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
7900: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
7910: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
7920: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ted", (char *) N
7930: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ULL);.. retur
7940: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c n TCL_ERROR;.#el
7950: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d se.. method =
7960: 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 TLS_method();..
7970: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
7980: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f min_proto_versio
7990: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
79a0: 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c RSION);.. SSL
79b0: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f _CTX_set_max_pro
79c0: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 to_version(ctx,
79d0: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b TLS1_3_VERSION);
79e0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e .. break;.#en
79f0: 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 dif..default:..
7a00: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f method = TLS_
7a10: 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 62 method();.. b
7a20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 reak;. }..
7a30: 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e ctx = SSL_CTX_n
7a40: 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 ew(method);.
7a50: 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 if (ctx == NULL)
7a60: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
7a70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 45 54 sult(interp, GET
7a80: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
7a90: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
7aa0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7ab0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c ;. }.. ssl
7ac0: 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b = SSL_new(ctx);
7ad0: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 . if (ssl ==
7ae0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
7af0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
7b00: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
7b10: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
7b20: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
7b30: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
7b40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
7b50: 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 .. /* Use lis
7b60: 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 20 77 t and order as w
7b70: 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 6e 20 ould be sent in
7b80: 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 a ClientHello or
7b90: 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 all available c
7ba0: 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 iphers */. if
7bb0: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 (use_supported)
7bc0: 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 {..sk = SSL_get
7bd0: 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 70 68 1_supported_ciph
7be0: 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 ers(ssl);. }
7bf0: 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c else {..sk = SSL
7c00: 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 73 6c _get_ciphers(ssl
7c10: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 );. }.. if
7c20: 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (sk != NULL) {.
7c30: 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b .if (!verbose) {
7c40: 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
7c50: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
7c60: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 NULL);.. for
7c70: 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c (int i = 0; i <
7c80: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e sk_SSL_CIPHER_n
7c90: 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 um(sk); i++) {..
7ca0: 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 .const SSL_CIPHE
7cb0: 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 R *c = sk_SSL_CI
7cc0: 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 PHER_value(sk, i
7cd0: 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 );...if (c == NU
7ce0: 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 LL) continue;...
7cf0: 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d 65 20 ./* cipher name
7d00: 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 or (NONE) */...c
7d10: 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 p = SSL_CIPHER_g
7d20: 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 et_name(c);...if
7d30: 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 (cp == NULL) br
7d40: 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f eak;...Tcl_ListO
7d50: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
7d60: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
7d70: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
7d80: 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 (cp, -1));..
7d90: 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 }...} else {..
7da0: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
7db0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 ewStringObj("",0
7dc0: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 );.. for (int
7dd0: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 i = 0; i < sk_S
7de0: 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b SL_CIPHER_num(sk
7df0: 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 ); i++) {...cons
7e00: 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 t SSL_CIPHER *c
7e10: 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f = sk_SSL_CIPHER_
7e20: 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 value(sk, i);...
7e30: 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 if (c == NULL) c
7e40: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 ontinue;..../* t
7e50: 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 extual descripti
7e60: 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 on of the cipher
7e70: 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 */...if (SSL_CI
7e80: 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e PHER_description
7e90: 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 (c, buf, sizeof(
7ea0: 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b buf)) != NULL) {
7eb0: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ... Tcl_Appen
7ec0: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 dToObj(objPtr, b
7ed0: 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 uf, (Tcl_Size) s
7ee0: 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d trlen(buf));...}
7ef0: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 else {... Tc
7f00: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 l_AppendToObj(ob
7f10: 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e jPtr, "UNKNOWN\n
7f20: 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 ", 8);...}..
7f30: 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 }..}..if (use_su
7f40: 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20 pported) {..
7f50: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 sk_SSL_CIPHER_fr
7f60: 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d ee(sk);..}. }
7f70: 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 . SSL_free(ss
7f80: 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f l);. SSL_CTX_
7f90: 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 free(ctx);..
7fa0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
7fb0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
7fc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
7fd0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8020: 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c -. *. * Protocol
8030: 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 sObjCmd -- list
8040: 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 available protoc
8050: 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 ols. *. *.This p
8060: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
8070: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 ked to process t
8080: 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f he "tls::protoco
8090: 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 ls" command. *.t
80a0: 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 o list available
80b0: 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 protocols.. *.
80c0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
80d0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
80e0: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 ult list.. *. *
80f0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
8100: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d .none. *. *-----
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
8150: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72 */.static int.Pr
8160: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c otocolsObjCmd(Cl
8170: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
8180: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
8190: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
81a0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
81b0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
81c0: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b Tcl_Obj *objPtr;
81d0: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 . (void) clie
81e0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 ntData;.. dpr
81f0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
8200: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
8210: 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 1) {..Tcl_Wrong
8220: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
8230: 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 1, objv, "");..r
8240: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8250: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
8260: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
8270: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
8280: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
8290: 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 ULL);..#if OPENS
82a0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
82b0: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 R < 0x10100000L
82c0: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 && !defined(NO_S
82d0: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL2) && !defined
82e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
82f0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
8300: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
8310: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
8320: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
8330: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 protocols[TLS_SS
8340: 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 L2], -1));.#endi
8350: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
8360: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
8370: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
8380: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
8390: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
83a0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c _METHOD). Tcl
83b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
83c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
83d0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
83e0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
83f0: 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 [TLS_SSL3], -1))
8400: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
8410: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 fined(NO_TLS1) &
8420: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
8430: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 SL_NO_TLS1) && !
8440: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
8450: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a NO_TLS1_METHOD).
8460: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
8470: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
8480: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
8490: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
84a0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 otocols[TLS_TLS1
84b0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
84c0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
84d0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
84e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
84f0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
8500: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
8510: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_1_METHOD).
8520: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
8530: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
8540: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
8550: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
8560: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d cols[TLS_TLS1_1]
8570: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
8580: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
8590: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
85a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
85b0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
85c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
85d0: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_2_METHOD).
85e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
85f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
8600: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
8610: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 StringObj(protoc
8620: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c ols[TLS_TLS1_2],
8630: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 -1));.#endif.#i
8640: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
8650: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 S1_3) && !define
8660: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
8670: 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1_3). Tcl_Lis
8680: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
8690: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
86a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
86b0: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
86c0: 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a _TLS1_3], -1));.
86d0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f #endif.. Tcl_
86e0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
86f0: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
8700: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
8710: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
8720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
8760: 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a . * HandshakeObj
8770: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
8780: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 s command is use
8790: 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74 d to verify whet
87a0: 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b her the handshak
87b0: 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a e is complete. *
87c0: 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 .or not.. *. * R
87d0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
87e0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
87f0: 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 . 1 means handsh
8800: 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 ake complete, 0
8810: 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 means pending..
8820: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
8830: 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 s:. *.May force
8840: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 SSL negotiation
8850: 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 to take place..
8860: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
88b0: 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 ic int Handshake
88c0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
88d0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
88e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
88f0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
8900: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
8910: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
8920: 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 nnel chan;
8930: 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c /* The channel
8940: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f to set a mode o
8950: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 n. */. State
8960: 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20 *statePtr;
8970: 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 /* client stat
8980: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 e for ssl socket
8990: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 */. const ch
89a0: 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c ar *errStr = NUL
89b0: 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d L;. int ret =
89c0: 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 1;. int err
89d0: 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 = 0;. (void)
89e0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
89f0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
8a00: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ");.. if (obj
8a10: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
8a20: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
8a30: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
8a40: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
8a50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
8a60: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
8a70: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 _error();.. c
8a80: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
8a90: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c nnel(interp, Tcl
8aa0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
8ab0: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 1]), NULL);.
8ac0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
8ad0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
8ae0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
8af0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
8b00: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
8b10: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
8b20: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
8b30: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
8b40: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
8b50: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 han);. if (Tc
8b60: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
8b70: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
8b80: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
8b90: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
8ba0: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
8bb0: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
8bc0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
8bd0: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e an),.. "\": n
8be0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
8bf0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
8c00: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 );..Tcl_SetError
8c10: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
8c20: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c S", "HANDSHAKE",
8c30: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
8c40: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
8c50: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
8c60: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
8c70: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
8c80: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 State *)Tcl_GetC
8c90: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
8ca0: 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 ta(chan);.. d
8cb0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 printf("Calling
8cc0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
8cd0: 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 ct");. ret =
8ce0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
8cf0: 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 ct(statePtr, &er
8d00: 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e r, 1);. dprin
8d10: 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 tf("Tls_WaitForC
8d20: 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a onnect returned:
8d30: 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 %i", ret);..
8d40: 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 20 if (ret < 0 &&
8d50: 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ((statePtr->flag
8d60: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e s & TLS_TCL_ASYN
8d70: 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41 C) && (err == EA
8d80: 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e GAIN))) {..dprin
8d90: 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e tf("Async set an
8da0: 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29 d err = EAGAIN")
8db0: 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 ;..ret = 0;.
8dc0: 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c } else if (ret <
8dd0: 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 75 0) {..long resu
8de0: 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 73 74 lt;..errStr = st
8df0: 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 atePtr->err;..Tc
8e00: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e l_ResetResult(in
8e10: 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 terp);..Tcl_SetE
8e20: 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 rrno(err);...if
8e30: 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 (!errStr || (*er
8e40: 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 rStr == 0)) {..
8e50: 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f errStr = Tcl_
8e60: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 PosixError(inter
8e70: 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 p);..}...Tcl_App
8e80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
8e90: 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69 , "handshake fai
8ea0: 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 led: ", errStr,
8eb0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
8ec0: 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d 20 53 .if ((result = S
8ed0: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 SL_get_verify_re
8ee0: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 sult(statePtr->s
8ef0: 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f sl)) != X509_V_O
8f00: 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 K) {.. Tcl_Ap
8f10: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
8f20: 70 2c 20 22 20 64 75 65 20 74 6f 20 5c 22 22 2c p, " due to \"",
8f30: 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 X509_verify_cer
8f40: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72 t_error_string(r
8f50: 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c 20 28 63 esult), "\"", (c
8f60: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d har *) NULL);..}
8f70: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f ..Tcl_SetErrorCo
8f80: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
8f90: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 , "HANDSHAKE", "
8fa0: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
8fb0: 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 ) NULL);..dprint
8fc0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c f("Returning TCL
8fd0: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 _ERROR with hand
8fe0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 shake failed: %s
8ff0: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 ", errStr);..ret
9000: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
9010: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
9020: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 (err != 0) {..
9030: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 dprintf("Got a
9040: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 n error with a c
9050: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 ompleted handsha
9060: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 ke: err = %i", e
9070: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 rr);..}..ret = 1
9080: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
9090: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 intf("Returning
90a0: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 TCL_OK with data
90b0: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a \"%i\"", ret);.
90c0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
90d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
90e0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 _NewIntObj(ret))
90f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
9100: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d _OK;.}../*. *---
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9150: 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a . *. * ImportObj
9160: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
9170: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
9180: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
9190: 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d s the "ssl" comm
91a0: 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 and. *. *.The ss
91b0: 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 l command pushes
91c0: 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 SSL over a (new
91d0: 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 ly connected) tc
91e0: 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 p socket. *. * R
91f0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
9200: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
9210: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
9220: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 ects:. *.May mod
9230: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 ify the behavior
9240: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 of an IO channe
9250: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d l.. *. *--------
9260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
92a0: 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 static int.Impor
92b0: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 tObjCmd(ClientDa
92c0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
92d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
92e0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
92f0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
9300: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 []) {. Tcl_Ch
9310: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 annel chan;../*
9320: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 The channel to s
9330: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f et a mode on. */
9340: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
9350: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 ePtr;../* client
9360: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 state for ssl s
9370: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c ocket */. SSL
9380: 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 4c _CTX *ctx..= NUL
9390: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a L;. Tcl_Obj *
93a0: 73 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b 0a script..= NULL;.
93b0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 Tcl_Obj *pas
93c0: 73 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 sword..= NULL;.
93d0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 Tcl_Obj *vcmd
93e0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 ..= NULL;. Tc
93f0: 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 l_DString upperC
9400: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
9410: 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 n, upperChannelB
9420: 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 locking, upperCh
9430: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 annelEncoding, u
9440: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
9450: 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 3b ar;. int idx;
9460: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 . Tcl_Size le
9470: 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 n;. int flags
9480: 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 ...= TLS_TCL_INI
9490: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 T;. int serve
94a0: 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63 r...= 0;./* is c
94b0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 onnection incomi
94c0: 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 ng or outgoing?
94d0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 */. char *key
94e0: 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 file..= NULL;.
94f0: 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 char *certfile
9500: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e ..= NULL;. un
9510: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 signed char *key
9520: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 ..= NULL;. Tc
9530: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 09 l_Size key_len..
9540: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 = 0;. unsigne
9550: 64 20 63 68 61 72 20 2a 63 65 72 74 09 09 3d 20 d char *cert..=
9560: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 NULL;. Tcl_Si
9570: 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20 30 ze cert_len..= 0
9580: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 ;. char *ciph
9590: 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ers..= NULL;.
95a0: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 char *ciphersui
95b0: 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 tes..= NULL;.
95c0: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 09 3d char *CAfile..=
95d0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
95e0: 2a 43 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c 3b *CApath..= NULL;
95f0: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72 . char *DHpar
9600: 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ams..= NULL;.
9610: 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09 3d char *model...=
9620: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
9630: 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 4e *servername..= N
9640: 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 ULL;./* hostname
9650: 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 for Server Name
9660: 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 Indication */.
9670: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 const unsigne
9680: 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f d char *session_
9690: 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 id = NULL;. T
96a0: 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 cl_Obj *alpn..=
96b0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 NULL;. int ss
96c0: 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 l2 = 0, ssl3 = 0
96d0: 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d ;. int tls1 =
96e0: 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 1, tls1_1 = 1,
96f0: 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 tls1_2 = 1, tls1
9700: 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 _3 = 1;. int
9710: 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c proto = 0, level
9720: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 = -1;. int v
9730: 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 erify = 0, requi
9740: 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 re = 0, request
9750: 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 = 1, post_handsh
9760: 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f ake = 0;. (vo
9770: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a id) clientData;.
9780: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
9790: 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 lled");..#if def
97a0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c ined(NO_TLS1) ||
97b0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
97c0: 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c _NO_TLS1). tl
97d0: 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 s1 = 0;.#endif.#
97e0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
97f0: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_1) || defined
9800: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
9810: 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d _1). tls1_1 =
9820: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 0;.#endif.#if d
9830: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
9840: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
9850: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a NSSL_NO_TLS1_2).
9860: 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a tls1_2 = 0;.
9870: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
9880: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c ed(NO_TLS1_3) ||
9890: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
98a0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
98b0: 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 tls1_3 = 0;.#end
98c0: 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 if.. if (objc
98d0: 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f < 2) {..Tcl_Wro
98e0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
98f0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
9900: 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b nel ?options?");
9910: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
9920: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 OR;. }.. E
9930: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
9940: 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 ;.. chan = Tc
9950: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
9960: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 erp, Tcl_GetStri
9970: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c ng(objv[1]), NUL
9980: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e L);. if (chan
9990: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
99a0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
99b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
99c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 }.. /* Make
99d0: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
99e0: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
99f0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
9a00: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
9a10: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 hannel(chan);..
9a20: 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b for (idx = 2;
9a30: 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 idx < objc; idx
9a40: 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 ++) {..char *opt
9a50: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
9a60: 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a 0a 09 69 (objv[idx]);...i
9a70: 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 f (opt[0] != '-'
9a80: 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 ).. break;...
9a90: 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 OPTOBJ("-alpn",
9aa0: 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 alpn);..OPTSTR("
9ab0: 2d 63 61 64 69 72 22 2c 20 43 41 70 61 74 68 29 -cadir", CApath)
9ac0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66 69 ;..OPTSTR("-cafi
9ad0: 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f le", CAfile);..O
9ae0: 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 PTBYTE("-cert",
9af0: 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b cert, cert_len);
9b00: 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66 ..OPTSTR("-certf
9b10: 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b ile", certfile);
9b20: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 ..OPTSTR("-ciphe
9b30: 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f r", ciphers);..O
9b40: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 22 PTSTR("-ciphers"
9b50: 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 , ciphers);..OPT
9b60: 53 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 74 STR("-ciphersuit
9b70: 65 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 65 es", ciphersuite
9b80: 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f s);..OPTOBJ("-co
9b90: 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b mmand", script);
9ba0: 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72 ..OPTSTR("-dhpar
9bb0: 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b ams", DHparams);
9bc0: 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 ..OPTBYTE("-key"
9bd0: 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b , key, key_len);
9be0: 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69 ..OPTSTR("-keyfi
9bf0: 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 le", keyfile);..
9c00: 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c OPTSTR("-model",
9c10: 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a model);..OPTOBJ
9c20: 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 ("-password", pa
9c30: 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f ssword);..OPTBOO
9c40: 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 L("-post_handsha
9c50: 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 ke", post_handsh
9c60: 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 ake);..OPTBOOL("
9c70: 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 65 -request", reque
9c80: 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d st);..OPTBOOL("-
9c90: 72 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 72 require", requir
9ca0: 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 e);..OPTINT("-se
9cb0: 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 6c curity_level", l
9cc0: 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 evel);..OPTBOOL(
9cd0: 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76 65 "-server", serve
9ce0: 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 r);..OPTSTR("-se
9cf0: 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 rvername", serve
9d00: 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 rname);..OPTSTR(
9d10: 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 "-session_id", s
9d20: 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 ession_id);..OPT
9d30: 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 BOOL("-ssl2", ss
9d40: 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d l2);..OPTBOOL("-
9d50: 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f ssl3", ssl3);..O
9d60: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 PTBOOL("-tls1",
9d70: 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 tls1);..OPTBOOL(
9d80: 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f "-tls1.1", tls1_
9d90: 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 1);..OPTBOOL("-t
9da0: 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b ls1.2", tls1_2);
9db0: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 ..OPTBOOL("-tls1
9dc0: 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f .3", tls1_3);..O
9dd0: 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 65 PTOBJ("-validate
9de0: 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b command", vcmd);
9df0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22 ..OPTOBJ("-vcmd"
9e00: 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 , vcmd);...OPTBA
9e10: 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c D("option", "-al
9e20: 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 pn, -cadir, -caf
9e30: 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72 ile, -cert, -cer
9e40: 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 tfile, -cipher,
9e50: 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 2d -ciphersuites, -
9e60: 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61 command, -dhpara
9e70: 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 ms, -key, -keyfi
9e80: 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 le, -model, -pas
9e90: 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61 6e sword, -post_han
9ea0: 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65 73 74 dshake, -request
9eb0: 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73 65 63 , -require, -sec
9ec0: 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 2d 73 65 urity_level, -se
9ed0: 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d rver, -servernam
9ee0: 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 e, -session_id,
9ef0: 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 -ssl2, -ssl3, -t
9f00: 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 ls1, -tls1.1, -t
9f10: 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c 20 ls1.2, -tls1.3,
9f20: 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d or -validatecomm
9f30: 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 and");...return
9f40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
9f50: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 . if (request
9f60: 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c )..verify |= SSL
9f70: 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f _VERIFY_CLIENT_O
9f80: 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 NCE | SSL_VERIFY
9f90: 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28 72 _PEER;. if (r
9fa0: 65 71 75 65 73 74 20 26 26 20 72 65 71 75 69 72 equest && requir
9fb0: 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c e).verify |= SSL
9fc0: 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f _VERIFY_FAIL_IF_
9fd0: 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 NO_PEER_CERT;.
9fe0: 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26 if (request &&
9ff0: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 post_handshake)
a000: 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 .verify |= SSL_V
a010: 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 ERIFY_POST_HANDS
a020: 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 76 65 HAKE;. if (ve
a030: 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65 72 69 rify == 0)..veri
a040: 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f fy = SSL_VERIFY_
a050: 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f NONE;.. proto
a060: 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f |= (ssl2 ? TLS_
a070: 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b PROTO_SSL2 : 0);
a080: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 . proto |= (s
a090: 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f sl3 ? TLS_PROTO_
a0a0: 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 SSL3 : 0);. p
a0b0: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 roto |= (tls1 ?
a0c0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a TLS_PROTO_TLS1 :
a0d0: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 0);. proto |
a0e0: 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f = (tls1_1 ? TLS_
a0f0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 PROTO_TLS1_1 : 0
a100: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 );. proto |=
a110: 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 (tls1_2 ? TLS_PR
a120: 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b OTO_TLS1_2 : 0);
a130: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 . proto |= (t
a140: 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 ls1_3 ? TLS_PROT
a150: 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a O_TLS1_3 : 0);..
a160: 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 /* reset to
a170: 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 NULL if blank st
a180: 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a 2f ring provided */
a190: 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 26 26 . if (cert &&
a1a0: 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 20 20 !*cert)..
a1b0: 20 20 63 65 72 74 09 20 20 20 20 20 20 20 20 3d cert. =
a1c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b NULL;. if (k
a1d0: 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20 20 ey && !*key)..
a1e0: 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 20 20 key.
a1f0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
a200: 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 21 2a (certfile && !*
a210: 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 20 20 certfile)
a220: 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c certfile.= NUL
a230: 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66 69 L;. if (keyfi
a240: 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 le && !*keyfile)
a250: 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 ..keyfile.
a260: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
a270: 20 28 63 69 70 68 65 72 73 20 26 26 20 21 2a 63 (ciphers && !*c
a280: 69 70 68 65 72 73 29 09 20 20 20 20 20 20 20 20 iphers).
a290: 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 20 ciphers.
a2a0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
a2b0: 63 69 70 68 65 72 73 75 69 74 65 73 20 26 26 20 ciphersuites &&
a2c0: 21 2a 63 69 70 68 65 72 73 75 69 74 65 73 29 20 !*ciphersuites)
a2d0: 63 69 70 68 65 72 73 75 69 74 65 73 20 20 20 20 ciphersuites
a2e0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
a2f0: 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66 69 CAfile && !*CAfi
a300: 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 66 69 le). CAfi
a310: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c le. = NUL
a320: 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 70 61 74 L;. if (CApat
a330: 68 20 26 26 20 21 2a 43 41 70 61 74 68 29 09 20 h && !*CApath).
a340: 20 20 20 20 20 20 20 43 41 70 61 74 68 09 20 20 CApath.
a350: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
a360: 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 if (DHparams &
a370: 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 & !*DHparams).
a380: 20 20 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 DHparams
a390: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 = NULL;..
a3a0: 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 /* new SSL st
a3b0: 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 ate */. state
a3c0: 50 74 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 Ptr..= (State *)
a3d0: 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e ckalloc((unsign
a3e0: 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 ed) sizeof(State
a3f0: 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 ));. memset(s
a400: 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 tatePtr, 0, size
a410: 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 of(State));..
a420: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 statePtr->flags
a430: 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 .= flags;. st
a440: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d atePtr->interp.=
a450: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 interp;. sta
a460: 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 tePtr->vflags.=
a470: 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 verify;. stat
a480: 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a ePtr->err.= "";.
a490: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 . /* allocate
a4a0: 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 script */. i
a4b0: 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 f (script) {..(v
a4c0: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 oid) Tcl_GetStri
a4d0: 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 ngFromObj(script
a4e0: 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 , &len);..if (le
a4f0: 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 n) {.. stateP
a500: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 tr->callback = s
a510: 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f cript;.. Tcl_
a520: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 IncrRefCount(sta
a530: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
a540: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
a550: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 /* allocate pass
a560: 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 word */. if (
a570: 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f password) {..(vo
a580: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e id) Tcl_GetStrin
a590: 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 gFromObj(passwor
a5a0: 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c d, &len);..if (l
a5b0: 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 en) {.. state
a5c0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 Ptr->password =
a5d0: 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 password;.. T
a5e0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
a5f0: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
a600: 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 rd);..}. }..
a610: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 /* allocate v
a620: 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 alidate command
a630: 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 */. if (vcmd)
a640: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 {..(void) Tcl_G
a650: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
a660: 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 vcmd, &len);..if
a670: 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 (len) {.. st
a680: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 atePtr->vcmd = v
a690: 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e cmd;.. Tcl_In
a6a0: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
a6b0: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 Ptr->vcmd);..}.
a6c0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f }.. if (mo
a6d0: 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 del != NULL) {..
a6e0: 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 int mode;../* Ge
a6f0: 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f t the "model" co
a700: 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d ntext */..chan =
a710: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
a720: 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 interp, model, &
a730: 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e mode);..if (chan
a740: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
a750: 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 ) NULL) {.. T
a760: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
a770: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
a780: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
a790: 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d R;..}.../*.. * M
a7a0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
a7b0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
a7c0: 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a st channel.. */.
a7d0: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 .chan = Tcl_GetT
a7e0: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
a7f0: 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 ..if (Tcl_GetCha
a800: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 nnelType(chan) !
a810: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 = Tls_ChannelTyp
a820: 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f e()) {.. Tcl_
a830: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
a840: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
a850: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
a860: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
a870: 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c ..."\": not a TL
a880: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 S channel", (cha
a890: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
a8a0: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 Tcl_SetErrorCod
a8b0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
a8c0: 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e "IMPORT", "CHAN
a8d0: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c NEL", "INVALID",
a8e0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
a8f0: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
a900: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
a910: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
a920: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 CL_ERROR;..}..ct
a930: 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54 63 x = ((State *)Tc
a940: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
a950: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29 2d anceData(chan))-
a960: 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 >ctx;. } else
a970: 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20 43 {..if ((ctx = C
a980: 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72 TX_Init(statePtr
a990: 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c , server, proto,
a9a0: 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66 69 keyfile, certfi
a9b0: 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 28 le, key, cert, (
a9c0: 69 6e 74 29 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 int) key_len,..
a9d0: 20 20 20 28 69 6e 74 29 20 63 65 72 74 5f 6c 65 (int) cert_le
a9e0: 6e 2c 20 43 41 70 61 74 68 2c 20 43 41 66 69 6c n, CApath, CAfil
a9f0: 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 e, ciphers, ciph
aa00: 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c ersuites, level,
aa10: 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e DHparams)) == N
aa20: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f ULL) {.. Tls_
aa30: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
aa40: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 atePtr);.. re
aa50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
aa60: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 .}. }.. st
aa70: 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 atePtr->ctx = ct
aa80: 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 x;.. /*.
aa90: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b * We need to mak
aaa0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 e sure that the
aab0: 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e channel works in
aac0: 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65 binary (for the
aad0: 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69 . * encrypti
aae0: 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f on not to get go
aaf0: 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a ofed up).. *
ab00: 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f We only want to
ab10: 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 66 adjust the buff
ab20: 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 ering in pre-v2
ab30: 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a channels, where.
ab40: 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e * each chan
ab50: 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b nel in the stack
ab60: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20 maintained its
ab70: 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20 own buffers..
ab80: 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 */. Tcl_DSt
ab90: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
aba0: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
abb0: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 n);. Tcl_DStr
abc0: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
abd0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a annelBlocking);.
abe0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
abf0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
ac00: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 lEOFChar);. T
ac10: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
ac20: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
ac30: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 ding);. Tcl_G
ac40: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
ac50: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
ac60: 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 eofchar", &upper
ac70: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
ac80: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
ac90: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
aca0: 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 , chan, "-encodi
acb0: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e ng", &upperChann
acc0: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 elEncoding);.
acd0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
ace0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
acf0: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f an, "-translatio
ad00: 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 n", &upperChanne
ad10: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 lTranslation);.
ad20: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
ad30: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
ad40: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 chan, "-blocking
ad50: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
ad60: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 Blocking);. T
ad70: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
ad80: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
ad90: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
ada0: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 , "binary");.
adb0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
adc0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
add0: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c an, "-blocking",
ade0: 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70 "true");. dp
adf0: 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 rintf("Consuming
ae00: 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 Tcl channel %s"
ae10: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
ae20: 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 Name(chan));.
ae30: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 statePtr->self
ae40: 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e = Tcl_StackChann
ae50: 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 el(interp, Tls_C
ae60: 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 hannelType(), (C
ae70: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
ae80: 50 74 72 2c 0a 09 28 54 43 4c 5f 52 45 41 44 41 Ptr,..(TCL_READA
ae90: 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 BLE | TCL_WRITAB
aea0: 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 LE), chan);.
aeb0: 64 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 dprintf("Created
aec0: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 channel named %
aed0: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e s", Tcl_GetChann
aee0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
aef0: 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 >self));. if
af00: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 (statePtr->self
af10: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
af20: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a NULL) {../*.. *
af30: 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 No use of Tcl_E
af40: 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 ventuallyFree be
af50: 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c cause no possibl
af60: 65 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a e Tcl_Preserve..
af70: 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 . */..Tls_Free((
af80: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
af90: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
afa0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
afb0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
afc0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 ption(interp, st
afd0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d atePtr->self, "-
afe0: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 translation", Tc
aff0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
b000: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
b010: 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 slation));. T
b020: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
b030: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ion(interp, stat
b040: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e ePtr->self, "-en
b050: 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 coding", Tcl_DSt
b060: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
b070: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
b080: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
b090: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
b0a0: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 rp, statePtr->se
b0b0: 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 lf, "-eofchar",
b0c0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
b0d0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f (&upperChannelEO
b0e0: 46 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c FChar));. Tcl
b0f0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
b100: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
b110: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 tr->self, "-bloc
b120: 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 king", Tcl_DStri
b130: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
b140: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b annelBlocking));
b150: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
b160: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e Free(&upperChann
b170: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a elTranslation);.
b180: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
b190: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 ree(&upperChanne
b1a0: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 lEncoding);.
b1b0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
b1c0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
b1d0: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 Char);. Tcl_D
b1e0: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 StringFree(&uppe
b1f0: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
b200: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 );.. /*.
b210: 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 * SSL Initializa
b220: 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 tion. */.
b230: 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d statePtr->ssl =
b240: 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 SSL_new(statePt
b250: 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 r->ctx);. if
b260: 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 (!statePtr->ssl)
b270: 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 {../* SSL libra
b280: 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c ry error */..Tcl
b290: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
b2a0: 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 terp, "couldn't
b2b0: 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 construct ssl se
b2c0: 73 73 69 6f 6e 3a 20 22 2c 20 47 45 54 5f 45 52 ssion: ", GET_ER
b2d0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
b2e0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
b2f0: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 Tcl_SetErrorCod
b300: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
b310: 20 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 "IMPORT", "INIT
b320: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 ", "FAILED", (ch
b330: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c ar *) NULL);..Tl
b340: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
b350: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 statePtr);..retu
b360: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
b370: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 }.. /* Set
b380: 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 host server name
b390: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 */. if (serv
b3a0: 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 ername) {../* Se
b3b0: 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 ts the server na
b3c0: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 me indication (S
b3d0: 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c NI) in ClientHel
b3e0: 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a lo extension */.
b3f0: 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 36 ./* Per RFC 6066
b400: 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 , hostname is a
b410: 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74 ASCII encoded st
b420: 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 43 ring, though RFC
b430: 20 34 33 36 36 20 73 61 79 73 20 55 54 46 2d 38 4366 says UTF-8
b440: 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 . */..if (!SSL_s
b450: 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e et_tlsext_host_n
b460: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ame(statePtr->ss
b470: 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 l, servername) &
b480: 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 & require) {..
b490: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
b4a0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 lt(interp, "Set
b4b0: 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 SNI extension fa
b4c0: 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 iled: ", GET_ERR
b4d0: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 _REASON(), (char
b4e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
b4f0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
b500: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
b510: 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c "IMPORT", "SNI",
b520: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
b530: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
b540: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
b550: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
b560: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
b570: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 OR;..}.../* Set
b580: 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 hostname for pee
b590: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 68 6f r certificate ho
b5a0: 73 74 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74 stname verificat
b5b0: 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a ion in clients..
b5c0: 09 20 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53 . Don't use SS
b5d0: 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 L_set1_host sinc
b5e0: 65 20 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74 e it has limitat
b5f0: 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 ions. */..if (!S
b600: 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 SL_add1_host(sta
b610: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 tePtr->ssl, serv
b620: 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 ername)) {..
b630: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
b640: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 44 4e (interp, "Set DN
b650: 53 20 68 6f 73 74 6e 61 6d 65 20 66 61 69 6c 65 S hostname faile
b660: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 d: ", GET_ERR_RE
b670: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
b680: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c NULL);.. Tcl
b690: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
b6a0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
b6b0: 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 PORT", "HOSTNAME
b6c0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 ", "FAILED", (ch
b6d0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
b6e0: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
b6f0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
b700: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
b710: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a RROR;..}. }..
b720: 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 /* Resume se
b730: 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 ssion id */.
b740: 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 if (session_id &
b750: 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e & strlen(session
b760: 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f _id) <= SSL_MAX_
b770: 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 SID_CTX_LENGTH)
b780: 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 {../* SSL_set_se
b790: 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 ssion() */..if (
b7a0: 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 !SSL_SESSION_set
b7b0: 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 1_id_context(SSL
b7c0: 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 _get_session(sta
b7d0: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73 tePtr->ssl), ses
b7e0: 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e sion_id, (unsign
b7f0: 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 ed int) strlen(s
b800: 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 ession_id))) {..
b810: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
b820: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65 sult(interp, "Re
b830: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66 61 69 sume session fai
b840: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f led: ", GET_ERR_
b850: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
b860: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
b870: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
b880: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
b890: 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f IMPORT", "SESSIO
b8a0: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 N", "FAILED", (c
b8b0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
b8c0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
b8d0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
b8e0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
b8f0: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
b900: 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41 . /* Enable A
b910: 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72 pplication-Layer
b920: 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 Protocol Negoti
b930: 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20 ation. Examples
b940: 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09 are: http/1.0,..
b950: 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 http/1.1, h2, h3
b960: 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70 , ftp, imap, pop
b970: 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 3, xmpp-client,
b980: 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 74 xmpp-server, mqt
b990: 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a t, irc, etc. */.
b9a0: 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a if (alpn) {.
b9b0: 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43 ./* Convert a TC
b9c0: 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 L list into a pr
b9d0: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 otocol-list in w
b9e0: 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 ire-format */..u
b9f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 nsigned char *pr
ba00: 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 otos, *p;..unsig
ba10: 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c ned int protos_l
ba20: 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 7a en = 0;..Tcl_Siz
ba30: 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 6a e cnt, i;..int j
ba40: 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 ;..Tcl_Obj **lis
ba50: 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 t;...if (Tcl_Lis
ba60: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 tObjGetElements(
ba70: 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63 interp, alpn, &c
ba80: 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43 nt, &list) != TC
ba90: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 L_OK) {.. Tls
baa0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
bab0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
bac0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
bad0: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 ..}.../* Determi
bae0: 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 ne the memory re
baf0: 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 quired for the p
bb00: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a rotocol-list */.
bb10: 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c .for (i = 0; i <
bb20: 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 cnt; i++) {..
bb30: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 Tcl_GetStringF
bb40: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 romObj(list[i],
bb50: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 &len);.. if (
bb60: 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 len > 255) {...T
bb70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
bb80: 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 interp, "ALPN pr
bb90: 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f otocol names too
bba0: 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 long", (char *)
bbb0: 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 NULL);...Tcl_Se
bbc0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
bbd0: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
bbe0: 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 T", "ALPN", "FAI
bbf0: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
bc00: 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 ULL);...Tls_Free
bc10: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
bc20: 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 tr);...return TC
bc30: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a L_ERROR;.. }.
bc40: 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 . protos_len
bc50: 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c 65 6e += 1 + (int) len
bc60: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 ;..}.../* Build
bc70: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f the complete pro
bc80: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 tocol-list */..p
bc90: 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 rotos = ckalloc(
bca0: 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a protos_len);../*
bcb0: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 protocol-lists
bcc0: 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 consist of 8-bit
bcd0: 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 length-prefixed
bce0: 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a , byte strings *
bcf0: 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c 20 70 /..for (j = 0, p
bd00: 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 63 = protos; j < c
bd10: 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 nt; j++) {..
bd20: 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f char *str = Tcl_
bd30: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
bd40: 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b (list[j], &len);
bd50: 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28 75 6e .. *p++ = (un
bd60: 73 69 67 6e 65 64 20 63 68 61 72 29 20 6c 65 6e signed char) len
bd70: 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c ;.. memcpy(p,
bd80: 20 73 74 72 2c 20 28 73 69 7a 65 5f 74 29 20 6c str, (size_t) l
bd90: 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c en);.. p += l
bda0: 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f en;..}.../* SSL_
bdb0: 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 set_alpn_protos
bdc0: 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 makes a copy of
bdd0: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 the protocol-lis
bde0: 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 t */../* Note: T
bdf0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 his functions re
be00: 76 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72 verses the retur
be10: 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 n value conventi
be20: 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 on */..if (SSL_s
be30: 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 et_alpn_protos(s
be40: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 tatePtr->ssl, pr
be50: 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e otos, protos_len
be60: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 )) {.. Tcl_Ap
be70: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
be80: 70 2c 20 22 53 65 74 20 41 4c 50 4e 20 70 72 6f p, "Set ALPN pro
be90: 74 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a 20 22 tocols failed: "
bea0: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
beb0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
bec0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
bed0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
bee0: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
bef0: 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c ", "ALPN", "FAIL
bf00: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ED", (char *) NU
bf10: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 LL);.. Tls_Fr
bf20: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
bf30: 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 ePtr);.. ckfr
bf40: 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 ee(protos);..
bf50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
bf60: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 R;..}.../* Store
bf70: 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 protocols list
bf80: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 */..statePtr->pr
bf90: 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 otos = protos;..
bfa0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
bfb0: 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 _len = protos_le
bfc0: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a n;. } else {.
bfd0: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
bfe0: 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 s = NULL;..state
bff0: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 Ptr->protos_len
c000: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 = 0;. }..
c010: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 /*. * SSL Ca
c020: 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a llbacks. */.
c030: 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f SSL_set_app_
c040: 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 data(statePtr->s
c050: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 sl, (void *)stat
c060: 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 ePtr);./* point
c070: 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 back to us */.
c080: 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 SSL_set_verify
c090: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
c0a0: 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 verify, VerifyCa
c0b0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c llback);. SSL
c0c0: 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 _set_info_callba
c0d0: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ck(statePtr->ssl
c0e0: 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b , InfoCallback);
c0f0: 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 .. /* Callbac
c100: 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 20 k for observing
c110: 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 protocol message
c120: 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 s */.#ifndef OPE
c130: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 NSSL_NO_SSL_TRAC
c140: 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 53 E. /* void SS
c150: 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 L_CTX_set_msg_ca
c160: 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 llback_arg(state
c170: 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 Ptr->ctx, (void
c180: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 *)statePtr);.
c190: 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 void SSL_CTX_se
c1a0: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 t_msg_callback(s
c1b0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65 tatePtr->ctx, Me
c1c0: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20 ssageCallback);
c1d0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d */. SSL_set_m
c1e0: 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 sg_callback_arg(
c1f0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 statePtr->ssl, (
c200: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
c210: 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 ;. SSL_set_ms
c220: 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 g_callback(state
c230: 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67 Ptr->ssl, Messag
c240: 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 eCallback);.#end
c250: 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 if.. /* Creat
c260: 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 e Tcl_Channel BI
c270: 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 O Handler */.
c280: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f statePtr->p_bio
c290: 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 .= BIO_new_tcl(s
c2a0: 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 tatePtr, BIO_NOC
c2b0: 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65 LOSE);. state
c2c0: 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e Ptr->bio.= BIO_n
c2d0: 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b ew(BIO_f_ssl());
c2e0: 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 .. if (server
c2f0: 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 ) {../* Server c
c300: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c allbacks */..SSL
c310: 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f _CTX_set_tlsext_
c320: 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 servername_arg(s
c330: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 tatePtr->ctx, (v
c340: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
c350: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c ..SSL_CTX_set_tl
c360: 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f sext_servername_
c370: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 callback(statePt
c380: 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 r->ctx, SNICallb
c390: 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 ack);..SSL_CTX_s
c3a0: 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f et_client_hello_
c3b0: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 cb(statePtr->ctx
c3c0: 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c , HelloCallback,
c3d0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
c3e0: 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74 r);..if (statePt
c3f0: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c r->protos != NUL
c400: 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 L) {.. SSL_CT
c410: 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 X_set_alpn_selec
c420: 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 t_cb(statePtr->c
c430: 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b tx, ALPNCallback
c440: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
c450: 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f tr);.#ifdef USE_
c460: 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73 NPN.. if (tls
c470: 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 1_2 == 0 && tls1
c480: 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c _3 == 0) {...SSL
c490: 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 _CTX_set_next_pr
c4a0: 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f otos_advertised_
c4b0: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 cb(statePtr->ctx
c4c0: 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 , NPNCallback, (
c4d0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
c4e0: 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a ;.. }.#endif.
c4f0: 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 .}.../* Enable s
c500: 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65 erver to send ce
c510: 72 74 20 72 65 71 75 65 73 74 20 61 66 74 65 72 rt request after
c520: 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 handshake (TLS
c530: 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 1.3 only) */../*
c540: 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 A write operati
c550: 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 on must take pla
c560: 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 74 69 ce for the Certi
c570: 66 69 63 61 74 65 20 52 65 71 75 65 73 74 20 74 ficate Request t
c580: 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f o be.. sent to
c590: 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 the client, thi
c5a0: 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 s can be done wi
c5b0: 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 th SSL_do_handsh
c5c0: 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 ake(). */..if (r
c5d0: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 equest && post_h
c5e0: 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c 73 31 andshake && tls1
c5f0: 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 _3) {.. SSL_v
c600: 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 erify_client_pos
c610: 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74 t_handshake(stat
c620: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a ePtr->ssl);..}..
c630: 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 69 ./* set automati
c640: 63 20 63 75 72 76 65 20 73 65 6c 65 63 74 69 6f c curve selectio
c650: 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63 n */..SSL_set_ec
c660: 64 68 5f 61 75 74 6f 28 73 74 61 74 65 50 74 72 dh_auto(statePtr
c670: 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 ->ssl, 1);.../*
c680: 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20 Set server mode
c690: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c */..statePtr->fl
c6a0: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 ags |= TLS_TCL_S
c6b0: 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f ERVER;..SSL_set_
c6c0: 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74 61 accept_state(sta
c6d0: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
c6e0: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c } else {../* Cl
c6f0: 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a ient callbacks *
c700: 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e /.#ifdef USE_NPN
c710: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e ..if (statePtr->
c720: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 protos != NULL &
c730: 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 & tls1_2 == 0 &&
c740: 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a tls1_3 == 0) {.
c750: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
c760: 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 _next_proto_sele
c770: 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e ct_cb(statePtr->
c780: 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 ctx, ALPNCallbac
c790: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 k, (void *)state
c7a0: 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a Ptr);..}.#endif.
c7b0: 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 ../* Session cac
c7c0: 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 hing */..SSL_CTX
c7d0: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 _set_session_cac
c7e0: 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 he_mode(statePtr
c7f0: 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f ->ctx, SSL_SESS_
c800: 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 CACHE_CLIENT | S
c810: 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f SL_SESS_CACHE_NO
c820: 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 _INTERNAL_STORE)
c830: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f ;..SSL_CTX_sess_
c840: 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 set_new_cb(state
c850: 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f Ptr->ctx, Sessio
c860: 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a nCallback);.../*
c870: 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e Enable post han
c880: 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63 dshake Authentic
c890: 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e ation extension.
c8a0: 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e TLS 1.3 only, n
c8b0: 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 ot http/2. */..i
c8c0: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f f (request && po
c8d0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a st_handshake) {.
c8e0: 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 . SSL_set_pos
c8f0: 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 t_handshake_auth
c900: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
c910: 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 1);..}.../* Set
c920: 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 client mode */..
c930: 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f SSL_set_connect_
c940: 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e state(statePtr->
c950: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ssl);. }.
c960: 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 SSL_set_bio(stat
c970: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 ePtr->ssl, state
c980: 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 Ptr->p_bio, stat
c990: 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 ePtr->p_bio);.
c9a0: 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 BIO_set_ssl(st
c9b0: 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 atePtr->bio, sta
c9c0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f tePtr->ssl, BIO_
c9d0: 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f NOCLOSE);.. /
c9e0: 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 *. * End of
c9f0: 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f SSL Init. */
ca00: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 . dprintf("Re
ca10: 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c turning %s", Tcl
ca20: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
ca30: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 statePtr->self))
ca40: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 ;. Tcl_SetRes
ca50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 ult(interp, (cha
ca60: 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e r *) Tcl_GetChan
ca70: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
ca80: 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c ->self), TCL_VOL
ca90: 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 ATILE);.. ret
caa0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a urn TCL_OK;.}...
cab0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
cac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
caf0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 --------. *. * U
cb00: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d nimportObjCmd --
cb10: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
cb20: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
cb30: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 to remove the t
cb40: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 opmost channel f
cb50: 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 ilter.. *. * Res
cb60: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
cb70: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
cb80: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
cb90: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 ts:. *.May modif
cba0: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f y the behavior o
cbb0: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e f an IO channel.
cbc0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
cbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
cc10: 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 atic int.Unimpor
cc20: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 tObjCmd(ClientDa
cc30: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
cc40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
cc50: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
cc60: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
cc70: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 []) {. Tcl_Ch
cc80: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 annel chan;../*
cc90: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 The channel to s
cca0: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f et a mode on. */
ccb0: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 . (void) clie
ccc0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 ntData;.. dpr
ccd0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
cce0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
ccf0: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
cd00: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
cd10: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
cd20: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c l");..return TCL
cd30: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
cd40: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
cd50: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
cd60: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
cd70: 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a bjv[1]), NULL);.
cd80: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
cd90: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
cda0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
cdb0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
cdc0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
cdd0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
cde0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
cdf0: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
ce00: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
ce10: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 el(chan);.. i
ce20: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
ce30: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
ce40: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
ce50: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
ce60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
ce70: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
ce80: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
ce90: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a me(chan),..."\":
cea0: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e not a TLS chann
ceb0: 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 el", (char *) NU
cec0: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
ced0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
cee0: 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 p, "TLS", "UNIMP
cef0: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c ORT", "CHANNEL",
cf00: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
cf10: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
cf20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
cf30: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 }.. if (Tc
cf40: 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c l_UnstackChannel
cf50: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d (interp, chan) =
cf60: 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 = TCL_ERROR) {..
cf70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
cf80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 ;. }.. ret
cf90: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a urn TCL_OK;.}...
cfa0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
cfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cfd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cfe0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
cff0: 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 TX_Init -- const
d000: 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 ruct a SSL_CTX i
d010: 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 nstance. *. * Re
d020: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 sults:. *.A vali
d030: 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e d SSL_CTX instan
d040: 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 ce or NULL.. *.
d050: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
d060: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 *.constructs SS
d070: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a L context (CTX).
d080: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
d090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d0c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
d0d0: 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 tic SSL_CTX *.CT
d0e0: 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 X_Init(State *st
d0f0: 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 atePtr, int isSe
d100: 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c rver, int proto,
d110: 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 char *keyfile,
d120: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a char *certfile,.
d130: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
d140: 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 r *key, unsigned
d150: 20 63 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74 char *cert, int
d160: 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 key_len, int ce
d170: 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 rt_len, char *CA
d180: 70 61 74 68 2c 0a 20 20 20 20 63 68 61 72 20 2a path,. char *
d190: 43 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 CAfile, char *ci
d1a0: 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70 phers, char *cip
d1b0: 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c hersuites, int l
d1c0: 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 evel, char *DHpa
d1d0: 72 61 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f rams) {. Tcl_
d1e0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d Interp *interp =
d1f0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
d200: 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a p;. SSL_CTX *
d210: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ctx = NULL;.
d220: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a Tcl_DString ds;.
d230: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 Tcl_DString
d240: 64 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 ds1;. int off
d250: 20 3d 20 30 2c 20 61 62 6f 72 74 20 3d 20 30 3b = 0, abort = 0;
d260: 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 . int load_pr
d270: 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 ivate_key;. c
d280: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 onst SSL_METHOD
d290: 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 *method;.. dp
d2a0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
d2b0: 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f .. if (!proto
d2c0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
d2d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e esult(interp, "n
d2e0: 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c o valid protocol
d2f0: 20 73 65 6c 65 63 74 65 64 22 2c 20 28 63 68 61 selected", (cha
d300: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
d310: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
d320: 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 . /* create S
d330: 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 SL context */.#i
d340: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
d350: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 N_NUMBER >= 0x10
d360: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 100000L || defin
d370: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 ed(NO_SSL2) || d
d380: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
d390: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 O_SSL2). if (
d3a0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
d3b0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 LS_PROTO_SSL2))
d3c0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
d3d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c ult(interp, "SSL
d3e0: 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 2 protocol not s
d3f0: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
d400: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
d410: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
d420: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
d430: 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 d(NO_SSL3) || de
d440: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d450: 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 _SSL3). if (E
d460: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
d470: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b S_PROTO_SSL3)) {
d480: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
d490: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 lt(interp, "SSL3
d4a0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
d4b0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
d4c0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
d4d0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
d4e0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
d4f0: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 (NO_TLS1) || def
d500: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d510: 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e TLS1). if (EN
d520: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
d530: 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a _PROTO_TLS1)) {.
d540: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
d550: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
d560: 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .0 protocol not
d570: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
d580: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
d590: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
d5a0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
d5b0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c ed(NO_TLS1_1) ||
d5c0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
d5d0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 _NO_TLS1_1).
d5e0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
d5f0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
d600: 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 1_1)) {..Tcl_App
d610: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
d620: 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f , "TLS 1.1 proto
d630: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
d640: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
d650: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
d660: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ;. }.#endif.#
d670: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
d680: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_2) || defined
d690: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d6a0: 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 _2). if (ENAB
d6b0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
d6c0: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a ROTO_TLS1_2)) {.
d6d0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
d6e0: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
d6f0: 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .2 protocol not
d700: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
d710: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
d720: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
d730: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
d740: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c ed(NO_TLS1_3) ||
d750: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
d760: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
d770: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
d780: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
d790: 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 1_3)) {..Tcl_App
d7a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
d7b0: 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f , "TLS 1.3 proto
d7c0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
d7d0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
d7e0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
d7f0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 ;. }.#endif.
d800: 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 if (proto ==
d810: 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 0) {../* Use ful
d820: 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f l range */..SSL_
d830: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 CTX_set_min_prot
d840: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 o_version(ctx, 0
d850: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f );..SSL_CTX_set_
d860: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f max_proto_versio
d870: 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d n(ctx, 0);. }
d880: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72 .. switch (pr
d890: 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 oto) {.#if OPENS
d8a0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
d8b0: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 R < 0x10100000L
d8c0: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 && !defined(NO_S
d8d0: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL2) && !defined
d8e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
d8f0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
d900: 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 ROTO_SSL2:..meth
d910: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
d920: 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 SSLv2_server_met
d930: 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c hod() : SSLv2_cl
d940: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
d950: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
d960: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 f !defined(NO_SS
d970: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
d980: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
d990: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
d9a0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 NSSL_NO_SSL3_MET
d9b0: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c HOD). case TL
d9c0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d S_PROTO_SSL3:..m
d9d0: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
d9e0: 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f ? SSLv3_server_
d9f0: 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 method() : SSLv3
da00: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
da10: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
da20: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
da30: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e _TLS1) && !defin
da40: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
da50: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
da60: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
da70: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 METHOD). case
da80: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a TLS_PROTO_TLS1:
da90: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
daa0: 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 ver ? TLSv1_serv
dab0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c er_method() : TL
dac0: 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f Sv1_client_metho
dad0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
dae0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
daf0: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 (NO_TLS1_1) && !
db00: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
db10: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 NO_TLS1_1) && !d
db20: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
db30: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 O_TLS1_1_METHOD)
db40: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
db50: 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 OTO_TLS1_1:..met
db60: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
db70: 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f TLSv1_1_server_
db80: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 method() : TLSv1
db90: 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 _1_client_method
dba0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
dbb0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
dbc0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 NO_TLS1_2) && !d
dbd0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
dbe0: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
dbf0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
dc00: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a _TLS1_2_METHOD).
dc10: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
dc20: 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 TO_TLS1_2:..meth
dc30: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
dc40: 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d TLSv1_2_server_m
dc50: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f ethod() : TLSv1_
dc60: 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 2_client_method(
dc70: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
dc80: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
dc90: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 O_TLS1_3) && !de
dca0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
dcb0: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 _TLS1_3). cas
dcc0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
dcd0: 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 _3:../* Use the
dce0: 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 generic method a
dcf0: 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 nd constraint ra
dd00: 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 nge after contex
dd10: 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a t is created */.
dd20: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
dd30: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f er ? TLS_server_
dd40: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 method() : TLS_c
dd50: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
dd60: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 .break;.#endif.
dd70: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 default:../*
dd80: 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 Negotiate highes
dd90: 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f t available SSL/
dda0: 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 TLS version */..
ddb0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
ddc0: 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d r ? TLS_server_m
ddd0: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c ethod() : TLS_cl
dde0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 ient_method();.#
ddf0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
de00: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
de10: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 100000L && !defi
de20: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 ned(NO_SSL2) &&
de30: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
de40: 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c _NO_SSL2)..off |
de50: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
de60: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 , TLS_PROTO_SSL2
de70: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 ) ? 0 : SSL_OP
de80: 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 _NO_SSLv2);.#end
de90: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
dea0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
deb0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
dec0: 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 SSL3)..off |= (E
ded0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
dee0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 S_PROTO_SSL3)
def0: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
df00: 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 SSLv3);.#endif.#
df10: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
df20: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
df30: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
df40: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
df50: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
df60: 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 OTO_TLS1) ? 0
df70: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
df80: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 1);.#endif.#if !
df90: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
dfa0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
dfb0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
dfc0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
dfd0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
dfe0: 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 OTO_TLS1_1) ? 0
dff0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
e000: 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 1_1);.#endif.#if
e010: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
e020: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
e030: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
e040: 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 _2)..off |= (ENA
e050: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
e060: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 PROTO_TLS1_2) ?
e070: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 0 : SSL_OP_NO_TL
e080: 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 Sv1_2);.#endif.#
e090: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
e0a0: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
e0b0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
e0c0: 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 S1_3)..off |= (E
e0d0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
e0e0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 S_PROTO_TLS1_3)
e0f0: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
e100: 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 TLSv1_3);.#endif
e110: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a ..break;. }..
e120: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
e130: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 ror();.. ctx
e140: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 = SSL_CTX_new(me
e150: 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21 thod);. if (!
e160: 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e ctx) {..return N
e170: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
e180: 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 if (getenv(SSLKE
e190: 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 YLOGFILE)) {..SS
e1a0: 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 L_CTX_set_keylog
e1b0: 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b _callback(ctx, K
e1c0: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a eyLogCallback);.
e1d0: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 }..#if !defi
e1e0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 ned(NO_TLS1_3) &
e1f0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
e200: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
e210: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 if (proto == T
e220: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
e230: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {..SSL_CTX_set_
e240: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f min_proto_versio
e250: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
e260: 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 RSION);..SSL_CTX
e270: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 _set_max_proto_v
e280: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
e290: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 _3_VERSION);.
e2a0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f }.#endif.. /
e2b0: 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 * Force cipher s
e2c0: 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 election order b
e2d0: 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 y server */.
e2e0: 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b if (!isServer) {
e2f0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 ..SSL_CTX_set_op
e300: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f tions(ctx, SSL_O
e310: 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f P_CIPHER_SERVER_
e320: 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 PREFERENCE);.
e330: 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f }..#if OPENSSL_
e340: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
e350: 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 0x10100000L.
e360: 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c OpenSSL_add_all
e370: 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f _algorithms(); /
e380: 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61 * Load ciphers a
e390: 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 nd digests */.#e
e3a0: 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 ndif.. SSL_CT
e3b0: 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 X_set_app_data(c
e3c0: 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 tx, (void*)inter
e3d0: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 p);./* remember
e3e0: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 the interpreter
e3f0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
e400: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
e410: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 SSL_OP_ALL);./*
e420: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b all SSL bug work
e430: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 arounds */. S
e440: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
e450: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e ns(ctx, SSL_OP_N
e460: 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 O_COMPRESSION);.
e470: 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 /* disable compr
e480: 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 ession even if s
e490: 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 upported */.
e4a0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
e4b0: 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 ons(ctx, off);..
e4c0: 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f /* disable proto
e4d0: 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a col versions */.
e4e0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
e4f0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
e500: 30 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 0101000L. SSL
e510: 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 _CTX_set_mode(ct
e520: 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f x, SSL_MODE_AUTO
e530: 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 _RETRY);./* hand
e540: 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 le new handshake
e550: 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e s in background.
e560: 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69 On by default i
e570: 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e n OpenSSL 1.1.1.
e580: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 */.#endif. S
e590: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f SL_CTX_sess_set_
e5a0: 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 cache_size(ctx,
e5b0: 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 128);.. /* Se
e5c0: 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 t user defined c
e5d0: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 iphers, cipher s
e5e0: 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 uites, and secur
e5f0: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 ity level */.
e600: 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d if ((ciphers !=
e610: 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 NULL) && !SSL_C
e620: 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 TX_set_cipher_li
e630: 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 st(ctx, ciphers)
e640: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
e650: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
e660: 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 et ciphers faile
e670: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 d: No valid ciph
e680: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ers", (char *) N
e690: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
e6a0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
e6b0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 n NULL;. }.
e6c0: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 75 69 if ((ciphersui
e6d0: 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 tes != NULL) &&
e6e0: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 !SSL_CTX_set_cip
e6f0: 68 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 hersuites(ctx, c
e700: 69 70 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a iphersuites)) {.
e710: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
e720: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 t(interp, "Set c
e730: 69 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69 ipher suites fai
e740: 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 led: No valid ci
e750: 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 phers", (char *)
e760: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
e770: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
e780: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
e790: 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 . /* Set secu
e7a0: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 rity level */.
e7b0: 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 if (level > -1
e7c0: 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b && level < 6) {
e7d0: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 ../* SSL_set_sec
e7e0: 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 urity_level */..
e7f0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 SSL_CTX_set_secu
e800: 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 rity_level(ctx,
e810: 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 level);. }..
e820: 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 /* set some c
e830: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 allbacks */.
e840: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 SSL_CTX_set_defa
e850: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 ult_passwd_cb(ct
e860: 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 x, PasswordCallb
e870: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 ack);. SSL_CT
e880: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 X_set_default_pa
e890: 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 sswd_cb_userdata
e8a0: 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 (ctx, (void *)st
e8b0: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a atePtr);.. /*
e8c0: 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 read a Diffie-H
e8d0: 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 ellman parameter
e8e0: 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 s file, or use t
e8f0: 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 he built-in one
e900: 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 */.#ifdef OPENSS
e910: 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 L_NO_DH. if (
e920: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c DHparams != NULL
e930: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
e940: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 esult(interp, "D
e950: 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 H parameter supp
e960: 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c ort not availabl
e970: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c e", (char *) NUL
e980: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
e990: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
e9a0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 NULL;. }.#els
e9b0: 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b e. {..DH* dh;
e9c0: 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 ..if (DHparams !
e9d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 = NULL) {.. B
e9e0: 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 62 69 IO *bio;.. bi
e9f0: 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 o = BIO_new_file
ea00: 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 (F2N(DHparams, &
ea10: 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 ds), "r");..
ea20: 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 if (!bio) {...Tc
ea30: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
ea40: 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 s);...Tcl_Append
ea50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
ea60: 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 Could not find D
ea70: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c H parameters fil
ea80: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c e", (char *) NUL
ea90: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
eaa0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
eab0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a n NULL;.. }..
eac0: 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 . dh = PEM_re
ead0: 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 ad_bio_DHparams(
eae0: 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c bio, NULL, NULL,
eaf0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f NULL);.. BIO
eb00: 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 _free(bio);..
eb10: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
eb20: 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 (&ds);.. if (
eb30: 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 !dh) {...Tcl_App
eb40: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
eb50: 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 , "Could not rea
eb60: 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 d DH parameters
eb70: 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 from file", (cha
eb80: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
eb90: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
eba0: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ...return NULL;.
ebb0: 09 20 20 20 20 7d 0a 09 20 20 20 20 53 53 4c 5f . }.. SSL_
ebc0: 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 CTX_set_tmp_dh(c
ebd0: 74 78 2c 20 64 68 29 3b 0a 09 20 20 20 20 44 48 tx, dh);.. DH
ebe0: 5f 66 72 65 65 28 64 68 29 3b 0a 0a 09 7d 20 65 _free(dh);...} e
ebf0: 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 20 55 73 lse {.. /* Us
ec00: 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44 48 20 e well known DH
ec10: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 parameters that
ec20: 68 61 76 65 20 62 75 69 6c 74 2d 69 6e 20 73 75 have built-in su
ec30: 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e 53 53 4c pport in OpenSSL
ec40: 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 21 53 53 */.. if (!SS
ec50: 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f 61 75 74 L_CTX_set_dh_aut
ec60: 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a 09 09 54 o(ctx, 1)) {...T
ec70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
ec80: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e interp, "Could n
ec90: 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 20 44 48 ot enable set DH
eca0: 20 61 75 74 6f 3a 20 22 2c 20 47 45 54 5f 45 52 auto: ", GET_ER
ecb0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
ecc0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
ecd0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
ece0: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ...return NULL;.
ecf0: 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a . }..}. }.
ed00: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 #endif.. /* s
ed10: 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 et our certifica
ed20: 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 te */. load_p
ed30: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a rivate_key = 0;.
ed40: 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 if (certfile
ed50: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 != NULL) {..loa
ed60: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 d_private_key =
ed70: 31 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 1;...if (SSL_CTX
ed80: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 _use_certificate
ed90: 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 _file(ctx, F2N(c
eda0: 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 ertfile, &ds), S
edb0: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 SL_FILETYPE_PEM)
edc0: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 <= 0) {.. Tc
edd0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
ede0: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 s);.. Tcl_App
edf0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
ee00: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 , "unable to set
ee10: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c certificate fil
ee20: 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 e ", certfile, "
ee30: 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 : ",...GET_ERR_R
ee40: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
ee50: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 ) NULL);.. SS
ee60: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
ee70: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c .. return NUL
ee80: 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 L;..}..Tcl_DStri
ee90: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 20 20 ngFree(&ds);..
eea0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 } else if (cer
eeb0: 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f t != NULL) {..lo
eec0: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d ad_private_key =
eed0: 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 1;..if (SSL_CTX
eee0: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 _use_certificate
eef0: 5f 41 53 4e 31 28 63 74 78 2c 20 63 65 72 74 5f _ASN1(ctx, cert_
ef00: 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 len, cert) <= 0)
ef10: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
ef20: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
ef30: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
ef40: 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a certificate: ",.
ef50: 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e ..GET_ERR_REASON
ef60: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
ef70: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
ef80: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
ef90: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d return NULL;..}
efa0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 . } else {..c
efb0: 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a ertfile = (char*
efc0: 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c )X509_get_defaul
efd0: 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a t_cert_file();..
efe0: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 .if (SSL_CTX_use
eff0: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c _certificate_fil
f000: 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c e(ctx, certfile,
f010: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 SSL_FILETYPE_PE
f020: 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 M) <= 0) {.#if 0
f030: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
f040: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
f050: 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 unable to use de
f060: 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 fault certificat
f070: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 e file ", certfi
f080: 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f le, ": ",...GET_
f090: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
f0a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
f0b0: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 SSL_CTX_free(
f0c0: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ctx);.. retur
f0d0: 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 n NULL;.#endif..
f0e0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
f0f0: 73 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 set our private
f100: 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c key */. if (l
f110: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 oad_private_key)
f120: 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 {..if (keyfile
f130: 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d == NULL && key =
f140: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b = NULL) {.. k
f150: 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c eyfile = certfil
f160: 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 e;..}...if (keyf
f170: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ile != NULL) {..
f180: 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 /* get the p
f190: 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 rivate key assoc
f1a0: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 iated with this
f1b0: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 certificate */..
f1c0: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 if (keyfile
f1d0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 == NULL) {...key
f1e0: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b file = certfile;
f1f0: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 .. }... if
f200: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 (SSL_CTX_use_Pr
f210: 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 ivateKey_file(ct
f220: 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 x, F2N(keyfile,
f230: 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 &ds), SSL_FILETY
f240: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a PE_PEM) <= 0) {.
f250: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
f260: 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 e(&ds);.../* flu
f270: 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 sh the passphras
f280: 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 e which might be
f290: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 left in the res
f2a0: 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 ult */...Tcl_Set
f2b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e Result(interp, N
f2c0: 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 ULL, TCL_STATIC)
f2d0: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 ;...Tcl_AppendRe
f2e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e sult(interp, "un
f2f0: 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c able to set publ
f300: 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b ic key file ", k
f310: 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 20 eyfile, " ",...
f320: 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f GET_ERR_REASO
f330: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
f340: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 LL);...SSL_CTX_f
f350: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 ree(ctx);...retu
f360: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a rn NULL;.. }.
f370: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
f380: 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 Free(&ds);...} e
f390: 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e lse if (key != N
f3a0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 ULL) {.. if (
f3b0: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 SSL_CTX_use_Priv
f3c0: 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f ateKey_ASN1(EVP_
f3d0: 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b PKEY_RSA, ctx, k
f3e0: 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 ey,key_len) <= 0
f3f0: 29 20 7b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 ) {.../* flush t
f400: 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 he passphrase wh
f410: 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 ich might be lef
f420: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 t in the result
f430: 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 */...Tcl_SetResu
f440: 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c lt(interp, NULL,
f450: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 TCL_STATIC);...
f460: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
f470: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
f480: 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b to set public k
f490: 65 79 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 ey: ", GET_ERR_R
f4a0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
f4b0: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 ) NULL);...SSL_C
f4c0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 TX_free(ctx);...
f4d0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 return NULL;..
f4e0: 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 }..}../* Now w
f4f0: 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 e know that a ke
f500: 79 20 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 y and cert have
f510: 62 65 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 been set against
f520: 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e .. * the SSL con
f530: 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 text */..if (!SS
f540: 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 L_CTX_check_priv
f550: 61 74 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a ate_key(ctx)) {.
f560: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
f570: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 esult(interp, "p
f580: 72 69 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 rivate key does
f590: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 not match the ce
f5a0: 72 74 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 rtificate public
f5b0: 20 6b 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28 key",.... (
f5c0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
f5d0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 SSL_CTX_free
f5e0: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 (ctx);.. retu
f5f0: 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 rn NULL;..}.
f600: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 6f }.. /* Set to
f610: 20 75 73 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 use default loc
f620: 61 74 69 6f 6e 20 61 6e 64 20 66 69 6c 65 20 66 ation and file f
f630: 6f 72 20 43 65 72 74 69 66 69 63 61 74 65 20 41 or Certificate A
f640: 75 74 68 6f 72 69 74 79 20 28 43 41 29 20 63 65 uthority (CA) ce
f650: 72 74 69 66 69 63 61 74 65 73 2e 20 54 68 65 0a rtificates. The.
f660: 20 20 20 20 20 2a 20 76 65 72 69 66 79 20 70 61 * verify pa
f670: 74 68 20 61 6e 64 20 73 74 6f 72 65 20 63 61 6e th and store can
f680: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 be overridden b
f690: 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 y the SSL_CERT_D
f6a0: 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68 65 20 IR env var. The
f6b0: 76 65 72 69 66 79 20 66 69 6c 65 20 63 61 6e 0a verify file can.
f6c0: 20 20 20 20 20 2a 20 62 65 20 6f 76 65 72 72 69 * be overri
f6d0: 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f dden by the SSL_
f6e0: 43 45 52 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 CERT_FILE env va
f6f0: 72 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 r. */. if (!S
f700: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 SL_CTX_set_defau
f710: 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 lt_verify_paths(
f720: 63 74 78 29 29 20 7b 0a 09 61 62 6f 72 74 2b 2b ctx)) {..abort++
f730: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
f740: 4f 76 65 72 72 69 64 65 73 20 66 6f 72 20 74 68 Overrides for th
f750: 65 20 43 41 20 76 65 72 69 66 79 20 70 61 74 68 e CA verify path
f760: 20 61 6e 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 and file */.
f770: 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 {.#if OPENSSL_V
f780: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
f790: 30 78 33 30 30 30 30 30 30 30 4c 0a 09 69 66 20 0x30000000L..if
f7a0: 28 43 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 20 (CApath != NULL
f7b0: 7c 7c 20 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c || CAfile != NUL
f7c0: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 L) {.. Tcl_DS
f7d0: 74 72 69 6e 67 20 64 73 31 3b 0a 09 20 20 20 20 tring ds1;..
f7e0: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 if (!SSL_CTX_loa
f7f0: 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f d_verify_locatio
f800: 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 ns(ctx, F2N(CAfi
f810: 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 le, &ds), F2N(CA
f820: 70 61 74 68 2c 20 26 64 73 31 29 29 29 20 7b 0a path, &ds1))) {.
f830: 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 ..abort++;..
f840: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
f850: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 ngFree(&ds);..
f860: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
f870: 65 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 2f e(&ds1);... /
f880: 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41 * Set list of CA
f890: 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 s to send to cli
f8a0: 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 74 ent when request
f8b0: 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72 ing a client cer
f8c0: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 tificate */..
f8d0: 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 /* https://sour
f8e0: 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c ceforge.net/p/tl
f8f0: 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 09 20 s/bugs/57/ */..
f900: 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 /* XXX:TODO:
f910: 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75 70 Let the user sup
f920: 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 ply values here
f930: 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 instead of somet
f940: 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 hing that exists
f950: 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 on the filesyst
f960: 65 6d 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 4b em */.. STACK
f970: 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a _OF(X509_NAME) *
f980: 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f certNames = SSL_
f990: 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 load_client_CA_f
f9a0: 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 ile(F2N(CAfile,
f9b0: 26 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 28 &ds));.. if (
f9c0: 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c certNames != NUL
f9d0: 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 L) {...SSL_CTX_s
f9e0: 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 et_client_CA_lis
f9f0: 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 t(ctx, certNames
fa00: 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 );.. }.. T
fa10: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
fa20: 64 73 29 3b 0a 09 7d 0a 0a 23 65 6c 73 65 0a 09 ds);..}..#else..
fa30: 69 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e 55 if (CApath != NU
fa40: 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 LL) {.. if (!
fa50: 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 SSL_CTX_load_ver
fa60: 69 66 79 5f 64 69 72 28 63 74 78 2c 20 46 32 4e ify_dir(ctx, F2N
fa70: 28 43 41 70 61 74 68 2c 20 26 64 73 29 29 29 20 (CApath, &ds)))
fa80: 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 {...abort++;..
fa90: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
faa0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
fab0: 7d 0a 09 69 66 20 28 43 41 66 69 6c 65 20 21 3d }..if (CAfile !=
fac0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 NULL) {.. if
fad0: 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f (!SSL_CTX_load_
fae0: 76 65 72 69 66 79 5f 66 69 6c 65 28 63 74 78 2c verify_file(ctx,
faf0: 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 F2N(CAfile, &ds
fb00: 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b ))) {...abort++;
fb10: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c .. }.. Tcl
fb20: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
fb30: 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 );... /* Set
fb40: 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 list of CAs to s
fb50: 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 end to client wh
fb60: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 en requesting a
fb70: 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 client certifica
fb80: 74 65 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 4b te */.. STACK
fb90: 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a _OF(X509_NAME) *
fba0: 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f certNames = SSL_
fbb0: 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 load_client_CA_f
fbc0: 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 ile(F2N(CAfile,
fbd0: 26 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 28 &ds));.. if (
fbe0: 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c certNames != NUL
fbf0: 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 L) {...SSL_CTX_s
fc00: 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 et_client_CA_lis
fc10: 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 t(ctx, certNames
fc20: 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 );.. }.. T
fc30: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
fc40: 64 73 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 ds);..}.#endif.
fc50: 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e }.. return
fc60: 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d ctx;.}.../*. *-
fc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fcb0: 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f --. *. * StatusO
fcc0: 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 bjCmd -- return
fcd0: 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 certificate for
fce0: 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a connected peer..
fcf0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
fd00: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
fd10: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
fd20: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
fd30: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
fd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
fd80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74 */.static int.St
fd90: 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e atusObjCmd(Clien
fda0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
fdb0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
fdc0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
fdd0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
fde0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 bjv[]) {. Sta
fdf0: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 te *statePtr;.
fe00: 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 X509 *peer;.
fe10: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
fe20: 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e r;. Tcl_Chann
fe30: 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 el chan;. cha
fe40: 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 r *channelName,
fe50: 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e *ciphers;. in
fe60: 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 t mode;. cons
fe70: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
fe80: 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 *proto;. unsi
fe90: 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 gned int len;.
fea0: 20 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a int nid, res;.
feb0: 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e (void) clien
fec0: 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 tData;.. dpri
fed0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
fee0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
fef0: 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 20 || objc > 3 ||
ff00: 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 21 73 (objc == 3 && !s
ff10: 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 trcmp(Tcl_GetStr
ff20: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d ing(objv[1]), "-
ff30: 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 63 6c local"))) {..Tcl
ff40: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
ff50: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
ff60: 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c ?-local? channel
ff70: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
ff80: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
ff90: 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c /* Get channel
ffa0: 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e 6e Id */. chann
ffb0: 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 elName = Tcl_Get
ffc0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 28 6f 62 6a String(objv[(obj
ffd0: 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d c == 2 ? 1 : 2)]
ffe0: 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 );. chan = Tc
fff0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
10000 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 erp, channelName
10010 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 , &mode);. if
10020 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
10030 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
10040 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
10050 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
10060 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
10070 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
10080 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a most channel */.
10090 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
100a0 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
100b0 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f n);. if (Tcl_
100c0 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
100d0 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e han) != Tls_Chan
100e0 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 nelType()) {..Tc
100f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
10100 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
10110 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
10120 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
10130 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 ),..."\": not a
10140 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 TLS channel", (c
10150 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 har *) NULL);..T
10160 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
10170 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
10180 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 STATUS", "CHANNE
10190 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 L", "INVALID", (
101a0 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
101b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
101c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 ;. }. stat
101d0 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
101e0 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 Tcl_GetChannelI
101f0 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e nstanceData(chan
10200 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 );.. /* Get c
10210 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 70 ertificate for p
10220 65 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 eer or self */.
10230 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 if (objc == 2
10240 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f ) {..peer = SSL_
10250 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 get_peer_certifi
10260 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 cate(statePtr->s
10270 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 sl);. } else
10280 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 {..peer = SSL_ge
10290 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 t_certificate(st
102a0 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
102b0 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 }. /* Get X
102c0 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 509 certificate
102d0 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 info */. if (
102e0 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 peer) {..objPtr
102f0 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a = Tls_NewX509Obj
10300 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a (interp, peer);.
10310 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 .if (objc == 2)
10320 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 {.. X509_free
10330 28 70 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 (peer);.. pee
10340 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 r = NULL;..}.
10350 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 } else {..objPt
10360 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
10370 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 bj(0, NULL);.
10380 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 }.. /* Peer
10390 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 name */. LAPP
103a0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
103b0 6f 62 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 6d objPtr, "peernam
103c0 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 e", SSL_get0_pee
103d0 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e rname(statePtr->
103e0 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c ssl), -1);. L
103f0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
10400 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 p, objPtr, "sbit
10410 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 s", SSL_get_ciph
10420 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 er_bits(statePtr
10430 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a ->ssl, NULL));..
10440 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 ciphers = (c
10450 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 har*)SSL_get_cip
10460 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 her(statePtr->ss
10470 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f l);. LAPPEND_
10480 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
10490 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 63 69 tr, "cipher", ci
104a0 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 phers, -1);..
104b0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 /* Verify the X
104c0 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 509 certificate
104d0 70 72 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 presented by the
104e0 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 peer */. LAP
104f0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
10500 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 objPtr, "verify
10510 52 65 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 Result",..X509_v
10520 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 erify_cert_error
10530 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f _string(SSL_get_
10540 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 verify_result(st
10550 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d atePtr->ssl)), -
10560 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 1);.. /* Veri
10570 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d fy mode */. m
10580 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 ode = SSL_get_ve
10590 72 69 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 rify_mode(stateP
105a0 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 tr->ssl);. if
105b0 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 (mode && SSL_VE
105c0 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 RIFY_NONE) {..LA
105d0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
105e0 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 , objPtr, "verif
105f0 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 yMode", "none",
10600 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 -1);. } else
10610 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 {..Tcl_Obj *list
10620 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 ObjPtr = Tcl_New
10630 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
10640 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 ;..if (mode && S
10650 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 29 20 SL_VERIFY_PEER)
10660 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
10670 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
10680 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 interp, listObjP
10690 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
106a0 67 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 gObj("peer", -1)
106b0 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 );..}..if (mode
106c0 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 && SSL_VERIFY_FA
106d0 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 IL_IF_NO_PEER_CE
106e0 52 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c RT) {.. Tcl_L
106f0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10700 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 ent(interp, list
10710 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 ObjPtr, Tcl_NewS
10720 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 tringObj("fail i
10730 66 20 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c f no peer cert",
10740 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d -1));..}..if (m
10750 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 ode && SSL_VERIF
10760 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b Y_CLIENT_ONCE) {
10770 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
10780 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
10790 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 nterp, listObjPt
107a0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
107b0 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 Obj("client once
107c0 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 ", -1));..}..if
107d0 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 (mode && SSL_VER
107e0 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 IFY_POST_HANDSHA
107f0 4b 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c KE) {.. Tcl_L
10800 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10810 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 ent(interp, list
10820 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 ObjPtr, Tcl_NewS
10830 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 tringObj("post h
10840 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b andshake", -1));
10850 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a ..}..LAPPEND_OBJ
10860 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10870 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c "verifyMode", l
10880 69 73 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d istObjPtr). }
10890 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 .. /* Verify
108a0 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 mode depth */.
108b0 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e LAPPEND_INT(in
108c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 terp, objPtr, "v
108d0 65 72 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c erifyDepth", SSL
108e0 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 _get_verify_dept
108f0 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 h(statePtr->ssl)
10900 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 );.. /* Repor
10910 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 t the selected p
10920 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 rotocol as a res
10930 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 ult of the negot
10940 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 iation */. SS
10950 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 L_get0_alpn_sele
10960 63 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 cted(statePtr->s
10970 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e sl, &proto, &len
10980 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 );. LAPPEND_S
10990 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
109a0 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 r, "alpn", (char
109b0 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 *)proto, (Tcl_S
109c0 69 7a 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c ize) len);. L
109d0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
109e0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 p, objPtr, "prot
109f0 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 ocol", SSL_get_v
10a00 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d ersion(statePtr-
10a10 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 >ssl), -1);..
10a20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f /* Valid for no
10a30 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 n-RSA signature
10a40 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 and TLS 1.3 */.
10a50 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 if (objc == 2
10a60 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 ) {..res = SSL_g
10a70 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 et_peer_signatur
10a80 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
10a90 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 ssl, &nid);.
10aa0 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
10ab0 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 SSL_get_signatur
10ac0 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
10ad0 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 ssl, &nid);.
10ae0 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 }. if (!res)
10af0 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c {nid = 0;}. L
10b00 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
10b10 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e p, objPtr, "sign
10b20 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 atureHashAlgorit
10b30 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 hm", OBJ_nid2ln(
10b40 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 nid), -1);..
10b50 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b if (objc == 2) {
10b60 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f ..res = SSL_get_
10b70 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 peer_signature_t
10b80 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 ype_nid(statePtr
10b90 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 ->ssl, &nid);.
10ba0 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 } else {..res
10bb0 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 = SSL_get_signat
10bc0 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 ure_type_nid(sta
10bd0 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 tePtr->ssl, &nid
10be0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 );. }. if
10bf0 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b (!res) {nid = 0;
10c00 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 }. LAPPEND_ST
10c10 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
10c20 2c 20 22 73 69 67 6e 61 74 75 72 65 54 79 70 65 , "signatureType
10c30 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 ", OBJ_nid2ln(ni
10c40 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63 d), -1);.. Tc
10c50 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
10c60 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a nterp, objPtr);.
10c70 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
10c80 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
10c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
10cd0 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e *. * Connection
10ce0 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 InfoObjCmd -- re
10cf0 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 turn connection
10d00 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 info from OpenSS
10d10 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 L.. *. * Results
10d20 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 :. *.A list of c
10d30 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 onnection info.
10d40 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
10d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d80 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
10d90 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 atic int Connect
10da0 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c ionInfoObjCmd(Cl
10db0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
10dc0 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
10dd0 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
10de0 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
10df0 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
10e00 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
10e10 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 ;../* The channe
10e20 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 l to set a mode
10e30 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 on */. State
10e40 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 *statePtr;../* c
10e50 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 lient state for
10e60 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 ssl socket */.
10e70 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
10e80 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 r, *listPtr;.
10e90 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b const SSL *ssl;
10ea0 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 . const SSL_C
10eb0 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 IPHER *cipher;.
10ec0 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 const SSL_SES
10ed0 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 SION *session;.
10ee0 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 const EVP_MD
10ef0 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 *md;. (void)
10f00 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
10f10 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 if (objc != 2)
10f20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
10f30 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
10f40 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b bjv, "channel");
10f50 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
10f60 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 OR;. }.. c
10f70 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
10f80 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c nnel(interp, Tcl
10f90 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
10fa0 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 1]), NULL);.
10fb0 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
10fc0 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
10fd0 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
10fe0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
10ff0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
11000 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
11010 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
11020 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
11030 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
11040 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 han);. if (Tc
11050 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
11060 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
11070 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
11080 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
11090 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
110a0 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
110b0 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
110c0 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e an),.. "\": n
110d0 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
110e0 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
110f0 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 );..Tcl_SetError
11100 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
11110 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 S", "CONNECTION"
11120 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e , "CHANNEL", "IN
11130 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 VALID", (char *)
11140 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
11150 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
11160 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
11170 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
11180 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 NULL);.. /*
11190 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 Connection info
111a0 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 */. statePtr
111b0 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 = (State *)Tcl_G
111c0 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 etChannelInstanc
111d0 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 eData(chan);.
111e0 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74 72 2d ssl = statePtr-
111f0 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 >ssl;. if (ss
11200 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a l != NULL) {../*
11210 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 connection stat
11220 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 e */..LAPPEND_ST
11230 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11240 2c 20 22 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 , "state", SSL_s
11250 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 tate_string_long
11260 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a (ssl), -1);.../*
11270 20 47 65 74 20 53 4e 49 20 72 65 71 75 65 73 74 Get SNI request
11280 65 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a ed server name *
11290 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
112a0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
112b0 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c servername", SSL
112c0 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 _get_servername(
112d0 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 ssl, TLSEXT_NAME
112e0 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c TYPE_host_name),
112f0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 -1);.../* Get p
11300 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 rotocol */..LAPP
11310 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11320 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f objPtr, "protoco
11330 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 l", SSL_get_vers
11340 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a ion(ssl), -1);..
11350 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 6f ./* Renegotiatio
11360 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 n allowed */..LA
11370 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
11380 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 p, objPtr, "rene
11390 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 gotiation_allowe
113a0 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 d", SSL_get_secu
113b0 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e re_renegotiation
113c0 5f 73 75 70 70 6f 72 74 28 28 53 53 4c 20 2a 29 _support((SSL *)
113d0 20 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 ssl));.../* Get
113e0 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 security level
113f0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 */..LAPPEND_INT(
11400 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11410 22 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 "security_level"
11420 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 , SSL_get_securi
11430 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a ty_level(ssl));.
11440 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 ../* Session inf
11450 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f o */..LAPPEND_BO
11460 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 OL(interp, objPt
11470 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 r, "session_reus
11480 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e ed", SSL_session
11490 5f 72 65 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a _reused(ssl));..
114a0 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69 6e ./* Is server in
114b0 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 fo */..LAPPEND_B
114c0 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
114d0 74 72 2c 20 22 69 73 5f 73 65 72 76 65 72 22 2c tr, "is_server",
114e0 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 SSL_is_server(s
114f0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 sl));.../* Is DT
11500 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 LS */..LAPPEND_B
11510 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
11520 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 2c 20 53 tr, "is_dtls", S
11530 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 6c 29 29 SL_is_dtls(ssl))
11540 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
11550 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 Cipher info */.
11560 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f cipher = SSL_
11570 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 get_current_ciph
11580 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 er(ssl);. if
11590 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 (cipher != NULL)
115a0 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46 {..char buf[BUF
115b0 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 SIZ] = {0};..int
115c0 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b bits, alg_bits;
115d0 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d .../* Cipher nam
115e0 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 e */..LAPPEND_ST
115f0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11600 2c 20 22 63 69 70 68 65 72 22 2c 20 53 53 4c 5f , "cipher", SSL_
11610 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 CIPHER_get_name(
11620 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 cipher), -1);...
11630 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 /* RFC name of c
11640 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e ipher */..LAPPEN
11650 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
11660 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 72 64 5f jPtr, "standard_
11670 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50 48 45 name", SSL_CIPHE
11680 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 R_standard_name(
11690 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 cipher), -1);...
116a0 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20 /* OpenSSL name
116b0 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 of cipher */..LA
116c0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
116d0 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73 , objPtr, "opens
116e0 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53 sl_name", OPENSS
116f0 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28 53 53 L_cipher_name(SS
11700 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 L_CIPHER_standar
11710 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 29 2c d_name(cipher)),
11720 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 -1);.../* numbe
11730 72 20 6f 66 20 73 65 63 72 65 74 20 62 69 74 73 r of secret bits
11740 20 75 73 65 64 20 66 6f 72 20 63 69 70 68 65 72 used for cipher
11750 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f */..bits = SSL_
11760 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73 28 CIPHER_get_bits(
11770 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 cipher, &alg_bit
11780 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 s);..LAPPEND_INT
11790 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
117a0 20 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c 20 "secret_bits",
117b0 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f bits);..LAPPEND_
117c0 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
117d0 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62 tr, "algorithm_b
117e0 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b its", alg_bits);
117f0 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 ../* alg_bits is
11800 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63 72 actual key secr
11810 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65 20 et bits. If use
11820 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74 20 bits and secret
11830 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 73 (algorithm) bits
11840 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74 68 65 differ,.. the
11850 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 69 74 rest of the bit
11860 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e 65 s are fixed, i.e
11870 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 . for limited ex
11880 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 62 69 port ciphers (bi
11890 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a ts < 56) */.../*
118a0 20 49 6e 64 69 63 61 74 65 73 20 77 68 69 63 68 Indicates which
118b0 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f SSL/TLS protoco
118c0 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 73 74 20 l version first
118d0 64 65 66 69 6e 65 64 20 74 68 65 20 63 69 70 68 defined the ciph
118e0 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 er */..LAPPEND_S
118f0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11900 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 r, "min_version"
11910 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 , SSL_CIPHER_get
11920 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29 _version(cipher)
11930 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 , -1);.../* Ciph
11940 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 er NID */..LAPPE
11950 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11960 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 4e 49 bjPtr, "cipherNI
11970 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f D", (char *)OBJ_
11980 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 nid2ln(SSL_CIPHE
11990 52 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 R_get_cipher_nid
119a0 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
119b0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
119c0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 erp, objPtr, "di
119d0 67 65 73 74 4e 49 44 22 2c 20 28 63 68 61 72 20 gestNID", (char
119e0 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c *)OBJ_nid2ln(SSL
119f0 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 69 67 65 _CIPHER_get_dige
11a00 73 74 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c st_nid(cipher)),
11a10 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 -1);..LAPPEND_S
11a20 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11a30 72 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 65 4e r, "keyExchangeN
11a40 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a ID", (char *)OBJ
11a50 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 _nid2ln(SSL_CIPH
11a60 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 ER_get_kx_nid(ci
11a70 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 pher)), -1);..LA
11a80 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11a90 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 68 65 , objPtr, "authe
11aa0 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 nticationNID", (
11ab0 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c char *)OBJ_nid2l
11ac0 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 n(SSL_CIPHER_get
11ad0 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 68 65 72 _auth_nid(cipher
11ae0 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 )), -1);.../* me
11af0 73 73 61 67 65 20 61 75 74 68 65 6e 74 69 63 61 ssage authentica
11b00 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 tion code - Ciph
11b10 65 72 20 69 73 20 41 45 41 44 20 28 65 2e 67 2e er is AEAD (e.g.
11b20 20 47 43 4d 20 6f 72 20 43 68 61 43 68 61 32 30 GCM or ChaCha20
11b30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f /Poly1305) or no
11b40 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 t */../* Authent
11b50 69 63 61 74 65 64 20 45 6e 63 72 79 70 74 69 6f icated Encryptio
11b60 6e 20 77 69 74 68 20 61 73 73 6f 63 69 61 74 65 n with associate
11b70 64 20 64 61 74 61 20 28 41 45 41 44 29 20 63 68 d data (AEAD) ch
11b80 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f eck */..LAPPEND_
11b90 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
11ba0 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 73 5f Ptr, "cipher_is_
11bb0 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 aead", SSL_CIPHE
11bc0 52 5f 69 73 5f 61 65 61 64 28 63 69 70 68 65 72 R_is_aead(cipher
11bd0 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 ));.../* Digest
11be0 75 73 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 used during the
11bf0 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b SSL/TLS handshak
11c00 65 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 65 e when using the
11c10 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 cipher. */..md
11c20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 = SSL_CIPHER_get
11c30 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 _handshake_diges
11c40 74 28 63 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 t(cipher);..LAPP
11c50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11c60 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 73 68 61 objPtr, "handsha
11c70 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 63 68 61 ke_digest", (cha
11c80 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 r *)EVP_MD_name(
11c90 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 md), -1);.../* G
11ca0 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 et OpenSSL-speci
11cb0 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 fic ID, not IANA
11cc0 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ID */..LAPPEND_
11cd0 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
11ce0 74 72 2c 20 22 63 69 70 68 65 72 5f 69 64 22 2c tr, "cipher_id",
11cf0 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 (int) SSL_CIPHE
11d00 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72 29 R_get_id(cipher)
11d10 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 );.../* Two-byte
11d20 20 49 44 20 75 73 65 64 20 69 6e 20 74 68 65 20 ID used in the
11d30 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 TLS protocol of
11d40 74 68 65 20 67 69 76 65 6e 20 63 69 70 68 65 72 the given cipher
11d50 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 */..LAPPEND_INT
11d60 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11d70 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 "protocol_id",
11d80 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 (int) SSL_CIPHER
11d90 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 _get_protocol_id
11da0 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 (cipher));.../*
11db0 54 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 Textual descript
11dc0 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 ion of the ciphe
11dd0 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 r */..if (SSL_CI
11de0 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e PHER_description
11df0 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 (cipher, buf, si
11e00 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 zeof(buf)) != NU
11e10 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 LL) {.. LAPPE
11e20 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11e30 62 6a 50 74 72 2c 20 22 64 65 73 63 72 69 70 74 bjPtr, "descript
11e40 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a ion", buf, -1);.
11e50 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
11e60 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f Session info */
11e70 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 . session = S
11e80 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 SL_get_session(s
11e90 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 65 73 sl);. if (ses
11ea0 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a sion != NULL) {.
11eb0 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 .const unsigned
11ec0 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 char *ticket;..s
11ed0 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 ize_t len2;..uns
11ee0 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a igned int ulen;.
11ef0 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 .const unsigned
11f00 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 char *session_id
11f10 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 , *proto;..unsig
11f20 6e 65 64 20 63 68 61 72 20 62 75 66 66 65 72 5b ned char buffer[
11f30 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b SSL_MAX_MASTER_K
11f40 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a EY_LENGTH];.../*
11f50 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 Report the sele
11f60 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 cted protocol as
11f70 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 a result of the
11f80 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f ALPN negotiatio
11f90 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f n */..SSL_SESSIO
11fa0 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 N_get0_alpn_sele
11fb0 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 cted(session, &p
11fc0 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c roto, &len2);..L
11fd0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11fe0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e p, objPtr, "alpn
11ff0 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 ", (char *) prot
12000 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 o, (Tcl_Size) le
12010 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 n2);.../* Report
12020 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 the selected pr
12030 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 otocol as a resu
12040 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 lt of the NPN ne
12050 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 gotiation */.#if
12060 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c def USE_NPN..SSL
12070 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f _get0_next_proto
12080 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 73 6c 2c _negotiated(ssl,
12090 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b &proto, &ulen);
120a0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
120b0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e terp, objPtr, "n
120c0 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 pn", (char *) pr
120d0 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 oto, (Tcl_Size)
120e0 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 ulen);.#endif...
120f0 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73 /* Resumable ses
12100 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 sion */..LAPPEND
12110 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
12120 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 jPtr, "resumable
12130 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 ", SSL_SESSION_i
12140 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73 s_resumable(sess
12150 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 ion));.../* Sess
12160 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 20 28 ion start time (
12170 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 seconds since ep
12180 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 och) */..LAPPEND
12190 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 _LONG(interp, ob
121a0 6a 50 74 72 2c 20 22 73 74 61 72 74 5f 74 69 6d jPtr, "start_tim
121b0 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f e", SSL_SESSION_
121c0 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e get_time(session
121d0 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 ));.../* Timeout
121e0 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 value - SSL_CTX
121f0 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e _get_timeout (in
12200 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 seconds) */..LA
12210 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 PPEND_LONG(inter
12220 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 p, objPtr, "time
12230 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f out", SSL_SESSIO
12240 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 N_get_timeout(se
12250 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 ssion));.../* Se
12260 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 ssion id - TLSv1
12270 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c .2 and below onl
12280 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 y */..session_id
12290 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
122a0 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 et_id(session, &
122b0 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f ulen);..LAPPEND_
122c0 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f BARRAY(interp, o
122d0 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f bjPtr, "session_
122e0 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c id", session_id,
122f0 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e (Tcl_Size) ulen
12300 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
12310 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 context */..sess
12320 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 ion_id = SSL_SES
12330 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e SION_get0_id_con
12340 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 text(session, &u
12350 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 len);..LAPPEND_B
12360 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 ARRAY(interp, ob
12370 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 jPtr, "session_c
12380 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 69 6f 6e ontext", session
12390 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 _id, (Tcl_Size)
123a0 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 ulen);.../* Sess
123b0 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 ion ticket - cli
123c0 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c ent only */..SSL
123d0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 _SESSION_get0_ti
123e0 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 cket(session, &t
123f0 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 icket, &len2);..
12400 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 LAPPEND_BARRAY(i
12410 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12420 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c session_ticket",
12430 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 ticket, (Tcl_Si
12440 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 ze) len2);.../*
12450 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c Session ticket l
12460 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28 69 6e ifetime hint (in
12470 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 seconds) */..LA
12480 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 PPEND_LONG(inter
12490 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 p, objPtr, "life
124a0 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 time", SSL_SESSI
124b0 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 ON_get_ticket_li
124c0 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 fetime_hint(sess
124d0 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b ion));.../* Tick
124e0 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a 23 et app data */.#
124f0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
12500 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
12510 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f 53 45 53 000000L..SSL_SES
12520 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 SION_get0_ticket
12530 5f 61 70 70 64 61 74 61 28 28 53 53 4c 5f 53 45 _appdata((SSL_SE
12540 53 53 49 4f 4e 20 2a 29 20 73 65 73 73 69 6f 6e SSION *) session
12550 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 , &ticket, &len2
12560 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 );..LAPPEND_BARR
12570 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 AY(interp, objPt
12580 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 r, "ticket_app_d
12590 61 74 61 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 ata", ticket, (T
125a0 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a cl_Size) len2);.
125b0 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47 65 74 20 #endif.../* Get
125c0 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c master key */..l
125d0 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f en2 = SSL_SESSIO
125e0 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 N_get_master_key
125f0 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 (session, buffer
12600 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 , SSL_MAX_MASTER
12610 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c _KEY_LENGTH);..L
12620 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e APPEND_BARRAY(in
12630 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d terp, objPtr, "m
12640 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 aster_key", buff
12650 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c er, (Tcl_Size) l
12660 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 en2);.../* Compr
12670 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e ession id */..un
12680 73 69 67 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 signed int id =
12690 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
126a0 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 65 73 73 compress_id(sess
126b0 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 ion);..LAPPEND_S
126c0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
126d0 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f r, "compression_
126e0 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 id", id == 1 ? "
126f0 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 zlib" : "none",
12700 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 -1);. }..
12710 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 /* Compression i
12720 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 nfo */. if (s
12730 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 sl != NULL) {.#i
12740 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f fdef HAVE_SSL_CO
12750 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 MPRESSION..const
12760 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f COMP_METHOD *co
12770 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 mp, *expn;..comp
12780 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 = SSL_get_curre
12790 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 nt_compression(s
127a0 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c sl);..expn = SSL
127b0 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 _get_current_exp
127c0 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c ansion(ssl);...L
127d0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
127e0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 p, objPtr, "comp
127f0 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f ression", comp ?
12800 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 SSL_COMP_get_na
12810 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 me(comp) : "none
12820 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 ", -1);..LAPPEND
12830 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12840 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 Ptr, "expansion"
12850 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d , expn ? SSL_COM
12860 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 P_get_name(expn)
12870 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a : "none", -1);.
12880 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 #else..LAPPEND_S
12890 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
128a0 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 r, "compression"
128b0 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 , "none", -1);..
128c0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
128d0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 rp, objPtr, "exp
128e0 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c ansion", "none",
128f0 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 -1);.#endif.
12900 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 }.. /* Serve
12910 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a r info */. {.
12920 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c .long mode = SSL
12930 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e _CTX_get_session
12940 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 _cache_mode(stat
12950 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 ePtr->ctx);..cha
12960 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f r *msg;...if (mo
12970 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 de & SSL_SESS_CA
12980 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 CHE_OFF) {..
12990 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 msg = "off";..}
129a0 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 else if (mode &
129b0 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 SSL_SESS_CACHE_C
129c0 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 LIENT) {.. ms
129d0 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d g = "client";..}
129e0 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 else if (mode &
129f0 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f SSL_SESS_CACHE_
12a00 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 6d SERVER) {.. m
12a10 73 67 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 sg = "server";..
12a20 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 } else if (mode
12a30 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
12a40 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 _BOTH) {.. ms
12a50 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 g = "both";..} e
12a60 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d lse {.. msg =
12a70 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 "unknown";..}..
12a80 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
12a90 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 rp, objPtr, "ses
12aa0 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 sion_cache_mode"
12ab0 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 , msg, -1);.
12ac0 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 }.. /* CA Lis
12ad0 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e t */. /* IF n
12ae0 6f 74 20 61 20 73 65 72 76 65 72 2c 20 73 61 6d ot a server, sam
12af0 65 20 61 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 e as SSL_get0_pe
12b00 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 er_CA_list. If s
12b10 65 72 76 65 72 20 73 61 6d 65 20 61 73 20 53 53 erver same as SS
12b20 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 L_CTX_get_client
12b30 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 _CA_list */.
12b40 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 listPtr = Tcl_Ne
12b50 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
12b60 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 );. STACK_OF(
12b70 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c X509_NAME) *ca_l
12b80 69 73 74 3b 0a 20 20 20 20 69 66 20 28 28 63 61 ist;. if ((ca
12b90 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f _list = SSL_get_
12ba0 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 client_CA_list(s
12bb0 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a sl)) != NULL) {.
12bc0 09 63 68 61 72 20 62 75 66 66 65 72 5b 42 55 46 .char buffer[BUF
12bd0 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 SIZ];..for (int
12be0 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 i = 0; i < sk_X5
12bf0 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 09_NAME_num(ca_l
12c00 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 ist); i++) {..
12c10 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d X509_NAME *nam
12c20 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 e = sk_X509_NAME
12c30 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 _value(ca_list,
12c40 69 29 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 6d i);.. if (nam
12c50 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 e) {...X509_NAME
12c60 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 _oneline(name, b
12c70 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a uffer, BUFSIZ);.
12c80 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
12c90 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
12ca0 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f p, listPtr, Tcl_
12cb0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 NewStringObj(buf
12cc0 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 fer, -1));..
12cd0 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c }..}. }. L
12ce0 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 APPEND_OBJ(inter
12cf0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 p, objPtr, "caLi
12d00 73 74 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 st", listPtr);.
12d10 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 LAPPEND_INT(i
12d20 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12d30 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b caListCount", sk
12d40 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 _X509_NAME_num(c
12d50 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 a_list));.. T
12d60 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
12d70 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
12d80 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
12d90 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
12da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12de0 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 . *. * VersionOb
12df0 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 jCmd -- return v
12e00 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 ersion string fr
12e10 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 om OpenSSL.. *.
12e20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
12e30 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
12e40 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
12e50 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
12e60 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
12e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
12eb0 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f tatic int.Versio
12ec0 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 nObjCmd(ClientDa
12ed0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
12ee0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
12ef0 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
12f00 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
12f10 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []) {. Tcl_Ob
12f20 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 28 j *objPtr;. (
12f30 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
12f40 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 6f 62 6a ;. (void) obj
12f50 63 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 6f 62 c;. (void) ob
12f60 6a 76 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 jv;.. dprintf
12f70 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
12f80 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 objPtr = Tcl_Ne
12f90 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 wStringObj(OPENS
12fa0 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c SL_VERSION_TEXT,
12fb0 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 -1);. Tcl_Se
12fc0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
12fd0 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 p, objPtr);..
12fe0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
12ff0 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
13000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
13040 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d * MiscObjCmd --
13050 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 misc commands.
13060 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
13070 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
13080 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
13090 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
130a0 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
130b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
130c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
130d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
130e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
130f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 /.static int.Mis
13100 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 cObjCmd(ClientDa
13110 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
13120 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
13130 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
13140 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
13150 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 []) {. static
13160 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d const char *com
13170 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 mands [] = { "re
13180 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55 q", "strreq", NU
13190 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 LL };. enum c
131a0 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 ommand { C_REQ,
131b0 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d C_STRREQ, C_DUMM
131c0 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a Y };. Tcl_Siz
131d0 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69 e cmd;. int i
131e0 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20 62 sStr;. char b
131f0 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 20 20 uffer[16384];.
13200 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 (void) clientD
13210 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ata;.. dprint
13220 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
13230 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 if (objc < 2)
13240 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
13250 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
13260 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 bjv, "subcommand
13270 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 ?args?");..retu
13280 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
13290 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f }. if (Tcl_
132a0 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 GetIndexFromObj(
132b0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c interp, objv[1],
132c0 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d commands, "comm
132d0 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 and", 0, &cmd) !
132e0 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 = TCL_OK) {..ret
132f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
13300 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c }.. ERR_cl
13310 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 ear_error();..
13320 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d isStr = (cmd =
13330 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 = C_STRREQ);.
13340 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 switch ((enum c
13350 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 ommand) cmd) {..
13360 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 case C_REQ:..cas
13370 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 e C_STRREQ: {..
13380 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 EVP_PKEY *pke
13390 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 y=NULL;.. X50
133a0 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 9 *cert=NULL;..
133b0 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 X509_NAME *na
133c0 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 me=NULL;.. Tc
133d0 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 l_Obj **listv;..
133e0 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 Tcl_Size lis
133f0 74 63 3b 0a 09 20 20 20 20 69 6e 74 20 69 3b 0a tc;.. int i;.
13400 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e .. BIO *out=N
13410 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 ULL;... char
13420 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 *k_C="",*k_ST=""
13430 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 ,*k_L="",*k_O=""
13440 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d ,*k_OU="",*k_CN=
13450 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a "",*k_Email="";.
13460 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 . char *keyou
13470 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a t,*pemout,*str;.
13480 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 . int keysize
13490 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 ,serial=0,days=3
134a0 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 65;..#if OPENSSL
134b0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
134c0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 < 0x30000000L..
134d0 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d BIGNUM *bne =
134e0 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 NULL;.. RSA
134f0 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c *rsa = NULL;.#el
13500 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 se.. EVP_PKEY
13510 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c _CTX *ctx = NULL
13520 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 ;.#endif... i
13530 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 f ((objc<5) || (
13540 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c objc>6)) {...Tcl
13550 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
13560 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 terp, 2, objv, "
13570 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 keysize keyfile
13580 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 certfile ?info?"
13590 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
135a0 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 ERROR;.. }...
135b0 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 if (Tcl_GetI
135c0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
135d0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 , objv[2], &keys
135e0 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ize) != TCL_OK)
135f0 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {...return TCL_E
13600 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 RROR;.. }..
13610 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 keyout=Tcl_Get
13620 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b String(objv[3]);
13630 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c .. pemout=Tcl
13640 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
13650 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 4]);.. if (is
13660 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 Str) {...Tcl_Set
13670 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 Var(interp,keyou
13680 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 t,"",0);...Tcl_S
13690 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d etVar(interp,pem
136a0 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 out,"",0);..
136b0 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 }... if (objc
136c0 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c >=6) {...if (Tcl
136d0 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 _ListObjGetEleme
136e0 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 nts(interp, objv
136f0 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 [5], &listc, &li
13700 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 stv) != TCL_OK)
13710 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 {... return T
13720 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 CL_ERROR;...}...
13730 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 .if ((listc%2) !
13740 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c = 0) {... Tcl
13750 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
13760 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c p,"Information l
13770 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 ist must have ev
13780 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 en number of arg
13790 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 uments",NULL);..
137a0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
137b0 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 ERROR;...}...for
137c0 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 (i=0; i<listc;
137d0 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 i+=2) {... st
137e0 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 r=Tcl_GetString(
137f0 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 listv[i]);...
13800 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
13810 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 "days")==0) {...
13820 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 .if (Tcl_GetIntF
13830 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 romObj(interp,li
13840 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 stv[i+1],&days)!
13850 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 =TCL_OK)....
13860 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
13870 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
13880 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 f (strcmp(str,"s
13890 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 erial")==0) {...
138a0 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 .if (Tcl_GetIntF
138b0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 romObj(interp,li
138c0 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c stv[i+1],&serial
138d0 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 )!=TCL_OK)....
138e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
138f0 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 OR;... } else
13900 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
13910 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "C")==0) {....k_
13920 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 C=Tcl_GetString(
13930 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
13940 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
13950 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d rcmp(str,"ST")==
13960 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 0) {....k_ST=Tcl
13970 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
13980 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
13990 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
139a0 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 str,"L")==0) {..
139b0 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 ..k_L=Tcl_GetStr
139c0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
139d0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
139e0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 (strcmp(str,"O"
139f0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 )==0) {....k_O=T
13a00 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
13a10 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
13a20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
13a30 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 p(str,"OU")==0)
13a40 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 {....k_OU=Tcl_Ge
13a50 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
13a60 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
13a70 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
13a80 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 ,"CN")==0) {....
13a90 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 k_CN=Tcl_GetStri
13aa0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
13ab0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
13ac0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 (strcmp(str,"Ema
13ad0 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f il")==0) {....k_
13ae0 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 Email=Tcl_GetStr
13af0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
13b00 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ... } else {.
13b10 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
13b20 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e (interp,"Unknown
13b30 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c parameter",NULL
13b40 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c );....return TCL
13b50 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a _ERROR;... }.
13b60 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 ..}.. }..#if
13b70 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
13b80 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
13b90 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 000L.. bne =
13ba0 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 BN_new();.. r
13bb0 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a sa = RSA_new();.
13bc0 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f . pkey = EVP_
13bd0 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 PKEY_new();..
13be0 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c if (bne == NULL
13bf0 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 || rsa == NULL
13c00 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 || pkey == NULL
13c10 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 || !BN_set_word(
13c20 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 bne,RSA_F4) ||..
13c30 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b .!RSA_generate_k
13c40 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69 ey_ex(rsa, keysi
13c50 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c ze, bne, NULL) |
13c60 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 | !EVP_PKEY_assi
13c70 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61 gn_RSA(pkey, rsa
13c80 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f )) {...EVP_PKEY_
13c90 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a free(pkey);.../*
13ca0 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20 RSA_free(rsa);
13cb0 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45 freed by EVP_PKE
13cc0 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 Y_free */...BN_f
13cd0 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a ree(bne);.#else.
13ce0 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f . pkey = EVP_
13cf0 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 RSA_gen((unsigne
13d00 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b d int) keysize);
13d10 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f .. ctx = EVP_
13d20 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 PKEY_CTX_new(pke
13d30 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 y,NULL);.. if
13d40 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c (pkey == NULL |
13d50 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c | ctx == NULL ||
13d60 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 !EVP_PKEY_keyge
13d70 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 n_init(ctx) ||..
13d80 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 .!EVP_PKEY_CTX_s
13d90 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 et_rsa_keygen_bi
13da0 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 ts(ctx, keysize)
13db0 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 || !EVP_PKEY_ke
13dc0 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 ygen(ctx, &pkey)
13dd0 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 ) {...EVP_PKEY_f
13de0 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 ree(pkey);...EVP
13df0 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63 _PKEY_CTX_free(c
13e00 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 tx);.#endif...Tc
13e10 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
13e20 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 rp,"Error genera
13e30 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79 ting private key
13e40 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 ",NULL);...retur
13e50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
13e60 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 } else {...if
13e70 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 (isStr) {...
13e80 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f out=BIO_new(BIO_
13e90 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 s_mem());...
13ea0 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 PEM_write_bio_Pr
13eb0 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 ivateKey(out,pke
13ec0 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 y,NULL,NULL,0,NU
13ed0 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 LL,NULL);...
13ee0 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 i=BIO_read(out,b
13ef0 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 uffer,sizeof(buf
13f00 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 fer)-1);... i
13f10 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a =(i<0) ? 0 : i;.
13f20 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d .. buffer[i]=
13f30 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f '\0';... Tcl_
13f40 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 SetVar(interp,ke
13f50 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a yout,buffer,0);.
13f60 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 .. BIO_flush(
13f70 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f out);... BIO_
13f80 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 free(out);...} e
13f90 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d lse {... out=
13fa0 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 BIO_new(BIO_s_fi
13fb0 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f le());... BIO
13fc0 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 _write_filename(
13fd0 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 out,keyout);...
13fe0 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
13ff0 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c _PrivateKey(out,
14000 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 pkey,NULL,NULL,0
14010 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 ,NULL,NULL);...
14020 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f /* PEM_write_
14030 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65 bio_RSAPrivateKe
14040 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c y(out, rsa, NULL
14050 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c , NULL, 0, NULL,
14060 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 NULL); */...
14070 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 BIO_free_all(ou
14080 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 t);.. .}....if (
14090 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 (cert=X509_new()
140a0 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 )==NULL) {...
140b0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 Tcl_SetResult(i
140c0 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e nterp,"Error gen
140d0 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 69 63 erating certific
140e0 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c ate request",NUL
140f0 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b L);... EVP_PK
14100 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 EY_free(pkey);.#
14110 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
14120 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
14130 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 000000L... BN
14140 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 _free(bne);.#end
14150 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 if... return
14160 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a TCL_ERROR;...}..
14170 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 ..X509_set_versi
14180 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 on(cert,2);...AS
14190 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 N1_INTEGER_set(X
141a0 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 509_get_serialNu
141b0 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 mber(cert),seria
141c0 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d l);...X509_gmtim
141d0 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f e_adj(X509_getm_
141e0 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c notBefore(cert),
141f0 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 0);...X509_gmtim
14200 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f e_adj(X509_getm_
14210 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 notAfter(cert),(
14220 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 long)60*60*24*da
14230 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f ys);...X509_set_
14240 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 pubkey(cert,pkey
14250 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f );....name=X509_
14260 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 get_subject_name
14270 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f (cert);....X509_
14280 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
14290 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 y_txt(name,"C",
142a0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
142b0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
142c0 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d ar *) k_C, -1, -
142d0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
142e0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
142f0 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d txt(name,"ST", M
14300 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
14310 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
14320 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d r *) k_ST, -1, -
14330 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
14340 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
14350 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 txt(name,"L", MB
14360 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
14370 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
14380 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c *) k_L, -1, -1,
14390 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
143a0 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
143b0 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 t(name,"O", MBST
143c0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
143d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
143e0 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 ) k_O, -1, -1, 0
143f0 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
14400 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
14410 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 name,"OU", MBSTR
14420 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
14430 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
14440 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 k_OU, -1, -1, 0
14450 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
14460 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
14470 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 name,"CN", MBSTR
14480 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
14490 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
144a0 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 k_CN, -1, -1, 0
144b0 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
144c0 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
144d0 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 name,"Email", MB
144e0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
144f0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
14500 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c *) k_Email, -1,
14510 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 -1, 0);....X509
14520 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d _set_subject_nam
14530 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 e(cert,name);...
14540 09 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 .if (!X509_sign(
14550 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 cert,pkey,EVP_sh
14560 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 a256())) {...
14570 20 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 X509_free(cert)
14580 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 ;... EVP_PKEY
14590 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 _free(pkey);.#if
145a0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
145b0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
145c0 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 0000L... BN_f
145d0 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 ree(bne);.#endif
145e0 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 ... Tcl_SetRe
145f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 sult(interp,"Err
14600 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 or signing certi
14610 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 ficate",NULL);..
14620 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
14630 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 ERROR;...}....if
14640 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 (isStr) {...
14650 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f out=BIO_new(BIO
14660 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 _s_mem());...
14670 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 PEM_write_bio_X
14680 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 509(out,cert);..
14690 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 . i=BIO_read(
146a0 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f out,buffer,sizeo
146b0 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 f(buffer)-1);...
146c0 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 i=(i<0) ? 0
146d0 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 : i;... buffe
146e0 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 r[i]='\0';...
146f0 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 Tcl_SetVar(inte
14700 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 rp,pemout,buffer
14710 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 ,0);... BIO_f
14720 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 lush(out);...
14730 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a BIO_free(out);.
14740 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 ..} else {...
14750 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f out=BIO_new(BIO
14760 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 _s_file());...
14770 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 BIO_write_file
14780 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 name(out,pemout)
14790 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 ;... PEM_writ
147a0 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 e_bio_X509(out,c
147b0 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f ert);... BIO_
147c0 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 free_all(out);..
147d0 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 .}....X509_free(
147e0 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 cert);...EVP_PKE
147f0 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 Y_free(pkey);.#i
14800 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
14810 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
14820 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 00000L...BN_free
14830 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 (bne);.#endif..
14840 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a }..}..break;.
14850 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 default:..br
14860 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 eak;. }. r
14870 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
14880 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
14890 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 *******/./* Init
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a */.
148b0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
148c0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d *****/../*. *---
148d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
148e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
148f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14910 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 . *. * Tls_Free
14920 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
14930 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 ocedure cleans u
14940 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 p when a SSL soc
14950 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 ket based channe
14960 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 l. *.is closed a
14970 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 nd its reference
14980 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c count falls bel
14990 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ow 1. *. * Resul
149a0 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 ts:. *.none. *.
149b0 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
149c0 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 *.Frees all the
149d0 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d state. *. *----
149e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
149f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
14a20 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 */.void.Tls_Fre
14a30 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 e(char *blockPtr
14a40 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
14a50 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
14a60 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 *)blockPtr;..
14a70 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
14a80 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c d");.. Tls_Cl
14a90 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 ean(statePtr);.
14aa0 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 ckfree(blockP
14ab0 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d tr);.}.../*. *--
14ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b00 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 -. *. * Tls_Clea
14b10 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 n --. *. *.This
14b20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 procedure cleans
14b30 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 up when a SSL s
14b40 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e ocket based chan
14b50 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 nel. *.is closed
14b60 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e and its referen
14b70 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 ce count falls b
14b80 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 elow 1. This sh
14b90 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 ould. *.be calle
14ba0 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 d synchronously
14bb0 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 by the CloseProc
14bc0 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 , not in the. *.
14bd0 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 EventuallyFree c
14be0 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 allback.. *. * R
14bf0 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a esults:. *.none.
14c00 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
14c10 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c ts:. *.Frees all
14c20 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a the state. *. *
14c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c70 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 ---. */.void Tls
14c80 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 _Clean(State *st
14c90 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 atePtr) {. dp
14ca0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
14cb0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
14cc0 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 we're assuming h
14cd0 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20 73 ere that we're s
14ce0 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 ingle-threaded.
14cf0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 */. if (s
14d00 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 tatePtr->timer !
14d10 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 = (Tcl_TimerToke
14d20 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f n) NULL) {..Tcl_
14d30 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c DeleteTimerHandl
14d40 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d er(statePtr->tim
14d50 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e er);..statePtr->
14d60 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 timer = NULL;.
14d70 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 }.. if (sta
14d80 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b tePtr->protos) {
14d90 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 ..ckfree(statePt
14da0 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 r->protos);..sta
14db0 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 tePtr->protos =
14dc0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
14dd0 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 if (statePtr->bi
14de0 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 o) {../* This wi
14df0 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 ll call SSL_shut
14e00 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 down. Bug 141404
14e10 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 5 */..dprintf("B
14e20 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 IO_free_all(%p)"
14e30 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 , statePtr->bio)
14e40 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 ;..BIO_free_all(
14e50 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a statePtr->bio);.
14e60 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d .statePtr->bio =
14e70 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
14e80 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 if (statePtr->s
14e90 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 sl) {..dprintf("
14ea0 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 SSL_free(%p)", s
14eb0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 tatePtr->ssl);..
14ec0 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 SSL_free(statePt
14ed0 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 r->ssl);..stateP
14ee0 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a tr->ssl = NULL;.
14ef0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
14f00 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 atePtr->ctx) {..
14f10 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 SSL_CTX_free(sta
14f20 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 tePtr->ctx);..st
14f30 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 atePtr->ctx = NU
14f40 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
14f50 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
14f60 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 back) {..Tcl_Dec
14f70 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
14f80 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 tr->callback);..
14f90 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
14fa0 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d ck = NULL;. }
14fb0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
14fc0 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 r->password) {..
14fd0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
14fe0 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 (statePtr->passw
14ff0 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ord);..statePtr-
15000 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c >password = NULL
15010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
15020 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 20 statePtr->vcmd)
15030 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f {..Tcl_DecrRefCo
15040 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 unt(statePtr->vc
15050 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e md);..statePtr->
15060 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 vcmd = NULL;.
15070 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 }.. dprintf(
15080 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a "Returning");.}.
15090 0c 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f ..#if TCL_MAJOR_
150a0 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23 64 65 66 VERSION > 8.#def
150b0 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 ine MIN_VERSION
150c0 22 39 2e 30 22 0a 23 65 6c 73 65 0a 23 64 65 66 "9.0".#else.#def
150d0 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 ine MIN_VERSION
150e0 22 38 2e 35 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a "8.5".#endif../*
150f0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
15100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15130 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
15140 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 _Init --. *. *.T
15150 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 his is a package
15160 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 initialization
15170 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 procedure, which
15180 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 is called. *.by
15190 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70 Tcl when this p
151a0 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 ackage is to be
151b0 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 added to an inte
151c0 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 rpreter.. *. * R
151d0 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e esults: Ssl con
151e0 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 figured and load
151f0 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ed. *. * Side ef
15200 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 fects:. *. creat
15210 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e e the ssl comman
15220 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 d, initialize ss
15230 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d l context. *. *-
15240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15280 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 --. */.DLLEXPORT
15290 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 int Tls_Init(Tc
152a0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
152b0 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 ) {. const ch
152c0 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 ar tlsTclInitScr
152d0 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 ipt[] = {.#inclu
152e0 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 de "tls.tcl.h"..
152f0 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 0x00. };..
15300 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
15310 22 29 3b 0a 0a 23 69 66 64 65 66 20 55 53 45 5f ");..#ifdef USE_
15320 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 20 69 66 TCL_STUBS. if
15330 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 (Tcl_InitStubs(
15340 69 6e 74 65 72 70 2c 20 4d 49 4e 5f 56 45 52 53 interp, MIN_VERS
15350 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 ION, 0) == NULL)
15360 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
15370 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 RROR;. }.#end
15380 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 50 if. if (Tcl_P
15390 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 kgRequire(interp
153a0 2c 20 22 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 , "Tcl", MIN_VER
153b0 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c SION, 0) == NULL
153c0 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
153d0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
153e0 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 if (TlsLibInit
153f0 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b (0) != TCL_OK) {
15400 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
15410 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c lt(interp, "coul
15420 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 d not initialize
15430 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 SSL library", (
15440 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
15450 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
15460 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c ;. }.. Tcl
15470 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
15480 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
15490 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 ciphers", Cipher
154a0 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 sObjCmd, (Client
154b0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c Data) NULL, (Tcl
154c0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
154d0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
154e0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
154f0 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
15500 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e connection", Con
15510 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d nectionInfoObjCm
15520 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
15530 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
15540 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
15550 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
15560 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
15570 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 rp, "tls::handsh
15580 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f ake", HandshakeO
15590 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
155a0 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 ta) NULL, (Tcl_C
155b0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
155c0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
155d0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
155e0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d interp, "tls::im
155f0 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a port", ImportObj
15600 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
15610 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 ) NULL, (Tcl_Cmd
15620 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
15630 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
15640 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
15650 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d terp, "tls::unim
15660 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f port", UnimportO
15670 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
15680 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 ta) NULL, (Tcl_C
15690 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
156a0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
156b0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
156c0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 interp, "tls::st
156d0 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a atus", StatusObj
156e0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
156f0 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 ) NULL, (Tcl_Cmd
15700 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
15710 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
15720 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
15730 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73 terp, "tls::vers
15740 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a ion", VersionObj
15750 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
15760 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 ) NULL, (Tcl_Cmd
15770 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
15780 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
15790 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
157a0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 terp, "tls::misc
157b0 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 ", MiscObjCmd, (
157c0 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
157d0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
157e0 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
157f0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
15800 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
15810 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 "tls::protocols"
15820 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d , ProtocolsObjCm
15830 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
15840 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
15850 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
15860 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 );.. if (inte
15870 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 rp) {..Tcl_Eval(
15880 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e interp, tlsTclIn
15890 69 74 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d itScript);. }
158a0 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c .. return Tcl
158b0 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 _PkgProvide(inte
158c0 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 rp, PACKAGE_NAME
158d0 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f , PACKAGE_VERSIO
158e0 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d N);.}../*. *----
158f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15920 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 --*. *. *.Tls_Sa
15930 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 feInit --. *. *.
15940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15970 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72 *. *.Standard pr
15980 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65 64 ocedure required
15990 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 by 'load'.. *.I
159a0 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20 nitializes this
159b0 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 extension for a
159c0 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 safe interpreter
159d0 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *.-----------
159e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a00 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 -----*. *. *.Sid
15a10 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 e effects:. *..A
15a20 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a s of 'Tls_Init'.
15a30 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a *. *.Result:. *
15a40 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c ..A standard Tcl
15a50 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a error code.. *.
15a60 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
15a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a90 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c --------*. */.DL
15aa0 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f LEXPORT int Tls_
15ab0 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 SafeInit(Tcl_Int
15ac0 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 erp *interp) {.
15ad0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
15ae0 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e ed");. return
15af0 20 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 Tls_Init(interp
15b00 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d );.}../*. *-----
15b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b40 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 -*. *. *.TlsLibI
15b50 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d nit --. *. *.---
15b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
15b90 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 *.Initializes SS
15ba0 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 L library once p
15bb0 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 er application.
15bc0 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
15bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15bf0 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 --*. *. *.Side e
15c00 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 ffects:. *..init
15c10 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 ializes SSL libr
15c20 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 ary. *. *.Result
15c30 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a :. *..none. *. *
15c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c70 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 ------*. */.stat
15c80 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 ic int TlsLibIni
15c90 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 t(int uninitiali
15ca0 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 ze) {. static
15cb0 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 int initialized
15cc0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 = 0;. int st
15cd0 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 atus = TCL_OK;.#
15ce0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
15cf0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
15d00 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
15d10 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e DS). size_t n
15d20 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 um_locks;.#endif
15d30 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 .. if (uninit
15d40 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 ialize) {..if (!
15d50 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
15d60 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b dprintf("Ask
15d70 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 ed to uninitiali
15d80 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e ze, but we are n
15d90 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 ot initialized")
15da0 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 ;... return T
15db0 43 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09 64 70 72 69 CL_OK;..}...dpri
15dc0 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e ntf("Asked to un
15dd0 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 initialize");..#
15de0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
15df0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
15e00 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
15e10 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f DS)..Tcl_MutexLo
15e20 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 ck(&init_mx);...
15e30 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 if (locks) {..
15e40 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 free(locks);..
15e50 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c locks = NULL
15e60 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e ;.. locksCoun
15e70 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 t = 0;..}.#endif
15e80 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 ..initialized =
15e90 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 0;..#if defined(
15ea0 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
15eb0 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
15ec0 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 THREADS)..Tcl_Mu
15ed0 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f texUnlock(&init_
15ee0 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 mx);.#endif...re
15ef0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 turn TCL_OK;.
15f00 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 }.. if (init
15f10 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 ialized) {..dpri
15f20 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 ntf("Called, but
15f30 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 using cached va
15f40 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 20 73 lue");..return s
15f50 74 61 74 75 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 tatus;. }..
15f60 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
15f70 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 d");..#if define
15f80 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
15f90 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
15fa0 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 L_THREADS). T
15fb0 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e cl_MutexLock(&in
15fc0 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 it_mx);.#endif.
15fd0 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d initialized =
15fe0 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 1;..#if defined
15ff0 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
16000 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
16010 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75 _THREADS). nu
16020 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 m_locks = 1;.
16030 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 locksCount = (i
16040 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 nt) num_locks;.
16050 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f locks = mallo
16060 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 c(sizeof(*locks)
16070 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 * num_locks);.
16080 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c memset(locks,
16090 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 0, sizeof(*lock
160a0 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b s) * num_locks);
160b0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 .#endif.. /*
160c0 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 Initialize BOTH
160d0 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 libcrypto and li
160e0 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 bssl. */. OPE
160f0 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 NSSL_init_ssl(OP
16100 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f ENSSL_INIT_LOAD_
16110 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 SSL_STRINGS | OP
16120 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f ENSSL_INIT_LOAD_
16130 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 CRYPTO_STRINGS..
16140 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 | OPENSSL_INIT_A
16150 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c DD_ALL_CIPHERS |
16160 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 OPENSSL_INIT_AD
16170 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e D_ALL_DIGESTS, N
16180 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e ULL);.. BIO_n
16190 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b ew_tcl(NULL, 0);
161a0 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 ..#if 0. /*.
161b0 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 * XXX:TODO:
161c0 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 65 Remove this code
161d0 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 and replace it
161e0 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20 20 with a check.
161f0 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 * for enough e
16200 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f ntropy and do no
16210 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 t try to create
16220 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 our own. * t
16230 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a errible entropy.
16240 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 */. /*.
16250 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 20 72 * Seed the r
16260 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e andom number gen
16270 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53 erator in the SS
16280 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20 L library,.
16290 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 * using the do/w
162a0 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62 hile construct b
162b0 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 62 75 ecause of the bu
162c0 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 g note in the.
162d0 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 * OpenSSL FAQ
162e0 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f at http://www.o
162f0 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f penssl.org/suppo
16300 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 rt/faq.html#USER
16310 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 1. *. *
16320 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 The crux of the
16330 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 problem is that
16340 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e Solaris 7 does n
16350 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 20 2a ot have a. *
16360 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 /dev/random or
16370 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 /dev/urandom dev
16380 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 ice so it cannot
16390 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 gather enough.
163a0 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 * entropy fr
163b0 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64 om the RAND_seed
163c0 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 () when TLS init
163d0 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75 ializes and refu
163e0 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f ses. * to go
163f0 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65 further. Earlie
16400 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 r versions of Op
16410 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e enSSL carried on
16420 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 regardless..
16430 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 */. srand((
16440 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69 unsigned int) ti
16450 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 me((time_t *) NU
16460 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 LL));. do {..
16470 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 for (i = 0; i <
16480 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 16; i++) {..
16490 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 rnd_seed[i] = 1
164a0 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 20 + (char) (255.0
164b0 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d * rand()/(RAND_M
164c0 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 AX+1.0));..}..RA
164d0 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64 ND_seed(rnd_seed
164e0 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 , sizeof(rnd_see
164f0 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 d));. } while
16500 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20 (RAND_status()
16510 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 != 1);.#endif..#
16520 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
16530 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
16540 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
16550 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e DS)..Tcl_MutexUn
16560 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a lock(&init_mx);.
16570 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75 #endif.. retu
16580 72 6e 20 73 74 61 74 75 73 3b 0a 7d 0a rn status;.}.