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 69 6e 74 20 6f 66 66 20 3d 20 30 2c int off = 0,
d240: 20 61 62 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 abort = 0;.
d250: 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 int load_private
d260: 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 _key;. const
d270: 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 SSL_METHOD *meth
d280: 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 od;.. dprintf
d290: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
d2a0: 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 if (!proto) {..
d2b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d2c0: 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c (interp, "no val
d2d0: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 id protocol sele
d2e0: 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 cted", (char *)
d2f0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
d300: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
d310: 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f /* create SSL co
d320: 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 ntext */.#if OPE
d330: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
d340: 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 BER >= 0x1010000
d350: 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 0L || defined(NO
d360: 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL2) || define
d370: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
d380: 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 2). if (ENABL
d390: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
d3a0: 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 OTO_SSL2)) {..Tc
d3b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d3c0: 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f nterp, "SSL2 pro
d3d0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
d3e0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ted", (char *) N
d3f0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
d400: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
d410: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
d420: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL3) || defined
d430: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
d440: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
d450: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
d460: 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c TO_SSL3)) {..Tcl
d470: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
d480: 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 terp, "SSL3 prot
d490: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
d4a0: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ed", (char *) NU
d4b0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
d4c0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
d4d0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
d4e0: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
d4f0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
d500: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
d510: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
d520: 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f O_TLS1)) {..Tcl_
d530: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d540: 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 erp, "TLS 1.0 pr
d550: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
d560: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
d570: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
d580: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
d590: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
d5a0: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
d5b0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d5c0: 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 LS1_1). if (E
d5d0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
d5e0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 S_PROTO_TLS1_1))
d5f0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
d600: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
d610: 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.1 protocol n
d620: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
d630: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
d640: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
d650: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
d660: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
d670: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
d680: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 SSL_NO_TLS1_2).
d690: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
d6a0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
d6b0: 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f TLS1_2)) {..Tcl_
d6c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d6d0: 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 erp, "TLS 1.2 pr
d6e0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
d6f0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
d700: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
d710: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
d720: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
d730: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 _TLS1_3) || defi
d740: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d750: 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 LS1_3). if (E
d760: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
d770: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 S_PROTO_TLS1_3))
d780: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
d790: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
d7a0: 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.3 protocol n
d7b0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
d7c0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
d7d0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
d7e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 }.#endif. if
d7f0: 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a (proto == 0) {.
d800: 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 6e ./* Use full ran
d810: 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 ge */..SSL_CTX_s
d820: 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 et_min_proto_ver
d830: 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 53 sion(ctx, 0);..S
d840: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 SL_CTX_set_max_p
d850: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
d860: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 , 0);. }..
d870: 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 switch (proto)
d880: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 {.#if OPENSSL_VE
d890: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
d8a0: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 x10100000L && !d
d8b0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
d8c0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
d8d0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
d8e0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
d8f0: 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 SSL2:..method =
d900: 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32 isServer ? SSLv2
d910: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
d920: 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f : SSLv2_client_
d930: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
d940: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
d950: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
d960: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
d970: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 SL_NO_SSL3) && !
d980: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d990: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a NO_SSL3_METHOD).
d9a0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
d9b0: 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 TO_SSL3:..method
d9c0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 = isServer ? SS
d9d0: 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f Lv3_server_metho
d9e0: 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 d() : SSLv3_clie
d9f0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
da00: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
da10: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
da20: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
da30: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 ENSSL_NO_TLS1) &
da40: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
da50: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f SL_NO_TLS1_METHO
da60: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f D). case TLS_
da70: 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 PROTO_TLS1:..met
da80: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
da90: 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 TLSv1_server_me
daa0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 thod() : TLSv1_c
dab0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
dac0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
dad0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
dae0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
daf0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
db00: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
db10: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
db20: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_1_METHOD).
db30: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
db40: 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d LS1_1:..method =
db50: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 isServer ? TLSv
db60: 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 1_1_server_metho
db70: 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c d() : TLSv1_1_cl
db80: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
db90: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
dba0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
dbb0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
dbc0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
dbd0: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
dbe0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
dbf0: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 _2_METHOD). c
dc00: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
dc10: 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 S1_2:..method =
dc20: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 isServer ? TLSv1
dc30: 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 _2_server_method
dc40: 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 () : TLSv1_2_cli
dc50: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
dc60: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
dc70: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
dc80: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
dc90: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
dca0: 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 _3). case TLS
dcb0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 _PROTO_TLS1_3:..
dcc0: 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 /* Use the gener
dcd0: 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f ic method and co
dce0: 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 nstraint range a
dcf0: 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 fter context is
dd00: 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 created */..meth
dd10: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
dd20: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f TLS_server_metho
dd30: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 d() : TLS_client
dd40: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
dd50: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 k;.#endif. de
dd60: 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 fault:../* Negot
dd70: 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 61 iate highest ava
dd80: 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 ilable SSL/TLS v
dd90: 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f ersion */..metho
dda0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
ddb0: 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 LS_server_method
ddc0: 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f () : TLS_client_
ddd0: 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 method();.#if OP
dde0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
ddf0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
de00: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
de10: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
de20: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
de30: 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e SL2)..off |= (EN
de40: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
de50: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f _PROTO_SSL2) ?
de60: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 0 : SSL_OP_NO_S
de70: 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 SLv2);.#endif.#i
de80: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 f !defined(NO_SS
de90: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
dea0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
deb0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
dec0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
ded0: 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a TO_SSL3) ? 0 :
dee0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 SSL_OP_NO_SSLv3
def0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
df00: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
df10: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
df20: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 SSL_NO_TLS1)..of
df30: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
df40: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
df50: 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c LS1) ? 0 : SSL
df60: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 _OP_NO_TLSv1);.#
df70: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
df80: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 ed(NO_TLS1_1) &&
df90: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
dfa0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 L_NO_TLS1_1)..of
dfb0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
dfc0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
dfd0: 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c LS1_1) ? 0 : SSL
dfe0: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b _OP_NO_TLSv1_1);
dff0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
e000: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
e010: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
e020: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 SSL_NO_TLS1_2)..
e030: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
e040: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
e050: 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 _TLS1_2) ? 0 : S
e060: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 SL_OP_NO_TLSv1_2
e070: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
e080: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
e090: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
e0a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
e0b0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
e0c0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
e0d0: 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a TO_TLS1_3) ? 0 :
e0e0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
e0f0: 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 _3);.#endif..bre
e100: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 ak;. }.. E
e110: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
e120: 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c ;.. ctx = SSL
e130: 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 _CTX_new(method)
e140: 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 20 ;. if (!ctx)
e150: 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a {..return NULL;.
e160: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 }.. if (g
e170: 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 etenv(SSLKEYLOGF
e180: 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 ILE)) {..SSL_CTX
e190: 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c _set_keylog_call
e1a0: 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 back(ctx, KeyLog
e1b0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d Callback);. }
e1c0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e ..#if !defined(N
e1d0: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 O_TLS1_3) && !de
e1e0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e1f0: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 _TLS1_3). if
e200: 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 (proto == TLS_PR
e210: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 OTO_TLS1_3) {..S
e220: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 SL_CTX_set_min_p
e230: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
e240: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
e250: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f );..SSL_CTX_set_
e260: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f max_proto_versio
e270: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
e280: 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 RSION);. }.#e
e290: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 ndif.. /* For
e2a0: 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 74 ce cipher select
e2b0: 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72 ion order by ser
e2c0: 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 ver */. if (!
e2d0: 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c isServer) {..SSL
e2e0: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
e2f0: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 (ctx, SSL_OP_CIP
e300: 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45 HER_SERVER_PREFE
e310: 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 23 RENCE);. }..#
e320: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
e330: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
e340: 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 6e 100000L. Open
e350: 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f SSL_add_all_algo
e360: 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61 rithms(); /* Loa
e370: 64 20 63 69 70 68 65 72 73 20 61 6e 64 20 64 69 d ciphers and di
e380: 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64 69 66 0a gests */.#endif.
e390: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
e3a0: 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 _app_data(ctx, (
e3b0: 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f void*)interp);./
e3c0: 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 * remember the i
e3d0: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 nterpreter */.
e3e0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 SSL_CTX_set_op
e3f0: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f tions(ctx, SSL_O
e400: 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 P_ALL);./* all S
e410: 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e SL bug workaroun
e420: 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 ds */. SSL_CT
e430: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 X_set_options(ct
e440: 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d x, SSL_OP_NO_COM
e450: 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 69 PRESSION);./* di
e460: 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f sable compressio
e470: 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f 72 n even if suppor
e480: 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 ted */. SSL_C
e490: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 TX_set_options(c
e4a0: 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 tx, off);../* di
e4b0: 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 sable protocol v
e4c0: 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f ersions */.#if O
e4d0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
e4e0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 UMBER < 0x101010
e4f0: 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 00L. SSL_CTX_
e500: 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 set_mode(ctx, SS
e510: 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 L_MODE_AUTO_RETR
e520: 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 Y);./* handle ne
e530: 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 w handshakes in
e540: 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 background. On b
e550: 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65 y default in Ope
e560: 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 nSSL 1.1.1. */.#
e570: 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 endif. SSL_CT
e580: 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 X_sess_set_cache
e590: 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b _size(ctx, 128);
e5a0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 .. /* Set use
e5b0: 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 r defined cipher
e5c0: 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 73 s, cipher suites
e5d0: 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c , and security l
e5e0: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 evel */. if (
e5f0: 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c (ciphers != NULL
e600: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 ) && !SSL_CTX_se
e610: 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 t_cipher_list(ct
e620: 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09 x, ciphers)) {..
e630: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
e640: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 (interp, "Set ci
e650: 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f phers failed: No
e660: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c valid ciphers",
e670: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
e680: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
e690: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c tx);..return NUL
e6a0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
e6b0: 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 21 ((ciphersuites !
e6c0: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f = NULL) && !SSL_
e6d0: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75 CTX_set_ciphersu
e6e0: 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 72 ites(ctx, cipher
e6f0: 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f suites)) {..Tcl_
e700: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
e710: 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 erp, "Set cipher
e720: 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20 suites failed:
e730: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 No valid ciphers
e740: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
e750: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 );..SSL_CTX_free
e760: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e (ctx);..return N
e770: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
e780: 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 20 /* Set security
e790: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 level */. if
e7a0: 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c (level > -1 && l
e7b0: 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 evel < 6) {../*
e7c0: 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79 SSL_set_security
e7d0: 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 _level */..SSL_C
e7e0: 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f TX_set_security_
e7f0: 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c level(ctx, level
e800: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
e810: 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 set some callba
e820: 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 cks */. SSL_C
e830: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 TX_set_default_p
e840: 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 asswd_cb(ctx, Pa
e850: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b sswordCallback);
e860: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
e870: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f _default_passwd_
e880: 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c cb_userdata(ctx,
e890: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
e8a0: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 r);.. /* read
e8b0: 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 a Diffie-Hellma
e8c0: 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c n parameters fil
e8d0: 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 e, or use the bu
e8e0: 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 ilt-in one */.#i
e8f0: 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f fdef OPENSSL_NO_
e900: 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 DH. if (DHpar
e910: 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ams != NULL) {..
e920: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
e930: 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 (interp, "DH par
e940: 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e ameter support n
e950: 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 ot available", (
e960: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
e970: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
e980: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
e990: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 . }.#else.
e9a0: 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 {..DH* dh;..if
e9b0: 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c (DHparams != NUL
e9c0: 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 L) {.. BIO *b
e9d0: 69 6f 3b 0a 0a 09 20 20 20 20 54 63 6c 5f 44 53 io;... Tcl_DS
e9e0: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a tringInit(&ds);.
e9f0: 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e . bio = BIO_n
ea00: 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 ew_file(F2N(DHpa
ea10: 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 rams, &ds), "r")
ea20: 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 ;.. if (!bio)
ea30: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 {...Tcl_DString
ea40: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c Free(&ds);...Tcl
ea50: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
ea60: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 terp, "Could not
ea70: 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 find DH paramet
ea80: 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 ers file", (char
ea90: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c *) NULL);...SSL
eaa0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
eab0: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
eac0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d }... dh =
ead0: 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 PEM_read_bio_DH
eae0: 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c params(bio, NULL
eaf0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 , NULL, NULL);..
eb00: 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f BIO_free(bio
eb10: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 );.. Tcl_DStr
eb20: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
eb30: 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 if (!dh) {...
eb40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
eb50: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 (interp, "Could
eb60: 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 61 not read DH para
eb70: 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 meters from file
eb80: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
eb90: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 );...SSL_CTX_fre
eba0: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e e(ctx);...return
ebb0: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 NULL;.. }..
ebc0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 SSL_CTX_set_t
ebd0: 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a mp_dh(ctx, dh);.
ebe0: 09 20 20 20 20 44 48 5f 66 72 65 65 28 64 68 29 . DH_free(dh)
ebf0: 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 ;...} else {..
ec00: 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b 6e /* Use well kn
ec10: 6f 77 6e 20 44 48 20 70 61 72 61 6d 65 74 65 72 own DH parameter
ec20: 73 20 74 68 61 74 20 68 61 76 65 20 62 75 69 6c s that have buil
ec30: 74 2d 69 6e 20 73 75 70 70 6f 72 74 20 69 6e 20 t-in support in
ec40: 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 20 OpenSSL */..
ec50: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 if (!SSL_CTX_set
ec60: 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 29 _dh_auto(ctx, 1)
ec70: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 ) {...Tcl_Append
ec80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
ec90: 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c 65 Could not enable
eca0: 20 73 65 74 20 44 48 20 61 75 74 6f 3a 20 22 2c set DH auto: ",
ecb0: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 GET_ERR_REASON(
ecc0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
ecd0: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 );...SSL_CTX_fre
ece0: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e e(ctx);...return
ecf0: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d NULL;.. }..}
ed00: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 . }.#endif..
ed10: 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 /* set our ce
ed20: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 rtificate */.
ed30: 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 load_private_ke
ed40: 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 y = 0;. if (c
ed50: 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 ertfile != NULL)
ed60: 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 {..load_private
ed70: 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f _key = 1;...Tcl_
ed80: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 DStringInit(&ds)
ed90: 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 ;..if (SSL_CTX_u
eda0: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 se_certificate_f
edb0: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72 ile(ctx, F2N(cer
edc0: 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c tfile, &ds), SSL
edd0: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c _FILETYPE_PEM) <
ede0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f = 0) {.. Tcl_
edf0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
ee00: 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ;.. Tcl_Appen
ee10: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
ee20: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 "unable to set c
ee30: 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 ertificate file
ee40: 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 ", certfile, ":
ee50: 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 ",...GET_ERR_REA
ee60: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
ee70: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
ee80: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
ee90: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b return NULL;
eea0: 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 ..}..Tcl_DString
eeb0: 46 72 65 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 Free(&ds);..
eec0: 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 } else if (cert
eed0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 != NULL) {..load
eee0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 _private_key = 1
eef0: 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 ;..if (SSL_CTX_u
ef00: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 se_certificate_A
ef10: 53 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 SN1(ctx, cert_le
ef20: 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b n, cert) <= 0) {
ef30: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
ef40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
ef50: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 unable to set ce
ef60: 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 rtificate: ",...
ef70: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
ef80: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
ef90: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
efa0: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
efb0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 eturn NULL;..}.
efc0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 } else {..cer
efd0: 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 tfile = (char*)X
efe0: 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 509_get_default_
eff0: 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 cert_file();...i
f000: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 f (SSL_CTX_use_c
f010: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 ertificate_file(
f020: 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 ctx, certfile, S
f030: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 SL_FILETYPE_PEM)
f040: 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 <= 0) {.#if 0..
f050: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
f060: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e sult(interp, "un
f070: 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 able to use defa
f080: 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20 ult certificate
f090: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 file ", certfile
f0a0: 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 , ": ",...GET_ER
f0b0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
f0c0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
f0d0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
f0e0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
f0f0: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a NULL;.#endif..}.
f100: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 }.. /* se
f110: 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 t our private ke
f120: 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 y */. if (loa
f130: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b d_private_key) {
f140: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d ..if (keyfile ==
f150: 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 NULL && key ==
f160: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 NULL) {.. key
f170: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b file = certfile;
f180: 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c ..}...if (keyfil
f190: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 e != NULL) {..
f1a0: 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 /* get the pri
f1b0: 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 vate key associa
f1c0: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 ted with this ce
f1d0: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 rtificate */..
f1e0: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d if (keyfile ==
f1f0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 NULL) {...keyfi
f200: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 le = certfile;..
f210: 20 20 20 20 7d 0a 0a 09 20 20 20 20 54 63 6c 5f }... Tcl_
f220: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 DStringInit(&ds)
f230: 3b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 ;.. if (SSL_C
f240: 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 TX_use_PrivateKe
f250: 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 y_file(ctx, F2N(
f260: 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 keyfile, &ds), S
f270: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 SL_FILETYPE_PEM)
f280: 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 <= 0) {...Tcl_D
f290: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
f2a0: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 .../* flush the
f2b0: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 passphrase which
f2c0: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 might be left i
f2d0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a n the result */.
f2e0: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 ..Tcl_SetResult(
f2f0: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 interp, NULL, TC
f300: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c L_STATIC);...Tcl
f310: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
f320: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
f330: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 set public key
f340: 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c file ", keyfile,
f350: 20 22 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f " ",... GET_
f360: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
f370: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
f380: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
f390: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c );...return NULL
f3a0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 ;.. }.. Tc
f3b0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
f3c0: 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 s);...} else if
f3d0: 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (key != NULL) {.
f3e0: 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 . if (SSL_CTX
f3f0: 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f _use_PrivateKey_
f400: 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 ASN1(EVP_PKEY_RS
f410: 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f A, ctx, key,key_
f420: 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f len) <= 0) {.../
f430: 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 * flush the pass
f440: 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 phrase which mig
f450: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 ht be left in th
f460: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 e result */...Tc
f470: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
f480: 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 rp, NULL, TCL_ST
f490: 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 ATIC);...Tcl_App
f4a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
f4b0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 , "unable to set
f4c0: 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 public key: ",
f4d0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
f4e0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
f4f0: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
f500: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
f510: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a NULL;.. }..}.
f520: 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 ./* Now we know
f530: 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 that a key and c
f540: 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 ert have been se
f550: 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 t against.. * th
f560: 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f e SSL context */
f570: 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 ..if (!SSL_CTX_c
f580: 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 heck_private_key
f590: 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 (ctx)) {.. Tc
f5a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
f5b0: 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 nterp, "private
f5c0: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 key does not mat
f5d0: 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 ch the certifica
f5e0: 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a te public key",.
f5f0: 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 ... (char *)
f600: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c NULL);.. SSL
f610: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
f620: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c . return NULL
f630: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
f640: 2f 2a 20 53 65 74 20 74 6f 20 75 73 65 20 64 65 /* Set to use de
f650: 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 61 fault location a
f660: 6e 64 20 66 69 6c 65 20 66 6f 72 20 43 65 72 74 nd file for Cert
f670: 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 74 ificate Authorit
f680: 79 20 28 43 41 29 20 63 65 72 74 69 66 69 63 61 y (CA) certifica
f690: 74 65 73 2e 20 54 68 65 0a 20 20 20 20 20 2a 20 tes. The. *
f6a0: 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 verify path and
f6b0: 73 74 6f 72 65 20 63 61 6e 20 62 65 20 6f 76 65 store can be ove
f6c0: 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 rridden by the S
f6d0: 53 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 20 SL_CERT_DIR env
f6e0: 76 61 72 2e 20 54 68 65 20 76 65 72 69 66 79 20 var. The verify
f6f0: 66 69 6c 65 20 63 61 6e 0a 20 20 20 20 20 2a 20 file can. *
f700: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 be overridden by
f710: 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 the SSL_CERT_FI
f720: 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 20 LE env var. */.
f730: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f if (!SSL_CTX_
f740: 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 set_default_veri
f750: 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b fy_paths(ctx)) {
f760: 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20 20 20 7d ..abort++;. }
f770: 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 72 69 64 .. /* Overrid
f780: 65 73 20 66 6f 72 20 74 68 65 20 43 41 20 76 65 es for the CA ve
f790: 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 66 69 rify path and fi
f7a0: 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23 69 66 20 le */. {.#if
f7b0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
f7c0: 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
f7d0: 30 30 30 4c 0a 09 69 66 20 28 43 41 70 61 74 68 000L..if (CApath
f7e0: 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41 66 69 != NULL || CAfi
f7f0: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 le != NULL) {..
f800: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 Tcl_DString d
f810: 73 31 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 s1;.. Tcl_DSt
f820: 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 ringInit(&ds);..
f830: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
f840: 6e 69 74 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 nit(&ds1);...
f850: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f if (!SSL_CTX_lo
f860: 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 ad_verify_locati
f870: 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 ons(ctx, F2N(CAf
f880: 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 ile, &ds), F2N(C
f890: 41 70 61 74 68 2c 20 26 64 73 31 29 29 29 20 7b Apath, &ds1))) {
f8a0: 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 ...abort++;..
f8b0: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 }.. Tcl_DStr
f8c0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
f8d0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
f8e0: 65 65 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 ee(&ds1);...
f8f0: 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 /* Set list of C
f900: 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c As to send to cl
f910: 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 ient when reques
f920: 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 ting a client ce
f930: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 rtificate */..
f940: 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 /* https://sou
f950: 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 rceforge.net/p/t
f960: 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 09 ls/bugs/57/ */..
f970: 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a /* XXX:TODO:
f980: 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75 Let the user su
f990: 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 pply values here
f9a0: 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 instead of some
f9b0: 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 thing that exist
f9c0: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 s on the filesys
f9d0: 74 65 6d 20 2a 2f 0a 09 20 20 20 20 54 63 6c 5f tem */.. Tcl_
f9e0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 DStringInit(&ds)
f9f0: 3b 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 ;.. STACK_OF(
fa00: 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 X509_NAME) *cert
fa10: 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 Names = SSL_load
fa20: 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 _client_CA_file(
fa30: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 F2N(CAfile, &ds)
fa40: 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 );.. if (cert
fa50: 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b Names != NULL) {
fa60: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 ...SSL_CTX_set_c
fa70: 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 lient_CA_list(ct
fa80: 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 x, certNames);..
fa90: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 }.. Tcl_D
faa0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
fab0: 0a 09 7d 0a 0a 23 65 6c 73 65 0a 09 69 66 20 28 ..}..#else..if (
fac0: 43 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20 CApath != NULL)
fad0: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 {.. Tcl_DStri
fae0: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 ngInit(&ds);..
faf0: 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c if (!SSL_CTX_l
fb00: 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 72 28 63 oad_verify_dir(c
fb10: 74 78 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 tx, F2N(CApath,
fb20: 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 &ds))) {...abort
fb30: 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 ++;.. }..
fb40: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
fb50: 26 64 73 29 3b 0a 09 7d 0a 09 69 66 20 28 43 41 &ds);..}..if (CA
fb60: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
fb70: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
fb80: 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 20 20 Init(&ds);..
fb90: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 if (!SSL_CTX_loa
fba0: 64 5f 76 65 72 69 66 79 5f 66 69 6c 65 28 63 74 d_verify_file(ct
fbb0: 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 x, F2N(CAfile, &
fbc0: 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b ds))) {...abort+
fbd0: 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 +;.. }.. T
fbe0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
fbf0: 64 73 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 ds);... /* Se
fc00: 74 20 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f t list of CAs to
fc10: 20 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 send to client
fc20: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 when requesting
fc30: 61 20 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69 a client certifi
fc40: 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 54 63 6c cate */.. Tcl
fc50: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 _DStringInit(&ds
fc60: 29 3b 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 );.. STACK_OF
fc70: 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 (X509_NAME) *cer
fc80: 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 tNames = SSL_loa
fc90: 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 d_client_CA_file
fca0: 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 (F2N(CAfile, &ds
fcb0: 29 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 ));.. if (cer
fcc0: 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 tNames != NULL)
fcd0: 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {...SSL_CTX_set_
fce0: 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 client_CA_list(c
fcf0: 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a tx, certNames);.
fd00: 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f . }.. Tcl_
fd10: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
fd20: 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 ;..}.#endif.
fd30: 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 }.. return ct
fd40: 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d x;.}.../*. *----
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 2d 2d ----------------
fd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
fd90: 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 *. * StatusObjC
fda0: 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 md -- return cer
fdb0: 74 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e tificate for con
fdc0: 6e 65 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a nected peer.. *.
fdd0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
fde0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
fdf0: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
fe00: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
fe10: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
fe20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
fe60: 73 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 static int.Statu
fe70: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 sObjCmd(ClientDa
fe80: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
fe90: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
fea0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
feb0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
fec0: 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 []) {. State
fed0: 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 *statePtr;. X
fee0: 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 509 *peer;. T
fef0: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a cl_Obj *objPtr;.
ff00: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
ff10: 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a chan;. char *
ff20: 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 channelName, *ci
ff30: 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d phers;. int m
ff40: 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 ode;. const u
ff50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 nsigned char *pr
ff60: 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 oto;. unsigne
ff70: 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 d int len;. i
ff80: 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a 20 20 20 nt nid, res;.
ff90: 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 (void) clientDa
ffa0: 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 ta;.. dprintf
ffb0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
ffc0: 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c if (objc < 2 ||
ffd0: 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 objc > 3 || (ob
ffe0: 6a 63 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63 jc == 3 && !strc
fff0: 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 mp(Tcl_GetString
10000 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 (objv[1]), "-loc
10010 61 6c 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 al"))) {..Tcl_Wr
10020 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
10030 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c p, 1, objv, "?-l
10040 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b ocal? channel");
10050 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
10060 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
10070 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 * Get channel Id
10080 20 2a 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e */. channelN
10090 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 ame = Tcl_GetStr
100a0 69 6e 67 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d ing(objv[(objc =
100b0 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d 29 3b 0a = 2 ? 1 : 2)]);.
100c0 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
100d0 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
100e0 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 , channelName, &
100f0 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 mode);. if (c
10100 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
10110 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
10120 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
10130 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
10140 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
10150 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
10160 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
10170 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
10180 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
10190 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
101a0 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
101b0 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
101c0 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 Type()) {..Tcl_A
101d0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
101e0 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
101f0 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
10200 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
10210 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 .."\": not a TLS
10220 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 channel", (char
10230 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f *) NULL);..Tcl_
10240 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
10250 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 erp, "TLS", "STA
10260 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c TUS", "CHANNEL",
10270 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
10280 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
10290 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
102a0 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 }. statePt
102b0 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 r = (State *) Tc
102c0 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
102d0 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a anceData(chan);.
102e0 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 . /* Get cert
102f0 69 66 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 ificate for peer
10300 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 or self */.
10310 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b if (objc == 2) {
10320 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 ..peer = SSL_get
10330 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 _peer_certificat
10340 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
10350 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
10360 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 peer = SSL_get_c
10370 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 ertificate(state
10380 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
10390 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 . /* Get X509
103a0 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 certificate inf
103b0 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 o */. if (pee
103c0 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 r) {..objPtr = T
103d0 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e ls_NewX509Obj(in
103e0 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 terp, peer);..if
103f0 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 (objc == 2) {..
10400 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 70 65 X509_free(pe
10410 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20 3d er);.. peer =
10420 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 NULL;..}. }
10430 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d else {..objPtr =
10440 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
10450 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0, NULL);. }.
10460 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d . /* Peer nam
10470 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 e */. LAPPEND
10480 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
10490 50 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c Ptr, "peername",
104a0 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 SSL_get0_peerna
104b0 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c me(statePtr->ssl
104c0 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 ), -1);. LAPP
104d0 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 END_INT(interp,
104e0 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22 2c objPtr, "sbits",
104f0 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f SSL_get_cipher_
10500 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 bits(statePtr->s
10510 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 sl, NULL));..
10520 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 ciphers = (char
10530 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 *)SSL_get_cipher
10540 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
10550 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
10560 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10570 20 22 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 "cipher", ciphe
10580 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a rs, -1);.. /*
10590 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30 39 Verify the X509
105a0 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72 65 certificate pre
105b0 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 sented by the pe
105c0 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e er */. LAPPEN
105d0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
105e0 6a 50 74 72 2c 20 22 76 65 72 69 66 79 52 65 73 jPtr, "verifyRes
105f0 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 69 ult",..X509_veri
10600 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 fy_cert_error_st
10610 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 ring(SSL_get_ver
10620 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 ify_result(state
10630 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b Ptr->ssl)), -1);
10640 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 .. /* Verify
10650 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 mode */. mode
10660 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 = SSL_get_verif
10670 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d y_mode(statePtr-
10680 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d >ssl);. if (m
10690 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 ode && SSL_VERIF
106a0 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 Y_NONE) {..LAPPE
106b0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
106c0 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f bjPtr, "verifyMo
106d0 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 de", "none", -1)
106e0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
106f0 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a Tcl_Obj *listObj
10700 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
10710 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 tObj(0, NULL);..
10720 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f if (mode && SSL_
10730 56 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 VERIFY_PEER) {..
10740 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
10750 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
10760 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c erp, listObjPtr,
10770 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
10780 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a j("peer", -1));.
10790 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 .}..if (mode &&
107a0 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f SSL_VERIFY_FAIL_
107b0 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 IF_NO_PEER_CERT)
107c0 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
107d0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
107e0 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a (interp, listObj
107f0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
10800 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e ngObj("fail if n
10810 6f 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31 o peer cert", -1
10820 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 ));..}..if (mode
10830 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 && SSL_VERIFY_C
10840 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 LIENT_ONCE) {..
10850 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
10860 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10870 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 rp, listObjPtr,
10880 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
10890 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 ("client once",
108a0 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f -1));..}..if (mo
108b0 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 de && SSL_VERIFY
108c0 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 _POST_HANDSHAKE)
108d0 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
108e0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
108f0 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a (interp, listObj
10900 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
10910 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 ngObj("post hand
10920 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d shake", -1));..}
10930 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e ..LAPPEND_OBJ(in
10940 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 terp, objPtr, "v
10950 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 74 erifyMode", list
10960 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a 20 ObjPtr). }..
10970 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 /* Verify mod
10980 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 4c e depth */. L
10990 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
109a0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 p, objPtr, "veri
109b0 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 65 fyDepth", SSL_ge
109c0 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 73 t_verify_depth(s
109d0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a tatePtr->ssl));.
109e0 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 . /* Report t
109f0 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 he selected prot
10a00 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 ocol as a result
10a10 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 of the negotiat
10a20 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 ion */. SSL_g
10a30 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 et0_alpn_selecte
10a40 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c d(statePtr->ssl,
10a50 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a &proto, &len);.
10a60 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
10a70 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10a80 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 "alpn", (char *)
10a90 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 proto, (Tcl_Size
10aa0 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 ) len);. LAPP
10ab0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
10ac0 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f objPtr, "protoco
10ad0 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 l", SSL_get_vers
10ae0 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ion(statePtr->ss
10af0 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a l), -1);.. /*
10b00 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 Valid for non-R
10b10 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 SA signature and
10b20 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 TLS 1.3 */.
10b30 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b if (objc == 2) {
10b40 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f ..res = SSL_get_
10b50 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e peer_signature_n
10b60 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c id(statePtr->ssl
10b70 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 , &nid);. } e
10b80 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c lse {..res = SSL
10b90 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e _get_signature_n
10ba0 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c id(statePtr->ssl
10bb0 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 , &nid);. }.
10bc0 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 if (!res) {ni
10bd0 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 d = 0;}. LAPP
10be0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
10bf0 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 objPtr, "signatu
10c00 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 reHashAlgorithm"
10c10 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 , OBJ_nid2ln(nid
10c20 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 69 66 20 ), -1);.. if
10c30 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 (objc == 2) {..r
10c40 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 es = SSL_get_pee
10c50 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 r_signature_type
10c60 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 _nid(statePtr->s
10c70 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d sl, &nid);. }
10c80 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 else {..res = S
10c90 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 SL_get_signature
10ca0 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 _type_nid(stateP
10cb0 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a tr->ssl, &nid);.
10cc0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 }. if (!r
10cd0 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 es) {nid = 0;}.
10ce0 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
10cf0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10d00 73 69 67 6e 61 74 75 72 65 54 79 70 65 22 2c 20 signatureType",
10d10 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c OBJ_nid2ln(nid),
10d20 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 -1);.. Tcl_S
10d30 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
10d40 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
10d50 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
10d60 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
10db0 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 * ConnectionInf
10dc0 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 oObjCmd -- retur
10dd0 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 n connection inf
10de0 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a o from OpenSSL..
10df0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
10e00 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e *.A list of conn
10e10 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a ection info. *.
10e20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
10e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e60 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
10e70 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e c int Connection
10e80 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e InfoObjCmd(Clien
10e90 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
10ea0 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
10eb0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
10ec0 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
10ed0 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
10ee0 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 _Channel chan;..
10ef0 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 /* The channel t
10f00 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 o set a mode on
10f10 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 */. State *st
10f20 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 atePtr;../* clie
10f30 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c nt state for ssl
10f40 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 socket */. T
10f50 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 cl_Obj *objPtr,
10f60 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f *listPtr;. co
10f70 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 nst SSL *ssl;.
10f80 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 const SSL_CIPH
10f90 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 ER *cipher;.
10fa0 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f const SSL_SESSIO
10fb0 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 N *session;.
10fc0 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 const EVP_MD *md
10fd0 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 ;. (void) cli
10fe0 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 entData;.. if
10ff0 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 (objc != 2) {..
11000 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
11010 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
11020 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 , "channel");..r
11030 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
11040 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e . }.. chan
11050 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
11060 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 l(interp, Tcl_Ge
11070 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 tString(objv[1])
11080 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 , NULL);. if
11090 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
110a0 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
110b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
110c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
110d0 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
110e0 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
110f0 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
11100 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
11110 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
11120 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 );. if (Tcl_G
11130 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
11140 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
11150 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c elType()) {..Tcl
11160 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
11170 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
11180 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
11190 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
111a0 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 ,.. "\": not
111b0 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 a TLS channel",
111c0 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
111d0 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
111e0 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
111f0 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 "CONNECTION", "
11200 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c CHANNEL", "INVAL
11210 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ID", (char *) NU
11220 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
11230 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
11240 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
11250 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
11260 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e LL);.. /* Con
11270 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a nection info */.
11280 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
11290 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 State *)Tcl_GetC
112a0 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
112b0 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 ta(chan);. ss
112c0 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 l = statePtr->ss
112d0 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 l;. if (ssl !
112e0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f = NULL) {../* co
112f0 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a nnection state *
11300 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
11310 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11320 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 state", SSL_stat
11330 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 e_string_long(ss
11340 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 l), -1);.../* Ge
11350 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 t SNI requested
11360 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 server name */..
11370 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11380 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 rp, objPtr, "ser
11390 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 vername", SSL_ge
113a0 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c t_servername(ssl
113b0 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 , TLSEXT_NAMETYP
113c0 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 E_host_name), -1
113d0 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 );.../* Get prot
113e0 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 ocol */..LAPPEND
113f0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11400 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c Ptr, "protocol",
11410 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e SSL_get_version
11420 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a (ssl), -1);.../*
11430 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 Renegotiation a
11440 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 llowed */..LAPPE
11450 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
11460 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 objPtr, "renegot
11470 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c iation_allowed",
11480 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f SSL_get_secure_
11490 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 renegotiation_su
114a0 70 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 73 pport((SSL *) ss
114b0 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 l));.../* Get se
114c0 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a curity level */.
114d0 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 .LAPPEND_INT(int
114e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
114f0 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 curity_level", S
11500 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f SL_get_security_
11510 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f level(ssl));.../
11520 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a * Session info *
11530 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
11540 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11550 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 "session_reused"
11560 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 , SSL_session_re
11570 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a used(ssl));.../*
11580 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 Is server info
11590 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c */..LAPPEND_BOOL
115a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
115b0 20 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53 "is_server", SS
115c0 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 L_is_server(ssl)
115d0 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 );.../* Is DTLS
115e0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c */..LAPPEND_BOOL
115f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11600 20 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f "is_dtls", SSL_
11610 69 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20 is_dtls(ssl));.
11620 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 }.. /* Cip
11630 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 her info */.
11640 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 cipher = SSL_get
11650 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 _current_cipher(
11660 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 ssl);. if (ci
11670 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a pher != NULL) {.
11680 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a .char buf[BUFSIZ
11690 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 ] = {0};..int bi
116a0 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 ts, alg_bits;...
116b0 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a /* Cipher name *
116c0 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
116d0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
116e0 63 69 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 cipher", SSL_CIP
116f0 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 HER_get_name(cip
11700 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 her), -1);.../*
11710 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 RFC name of ciph
11720 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 er */..LAPPEND_S
11730 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11740 72 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d r, "standard_nam
11750 65 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 e", SSL_CIPHER_s
11760 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 tandard_name(cip
11770 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 her), -1);.../*
11780 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 OpenSSL name of
11790 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 cipher */..LAPPE
117a0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
117b0 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f bjPtr, "openssl_
117c0 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 name", OPENSSL_c
117d0 69 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 ipher_name(SSL_C
117e0 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e IPHER_standard_n
117f0 61 6d 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31 ame(cipher)), -1
11800 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f );.../* number o
11810 66 20 73 65 63 72 65 74 20 62 69 74 73 20 75 73 f secret bits us
11820 65 64 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f ed for cipher */
11830 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 ..bits = SSL_CIP
11840 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 HER_get_bits(cip
11850 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b her, &alg_bits);
11860 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
11870 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
11880 65 63 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74 ecret_bits", bit
11890 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 s);..LAPPEND_INT
118a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
118b0 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 "algorithm_bits
118c0 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f ", alg_bits);../
118d0 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 * alg_bits is ac
118e0 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 tual key secret
118f0 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 bits. If use bit
11900 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c s and secret (al
11910 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 gorithm) bits di
11920 66 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 ffer,.. the re
11930 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 st of the bits a
11940 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 re fixed, i.e. f
11950 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 or limited expor
11960 74 20 63 69 70 68 65 72 73 20 28 62 69 74 73 20 t ciphers (bits
11970 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e < 56) */.../* In
11980 64 69 63 61 74 65 73 20 77 68 69 63 68 20 53 53 dicates which SS
11990 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 L/TLS protocol v
119a0 65 72 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66 ersion first def
119b0 69 6e 65 64 20 74 68 65 20 63 69 70 68 65 72 20 ined the cipher
119c0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
119d0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
119e0 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 "min_version", S
119f0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 SL_CIPHER_get_ve
11a00 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d rsion(cipher), -
11a10 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 1);.../* Cipher
11a20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f NID */..LAPPEND_
11a30 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11a40 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22 2c tr, "cipherNID",
11a50 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 (char *)OBJ_nid
11a60 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 2ln(SSL_CIPHER_g
11a70 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 69 et_cipher_nid(ci
11a80 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 pher)), -1);..LA
11a90 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11aa0 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 73 , objPtr, "diges
11ab0 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f tNID", (char *)O
11ac0 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 BJ_nid2ln(SSL_CI
11ad0 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74 5f PHER_get_digest_
11ae0 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 nid(cipher)), -1
11af0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
11b00 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11b10 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44 22 "keyExchangeNID"
11b20 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 , (char *)OBJ_ni
11b30 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f d2ln(SSL_CIPHER_
11b40 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 get_kx_nid(ciphe
11b50 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 r)), -1);..LAPPE
11b60 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11b70 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74 69 bjPtr, "authenti
11b80 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 cationNID", (cha
11b90 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 r *)OBJ_nid2ln(S
11ba0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 75 SL_CIPHER_get_au
11bb0 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c th_nid(cipher)),
11bc0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 -1);.../* messa
11bd0 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f ge authenticatio
11be0 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72 20 n code - Cipher
11bf0 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47 43 is AEAD (e.g. GC
11c00 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50 6f M or ChaCha20/Po
11c10 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a ly1305) or not *
11c20 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 /../* Authentica
11c30 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 ted Encryption w
11c40 69 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 64 ith associated d
11c50 61 74 61 20 28 41 45 41 44 29 20 63 68 65 63 6b ata (AEAD) check
11c60 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f */..LAPPEND_BOO
11c70 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 L(interp, objPtr
11c80 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65 61 , "cipher_is_aea
11c90 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 d", SSL_CIPHER_i
11ca0 73 5f 61 65 61 64 28 63 69 70 68 65 72 29 29 3b s_aead(cipher));
11cb0 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65 .../* Digest use
11cc0 64 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c d during the SSL
11cd0 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77 /TLS handshake w
11ce0 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69 hen using the ci
11cf0 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 pher. */..md = S
11d00 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61 SL_CIPHER_get_ha
11d10 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63 ndshake_digest(c
11d20 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 ipher);..LAPPEND
11d30 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11d40 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f Ptr, "handshake_
11d50 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a digest", (char *
11d60 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 )EVP_MD_name(md)
11d70 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 , -1);.../* Get
11d80 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 OpenSSL-specific
11d90 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 ID, not IANA ID
11da0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 */..LAPPEND_INT
11db0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11dc0 20 22 63 69 70 68 65 72 5f 69 64 22 2c 20 28 69 "cipher_id", (i
11dd0 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 nt) SSL_CIPHER_g
11de0 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a et_id(cipher));.
11df0 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 ../* Two-byte ID
11e00 20 75 73 65 64 20 69 6e 20 74 68 65 20 54 4c 53 used in the TLS
11e10 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 protocol of the
11e20 20 67 69 76 65 6e 20 63 69 70 68 65 72 20 2a 2f given cipher */
11e30 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
11e40 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 terp, objPtr, "p
11e50 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e rotocol_id", (in
11e60 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 t) SSL_CIPHER_ge
11e70 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 t_protocol_id(ci
11e80 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 pher));.../* Tex
11e90 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e tual description
11ea0 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a of the cipher *
11eb0 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 /..if (SSL_CIPHE
11ec0 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69 R_description(ci
11ed0 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f pher, buf, sizeo
11ee0 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 f(buf)) != NULL)
11ef0 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f {.. LAPPEND_
11f00 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11f10 74 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e tr, "description
11f20 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a ", buf, -1);..}.
11f30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
11f40 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 ssion info */.
11f50 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f session = SSL_
11f60 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 get_session(ssl)
11f70 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f ;. if (sessio
11f80 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f n != NULL) {..co
11f90 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
11fa0 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 r *ticket;..size
11fb0 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e _t len2;..unsign
11fc0 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f ed int ulen;..co
11fd0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
11fe0 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a r *session_id, *
11ff0 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 proto;..unsigned
12000 20 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c char buffer[SSL
12010 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f _MAX_MASTER_KEY_
12020 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 LENGTH];.../* Re
12030 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 port the selecte
12040 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 d protocol as a
12050 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c result of the AL
12060 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a PN negotiation *
12070 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 /..SSL_SESSION_g
12080 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 et0_alpn_selecte
12090 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 d(session, &prot
120a0 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 o, &len2);..LAPP
120b0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
120c0 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 objPtr, "alpn",
120d0 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 (char *) proto,
120e0 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 (Tcl_Size) len2)
120f0 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 ;.../* Report th
12100 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
12110 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
12120 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 of the NPN negot
12130 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 iation */.#ifdef
12140 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 USE_NPN..SSL_ge
12150 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 t0_next_proto_ne
12160 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70 gotiated(ssl, &p
12170 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c roto, &ulen);..L
12180 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
12190 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 p, objPtr, "npn"
121a0 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f , (char *) proto
121b0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 , (Tcl_Size) ule
121c0 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 n);.#endif.../*
121d0 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f Resumable sessio
121e0 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f n */..LAPPEND_BO
121f0 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 OL(interp, objPt
12200 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 r, "resumable",
12210 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 SSL_SESSION_is_r
12220 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e esumable(session
12230 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e ));.../* Session
12240 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63 start time (sec
12250 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68 onds since epoch
12260 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f ) */..LAPPEND_LO
12270 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NG(interp, objPt
12280 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c r, "start_time",
12290 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
122a0 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b _time(session));
122b0 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 .../* Timeout va
122c0 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 lue - SSL_CTX_ge
122d0 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 t_timeout (in se
122e0 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 conds) */..LAPPE
122f0 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
12300 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 objPtr, "timeout
12310 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 ", SSL_SESSION_g
12320 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 et_timeout(sessi
12330 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 on));.../* Sessi
12340 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 on id - TLSv1.2
12350 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a and below only *
12360 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 /..session_id =
12370 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
12380 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 id(session, &ule
12390 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 n);..LAPPEND_BAR
123a0 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 RAY(interp, objP
123b0 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 tr, "session_id"
123c0 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 , session_id, (T
123d0 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a cl_Size) ulen);.
123e0 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e ../* Session con
123f0 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e text */..session
12400 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f _id = SSL_SESSIO
12410 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 N_get0_id_contex
12420 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e t(session, &ulen
12430 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 );..LAPPEND_BARR
12440 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 AY(interp, objPt
12450 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 r, "session_cont
12460 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 ext", session_id
12470 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 , (Tcl_Size) ule
12480 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e n);.../* Session
12490 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 ticket - client
124a0 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 only */..SSL_SE
124b0 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 SSION_get0_ticke
124c0 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b t(session, &tick
124d0 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 et, &len2);..LAP
124e0 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 PEND_BARRAY(inte
124f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 rp, objPtr, "ses
12500 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 sion_ticket", ti
12510 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 cket, (Tcl_Size)
12520 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 len2);.../* Ses
12530 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 sion ticket life
12540 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 time hint (in se
12550 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 conds) */..LAPPE
12560 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
12570 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d objPtr, "lifetim
12580 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f e", SSL_SESSION_
12590 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 get_ticket_lifet
125a0 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e ime_hint(session
125b0 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 ));.../* Ticket
125c0 61 70 70 20 64 61 74 61 20 2a 2f 0a 23 69 66 20 app data */.#if
125d0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
125e0 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
125f0 30 30 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f 000L..SSL_SESSIO
12600 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 N_get0_ticket_ap
12610 70 64 61 74 61 28 28 53 53 4c 5f 53 45 53 53 49 pdata((SSL_SESSI
12620 4f 4e 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26 ON *) session, &
12630 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a ticket, &len2);.
12640 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
12650 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12660 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 "ticket_app_data
12670 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f ", ticket, (Tcl_
12680 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e Size) len2);.#en
12690 64 69 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 dif.../* Get mas
126a0 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 ter key */..len2
126b0 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
126c0 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 et_master_key(se
126d0 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 ssion, buffer, S
126e0 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 SL_MAX_MASTER_KE
126f0 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 Y_LENGTH);..LAPP
12700 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 END_BARRAY(inter
12710 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 p, objPtr, "mast
12720 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c er_key", buffer,
12730 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
12740 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 );.../* Compress
12750 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 ion id */..unsig
12760 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c ned int id = SSL
12770 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d _SESSION_get_com
12780 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e press_id(session
12790 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
127a0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
127b0 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 "compression_id"
127c0 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 , id == 1 ? "zli
127d0 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 b" : "none", -1)
127e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
127f0 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f Compression info
12800 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 */. if (ssl
12810 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 != NULL) {.#ifde
12820 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 f HAVE_SSL_COMPR
12830 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f ESSION..const CO
12840 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c MP_METHOD *comp,
12850 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 *expn;..comp =
12860 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f SSL_get_current_
12870 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 compression(ssl)
12880 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 ;..expn = SSL_ge
12890 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 t_current_expans
128a0 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 ion(ssl);...LAPP
128b0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
128c0 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 objPtr, "compres
128d0 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 sion", comp ? SS
128e0 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 L_COMP_get_name(
128f0 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 comp) : "none",
12900 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 -1);..LAPPEND_ST
12910 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
12920 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 , "expansion", e
12930 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 xpn ? SSL_COMP_g
12940 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 et_name(expn) :
12950 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c "none", -1);.#el
12960 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 se..LAPPEND_STR(
12970 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12980 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 "compression", "
12990 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 none", -1);..LAP
129a0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
129b0 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 objPtr, "expans
129c0 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 ion", "none", -1
129d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
129e0 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 . /* Server i
129f0 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f nfo */. {..lo
12a00 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 ng mode = SSL_CT
12a10 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 X_get_session_ca
12a20 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 che_mode(statePt
12a30 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a r->ctx);..char *
12a40 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 msg;...if (mode
12a50 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
12a60 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 _OFF) {.. msg
12a70 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 = "off";..} els
12a80 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c e if (mode & SSL
12a90 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 _SESS_CACHE_CLIE
12aa0 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d NT) {.. msg =
12ab0 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c "client";..} el
12ac0 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 se if (mode & SS
12ad0 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 L_SESS_CACHE_SER
12ae0 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 VER) {.. msg
12af0 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 = "server";..} e
12b00 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 lse if (mode & S
12b10 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f SL_SESS_CACHE_BO
12b20 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d TH) {.. msg =
12b30 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 "both";..} else
12b40 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75 {.. msg = "u
12b50 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 nknown";..}..LAP
12b60 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
12b70 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
12b80 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d n_cache_mode", m
12b90 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a sg, -1);. }..
12ba0 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a /* CA List *
12bb0 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 /. /* IF not
12bc0 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61 a server, same a
12bd0 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f s SSL_get0_peer_
12be0 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76 CA_list. If serv
12bf0 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 er same as SSL_C
12c00 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 TX_get_client_CA
12c10 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 _list */. lis
12c20 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 tPtr = Tcl_NewLi
12c30 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
12c40 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 STACK_OF(X50
12c50 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 9_NAME) *ca_list
12c60 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69 ;. if ((ca_li
12c70 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 st = SSL_get_cli
12c80 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 ent_CA_list(ssl)
12c90 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 ) != NULL) {..ch
12ca0 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a ar buffer[BUFSIZ
12cb0 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d ];..for (int i =
12cc0 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 0; i < sk_X509_
12cd0 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 NAME_num(ca_list
12ce0 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 ); i++) {.. X
12cf0 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 509_NAME *name =
12d00 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 sk_X509_NAME_va
12d10 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b lue(ca_list, i);
12d20 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 .. if (name)
12d30 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e {...X509_NAME_on
12d40 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 eline(name, buff
12d50 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 er, BUFSIZ);...T
12d60 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
12d70 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
12d80 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 listPtr, Tcl_New
12d90 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 StringObj(buffer
12da0 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 , -1));.. }..
12db0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 }. }. LAPP
12dc0 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 END_OBJ(interp,
12dd0 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22 objPtr, "caList"
12de0 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 , listPtr);.
12df0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
12e00 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c rp, objPtr, "caL
12e10 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 istCount", sk_X5
12e20 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 09_NAME_num(ca_l
12e30 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ist));.. Tcl_
12e40 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
12e50 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
12e60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
12e70 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d ----------------
12eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
12ec0 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d . * VersionObjCm
12ed0 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 d -- return vers
12ee0 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 ion string from
12ef0 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 OpenSSL.. *. * R
12f00 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
12f10 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
12f20 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
12f30 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
12f40 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
12f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f80 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
12f90 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 ic int.VersionOb
12fa0 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
12fb0 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
12fc0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
12fd0 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
12fe0 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
12ff0 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
13000 6f 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 objPtr;. (voi
13010 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 d) clientData;.
13020 20 20 20 28 76 6f 69 64 29 20 6f 62 6a 63 3b 0a (void) objc;.
13030 20 20 20 20 28 76 6f 69 64 29 20 6f 62 6a 76 3b (void) objv;
13040 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
13050 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 alled");.. ob
13060 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 jPtr = Tcl_NewSt
13070 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f ringObj(OPENSSL_
13080 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 VERSION_TEXT, -1
13090 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 );. Tcl_SetOb
130a0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
130b0 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 objPtr);.. re
130c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c turn TCL_OK;.}..
130d0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
130e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
130f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13110 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
13120 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 MiscObjCmd -- mi
13130 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 sc commands. *.
13140 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
13150 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
13160 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
13170 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
13180 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
13190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
131d0 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 tatic int.MiscOb
131e0 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
131f0 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
13200 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
13210 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
13220 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
13230 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f {. static co
13240 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e nst char *comman
13250 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c ds [] = { "req",
13260 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 "strreq", NULL
13270 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d };. enum comm
13280 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 and { C_REQ, C_S
13290 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d TRREQ, C_DUMMY }
132a0 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 ;. Tcl_Size c
132b0 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 74 md;. int isSt
132c0 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 r;. char buff
132d0 65 72 5b 31 36 33 38 34 5d 3b 0a 20 20 20 20 28 er[16384];. (
132e0 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
132f0 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
13300 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
13310 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 f (objc < 2) {..
13320 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
13330 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
13340 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 , "subcommand ?a
13350 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 rgs?");..return
13360 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
13370 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
13380 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 IndexFromObj(int
13390 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f erp, objv[1], co
133a0 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 mmands, "command
133b0 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 ", 0, &cmd) != T
133c0 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
133d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
133e0 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
133f0 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 _error();.. i
13400 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 sStr = (cmd == C
13410 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 _STRREQ);. sw
13420 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d itch ((enum comm
13430 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 and) cmd) {..cas
13440 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 e C_REQ:..case C
13450 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 _STRREQ: {..
13460 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e EVP_PKEY *pkey=N
13470 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a ULL;.. X509 *
13480 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 cert=NULL;..
13490 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d X509_NAME *name=
134a0 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f NULL;.. Tcl_O
134b0 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 bj **listv;..
134c0 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b Tcl_Size listc;
134d0 0a 09 20 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20 .. int i;...
134e0 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c BIO *out=NULL
134f0 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f ;... char *k_
13500 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b C="",*k_ST="",*k
13510 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b _L="",*k_O="",*k
13520 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c _OU="",*k_CN="",
13530 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 *k_Email="";..
13540 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a char *keyout,*
13550 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 pemout,*str;..
13560 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 int keysize,se
13570 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b rial=0,days=365;
13580 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
13590 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
135a0 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 x30000000L..
135b0 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 BIGNUM *bne = NU
135c0 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 LL;.. RSA *rs
135d0 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a a = NULL;.#else.
135e0 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 . EVP_PKEY_CT
135f0 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 X *ctx = NULL;.#
13600 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 endif... if (
13610 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a (objc<5) || (obj
13620 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 c>6)) {...Tcl_Wr
13630 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
13640 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 p, 2, objv, "key
13650 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 size keyfile cer
13660 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a tfile ?info?");.
13670 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
13680 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 OR;.. }...
13690 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 if (Tcl_GetIntF
136a0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
136b0 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 bjv[2], &keysize
136c0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
136d0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
136e0 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b R;.. }.. k
136f0 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 eyout=Tcl_GetStr
13700 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 ing(objv[3]);..
13710 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 pemout=Tcl_Ge
13720 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 tString(objv[4])
13730 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72 ;.. if (isStr
13740 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 ) {...Tcl_SetVar
13750 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 (interp,keyout,"
13760 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 ",0);...Tcl_SetV
13770 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 ar(interp,pemout
13780 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a ,"",0);.. }..
13790 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 . if (objc>=6
137a0 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 ) {...if (Tcl_Li
137b0 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 stObjGetElements
137c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d (interp, objv[5]
137d0 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 , &listc, &listv
137e0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
137f0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
13800 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 ERROR;...}....if
13810 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 ((listc%2) != 0
13820 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 ) {... Tcl_Se
13830 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
13840 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 Information list
13850 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 must have even
13860 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 number of argume
13870 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 nts",NULL);...
13880 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
13890 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 OR;...}...for (i
138a0 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d =0; i<listc; i+=
138b0 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 2) {... str=T
138c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
138d0 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 tv[i]);... if
138e0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 (strcmp(str,"da
138f0 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 ys")==0) {....if
13900 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
13910 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 Obj(interp,listv
13920 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 [i+1],&days)!=TC
13930 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 L_OK).... ret
13940 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
13950 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
13960 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 strcmp(str,"seri
13970 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 al")==0) {....if
13980 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
13990 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 Obj(interp,listv
139a0 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d [i+1],&serial)!=
139b0 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 TCL_OK).... r
139c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
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 43 22 (strcmp(str,"C"
139f0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 )==0) {....k_C=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 53 54 22 29 3d 3d 30 29 20 p(str,"ST")==0)
13a40 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 {....k_ST=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 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ,"L")==0) {....k
13a90 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 _L=Tcl_GetString
13aa0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
13ab0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
13ac0 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d trcmp(str,"O")==
13ad0 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 0) {....k_O=Tcl_
13ae0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
13af0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
13b00 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
13b10 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 tr,"OU")==0) {..
13b20 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 ..k_OU=Tcl_GetSt
13b30 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
13b40 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
13b50 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 f (strcmp(str,"C
13b60 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 N")==0) {....k_C
13b70 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 N=Tcl_GetString(
13b80 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
13b90 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
13ba0 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 rcmp(str,"Email"
13bb0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 )==0) {....k_Ema
13bc0 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 il=Tcl_GetString
13bd0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
13be0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 } else {....
13bf0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
13c00 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 terp,"Unknown pa
13c10 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a rameter",NULL);.
13c20 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
13c30 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d ROR;... }...}
13c40 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 .. }..#if OPE
13c50 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
13c60 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
13c70 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f L.. bne = BN_
13c80 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 new();.. rsa
13c90 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 = RSA_new();..
13ca0 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 pkey = EVP_PKE
13cb0 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 Y_new();.. if
13cc0 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (bne == NULL ||
13cd0 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 rsa == NULL ||
13ce0 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 pkey == NULL ||
13cf0 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 !BN_set_word(bne
13d00 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 ,RSA_F4) ||...!R
13d10 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f SA_generate_key_
13d20 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c ex(rsa, keysize,
13d30 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 bne, NULL) || !
13d40 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f EVP_PKEY_assign_
13d50 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 RSA(pkey, rsa))
13d60 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 {...EVP_PKEY_fre
13d70 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 e(pkey);.../* RS
13d80 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 A_free(rsa); fre
13d90 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 ed by EVP_PKEY_f
13da0 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 ree */...BN_free
13db0 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 (bne);.#else..
13dc0 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 pkey = EVP_RSA
13dd0 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 _gen((unsigned i
13de0 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 nt) keysize);..
13df0 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 ctx = EVP_PKE
13e00 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e Y_CTX_new(pkey,N
13e10 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 ULL);.. if (p
13e20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 key == NULL || c
13e30 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 tx == NULL || !E
13e40 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 VP_PKEY_keygen_i
13e50 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 nit(ctx) ||...!E
13e60 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f VP_PKEY_CTX_set_
13e70 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 rsa_keygen_bits(
13e80 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c ctx, keysize) ||
13e90 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 !EVP_PKEY_keyge
13ea0 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b n(ctx, &pkey)) {
13eb0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
13ec0 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b (pkey);...EVP_PK
13ed0 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 EY_CTX_free(ctx)
13ee0 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 ;.#endif...Tcl_S
13ef0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
13f00 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e "Error generatin
13f10 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e g private key",N
13f20 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 ULL);...return T
13f30 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
13f40 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 else {...if (is
13f50 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 Str) {... out
13f60 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d =BIO_new(BIO_s_m
13f70 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d em());... PEM
13f80 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 _write_bio_Priva
13f90 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e teKey(out,pkey,N
13fa0 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c ULL,NULL,0,NULL,
13fb0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 NULL);... i=B
13fc0 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 IO_read(out,buff
13fd0 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 er,sizeof(buffer
13fe0 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 )-1);... i=(i
13ff0 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 <0) ? 0 : i;...
14000 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 buffer[i]='\0
14010 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 ';... Tcl_Set
14020 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 Var(interp,keyou
14030 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 t,buffer,0);...
14040 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 BIO_flush(out
14050 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
14060 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 e(out);...} else
14070 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
14080 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 _new(BIO_s_file(
14090 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 ));... BIO_wr
140a0 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 ite_filename(out
140b0 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 ,keyout);...
140c0 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 PEM_write_bio_Pr
140d0 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 ivateKey(out,pke
140e0 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 y,NULL,NULL,0,NU
140f0 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 LL,NULL);...
14100 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f /* PEM_write_bio
14110 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f _RSAPrivateKey(o
14120 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e ut, rsa, NULL, N
14130 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 ULL, 0, NULL, NU
14140 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 LL); */... BI
14150 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b O_free_all(out);
14160 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 .. .}....if ((ce
14170 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d rt=X509_new())==
14180 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 NULL) {... Tc
14190 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
141a0 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 rp,"Error genera
141b0 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 ting certificate
141c0 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b request",NULL);
141d0 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f ... EVP_PKEY_
141e0 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 free(pkey);.#if
141f0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
14200 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
14210 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 000L... BN_fr
14220 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a ee(bne);.#endif.
14230 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
14240 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58 _ERROR;...}....X
14250 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 509_set_version(
14260 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f cert,2);...ASN1_
14270 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 INTEGER_set(X509
14280 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 _get_serialNumbe
14290 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b r(cert),serial);
142a0 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 ...X509_gmtime_a
142b0 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 dj(X509_getm_not
142c0 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b Before(cert),0);
142d0 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 ...X509_gmtime_a
142e0 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 dj(X509_getm_not
142f0 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e After(cert),(lon
14300 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 g)60*60*24*days)
14310 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 ;...X509_set_pub
14320 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a key(cert,pkey);.
14330 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 ...name=X509_get
14340 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 _subject_name(ce
14350 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d rt);....X509_NAM
14360 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
14370 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 xt(name,"C", MBS
14380 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
14390 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
143a0 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 *) k_C, -1, -1,
143b0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
143c0 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
143d0 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 (name,"ST", MBST
143e0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
143f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
14400 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 ) k_ST, -1, -1,
14410 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
14420 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
14430 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 (name,"L", MBSTR
14440 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
14450 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
14460 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_L, -1, -1, 0)
14470 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
14480 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
14490 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e ame,"O", MBSTRIN
144a0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
144b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
144c0 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a _O, -1, -1, 0);.
144d0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
144e0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
144f0 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 e,"OU", MBSTRING
14500 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
14510 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
14520 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a OU, -1, -1, 0);.
14530 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
14540 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
14550 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 e,"CN", MBSTRING
14560 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
14570 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
14580 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a CN, -1, -1, 0);.
14590 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
145a0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
145b0 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 e,"Email", MBSTR
145c0 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
145d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
145e0 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 k_Email, -1, -1
145f0 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 , 0);....X509_se
14600 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 t_subject_name(c
14610 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 ert,name);....if
14620 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 (!X509_sign(cer
14630 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 t,pkey,EVP_sha25
14640 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 6())) {... X5
14650 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09_free(cert);..
14660 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 . EVP_PKEY_fr
14670 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 ee(pkey);.#if OP
14680 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
14690 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
146a0 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 0L... BN_free
146b0 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 (bne);.#endif...
146c0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
146d0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
146e0 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 signing certific
146f0 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 ate",NULL);...
14700 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
14710 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 OR;...}....if (i
14720 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 sStr) {... ou
14730 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
14740 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 mem());... PE
14750 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 M_write_bio_X509
14760 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 (out,cert);...
14770 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 i=BIO_read(out
14780 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 ,buffer,sizeof(b
14790 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 uffer)-1);...
147a0 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 i=(i<0) ? 0 : i
147b0 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 ;... buffer[i
147c0 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 ]='\0';... Tc
147d0 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
147e0 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 pemout,buffer,0)
147f0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 ;... BIO_flus
14800 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 h(out);... BI
14810 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d O_free(out);...}
14820 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 else {... ou
14830 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
14840 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 file());... B
14850 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d IO_write_filenam
14860 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 e(out,pemout);..
14870 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
14880 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 io_X509(out,cert
14890 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
148a0 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a e_all(out);...}.
148b0 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 ...X509_free(cer
148c0 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 t);...EVP_PKEY_f
148d0 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f ree(pkey);.#if O
148e0 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
148f0 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
14900 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 00L...BN_free(bn
14910 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 e);.#endif..
14920 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 }..}..break;.
14930 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b default:..break
14940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
14950 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
14960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14970 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 ****/./* Init
14980 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a */./**
14990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
149a0 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d **/../*. *------
149b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
149c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
149d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
149e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
149f0 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a . * Tls_Free --.
14a00 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
14a10 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 dure cleans up w
14a20 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 hen a SSL socket
14a30 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 based channel.
14a40 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 *.is closed and
14a50 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f its reference co
14a60 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 unt falls below
14a70 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 1. *. * Results:
14a80 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.none. *. * S
14a90 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
14aa0 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 Frees all the st
14ab0 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ate. *. *-------
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 0a 20 2a 2f ------------. */
14b00 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 63 .void.Tls_Free(c
14b10 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b har *blockPtr) {
14b20 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
14b30 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
14b40 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 blockPtr;.. d
14b50 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
14b60 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e ;.. Tls_Clean
14b70 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 (statePtr);.
14b80 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 ckfree(blockPtr)
14b90 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
14ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
14be0 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d *. * Tls_Clean -
14bf0 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
14c00 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 cedure cleans up
14c10 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b when a SSL sock
14c20 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c et based channel
14c30 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e . *.is closed an
14c40 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 d its reference
14c50 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f count falls belo
14c60 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c w 1. This shoul
14c70 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 d. *.be called s
14c80 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 ynchronously by
14c90 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e the CloseProc, n
14ca0 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 ot in the. *.Eve
14cb0 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c ntuallyFree call
14cc0 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 back.. *. * Resu
14cd0 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a lts:. *.none. *.
14ce0 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
14cf0 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 . *.Frees all th
14d00 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d e state. *. *---
14d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d50 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c . */.void Tls_Cl
14d60 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 ean(State *state
14d70 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e Ptr) {. dprin
14d80 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
14d90 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 /*. * we'
14da0 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 re assuming here
14db0 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 that we're sing
14dc0 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 le-threaded.
14dd0 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
14de0 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 ePtr->timer != (
14df0 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 Tcl_TimerToken)
14e00 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c NULL) {..Tcl_Del
14e10 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 eteTimerHandler(
14e20 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 statePtr->timer)
14e30 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d ;..statePtr->tim
14e40 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d er = NULL;. }
14e50 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
14e60 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 tr->protos) {..c
14e70 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e kfree(statePtr->
14e80 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 protos);..stateP
14e90 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c tr->protos = NUL
14ea0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
14eb0 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 (statePtr->bio)
14ec0 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 {../* This will
14ed0 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 call SSL_shutdow
14ee0 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 2a n. Bug 1414045 *
14ef0 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f /..dprintf("BIO_
14f00 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 free_all(%p)", s
14f10 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 tatePtr->bio);..
14f20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 BIO_free_all(sta
14f30 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 tePtr->bio);..st
14f40 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 atePtr->bio = NU
14f50 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
14f60 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 (statePtr->ssl)
14f70 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c {..dprintf("SSL
14f80 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 _free(%p)", stat
14f90 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c ePtr->ssl);..SSL
14fa0 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e _free(statePtr->
14fb0 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ssl);..statePtr-
14fc0 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 >ssl = NULL;.
14fd0 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
14fe0 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c Ptr->ctx) {..SSL
14ff0 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 _CTX_free(stateP
15000 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 tr->ctx);..state
15010 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b Ptr->ctx = NULL;
15020 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
15030 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
15040 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 k) {..Tcl_DecrRe
15050 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
15060 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 >callback);..sta
15070 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
15080 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
15090 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
150a0 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c password) {..Tcl
150b0 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _DecrRefCount(st
150c0 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
150d0 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 );..statePtr->pa
150e0 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 ssword = NULL;.
150f0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
15100 74 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 tePtr->vcmd) {..
15110 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
15120 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 (statePtr->vcmd)
15130 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63 6d ;..statePtr->vcm
15140 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a d = NULL;. }.
15150 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 . dprintf("Re
15160 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 23 turning");.}...#
15170 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 if TCL_MAJOR_VER
15180 53 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65 SION > 8.#define
15190 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e MIN_VERSION "9.
151a0 30 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 0".#else.#define
151b0 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e MIN_VERSION "8.
151c0 35 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 5".#endif../*. *
151d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
151e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
151f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15210 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e ---. *. * Tls_In
15220 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 it --. *. *.This
15230 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e is a package in
15240 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f itialization pro
15250 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 cedure, which is
15260 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 called. *.by Tc
15270 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b l when this pack
15280 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 age is to be add
15290 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 ed to an interpr
152a0 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 eter.. *. * Resu
152b0 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 lts: Ssl config
152c0 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a ured and loaded.
152d0 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
152e0 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 ts:. *. create t
152f0 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 he ssl command,
15300 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 initialize ssl c
15310 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d ontext. *. *----
15320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
15360 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e */.DLLEXPORT in
15370 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 t Tls_Init(Tcl_I
15380 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b nterp *interp) {
15390 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
153a0 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 tlsTclInitScript
153b0 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 [] = {.#include
153c0 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 "tls.tcl.h"..0x0
153d0 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70 0. };.. dp
153e0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
153f0 0a 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c ..#ifdef USE_TCL
15400 5f 53 54 55 42 53 0a 20 20 20 20 69 66 20 28 54 _STUBS. if (T
15410 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 cl_InitStubs(int
15420 65 72 70 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e erp, MIN_VERSION
15430 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a , 0) == NULL) {.
15440 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
15450 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a R;. }.#endif.
15460 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 if (Tcl_PkgR
15470 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 equire(interp, "
15480 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 53 49 4f Tcl", MIN_VERSIO
15490 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b N, 0) == NULL) {
154a0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
154b0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
154c0 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 f (TlsLibInit(0)
154d0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 != TCL_OK) {..T
154e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
154f0 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e interp, "could n
15500 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 ot initialize SS
15510 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 63 68 61 L library", (cha
15520 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
15530 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
15540 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 }.. Tcl_Cr
15550 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
15560 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 nterp, "tls::cip
15570 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 hers", CiphersOb
15580 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
15590 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d a) NULL, (Tcl_Cm
155a0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
155b0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
155c0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
155d0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e nterp, "tls::con
155e0 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 nection", Connec
155f0 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 tionInfoObjCmd,
15600 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c (ClientData) NUL
15610 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 L, (Tcl_CmdDelet
15620 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
15630 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
15640 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
15650 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 "tls::handshake
15660 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 ", HandshakeObjC
15670 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
15680 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 NULL, (Tcl_CmdD
15690 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
156a0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
156b0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
156c0 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 erp, "tls::impor
156d0 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 t", ImportObjCmd
156e0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e , (ClientData) N
156f0 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ULL, (Tcl_CmdDel
15700 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
15710 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
15720 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
15730 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 p, "tls::unimpor
15740 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 t", UnimportObjC
15750 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
15760 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 NULL, (Tcl_CmdD
15770 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
15780 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
15790 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
157a0 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 erp, "tls::statu
157b0 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 s", StatusObjCmd
157c0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e , (ClientData) N
157d0 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ULL, (Tcl_CmdDel
157e0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
157f0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
15800 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
15810 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e p, "tls::version
15820 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 ", VersionObjCmd
15830 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e , (ClientData) N
15840 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ULL, (Tcl_CmdDel
15850 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
15860 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
15870 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
15880 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 p, "tls::misc",
15890 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 MiscObjCmd, (Cli
158a0 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 entData) NULL, (
158b0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
158c0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
158d0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
158e0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
158f0 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 s::protocols", P
15900 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 rotocolsObjCmd,
15910 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c (ClientData) NUL
15920 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 L, (Tcl_CmdDelet
15930 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
15940 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 29 . if (interp)
15950 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74 {..Tcl_Eval(int
15960 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 erp, tlsTclInitS
15970 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 cript);. }..
15980 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b return Tcl_Pk
15990 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c gProvide(interp,
159a0 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 PACKAGE_NAME, P
159b0 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b ACKAGE_VERSION);
159c0 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
159d0 2d 2d 2d 2d 2d 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 2a ---------------*
15a00 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 . *. *.Tls_SafeI
15a10 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d nit --. *. *.---
15a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
15a50 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 *.Standard proce
15a60 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79 dure required by
15a70 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 'load'.. *.Init
15a80 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 ializes this ext
15a90 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 ension for a saf
15aa0 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 e interpreter..
15ab0 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
15ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ae0 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 --*. *. *.Side e
15af0 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f ffects:. *..As o
15b00 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a f 'Tls_Init'. *.
15b10 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 *.Result:. *..A
15b20 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 standard Tcl er
15b30 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d ror code.. *. *-
15b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b70 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 -----*. */.DLLEX
15b80 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 PORT int Tls_Saf
15b90 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 eInit(Tcl_Interp
15ba0 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 *interp) {.
15bb0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
15bc0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 6c );. return Tl
15bd0 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a s_Init(interp);.
15be0 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
15bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
15c20 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 *. *.TlsLibInit
15c30 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d --. *. *.------
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 2a 0a 20 2a 09 49 ----------*. *.I
15c70 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c nitializes SSL l
15c80 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 ibrary once per
15c90 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d application. *.-
15ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
15cd0 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 . *. *.Side effe
15ce0 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c cts:. *..initial
15cf0 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 izes SSL library
15d00 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 . *. *.Result:.
15d10 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *..none. *. *---
15d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d50 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ---*. */.static
15d60 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 int TlsLibInit(i
15d70 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 nt uninitialize)
15d80 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e {. static in
15d90 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 t initialized =
15da0 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75 0;. int statu
15db0 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 s = TCL_OK;.#if
15dc0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
15dd0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
15de0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
15df0 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f . size_t num_
15e00 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 locks;.#endif..
15e10 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61 6c if (uninitial
15e20 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 ize) {..if (!ini
15e30 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 tialized) {..
15e40 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 dprintf("Asked
15e50 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c to uninitialize,
15e60 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20 but we are not
15e70 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a initialized");..
15e80 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
15e90 4f 4b 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 OK;..}...dprintf
15ea0 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 ("Asked to unini
15eb0 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 tialize");..#if
15ec0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
15ed0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
15ee0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
15ef0 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 ..Tcl_MutexLock(
15f00 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 &init_mx);...if
15f10 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 (locks) {.. f
15f20 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 ree(locks);..
15f30 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 locks = NULL;..
15f40 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d locksCount =
15f50 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 0;..}.#endif..i
15f60 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a nitialized = 0;.
15f70 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
15f80 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
15f90 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
15fa0 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 EADS)..Tcl_Mutex
15fb0 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 Unlock(&init_mx)
15fc0 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 ;.#endif...retur
15fd0 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a n TCL_OK;. }.
15fe0 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c . if (initial
15ff0 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 ized) {..dprintf
16000 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 ("Called, but us
16010 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 65 ing cached value
16020 22 29 3b 0a 09 72 65 74 75 72 6e 20 73 74 61 74 ");..return stat
16030 75 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 us;. }.. d
16040 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
16050 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
16060 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
16070 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
16080 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f HREADS). Tcl_
16090 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f MutexLock(&init_
160a0 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 mx);.#endif.
160b0 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b initialized = 1;
160c0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ..#if defined(OP
160d0 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
160e0 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
160f0 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c READS). num_l
16100 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f ocks = 1;. lo
16110 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 cksCount = (int)
16120 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 num_locks;.
16130 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 locks = malloc(s
16140 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 izeof(*locks) *
16150 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 num_locks);.
16160 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c memset(locks, 0,
16170 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 sizeof(*locks)
16180 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 * num_locks);.#e
16190 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 ndif.. /* Ini
161a0 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 tialize BOTH lib
161b0 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 crypto and libss
161c0 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 l. */. OPENSS
161d0 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 L_init_ssl(OPENS
161e0 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c SL_INIT_LOAD_SSL
161f0 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 _STRINGS | OPENS
16200 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 SL_INIT_LOAD_CRY
16210 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f PTO_STRINGS..| O
16220 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f PENSSL_INIT_ADD_
16230 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 ALL_CIPHERS | OP
16240 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 ENSSL_INIT_ADD_A
16250 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c LL_DIGESTS, NULL
16260 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f );.. BIO_new_
16270 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 tcl(NULL, 0);..#
16280 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 if 0. /*.
16290 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d * XXX:TODO: Rem
162a0 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e ove this code an
162b0 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 d replace it wit
162c0 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a h a check. *
162d0 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 for enough entr
162e0 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 opy and do not t
162f0 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 ry to create our
16300 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 own. * terr
16310 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 ible entropy.
16320 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 */. /*.
16330 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e 64 * Seed the rand
16340 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 om number genera
16350 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c tor in the SSL l
16360 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 ibrary,. * u
16370 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c sing the do/whil
16380 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 e construct beca
16390 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e use of the bug n
163a0 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 ote in the.
163b0 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74 * OpenSSL FAQ at
163c0 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e http://www.open
163d0 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f ssl.org/support/
163e0 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 faq.html#USER1.
163f0 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 *. * The
16400 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f crux of the pro
16410 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c blem is that Sol
16420 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 aris 7 does not
16430 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 have a. * /d
16440 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 ev/random or /de
16450 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 v/urandom device
16460 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 so it cannot ga
16470 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 ther enough.
16480 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 * entropy from
16490 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20 the RAND_seed()
164a0 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c when TLS initial
164b0 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73 izes and refuses
164c0 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 . * to go fu
164d0 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76 rther. Earlier v
164e0 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 ersions of OpenS
164f0 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65 SL carried on re
16500 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a gardless.. *
16510 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73 /. srand((uns
16520 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28 igned int) time(
16530 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 (time_t *) NULL)
16540 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 );. do {..for
16550 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b (i = 0; i < 16;
16560 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 i++) {.. rnd
16570 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 _seed[i] = 1 + (
16580 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72 char) (255.0 * r
16590 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b and()/(RAND_MAX+
165a0 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 1.0));..}..RAND_
165b0 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 seed(rnd_seed, s
165c0 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 izeof(rnd_seed))
165d0 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52 ;. } while (R
165e0 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20 AND_status() !=
165f0 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 1);.#endif..#if
16600 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
16610 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
16620 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
16630 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 ..Tcl_MutexUnloc
16640 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e k(&init_mx);.#en
16650 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 dif.. return
16660 73 74 61 74 75 73 3b 0a 7d 0a status;.}.