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 62 75 66 5b 42 55 46 53 char buf[BUFS
70b0: 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 IZ];. int ind
70c0: 65 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 2c ex, verbose = 0,
70d0: 20 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20 3d use_supported =
70e0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 0;. const SS
70f0: 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 L_METHOD *method
7100: 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 ;. (void) cli
7110: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 entData;.. dp
7120: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
7130: 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 .. if ((objc
7140: 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 < 2) || (objc >
7150: 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4)) {..Tcl_Wrong
7160: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
7170: 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 1, objv, "protoc
7180: 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 ol ?verbose? ?su
7190: 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 pported?");..ret
71a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
71b0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c }. if (Tcl
71c0: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a _GetIndexFromObj
71d0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d (interp, objv[1]
71e0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 , protocols, "pr
71f0: 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 otocol", 0, &ind
7200: 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ex) != TCL_OK) {
7210: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
7220: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
7230: 20 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 ((objc > 2) &&
7240: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 Tcl_GetBooleanFr
7250: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
7260: 6a 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 jv[2], &verbose)
7270: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
7280: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7290: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 . }. if ((
72a0: 6f 62 6a 63 20 3e 20 33 29 20 26 26 20 54 63 6c objc > 3) && Tcl
72b0: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f _GetBooleanFromO
72c0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
72d0: 33 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 74 3], &use_support
72e0: 65 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ed) != TCL_OK) {
72f0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
7300: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 OR;. }.. E
7310: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
7320: 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 ;.. switch ((
7330: 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e enum protocol)in
7340: 64 65 78 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 dex) {..case TLS
7350: 5f 53 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 _SSL2:.#if OPENS
7360: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
7370: 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c R >= 0x10100000L
7380: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 || defined(NO_S
7390: 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 SL2) || defined(
73a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
73b0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
73c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
73d0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
73e0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
73f0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
7400: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
7410: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
7420: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
7430: 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 ethod = SSLv2_me
7440: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 thod(); break;.#
7450: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
7460: 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 SSL3:.#if define
7470: 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 d(NO_SSL3) || de
7480: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7490: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL3) || define
74a0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
74b0: 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 3_METHOD).. T
74c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
74d0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
74e0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
74f0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
7500: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ted", (char *) N
7510: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ULL);.. retur
7520: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c n TCL_ERROR;.#el
7530: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d se.. method =
7540: 20 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 3b SSLv3_method();
7550: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
7560: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 case TLS_TLS1:.#
7570: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
7580: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f S1) || defined(O
7590: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 PENSSL_NO_TLS1)
75a0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
75b0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f SL_NO_TLS1_METHO
75c0: 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 D).. Tcl_Appe
75d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
75e0: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 protocols[index
75f0: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e ], ": protocol n
7600: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
7610: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
7620: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
7630: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 RROR;.#else..
7640: 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f method = TLSv1_
7650: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b method(); break;
7660: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c .#endif..case TL
7670: 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 S_TLS1_1:.#if de
7680: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
7690: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
76a0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c SSL_NO_TLS1_1) |
76b0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
76c0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 L_NO_TLS1_1_METH
76d0: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 OD).. Tcl_App
76e0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
76f0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
7700: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
7710: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
7720: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
7730: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
7740: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 ERROR;.#else..
7750: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 method = TLSv1
7760: 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 _1_method(); bre
7770: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 ak;.#endif..case
7780: 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 TLS_TLS1_2:.#if
7790: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
77a0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _2) || defined(O
77b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
77c0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
77d0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d NSSL_NO_TLS1_2_M
77e0: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f ETHOD).. Tcl_
77f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
7800: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
7810: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
7820: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
7830: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
7840: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
7850: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
7860: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c . method = TL
7870: 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 Sv1_2_method();
7880: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 break;.#endif..c
7890: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a ase TLS_TLS1_3:.
78a0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
78b0: 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_3) || define
78c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
78d0: 31 5f 33 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 1_3).. Tcl_Ap
78e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
78f0: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 p, protocols[ind
7900: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c ex], ": protocol
7910: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
7920: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
7930: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
7940: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 _ERROR;.#else..
7950: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f method = TLS_
7960: 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 53 method();.. S
7970: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 SL_CTX_set_min_p
7980: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
7990: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
79a0: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
79b0: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 set_max_proto_ve
79c0: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f rsion(ctx, TLS1_
79d0: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 3_VERSION);..
79e0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
79f0: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 6d 65 default:.. me
7a00: 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f thod = TLS_metho
7a10: 64 28 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b d();.. break;
7a20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 . }.. ctx
7a30: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 = SSL_CTX_new(me
7a40: 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 63 thod);. if (c
7a50: 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 tx == NULL) {..T
7a60: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
7a70: 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 52 5f interp, GET_ERR_
7a80: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
7a90: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
7aa0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
7ab0: 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 }.. ssl = SS
7ac0: 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 L_new(ctx);.
7ad0: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 if (ssl == NULL)
7ae0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
7af0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 45 54 sult(interp, GET
7b00: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
7b10: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
7b20: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
7b30: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
7b40: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
7b50: 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 /* Use list and
7b60: 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 order as would
7b70: 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 be sent in a Cli
7b80: 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 entHello or all
7b90: 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 available cipher
7ba0: 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 s */. if (use
7bb0: 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 _supported) {..s
7bc0: 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 k = SSL_get1_sup
7bd0: 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 ported_ciphers(s
7be0: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 sl);. } else
7bf0: 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f {..sk = SSL_get_
7c00: 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 ciphers(ssl);.
7c10: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 }.. if (sk
7c20: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 != NULL) {..if (
7c30: 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 !verbose) {..
7c40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 70 3b const char *cp;
7c50: 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
7c60: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
7c70: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 NULL);.. for
7c80: 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c (int i = 0; i <
7c90: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e sk_SSL_CIPHER_n
7ca0: 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 um(sk); i++) {..
7cb0: 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 .const SSL_CIPHE
7cc0: 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 R *c = sk_SSL_CI
7cd0: 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 PHER_value(sk, i
7ce0: 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 );...if (c == NU
7cf0: 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 LL) continue;...
7d00: 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d 65 20 ./* cipher name
7d10: 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 or (NONE) */...c
7d20: 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 p = SSL_CIPHER_g
7d30: 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 et_name(c);...if
7d40: 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 (cp == NULL) br
7d50: 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f eak;...Tcl_ListO
7d60: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
7d70: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
7d80: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
7d90: 28 28 63 68 61 72 20 2a 29 20 63 70 2c 20 2d 31 ((char *) cp, -1
7da0: 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 ));.. }...} e
7db0: 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 lse {.. objPt
7dc0: 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e r = Tcl_NewStrin
7dd0: 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 gObj("",0);..
7de0: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b for (int i = 0;
7df0: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 i < sk_SSL_CIPH
7e00: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 ER_num(sk); i++)
7e10: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 {...const SSL_C
7e20: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 IPHER *c = sk_SS
7e30: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 L_CIPHER_value(s
7e40: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d k, i);...if (c =
7e50: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 = NULL) continue
7e60: 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 ;..../* textual
7e70: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 description of t
7e80: 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 he cipher */...i
7e90: 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 f (SSL_CIPHER_de
7ea0: 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 scription(c, buf
7eb0: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 , sizeof(buf)) !
7ec0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 = NULL) {...
7ed0: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 Tcl_AppendToObj(
7ee0: 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 54 63 objPtr, buf, (Tc
7ef0: 6c 5f 53 69 7a 65 29 20 73 74 72 6c 65 6e 28 62 l_Size) strlen(b
7f00: 75 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b uf));...} else {
7f10: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ... Tcl_Appen
7f20: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 dToObj(objPtr, "
7f30: 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a UNKNOWN\n", 8);.
7f40: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 ..}.. }..}..i
7f50: 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 f (use_supported
7f60: 29 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f ) {.. sk_SSL_
7f70: 43 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b CIPHER_free(sk);
7f80: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 ..}. }. SS
7f90: 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 L_free(ssl);.
7fa0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
7fb0: 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 x);.. Tcl_Set
7fc0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
7fd0: 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 , objPtr);. r
7fe0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
7ff0: 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
8040: 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 ProtocolsObjCmd
8050: 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 -- list availab
8060: 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a le protocols. *.
8070: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
8080: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 e is invoked to
8090: 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 process the "tls
80a0: 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d ::protocols" com
80b0: 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 mand. *.to list
80c0: 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 available protoc
80d0: 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ols.. *. * Resul
80e0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
80f0: 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 d Tcl result lis
8100: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
8110: 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 fects:. *.none.
8120: 2a 0a 20 2a 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 2d 2d ----------------
8150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8160: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
8170: 69 63 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 ic int.Protocols
8180: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
8190: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
81a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
81b0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
81c0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
81d0: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ]) {. Tcl_Obj
81e0: 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 *objPtr;. (v
81f0: 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b oid) clientData;
8200: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
8210: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
8220: 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 (objc != 1) {..
8230: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
8240: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
8250: 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 , "");..return T
8260: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
8270: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
8280: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a rror();.. obj
8290: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
82a0: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a tObj(0, NULL);..
82b0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
82c0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
82d0: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 0100000L && !def
82e0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 ined(NO_SSL2) &&
82f0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
8300: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 L_NO_SSL2). T
8310: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
8320: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
8330: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
8340: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
8350: 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 ls[TLS_SSL2], -1
8360: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
8370: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
8380: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
8390: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 NSSL_NO_SSL3) &&
83a0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
83b0: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 L_NO_SSL3_METHOD
83c0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
83d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
83e0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
83f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
8400: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 protocols[TLS_SS
8410: 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 L3], -1));.#endi
8420: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
8430: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 O_TLS1) && !defi
8440: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
8450: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
8460: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
8470: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c _METHOD). Tcl
8480: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
8490: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
84a0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
84b0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
84c0: 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 [TLS_TLS1], -1))
84d0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
84e0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
84f0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
8500: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 NSSL_NO_TLS1_1)
8510: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
8520: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 SSL_NO_TLS1_1_ME
8530: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 THOD). Tcl_Li
8540: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
8550: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
8560: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
8570: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
8580: 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b S_TLS1_1], -1));
8590: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
85a0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
85b0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
85c0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 SSL_NO_TLS1_2) &
85d0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
85e0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 SL_NO_TLS1_2_MET
85f0: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 HOD). Tcl_Lis
8600: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
8610: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
8620: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
8630: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
8640: 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a _TLS1_2], -1));.
8650: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
8660: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 ned(NO_TLS1_3) &
8670: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
8680: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
8690: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
86a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
86b0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
86c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
86d0: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 ocols[TLS_TLS1_3
86e0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
86f0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
8700: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
8710: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 jPtr);. retur
8720: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
8730: 0a 20 2a 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 2d 2d 2d ----------------
8760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8770: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e ------. *. * Han
8780: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a dshakeObjCmd --.
8790: 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 *. *.This comma
87a0: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 nd is used to ve
87b0: 72 69 66 79 20 77 68 65 74 68 65 72 20 74 68 65 rify whether the
87c0: 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f handshake is co
87d0: 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 mplete. *.or not
87e0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
87f0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
8800: 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 cl result. 1 mea
8810: 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d ns handshake com
8820: 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 plete, 0 means p
8830: 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 ending.. *. * Si
8840: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d de effects:. *.M
8850: 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 ay force SSL neg
8860: 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 otiation to take
8870: 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d place.. *. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88c0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 . */.static int
88d0: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 HandshakeObjCmd(
88e0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
88f0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
8900: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
8910: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
8920: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
8930: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
8940: 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 an; /* Th
8950: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 e channel to set
8960: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 a mode on. */.
8970: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
8980: 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c tr; /* cl
8990: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 ient state for s
89a0: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 sl socket */.
89b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 const char *err
89c0: 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 Str = NULL;.
89d0: 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 int ret = 1;.
89e0: 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 20 20 int err = 0;.
89f0: 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 (void) clientD
8a00: 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ata;.. dprint
8a10: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
8a20: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 if (objc != 2)
8a30: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
8a40: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
8a50: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 objv, "channel")
8a60: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
8a70: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
8a80: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
8a90: 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 );.. chan = T
8aa0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
8ab0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
8ac0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 ing(objv[1]), NU
8ad0: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 LL);. if (cha
8ae0: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
8af0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
8b00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
8b10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
8b20: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
8b30: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
8b40: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
8b50: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
8b60: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 Channel(chan);.
8b70: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
8b80: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
8b90: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
8ba0: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
8bb0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
8bc0: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
8bd0: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
8be0: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 elName(chan),..
8bf0: 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c "\": not a TL
8c00: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 S channel", (cha
8c10: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c r *) NULL);..Tcl
8c20: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
8c30: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 terp, "TLS", "HA
8c40: 4e 44 53 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e NDSHAKE", "CHANN
8c50: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 EL", "INVALID",
8c60: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
8c70: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
8c80: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 R;. }. sta
8c90: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
8ca0: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 )Tcl_GetChannelI
8cb0: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e nstanceData(chan
8cc0: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 );.. dprintf(
8cd0: 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 "Calling Tls_Wai
8ce0: 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 tForConnect");.
8cf0: 20 20 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 ret = Tls_Wai
8d00: 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 tForConnect(stat
8d10: 65 50 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a ePtr, &err, 1);.
8d20: 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 dprintf("Tls
8d30: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 _WaitForConnect
8d40: 72 65 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 returned: %i", r
8d50: 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 et);.. if (re
8d60: 74 20 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 t < 0 && ((state
8d70: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 Ptr->flags & TLS
8d80: 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 _TCL_ASYNC) && (
8d90: 65 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 err == EAGAIN)))
8da0: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 {..dprintf("Asy
8db0: 6e 63 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d nc set and err =
8dc0: 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 EAGAIN");..ret
8dd0: 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 = 0;. } else
8de0: 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 if (ret < 0) {..
8df0: 6c 6f 6e 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 long result;..er
8e00: 72 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d rStr = statePtr-
8e10: 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 >err;..Tcl_Reset
8e20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
8e30: 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 .Tcl_SetErrno(er
8e40: 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 r);...if (!errSt
8e50: 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d r || (*errStr ==
8e60: 20 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 0)) {.. errS
8e70: 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 tr = Tcl_PosixEr
8e80: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a ror(interp);..}.
8e90: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
8ea0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 lt(interp, "hand
8eb0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c shake failed: ",
8ec0: 20 65 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a errStr, (char *
8ed0: 29 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 ) NULL);..if ((r
8ee0: 65 73 75 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f esult = SSL_get_
8ef0: 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 verify_result(st
8f00: 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d atePtr->ssl)) !=
8f10: 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 X509_V_OK) {..
8f20: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
8f30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 20 64 75 ult(interp, " du
8f40: 65 20 74 6f 20 5c 22 22 2c 20 58 35 30 39 5f 76 e to \"", X509_v
8f50: 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 erify_cert_error
8f60: 5f 73 74 72 69 6e 67 28 72 65 73 75 6c 74 29 2c _string(result),
8f70: 20 22 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 "\"", (char *)
8f80: 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 NULL);..}..Tcl_S
8f90: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
8fa0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 rp, "TLS", "HAND
8fb0: 53 48 41 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 SHAKE", "FAILED"
8fc0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
8fd0: 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65 74 75 ;..dprintf("Retu
8fe0: 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 rning TCL_ERROR
8ff0: 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 20 66 with handshake f
9000: 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 72 53 ailed: %s", errS
9010: 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c tr);..return TCL
9020: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c _ERROR;. } el
9030: 73 65 20 7b 0a 09 69 66 20 28 65 72 72 20 21 3d se {..if (err !=
9040: 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 0) {.. dprin
9050: 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 tf("Got an error
9060: 20 77 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 with a complete
9070: 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 d handshake: err
9080: 20 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d = %i", err);..}
9090: 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d ..ret = 1;. }
90a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 .. dprintf("R
90b0: 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 eturning TCL_OK
90c0: 77 69 74 68 20 64 61 74 61 20 5c 22 25 69 5c 22 with data \"%i\"
90d0: 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 54 63 6c ", ret);. Tcl
90e0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
90f0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 terp, Tcl_NewInt
9100: 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 72 Obj(ret));. r
9110: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
9120: 0a 2f 2a 0a 20 2a 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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
9170: 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a ImportObjCmd --.
9180: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
9190: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
91a0: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
91b0: 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a ssl" command. *.
91c0: 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 *.The ssl comma
91d0: 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 nd pushes SSL ov
91e0: 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e er a (newly conn
91f0: 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 ected) tcp socke
9200: 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a t. *. * Results:
9210: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
9220: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
9230: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
9240: 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 *.May modify the
9250: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 behavior of an
9260: 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 IO channel.. *.
9270: 2a 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 2d 2d 2d 2d 2d ----------------
92a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92b0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
92c0: 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 int.ImportObjCmd
92d0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
92e0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
92f0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
9300: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
9310: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
9320: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
9330: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 han;../* The cha
9340: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f nnel to set a mo
9350: 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 de on. */. St
9360: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 ate *statePtr;..
9370: 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 /* client state
9380: 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a for ssl socket *
9390: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 /. SSL_CTX *c
93a0: 74 78 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 tx..= NULL;.
93b0: 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 Tcl_Obj *script.
93c0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c .= NULL;. Tcl
93d0: 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 09 _Obj *password..
93e0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
93f0: 4f 62 6a 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c Obj *vcmd..= NUL
9400: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 L;. Tcl_DStri
9410: 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 ng upperChannelT
9420: 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 ranslation, uppe
9430: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
9440: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e , upperChannelEn
9450: 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 coding, upperCha
9460: 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 nnelEOFChar;.
9470: 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 54 63 int idx;. Tc
9480: 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 l_Size len;.
9490: 69 6e 74 20 66 6c 61 67 73 09 09 09 3d 20 54 4c int flags...= TL
94a0: 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 S_TCL_INIT;.
94b0: 69 6e 74 20 73 65 72 76 65 72 09 09 09 3d 20 30 int server...= 0
94c0: 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 ;./* is connecti
94d0: 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f on incoming or o
94e0: 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 utgoing? */.
94f0: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d char *keyfile..=
9500: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
9510: 2a 63 65 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c *certfile..= NUL
9520: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 L;. unsigned
9530: 63 68 61 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c char *key..= NUL
9540: 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 L;. Tcl_Size
9550: 6b 65 79 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 key_len..= 0;.
9560: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
9570: 2a 63 65 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 *cert..= NULL;.
9580: 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 Tcl_Size cert
9590: 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 _len..= 0;. c
95a0: 68 61 72 20 2a 63 69 70 68 65 72 73 09 09 3d 20 har *ciphers..=
95b0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
95c0: 63 69 70 68 65 72 73 75 69 74 65 73 09 09 3d 20 ciphersuites..=
95d0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
95e0: 43 41 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a CAfile..= NULL;.
95f0: 20 20 20 20 63 68 61 72 20 2a 43 41 70 61 74 68 char *CApath
9600: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 ..= NULL;. ch
9610: 61 72 20 2a 44 48 70 61 72 61 6d 73 09 09 3d 20 ar *DHparams..=
9620: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
9630: 6d 6f 64 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a model...= NULL;.
9640: 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 char *server
9650: 6e 61 6d 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f 2a name..= NULL;./*
9660: 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 hostname for Se
9670: 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 rver Name Indica
9680: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72 tion */. char
9690: 20 2a 73 65 73 73 69 6f 6e 5f 69 64 09 09 3d 20 *session_id..=
96a0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 NULL;. Tcl_Ob
96b0: 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b j *alpn..= NULL;
96c0: 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 . int ssl2 =
96d0: 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 0, ssl3 = 0;.
96e0: 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 int tls1 = 1, t
96f0: 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f ls1_1 = 1, tls1_
9700: 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 2 = 1, tls1_3 =
9710: 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 1;. int proto
9720: 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 = 0, level = -1
9730: 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 ;. int verify
9740: 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 = 0, require =
9750: 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c 20 0, request = 1,
9760: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d post_handshake =
9770: 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 0;. (void) c
9780: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 lientData;..
9790: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
97a0: 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 );..#if defined(
97b0: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 NO_TLS1) || defi
97c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
97d0: 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 LS1). tls1 =
97e0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 0;.#endif.#if de
97f0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
9800: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
9810: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 SSL_NO_TLS1_1).
9820: 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 tls1_1 = 0;.#
9830: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
9840: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 d(NO_TLS1_2) ||
9850: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
9860: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 NO_TLS1_2). t
9870: 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 ls1_2 = 0;.#endi
9880: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
9890: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 _TLS1_3) || defi
98a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
98b0: 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f LS1_3). tls1_
98c0: 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 3 = 0;.#endif..
98d0: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 if (objc < 2)
98e0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
98f0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
9900: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f objv, "channel ?
9910: 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 options?");..ret
9920: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
9930: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c }.. ERR_cl
9940: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 ear_error();..
9950: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
9960: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
9970: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
9980: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 jv[1]), NULL);.
9990: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
99a0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
99b0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
99c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
99d0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
99e0: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
99f0: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
9a00: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 l */. chan =
9a10: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
9a20: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f l(chan);.. fo
9a30: 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 r (idx = 2; idx
9a40: 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b < objc; idx++) {
9a50: 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 ..char *opt = Tc
9a60: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
9a70: 5b 69 64 78 5d 29 3b 0a 0a 09 69 66 20 28 6f 70 [idx]);...if (op
9a80: 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 t[0] != '-')..
9a90: 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 break;...OPTOB
9aa0: 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 J("-alpn", alpn)
9ab0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64 69 ;..OPTSTR("-cadi
9ac0: 72 22 2c 20 43 41 70 61 74 68 29 3b 0a 09 4f 50 r", CApath);..OP
9ad0: 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 TSTR("-cafile",
9ae0: 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 42 59 54 CAfile);..OPTBYT
9af0: 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c E("-cert", cert,
9b00: 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 cert_len);..OPT
9b10: 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c STR("-certfile",
9b20: 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 certfile);..OPT
9b30: 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63 STR("-cipher", c
9b40: 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 iphers);..OPTSTR
9b50: 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63 69 70 ("-ciphers", cip
9b60: 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 hers);..OPTSTR("
9b70: 2d 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 20 -ciphersuites",
9b80: 63 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09 ciphersuites);..
9b90: 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 OPTOBJ("-command
9ba0: 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 ", script);..OPT
9bb0: 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c STR("-dhparams",
9bc0: 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 DHparams);..OPT
9bd0: 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 BYTE("-key", key
9be0: 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 , key_len);..OPT
9bf0: 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 STR("-keyfile",
9c00: 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 keyfile);..OPTST
9c10: 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 R("-model", mode
9c20: 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 l);..OPTOBJ("-pa
9c30: 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 ssword", passwor
9c40: 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 d);..OPTBOOL("-p
9c50: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20 ost_handshake",
9c60: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b post_handshake);
9c70: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 ..OPTBOOL("-requ
9c80: 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a est", request);.
9c90: 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 .OPTBOOL("-requi
9ca0: 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 re", require);..
9cb0: 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 74 OPTINT("-securit
9cc0: 79 5f 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 y_level", level)
9cd0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 ;..OPTBOOL("-ser
9ce0: 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 ver", server);..
9cf0: 4f 50 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e OPTSTR("-servern
9d00: 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 ame", servername
9d10: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73 );..OPTSTR("-ses
9d20: 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f sion_id", sessio
9d30: 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 n_id);..OPTBOOL(
9d40: 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a "-ssl2", ssl2);.
9d50: 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 .OPTBOOL("-ssl3"
9d60: 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f , ssl3);..OPTBOO
9d70: 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 L("-tls1", tls1)
9d80: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
9d90: 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 1.1", tls1_1);..
9da0: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 OPTBOOL("-tls1.2
9db0: 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 ", tls1_2);..OPT
9dc0: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 BOOL("-tls1.3",
9dd0: 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a tls1_3);..OPTOBJ
9de0: 28 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 ("-validatecomma
9df0: 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 nd", vcmd);..OPT
9e00: 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d OBJ("-vcmd", vcm
9e10: 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 d);...OPTBAD("op
9e20: 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d tion", "-alpn, -
9e30: 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 cadir, -cafile,
9e40: 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 -cert, -certfile
9e50: 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68 , -cipher, -ciph
9e60: 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 ersuites, -comma
9e70: 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d nd, -dhparams, -
9e80: 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d key, -keyfile, -
9e90: 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 model, -password
9ea0: 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b , -post_handshak
9eb0: 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 e, -request, -re
9ec0: 71 75 69 72 65 2c 20 2d 73 65 63 75 72 69 74 79 quire, -security
9ed0: 5f 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c _level, -server,
9ee0: 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 -servername, -s
9ef0: 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 ession_id, -ssl2
9f00: 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 , -ssl3, -tls1,
9f10: 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 -tls1.1, -tls1.2
9f20: 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 , -tls1.3, or -v
9f30: 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 alidatecommand")
9f40: 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ;...return TCL_E
9f50: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
9f60: 69 66 20 28 72 65 71 75 65 73 74 29 09 09 76 65 if (request)..ve
9f70: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 rify |= SSL_VERI
9f80: 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c FY_CLIENT_ONCE |
9f90: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 SSL_VERIFY_PEER
9fa0: 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 ;. if (reques
9fb0: 74 20 26 26 20 72 65 71 75 69 72 65 29 09 76 65 t && require).ve
9fc0: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 rify |= SSL_VERI
9fd0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
9fe0: 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 ER_CERT;. if
9ff0: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 (request && post
a000: 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69 _handshake).veri
a010: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 fy |= SSL_VERIFY
a020: 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b _POST_HANDSHAKE;
a030: 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 79 20 . if (verify
a040: 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20 3d 20 == 0)..verify =
a050: 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b SSL_VERIFY_NONE;
a060: 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 .. proto |= (
a070: 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f ssl2 ? TLS_PROTO
a080: 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 _SSL2 : 0);.
a090: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f proto |= (ssl3 ?
a0a0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 TLS_PROTO_SSL3
a0b0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
a0c0: 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 |= (tls1 ? TLS_P
a0d0: 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a ROTO_TLS1 : 0);.
a0e0: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
a0f0: 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f s1_1 ? TLS_PROTO
a100: 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 _TLS1_1 : 0);.
a110: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
a120: 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 _2 ? TLS_PROTO_T
a130: 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 LS1_2 : 0);.
a140: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 proto |= (tls1_3
a150: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
a160: 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 1_3 : 0);.. /
a170: 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 * reset to NULL
a180: 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 if blank string
a190: 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 provided */.
a1a0: 69 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 if (cert && !*ce
a1b0: 72 74 29 09 09 20 20 20 20 20 20 20 20 63 65 72 rt).. cer
a1c0: 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c t. = NULL
a1d0: 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 ;. if (key &&
a1e0: 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20 !*key)..
a1f0: 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e key. = N
a200: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72 ULL;. if (cer
a210: 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66 tfile && !*certf
a220: 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 65 72 ile) cer
a230: 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 tfile.= NULL;.
a240: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26 if (keyfile &&
a250: 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 !*keyfile)..key
a260: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e file. = N
a270: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 ULL;. if (cip
a280: 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 hers && !*cipher
a290: 73 29 09 20 20 20 20 20 20 20 20 63 69 70 68 65 s). ciphe
a2a0: 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c rs. = NUL
a2b0: 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 L;. if (ciphe
a2c0: 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 69 70 rsuites && !*cip
a2d0: 68 65 72 73 75 69 74 65 73 29 20 63 69 70 68 65 hersuites) ciphe
a2e0: 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c rsuites = NUL
a2f0: 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c L;. if (CAfil
a300: 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20 e && !*CAfile).
a310: 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 20 20 CAfile.
a320: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
a330: 20 20 69 66 20 28 43 41 70 61 74 68 20 26 26 20 if (CApath &&
a340: 21 2a 43 41 70 61 74 68 29 09 20 20 20 20 20 20 !*CApath).
a350: 20 20 43 41 70 61 74 68 09 20 20 20 20 20 20 20 CApath.
a360: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
a370: 28 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 (DHparams && !*D
a380: 48 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 Hparams).
a390: 20 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 DHparams
a3a0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a = NULL;.. /*
a3b0: 20 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a new SSL state *
a3c0: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09 /. statePtr..
a3d0: 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c = (State *) ckal
a3e0: 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 loc((unsigned) s
a3f0: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 izeof(State));.
a400: 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 memset(stateP
a410: 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 tr, 0, sizeof(St
a420: 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 ate));.. stat
a430: 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c ePtr->flags.= fl
a440: 61 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 ags;. statePt
a450: 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 r->interp.= inte
a460: 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 rp;. statePtr
a470: 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 ->vflags.= verif
a480: 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d y;. statePtr-
a490: 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 >err.= "";..
a4a0: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 /* allocate scri
a4b0: 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 pt */. if (sc
a4c0: 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 ript) {..(void)
a4d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
a4e0: 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 mObj(script, &le
a4f0: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
a500: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 . statePtr->c
a510: 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 allback = script
a520: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 ;.. Tcl_IncrR
a530: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
a540: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a ->callback);..}.
a550: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c }.. /* al
a560: 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 locate password
a570: 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 */. if (passw
a580: 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 ord) {..(void) T
a590: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
a5a0: 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c Obj(password, &l
a5b0: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b en);..if (len) {
a5c0: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
a5d0: 70 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 password = passw
a5e0: 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e ord;.. Tcl_In
a5f0: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
a600: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a Ptr->password);.
a610: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
a620: 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 allocate valida
a630: 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 te command */.
a640: 20 20 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 if (vcmd) {..(
a650: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 void) Tcl_GetStr
a660: 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c ingFromObj(vcmd,
a670: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e &len);..if (len
a680: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 ) {.. statePt
a690: 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a r->vcmd = vcmd;.
a6a0: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
a6b0: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
a6c0: 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a vcmd);..}. }.
a6d0: 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 . if (model !
a6e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d = NULL) {..int m
a6f0: 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 ode;../* Get the
a700: 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 "model" context
a710: 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f */..chan = Tcl_
a720: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
a730: 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 p, model, &mode)
a740: 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 ;..if (chan == (
a750: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
a760: 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 L) {.. Tls_Fr
a770: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
a780: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
a790: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
a7a0: 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 .../*.. * Make s
a7b0: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f ure to operate o
a7c0: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 n the topmost ch
a7d0: 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e annel.. */..chan
a7e0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
a7f0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 nnel(chan);..if
a800: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
a810: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 ype(chan) != Tls
a820: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 _ChannelType())
a830: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
a840: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
a850: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 "bad channel \""
a860: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
a870: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c Name(chan),..."\
a880: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
a890: 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 nnel", (char *)
a8a0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
a8b0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
a8c0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
a8d0: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c ORT", "CHANNEL",
a8e0: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
a8f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
a900: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 Tls_Free((char
a910: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
a920: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
a930: 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 ROR;..}..ctx = (
a940: 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 (State *)Tcl_Get
a950: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
a960: 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b ata(chan))->ctx;
a970: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 . } else {..i
a980: 66 20 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e f ((ctx = CTX_In
a990: 69 74 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 it(statePtr, ser
a9a0: 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 ver, proto, keyf
a9b0: 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b ile, certfile, k
a9c0: 65 79 2c 20 63 65 72 74 2c 20 28 69 6e 74 29 20 ey, cert, (int)
a9d0: 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 28 69 key_len,.. (i
a9e0: 6e 74 29 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 nt) cert_len, CA
a9f0: 70 61 74 68 2c 20 43 41 66 69 6c 65 2c 20 63 69 path, CAfile, ci
aa00: 70 68 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 phers, ciphersui
aa10: 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 tes, level, DHpa
aa20: 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 rams)) == NULL)
aa30: 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 {.. Tls_Free(
aa40: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
aa50: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
aa60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
aa70: 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 }.. statePt
aa80: 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 r->ctx = ctx;..
aa90: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 /*. * We
aaa0: 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 need to make sur
aab0: 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e e that the chann
aac0: 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 el works in bina
aad0: 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 ry (for the.
aae0: 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f * encryption no
aaf0: 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 t to get goofed
ab00: 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f up).. * We o
ab10: 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 nly want to adju
ab20: 73 74 20 74 68 65 20 62 75 66 66 65 72 69 6e 67 st the buffering
ab30: 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e 6e in pre-v2 chann
ab40: 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20 20 els, where.
ab50: 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 * each channel i
ab60: 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69 6e n the stack main
ab70: 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 tained its own b
ab80: 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a uffers.. */.
ab90: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
aba0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
abb0: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 lTranslation);.
abc0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
abd0: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
abe0: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 Blocking);. T
abf0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
ac00: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 upperChannelEOFC
ac10: 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 har);. Tcl_DS
ac20: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 tringInit(&upper
ac30: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
ac40: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 ;. Tcl_GetCha
ac50: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
ac60: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 p, chan, "-eofch
ac70: 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e ar", &upperChann
ac80: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 elEOFChar);.
ac90: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
aca0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
acb0: 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 n, "-encoding",
acc0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 &upperChannelEnc
acd0: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f oding);. Tcl_
ace0: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e GetChannelOption
acf0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
ad00: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 -translation", &
ad10: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
ad20: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 slation);. Tc
ad30: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_GetChannelOpti
ad40: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
ad50: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 "-blocking", &u
ad60: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
ad70: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ing);. Tcl_Se
ad80: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
ad90: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 nterp, chan, "-t
ada0: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 ranslation", "bi
adb0: 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f nary");. Tcl_
adc0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
add0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
ade0: 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 -blocking", "tru
adf0: 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 e");. dprintf
ae00: 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 ("Consuming Tcl
ae10: 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c channel %s", Tcl
ae20: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
ae30: 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 chan));. stat
ae40: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c ePtr->self = Tcl
ae50: 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e _StackChannel(in
ae60: 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 terp, Tls_Channe
ae70: 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 lType(), (Client
ae80: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 0a Data) statePtr,.
ae90: 09 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c .(TCL_READABLE |
aea0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 TCL_WRITABLE),
aeb0: 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e chan);. dprin
aec0: 74 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e tf("Created chan
aed0: 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 nel named %s", T
aee0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
aef0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
af00: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 ));. if (stat
af10: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 ePtr->self == (T
af20: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
af30: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 ) {../*.. * No u
af40: 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 se of Tcl_Eventu
af50: 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 allyFree because
af60: 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c no possible Tcl
af70: 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a _Preserve... */.
af80: 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 .Tls_Free((char
af90: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 *) statePtr);..r
afa0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
afb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f . }.. Tcl_
afc0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
afd0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
afe0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 r->self, "-trans
aff0: 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 lation", Tcl_DSt
b000: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
b010: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
b020: 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 on));. Tcl_Se
b030: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
b040: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
b050: 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e >self, "-encodin
b060: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 g", Tcl_DStringV
b070: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
b080: 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 elEncoding));.
b090: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
b0a0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 Option(interp, s
b0b0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 tatePtr->self, "
b0c0: 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 -eofchar", Tcl_D
b0d0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
b0e0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
b0f0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ));. Tcl_SetC
b100: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
b110: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
b120: 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 elf, "-blocking"
b130: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
b140: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ue(&upperChannel
b150: 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20 20 Blocking));.
b160: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
b170: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 &upperChannelTra
b180: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 nslation);. T
b190: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
b1a0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
b1b0: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 ding);. Tcl_D
b1c0: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 StringFree(&uppe
b1d0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 rChannelEOFChar)
b1e0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
b1f0: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e gFree(&upperChan
b200: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 nelBlocking);..
b210: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c /*. * SSL
b220: 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a Initialization.
b230: 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 */. stat
b240: 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f ePtr->ssl = SSL_
b250: 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 new(statePtr->ct
b260: 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 x);. if (!sta
b270: 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f tePtr->ssl) {../
b280: 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 * SSL library er
b290: 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 ror */..Tcl_Appe
b2a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
b2b0: 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 "couldn't const
b2c0: 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e ruct ssl session
b2d0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
b2e0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
b2f0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
b300: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
b310: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
b320: 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 ORT", "INIT", "F
b330: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 AILED", (char *)
b340: 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 NULL);..Tls_Fre
b350: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
b360: 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 Ptr);..return TC
b370: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
b380: 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 20 /* Set host
b390: 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 server name */.
b3a0: 20 20 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d if (servernam
b3b0: 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74 68 e) {../* Sets th
b3c0: 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e e server name in
b3d0: 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 69 dication (SNI) i
b3e0: 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78 n ClientHello ex
b3f0: 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 tension */../* P
b400: 65 72 20 52 46 43 20 36 30 36 36 2c 20 68 6f 73 er RFC 6066, hos
b410: 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43 49 49 tname is a ASCII
b420: 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c encoded string,
b430: 20 74 68 6f 75 67 68 20 52 46 43 20 34 33 36 36 though RFC 4366
b440: 20 73 61 79 73 20 55 54 46 2d 38 2e 20 2a 2f 0a says UTF-8. */.
b450: 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c .if (!SSL_set_tl
b460: 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 sext_host_name(s
b470: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 tatePtr->ssl, se
b480: 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71 rvername) && req
b490: 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c uire) {.. Tcl
b4a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
b4b0: 74 65 72 70 2c 20 22 53 65 74 20 53 4e 49 20 65 terp, "Set SNI e
b4c0: 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 3a xtension failed:
b4d0: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 ", GET_ERR_REAS
b4e0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
b4f0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 ULL);.. Tcl_S
b500: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
b510: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
b520: 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 46 41 49 RT", "SNI", "FAI
b530: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
b540: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
b550: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
b560: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
b570: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
b580: 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e }.../* Set hostn
b590: 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 ame for peer cer
b5a0: 74 69 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d tificate hostnam
b5b0: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 e verification i
b5c0: 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 n clients... D
b5d0: 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74 on't use SSL_set
b5e0: 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20 1_host since it
b5f0: 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e has limitations.
b600: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 */..if (!SSL_ad
b610: 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 d1_host(statePtr
b620: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d ->ssl, servernam
b630: 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 e)) {.. Tcl_A
b640: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
b650: 72 70 2c 20 22 53 65 74 20 44 4e 53 20 68 6f 73 rp, "Set DNS hos
b660: 74 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c tname failed: ",
b670: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 GET_ERR_REASON(
b680: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
b690: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 );.. Tcl_SetE
b6a0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
b6b0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 "TLS", "IMPORT"
b6c0: 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 , "HOSTNAME", "F
b6d0: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 AILED", (char *)
b6e0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 NULL);.. Tls
b6f0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
b700: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
b710: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
b720: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
b730: 2a 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e * Resume session
b740: 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 id */. if (s
b750: 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 ession_id && str
b760: 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 len(session_id)
b770: 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 <= SSL_MAX_SID_C
b780: 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a TX_LENGTH) {../*
b790: 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e SSL_set_session
b7a0: 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f () */..if (!SSL_
b7b0: 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f SESSION_set1_id_
b7c0: 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f context(SSL_get_
b7d0: 73 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 session(statePtr
b7e0: 2d 3e 73 73 6c 29 2c 0a 09 09 28 63 6f 6e 73 74 ->ssl),...(const
b7f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
b800: 29 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 ) session_id, (u
b810: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 nsigned int) str
b820: 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 len(session_id))
b830: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
b840: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
b850: 2c 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f , "Resume sessio
b860: 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 n failed: ", GET
b870: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
b880: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
b890: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 Tcl_SetError
b8a0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
b8b0: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 S", "IMPORT", "S
b8c0: 45 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 ESSION", "FAILED
b8d0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
b8e0: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 );.. Tls_Free
b8f0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
b900: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
b910: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 TCL_ERROR;..}.
b920: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 }.. /* Ena
b930: 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d ble Application-
b940: 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e Layer Protocol N
b950: 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d egotiation. Exam
b960: 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f 31 ples are: http/1
b970: 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 .0,..http/1.1, h
b980: 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2, h3, ftp, imap
b990: 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 , pop3, xmpp-cli
b9a0: 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 ent, xmpp-server
b9b0: 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 63 , mqtt, irc, etc
b9c0: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 . */. if (alp
b9d0: 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 n) {../* Convert
b9e0: 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f a TCL list into
b9f0: 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 a protocol-list
ba00: 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 in wire-format
ba10: 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 */..unsigned cha
ba20: 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 r *protos, *p;..
ba30: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f unsigned int pro
ba40: 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 tos_len = 0;..Tc
ba50: 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 l_Size cnt, i;..
ba60: 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 int j;..Tcl_Obj
ba70: 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 **list;...if (Tc
ba80: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d l_ListObjGetElem
ba90: 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 ents(interp, alp
baa0: 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 n, &cnt, &list)
bab0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 != TCL_OK) {..
bac0: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
bad0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
bae0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
baf0: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 RROR;..}.../* De
bb00: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f termine the memo
bb10: 72 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 ry required for
bb20: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 the protocol-lis
bb30: 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 t */..for (i = 0
bb40: 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 ; i < cnt; i++)
bb50: 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74 {.. Tcl_GetSt
bb60: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 ringFromObj(list
bb70: 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 [i], &len);..
bb80: 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 if (len > 255)
bb90: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {...Tcl_AppendRe
bba0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 4c sult(interp, "AL
bbb0: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 PN protocol name
bbc0: 73 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 s too long", (ch
bbd0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 ar *) NULL);...T
bbe0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
bbf0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
bc00: 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c IMPORT", "ALPN",
bc10: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
bc20: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 *) NULL);...Tls
bc30: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
bc40: 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75 tatePtr);...retu
bc50: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
bc60: 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 }.. protos
bc70: 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e 74 _len += 1 + (int
bc80: 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 ) len;..}.../* B
bc90: 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 uild the complet
bca0: 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 e protocol-list
bcb0: 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 */..protos = cka
bcc0: 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 lloc(protos_len)
bcd0: 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c ;../* protocol-l
bce0: 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 ists consist of
bcf0: 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 8-bit length-pre
bd00: 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 69 fixed, byte stri
bd10: 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d ngs */..for (j =
bd20: 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 0, p = protos;
bd30: 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a j < cnt; j++) {.
bd40: 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d . char *str =
bd50: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
bd60: 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26 omObj(list[j], &
bd70: 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 len);.. *p++
bd80: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 = (unsigned char
bd90: 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 ) len;.. memc
bda0: 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a 65 py(p, str, (size
bdb0: 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 _t) len);.. p
bdc0: 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a += len;..}.../*
bdd0: 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 SSL_set_alpn_pr
bde0: 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 otos makes a cop
bdf0: 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f y of the protoco
be00: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f l-list */../* No
be10: 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f te: This functio
be20: 6e 73 20 72 65 76 65 72 73 65 73 20 74 68 65 20 ns reverses the
be30: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e return value con
be40: 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 vention */..if (
be50: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f SSL_set_alpn_pro
be60: 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 tos(statePtr->ss
be70: 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f l, protos, proto
be80: 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 s_len)) {.. T
be90: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
bea0: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c 50 interp, "Set ALP
beb0: 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c N protocols fail
bec0: 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 ed: ", GET_ERR_R
bed0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
bee0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 ) NULL);.. Tc
bef0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
bf00: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
bf10: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 MPORT", "ALPN",
bf20: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
bf30: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
bf40: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
bf50: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
bf60: 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b ckfree(protos);
bf70: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
bf80: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 _ERROR;..}.../*
bf90: 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 Store protocols
bfa0: 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 list */..statePt
bfb0: 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 r->protos = prot
bfc0: 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 os;..statePtr->p
bfd0: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 rotos_len = prot
bfe0: 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c os_len;. } el
bff0: 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e se {..statePtr->
c000: 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 protos = NULL;..
c010: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
c020: 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a _len = 0;. }.
c030: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 . /*. * S
c040: 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 SL Callbacks.
c050: 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 */. SSL_set
c060: 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 _app_data(stateP
c070: 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a tr->ssl, (void *
c080: 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 )statePtr);./* p
c090: 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 oint back to us
c0a0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 */. SSL_set_v
c0b0: 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e erify(statePtr->
c0c0: 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 ssl, verify, Ver
c0d0: 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 ifyCallback);.
c0e0: 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 SSL_set_info_c
c0f0: 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 allback(statePtr
c100: 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 ->ssl, InfoCallb
c110: 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 ack);.. /* Ca
c120: 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 llback for obser
c130: 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 ving protocol me
c140: 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 ssages */.#ifnde
c150: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c f OPENSSL_NO_SSL
c160: 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f _TRACE. /* vo
c170: 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d id SSL_CTX_set_m
c180: 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 sg_callback_arg(
c190: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 statePtr->ctx, (
c1a0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
c1b0: 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 ;. void SSL_C
c1c0: 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 TX_set_msg_callb
c1d0: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ack(statePtr->ct
c1e0: 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 x, MessageCallba
c1f0: 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f ck); */. SSL_
c200: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b set_msg_callback
c210: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 73 _arg(statePtr->s
c220: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 sl, (void *)stat
c230: 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 ePtr);. SSL_s
c240: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 et_msg_callback(
c250: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d statePtr->ssl, M
c260: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b essageCallback);
c270: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 .#endif.. /*
c280: 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e Create Tcl_Chann
c290: 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a el BIO Handler *
c2a0: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e /. statePtr->
c2b0: 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f p_bio.= BIO_new_
c2c0: 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 tcl(statePtr, BI
c2d0: 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 O_NOCLOSE);.
c2e0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 statePtr->bio.=
c2f0: 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 BIO_new(BIO_f_ss
c300: 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 l());.. if (s
c310: 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 erver) {../* Ser
c320: 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f ver callbacks */
c330: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c ..SSL_CTX_set_tl
c340: 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f sext_servername_
c350: 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 arg(statePtr->ct
c360: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 x, (void *)state
c370: 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 Ptr);..SSL_CTX_s
c380: 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 et_tlsext_server
c390: 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 name_callback(st
c3a0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 atePtr->ctx, SNI
c3b0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f Callback);..SSL_
c3c0: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 CTX_set_client_h
c3d0: 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72 ello_cb(statePtr
c3e0: 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c ->ctx, HelloCall
c3f0: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 back, (void *)st
c400: 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74 atePtr);..if (st
c410: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 atePtr->protos !
c420: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 = NULL) {.. S
c430: 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f SL_CTX_set_alpn_
c440: 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 select_cb(stateP
c450: 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c tr->ctx, ALPNCal
c460: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 lback, (void *)s
c470: 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66 tatePtr);.#ifdef
c480: 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 USE_NPN.. if
c490: 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 (tls1_2 == 0 &&
c4a0: 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a tls1_3 == 0) {.
c4b0: 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 ..SSL_CTX_set_ne
c4c0: 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 xt_protos_advert
c4d0: 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74 72 ised_cb(statePtr
c4e0: 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 ->ctx, NPNCallba
c4f0: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 ck, (void *)stat
c500: 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 ePtr);.. }.#e
c510: 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 ndif..}.../* Ena
c520: 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73 65 ble server to se
c530: 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74 20 nd cert request
c540: 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20 after handshake
c550: 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a (TLS 1.3 only) *
c560: 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 /../* A write op
c570: 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b eration must tak
c580: 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65 20 e place for the
c590: 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71 75 Certificate Requ
c5a0: 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73 65 est to be.. se
c5b0: 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 nt to the client
c5c0: 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64 6f , this can be do
c5d0: 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 ne with SSL_do_h
c5e0: 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 andshake(). */..
c5f0: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 if (request && p
c600: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 ost_handshake &&
c610: 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 tls1_3) {..
c620: 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e SSL_verify_clien
c630: 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 t_post_handshake
c640: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
c650: 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74 ..}.../* set aut
c660: 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65 6c omatic curve sel
c670: 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 ection */..SSL_s
c680: 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 61 et_ecdh_auto(sta
c690: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a tePtr->ssl, 1);.
c6a0: 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20 ../* Set server
c6b0: 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 mode */..statePt
c6c0: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f r->flags |= TLS_
c6d0: 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c TCL_SERVER;..SSL
c6e0: 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 _set_accept_stat
c6f0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
c700: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
c710: 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 /* Client callba
c720: 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 cks */.#ifdef US
c730: 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65 E_NPN..if (state
c740: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e Ptr->protos != N
c750: 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d ULL && tls1_2 ==
c760: 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 0 && tls1_3 ==
c770: 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 0) {.. SSL_CT
c780: 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f X_set_next_proto
c790: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 _select_cb(state
c7a0: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 Ptr->ctx, ALPNCa
c7b0: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 llback, (void *)
c7c0: 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 statePtr);..}.#e
c7d0: 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f ndif.../* Sessio
c7e0: 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 n caching */..SS
c7f0: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f L_CTX_set_sessio
c800: 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 n_cache_mode(sta
c810: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f tePtr->ctx, SSL_
c820: 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e SESS_CACHE_CLIEN
c830: 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 T | SSL_SESS_CAC
c840: 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 HE_NO_INTERNAL_S
c850: 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f TORE);..SSL_CTX_
c860: 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 sess_set_new_cb(
c870: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 statePtr->ctx, S
c880: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b essionCallback);
c890: 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 .../* Enable pos
c8a0: 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 t handshake Auth
c8b0: 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e entication exten
c8c0: 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e sion. TLS 1.3 on
c8d0: 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 ly, not http/2.
c8e0: 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 */..if (request
c8f0: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b && post_handshak
c900: 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 e) {.. SSL_se
c910: 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 t_post_handshake
c920: 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e _auth(statePtr->
c930: 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a ssl, 1);..}.../*
c940: 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 Set client mode
c950: 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e */..SSL_set_con
c960: 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 nect_state(state
c970: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
c980: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f . SSL_set_bio
c990: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
c9a0: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c statePtr->p_bio,
c9b0: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f statePtr->p_bio
c9c0: 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 );. BIO_set_s
c9d0: 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f sl(statePtr->bio
c9e0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c , statePtr->ssl,
c9f0: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a BIO_NOCLOSE);..
ca00: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e /*. * En
ca10: 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 d of SSL Init.
ca20: 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 */. dprint
ca30: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 f("Returning %s"
ca40: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
ca50: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
ca60: 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 elf));. Tcl_S
ca70: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
ca80: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 (char *) Tcl_Ge
ca90: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
caa0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 tePtr->self), TC
cab0: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 L_VOLATILE);..
cac0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
cad0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cb00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
cb20: 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 . * UnimportObjC
cb30: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 md --. *. *.This
cb40: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e procedure is in
cb50: 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 voked to remove
cb60: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
cb70: 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 nel filter.. *.
cb80: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
cb90: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
cba0: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
cbb0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 effects:. *.May
cbc0: 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 modify the behav
cbd0: 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 ior of an IO cha
cbe0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nnel.. *. *-----
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 2d 2d 2d 2d 2d 2d 2d ----------------
cc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
cc30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e */.static int.Un
cc40: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 importObjCmd(Cli
cc50: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
cc60: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
cc70: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
cc80: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
cc90: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
cca0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
ccb0: 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c ../* The channel
ccc0: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f to set a mode o
ccd0: 6e 2e 20 2a 2f 0a 20 20 20 20 28 76 6f 69 64 29 n. */. (void)
cce0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 clientData;..
ccf0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
cd00: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
cd10: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f jc != 2) {..Tcl_
cd20: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
cd30: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
cd40: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 hannel");..retur
cd50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
cd60: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
cd70: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
cd80: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
cd90: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 ing(objv[1]), NU
cda0: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 LL);. if (cha
cdb0: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
cdc0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
cdd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
cde0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
cdf0: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
ce00: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
ce10: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
ce20: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
ce30: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a Channel(chan);..
ce40: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
ce50: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
ce60: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
ce70: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ype()) {..Tcl_Ap
ce80: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
ce90: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
cea0: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
ceb0: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
cec0: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 ."\": not a TLS
ced0: 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 channel", (char
cee0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
cef0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
cf00: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
cf10: 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e UNIMPORT", "CHAN
cf20: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c NEL", "INVALID",
cf30: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
cf40: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
cf50: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
cf60: 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 f (Tcl_UnstackCh
cf70: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 annel(interp, ch
cf80: 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 an) == TCL_ERROR
cf90: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
cfa0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
cfb0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
cfc0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
d010: 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 . * CTX_Init --
d020: 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f construct a SSL_
d030: 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a CTX instance. *.
d040: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
d050: 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 valid SSL_CTX i
d060: 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e nstance or NULL.
d070: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
d080: 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 cts:. *.construc
d090: 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 ts SSL context (
d0a0: 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d CTX). *. *------
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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
d0f0: 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 /.static SSL_CTX
d100: 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 *.CTX_Init(Stat
d110: 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 e *statePtr, int
d120: 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 isServer, int p
d130: 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 roto, char *keyf
d140: 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66 ile, char *certf
d150: 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 ile,. unsigne
d160: 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 d char *key, uns
d170: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 igned char *cert
d180: 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 , int key_len, i
d190: 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 nt cert_len, cha
d1a0: 72 20 2a 43 41 70 61 74 68 2c 0a 20 20 20 20 63 r *CApath,. c
d1b0: 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 har *CAfile, cha
d1c0: 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 r *ciphers, char
d1d0: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 *ciphersuites,
d1e0: 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 int level, char
d1f0: 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 *DHparams) {.
d200: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
d210: 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e erp = statePtr->
d220: 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f interp;. SSL_
d230: 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b CTX *ctx = NULL;
d240: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d250: 20 64 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 ds;. int off
d260: 20 3d 20 30 2c 20 61 62 6f 72 74 20 3d 20 30 3b = 0, abort = 0;
d270: 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 . int load_pr
d280: 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 ivate_key;. c
d290: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 onst SSL_METHOD
d2a0: 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 *method;.. dp
d2b0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
d2c0: 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f .. if (!proto
d2d0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
d2e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e esult(interp, "n
d2f0: 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c o valid protocol
d300: 20 73 65 6c 65 63 74 65 64 22 2c 20 28 63 68 61 selected", (cha
d310: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
d320: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
d330: 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 . /* create S
d340: 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 SL context */.#i
d350: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
d360: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 N_NUMBER >= 0x10
d370: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 100000L || defin
d380: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 ed(NO_SSL2) || d
d390: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
d3a0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 O_SSL2). if (
d3b0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
d3c0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 LS_PROTO_SSL2))
d3d0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
d3e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c ult(interp, "SSL
d3f0: 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 2 protocol not s
d400: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
d410: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
d420: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
d430: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
d440: 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 d(NO_SSL3) || de
d450: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d460: 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 _SSL3). if (E
d470: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
d480: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b S_PROTO_SSL3)) {
d490: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
d4a0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 lt(interp, "SSL3
d4b0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
d4c0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
d4d0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
d4e0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
d4f0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
d500: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 (NO_TLS1) || def
d510: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d520: 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e TLS1). if (EN
d530: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
d540: 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a _PROTO_TLS1)) {.
d550: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
d560: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
d570: 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .0 protocol not
d580: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
d590: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
d5a0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
d5b0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
d5c0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c ed(NO_TLS1_1) ||
d5d0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
d5e0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 _NO_TLS1_1).
d5f0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
d600: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
d610: 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 1_1)) {..Tcl_App
d620: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
d630: 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f , "TLS 1.1 proto
d640: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
d650: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
d660: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
d670: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ;. }.#endif.#
d680: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
d690: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_2) || defined
d6a0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d6b0: 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 _2). if (ENAB
d6c0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
d6d0: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a ROTO_TLS1_2)) {.
d6e0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
d6f0: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
d700: 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .2 protocol not
d710: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
d720: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
d730: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
d740: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
d750: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c ed(NO_TLS1_3) ||
d760: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
d770: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
d780: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
d790: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
d7a0: 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 1_3)) {..Tcl_App
d7b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
d7c0: 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f , "TLS 1.3 proto
d7d0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
d7e0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
d7f0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
d800: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 ;. }.#endif.
d810: 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 if (proto ==
d820: 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 0) {../* Use ful
d830: 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f l range */..SSL_
d840: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 CTX_set_min_prot
d850: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 o_version(ctx, 0
d860: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f );..SSL_CTX_set_
d870: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f max_proto_versio
d880: 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d n(ctx, 0);. }
d890: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72 .. switch (pr
d8a0: 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 oto) {.#if OPENS
d8b0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
d8c0: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 R < 0x10100000L
d8d0: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 && !defined(NO_S
d8e0: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL2) && !defined
d8f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
d900: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
d910: 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 ROTO_SSL2:..meth
d920: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
d930: 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 SSLv2_server_met
d940: 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c hod() : SSLv2_cl
d950: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
d960: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
d970: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 f !defined(NO_SS
d980: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
d990: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
d9a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
d9b0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 NSSL_NO_SSL3_MET
d9c0: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c HOD). case TL
d9d0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d S_PROTO_SSL3:..m
d9e0: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
d9f0: 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f ? SSLv3_server_
da00: 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 method() : SSLv3
da10: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
da20: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
da30: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
da40: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e _TLS1) && !defin
da50: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
da60: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
da70: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
da80: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 METHOD). case
da90: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a TLS_PROTO_TLS1:
daa0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
dab0: 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 ver ? TLSv1_serv
dac0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c er_method() : TL
dad0: 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f Sv1_client_metho
dae0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
daf0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
db00: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 (NO_TLS1_1) && !
db10: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
db20: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 NO_TLS1_1) && !d
db30: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
db40: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 O_TLS1_1_METHOD)
db50: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
db60: 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 OTO_TLS1_1:..met
db70: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
db80: 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f TLSv1_1_server_
db90: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 method() : TLSv1
dba0: 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 _1_client_method
dbb0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
dbc0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
dbd0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 NO_TLS1_2) && !d
dbe0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
dbf0: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
dc00: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
dc10: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a _TLS1_2_METHOD).
dc20: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
dc30: 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 TO_TLS1_2:..meth
dc40: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
dc50: 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d TLSv1_2_server_m
dc60: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f ethod() : TLSv1_
dc70: 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 2_client_method(
dc80: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
dc90: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
dca0: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 O_TLS1_3) && !de
dcb0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
dcc0: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 _TLS1_3). cas
dcd0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
dce0: 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 _3:../* Use the
dcf0: 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 generic method a
dd00: 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 nd constraint ra
dd10: 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 nge after contex
dd20: 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a t is created */.
dd30: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
dd40: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f er ? TLS_server_
dd50: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 method() : TLS_c
dd60: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
dd70: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 .break;.#endif.
dd80: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 default:../*
dd90: 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 Negotiate highes
dda0: 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f t available SSL/
ddb0: 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 TLS version */..
ddc0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
ddd0: 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d r ? TLS_server_m
dde0: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c ethod() : TLS_cl
ddf0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 ient_method();.#
de00: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
de10: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
de20: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 100000L && !defi
de30: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 ned(NO_SSL2) &&
de40: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
de50: 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c _NO_SSL2)..off |
de60: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
de70: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 , TLS_PROTO_SSL2
de80: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 ) ? 0 : SSL_OP
de90: 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 _NO_SSLv2);.#end
dea0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
deb0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
dec0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
ded0: 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 SSL3)..off |= (E
dee0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
def0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 S_PROTO_SSL3)
df00: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
df10: 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 SSLv3);.#endif.#
df20: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
df30: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
df40: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
df50: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
df60: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
df70: 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 OTO_TLS1) ? 0
df80: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
df90: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 1);.#endif.#if !
dfa0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
dfb0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
dfc0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
dfd0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
dfe0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
dff0: 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 OTO_TLS1_1) ? 0
e000: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
e010: 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 1_1);.#endif.#if
e020: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
e030: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
e040: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
e050: 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 _2)..off |= (ENA
e060: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
e070: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 PROTO_TLS1_2) ?
e080: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 0 : SSL_OP_NO_TL
e090: 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 Sv1_2);.#endif.#
e0a0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
e0b0: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
e0c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
e0d0: 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 S1_3)..off |= (E
e0e0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
e0f0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 S_PROTO_TLS1_3)
e100: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
e110: 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 TLSv1_3);.#endif
e120: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a ..break;. }..
e130: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
e140: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 ror();.. ctx
e150: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 = SSL_CTX_new(me
e160: 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21 thod);. if (!
e170: 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e ctx) {..return N
e180: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
e190: 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 if (getenv(SSLKE
e1a0: 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 YLOGFILE)) {..SS
e1b0: 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 L_CTX_set_keylog
e1c0: 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b _callback(ctx, K
e1d0: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a eyLogCallback);.
e1e0: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 }..#if !defi
e1f0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 ned(NO_TLS1_3) &
e200: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
e210: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
e220: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 if (proto == T
e230: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
e240: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {..SSL_CTX_set_
e250: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f min_proto_versio
e260: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
e270: 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 RSION);..SSL_CTX
e280: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 _set_max_proto_v
e290: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
e2a0: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 _3_VERSION);.
e2b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f }.#endif.. /
e2c0: 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 * Force cipher s
e2d0: 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 election order b
e2e0: 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 y server */.
e2f0: 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b if (!isServer) {
e300: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 ..SSL_CTX_set_op
e310: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f tions(ctx, SSL_O
e320: 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f P_CIPHER_SERVER_
e330: 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 PREFERENCE);.
e340: 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f }..#if OPENSSL_
e350: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
e360: 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 0x10100000L.
e370: 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c OpenSSL_add_all
e380: 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f _algorithms(); /
e390: 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61 * Load ciphers a
e3a0: 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 nd digests */.#e
e3b0: 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 ndif.. SSL_CT
e3c0: 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 X_set_app_data(c
e3d0: 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 tx, (void*)inter
e3e0: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 p);./* remember
e3f0: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 the interpreter
e400: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
e410: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
e420: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 SSL_OP_ALL);./*
e430: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b all SSL bug work
e440: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 arounds */. S
e450: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
e460: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e ns(ctx, SSL_OP_N
e470: 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 O_COMPRESSION);.
e480: 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 /* disable compr
e490: 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 ession even if s
e4a0: 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 upported */.
e4b0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
e4c0: 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 ons(ctx, off);..
e4d0: 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f /* disable proto
e4e0: 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a col versions */.
e4f0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
e500: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
e510: 30 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 0101000L. SSL
e520: 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 _CTX_set_mode(ct
e530: 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f x, SSL_MODE_AUTO
e540: 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 _RETRY);./* hand
e550: 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 le new handshake
e560: 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e s in background.
e570: 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69 On by default i
e580: 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e n OpenSSL 1.1.1.
e590: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 */.#endif. S
e5a0: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f SL_CTX_sess_set_
e5b0: 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 cache_size(ctx,
e5c0: 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 128);.. /* Se
e5d0: 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 t user defined c
e5e0: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 iphers, cipher s
e5f0: 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 uites, and secur
e600: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 ity level */.
e610: 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d if ((ciphers !=
e620: 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 NULL) && !SSL_C
e630: 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 TX_set_cipher_li
e640: 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 st(ctx, ciphers)
e650: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
e660: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
e670: 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 et ciphers faile
e680: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 d: No valid ciph
e690: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ers", (char *) N
e6a0: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
e6b0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
e6c0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 n NULL;. }.
e6d0: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 75 69 if ((ciphersui
e6e0: 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 tes != NULL) &&
e6f0: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 !SSL_CTX_set_cip
e700: 68 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 hersuites(ctx, c
e710: 69 70 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a iphersuites)) {.
e720: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
e730: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 t(interp, "Set c
e740: 69 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69 ipher suites fai
e750: 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 led: No valid ci
e760: 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 phers", (char *)
e770: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
e780: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
e790: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
e7a0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 . /* Set secu
e7b0: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 rity level */.
e7c0: 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 if (level > -1
e7d0: 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b && level < 6) {
e7e0: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 ../* SSL_set_sec
e7f0: 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 urity_level */..
e800: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 SSL_CTX_set_secu
e810: 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 rity_level(ctx,
e820: 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 level);. }..
e830: 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 /* set some c
e840: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 allbacks */.
e850: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 SSL_CTX_set_defa
e860: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 ult_passwd_cb(ct
e870: 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 x, PasswordCallb
e880: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 ack);. SSL_CT
e890: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 X_set_default_pa
e8a0: 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 sswd_cb_userdata
e8b0: 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 (ctx, (void *)st
e8c0: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a atePtr);.. /*
e8d0: 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 read a Diffie-H
e8e0: 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 ellman parameter
e8f0: 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 s file, or use t
e900: 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 he built-in one
e910: 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 */.#ifdef OPENSS
e920: 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 L_NO_DH. if (
e930: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c DHparams != NULL
e940: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
e950: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 esult(interp, "D
e960: 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 H parameter supp
e970: 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c ort not availabl
e980: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c e", (char *) NUL
e990: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
e9a0: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
e9b0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 NULL;. }.#els
e9c0: 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b e. {..DH* dh;
e9d0: 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 ..if (DHparams !
e9e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 = NULL) {.. B
e9f0: 49 4f 20 2a 62 69 6f 3b 0a 0a 09 20 20 20 20 54 IO *bio;... T
ea00: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
ea10: 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 ds);.. bio =
ea20: 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e BIO_new_file(F2N
ea30: 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c (DHparams, &ds),
ea40: 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 "r");.. if (
ea50: 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 !bio) {...Tcl_DS
ea60: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
ea70: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
ea80: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c lt(interp, "Coul
ea90: 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 d not find DH pa
eaa0: 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 rameters file",
eab0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
eac0: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
ead0: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
eae0: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 LL;.. }...
eaf0: 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 dh = PEM_read_b
eb00: 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c io_DHparams(bio,
eb10: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c NULL, NULL, NUL
eb20: 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 L);.. BIO_fre
eb30: 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c e(bio);.. Tcl
eb40: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
eb50: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 );.. if (!dh)
eb60: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 {...Tcl_AppendR
eb70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 esult(interp, "C
eb80: 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 ould not read DH
eb90: 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d parameters from
eba0: 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 file", (char *)
ebb0: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 NULL);...SSL_CT
ebc0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
ebd0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 eturn NULL;..
ebe0: 20 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f }.. SSL_CTX_
ebf0: 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 set_tmp_dh(ctx,
ec00: 64 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 dh);.. DH_fre
ec10: 65 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 e(dh);...} else
ec20: 7b 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65 {.. /* Use we
ec30: 6c 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 ll known DH para
ec40: 6d 65 74 65 72 73 20 74 68 61 74 20 68 61 76 65 meters that have
ec50: 20 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 built-in suppor
ec60: 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a t in OpenSSL */.
ec70: 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 . if (!SSL_CT
ec80: 58 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 X_set_dh_auto(ct
ec90: 78 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 x, 1)) {...Tcl_A
eca0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
ecb0: 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 rp, "Could not e
ecc0: 6e 61 62 6c 65 20 73 65 74 20 44 48 20 61 75 74 nable set DH aut
ecd0: 6f 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 o: ", GET_ERR_RE
ece0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
ecf0: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 NULL);...SSL_CT
ed00: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
ed10: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 eturn NULL;..
ed20: 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 }..}. }.#end
ed30: 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f if.. /* set o
ed40: 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a ur certificate *
ed50: 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 /. load_priva
ed60: 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 te_key = 0;.
ed70: 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 if (certfile !=
ed80: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 NULL) {..load_pr
ed90: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a ivate_key = 1;..
eda0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 .Tcl_DStringInit
edb0: 28 26 64 73 29 3b 0a 09 69 66 20 28 53 53 4c 5f (&ds);..if (SSL_
edc0: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
edd0: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 ate_file(ctx, F2
ede0: 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 N(certfile, &ds)
edf0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 , SSL_FILETYPE_P
ee00: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 EM) <= 0) {..
ee10: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
ee20: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f (&ds);.. Tcl_
ee30: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
ee40: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
ee50: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 set certificate
ee60: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 file ", certfile
ee70: 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 , ": ",...GET_ER
ee80: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
ee90: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
eea0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
eeb0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
eec0: 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 NULL;..}..Tcl_DS
eed0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
eee0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
eef0: 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a cert != NULL) {.
ef00: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 .load_private_ke
ef10: 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f y = 1;..if (SSL_
ef20: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
ef30: 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 65 ate_ASN1(ctx, ce
ef40: 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d rt_len, cert) <=
ef50: 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 0) {.. Tcl_A
ef60: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
ef70: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
ef80: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 et certificate:
ef90: 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 ",...GET_ERR_REA
efa0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
efb0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
efc0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
efd0: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b return NULL;
efe0: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b ..}. } else {
eff0: 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 ..certfile = (ch
f000: 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 ar*)X509_get_def
f010: 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 ault_cert_file()
f020: 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f ;...if (SSL_CTX_
f030: 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f use_certificate_
f040: 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 file(ctx, certfi
f050: 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 le, SSL_FILETYPE
f060: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 _PEM) <= 0) {.#i
f070: 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 f 0.. Tcl_App
f080: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
f090: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 , "unable to use
f0a0: 20 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 default certifi
f0b0: 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 cate file ", cer
f0c0: 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 tfile, ": ",...G
f0d0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
f0e0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
f0f0: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 .. SSL_CTX_fr
f100: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 ee(ctx);.. re
f110: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 turn NULL;.#endi
f120: 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 f..}. }..
f130: 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76 61 /* set our priva
f140: 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 te key */. if
f150: 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b (load_private_k
f160: 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 ey) {..if (keyfi
f170: 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 le == NULL && ke
f180: 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 y == NULL) {..
f190: 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 keyfile = cert
f1a0: 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b file;..}...if (k
f1b0: 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 eyfile != NULL)
f1c0: 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68 {.. /* get th
f1d0: 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 e private key as
f1e0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 sociated with th
f1f0: 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20 2a is certificate *
f200: 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66 69 /.. if (keyfi
f210: 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 le == NULL) {...
f220: 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 keyfile = certfi
f230: 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 le;.. }...
f240: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
f250: 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 (&ds);.. if (
f260: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 SSL_CTX_use_Priv
f270: 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c ateKey_file(ctx,
f280: 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 F2N(keyfile, &d
f290: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 s), SSL_FILETYPE
f2a0: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 _PEM) <= 0) {...
f2b0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
f2c0: 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 &ds);.../* flush
f2d0: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 the passphrase
f2e0: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c which might be l
f2f0: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c eft in the resul
f300: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 t */...Tcl_SetRe
f310: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c sult(interp, NUL
f320: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a L, TCL_STATIC);.
f330: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
f340: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 lt(interp, "unab
f350: 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 le to set public
f360: 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 key file ", key
f370: 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 20 20 20 file, " ",...
f380: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 GET_ERR_REASON(
f390: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
f3a0: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 );...SSL_CTX_fre
f3b0: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e e(ctx);...return
f3c0: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 NULL;.. }..
f3d0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
f3e0: 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 ee(&ds);...} els
f3f0: 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c e if (key != NUL
f400: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 L) {.. if (SS
f410: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 L_CTX_use_Privat
f420: 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b eKey_ASN1(EVP_PK
f430: 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 EY_RSA, ctx, key
f440: 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 ,key_len) <= 0)
f450: 7b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 {.../* flush the
f460: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 passphrase whic
f470: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 h might be left
f480: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f in the result */
f490: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
f4a0: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 (interp, NULL, T
f4b0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 CL_STATIC);...Tc
f4c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
f4d0: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
f4e0: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 o set public key
f4f0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
f500: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
f510: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
f520: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 _free(ctx);...re
f530: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
f540: 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 }..}../* Now we
f550: 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 know that a key
f560: 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 and cert have be
f570: 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 en set against..
f580: 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 * the SSL conte
f590: 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f xt */..if (!SSL_
f5a0: 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 CTX_check_privat
f5b0: 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 e_key(ctx)) {..
f5c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
f5d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 ult(interp, "pri
f5e0: 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f vate key does no
f5f0: 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 t match the cert
f600: 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b ificate public k
f610: 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 ey",.... (ch
f620: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
f630: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
f640: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tx);.. return
f650: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a NULL;..}. }.
f660: 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 . /* Set to u
f670: 73 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 se default locat
f680: 69 6f 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 ion and file for
f690: 20 43 65 72 74 69 66 69 63 61 74 65 20 41 75 74 Certificate Aut
f6a0: 68 6f 72 69 74 79 20 28 43 41 29 20 63 65 72 74 hority (CA) cert
f6b0: 69 66 69 63 61 74 65 73 2e 20 54 68 65 0a 20 20 ificates. The.
f6c0: 20 20 20 2a 20 76 65 72 69 66 79 20 70 61 74 68 * verify path
f6d0: 20 61 6e 64 20 73 74 6f 72 65 20 63 61 6e 20 62 and store can b
f6e0: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 e overridden by
f6f0: 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 the SSL_CERT_DIR
f700: 20 65 6e 76 20 76 61 72 2e 20 54 68 65 20 76 65 env var. The ve
f710: 72 69 66 79 20 66 69 6c 65 20 63 61 6e 0a 20 20 rify file can.
f720: 20 20 20 2a 20 62 65 20 6f 76 65 72 72 69 64 64 * be overridd
f730: 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 en by the SSL_CE
f740: 52 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e RT_FILE env var.
f750: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c */. if (!SSL
f760: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 _CTX_set_default
f770: 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 _verify_paths(ct
f780: 78 29 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a x)) {..abort++;.
f790: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 }.. /* Ov
f7a0: 65 72 72 69 64 65 73 20 66 6f 72 20 74 68 65 20 errides for the
f7b0: 43 41 20 76 65 72 69 66 79 20 70 61 74 68 20 61 CA verify path a
f7c0: 6e 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b nd file */. {
f7d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
f7e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
f7f0: 33 30 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43 30000000L..if (C
f800: 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c Apath != NULL ||
f810: 20 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 CAfile != NULL)
f820: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 {.. Tcl_DStr
f830: 69 6e 67 20 64 73 31 3b 0a 09 20 20 20 20 54 63 ing ds1;.. Tc
f840: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 l_DStringInit(&d
f850: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 s);.. Tcl_DSt
f860: 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a ringInit(&ds1);.
f870: 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 .. if (!SSL_C
f880: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c TX_load_verify_l
f890: 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 ocations(ctx, F2
f8a0: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 N(CAfile, &ds),
f8b0: 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73 31 F2N(CApath, &ds1
f8c0: 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b ))) {...abort++;
f8d0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c .. }.. Tcl
f8e0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
f8f0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 );.. Tcl_DStr
f900: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 0a ingFree(&ds1);..
f910: 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 . /* Set list
f920: 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20 of CAs to send
f930: 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 to client when r
f940: 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65 equesting a clie
f950: 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a nt certificate *
f960: 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74 70 73 3a /.. /* https:
f970: 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 //sourceforge.ne
f980: 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f t/p/tls/bugs/57/
f990: 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 58 58 3a */.. /* XXX:
f9a0: 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 TODO: Let the us
f9b0: 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 er supply values
f9c0: 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 here instead of
f9d0: 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 something that
f9e0: 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 exists on the fi
f9f0: 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09 20 20 20 lesystem */..
fa00: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
fa10: 28 26 64 73 29 3b 0a 09 20 20 20 20 53 54 41 43 (&ds);.. STAC
fa20: 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 K_OF(X509_NAME)
fa30: 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c *certNames = SSL
fa40: 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f _load_client_CA_
fa50: 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c file(F2N(CAfile,
fa60: 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 &ds));.. if
fa70: 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 (certNames != NU
fa80: 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f LL) {...SSL_CTX_
fa90: 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 set_client_CA_li
faa0: 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 st(ctx, certName
fab0: 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 s);.. }..
fac0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
fad0: 26 64 73 29 3b 0a 09 7d 0a 0a 23 65 6c 73 65 0a &ds);..}..#else.
fae0: 09 69 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e .if (CApath != N
faf0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f ULL) {.. Tcl_
fb00: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 DStringInit(&ds)
fb10: 3b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f ;.. if (!SSL_
fb20: 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f CTX_load_verify_
fb30: 64 69 72 28 63 74 78 2c 20 46 32 4e 28 43 41 70 dir(ctx, F2N(CAp
fb40: 61 74 68 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 ath, &ds))) {...
fb50: 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a abort++;.. }.
fb60: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
fb70: 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 09 69 Free(&ds);..}..i
fb80: 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c f (CAfile != NUL
fb90: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 L) {.. Tcl_DS
fba0: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a tringInit(&ds);.
fbb0: 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 . if (!SSL_CT
fbc0: 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 69 X_load_verify_fi
fbd0: 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 le(ctx, F2N(CAfi
fbe0: 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 le, &ds))) {...a
fbf0: 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 bort++;.. }..
fc00: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
fc10: 72 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 20 20 ree(&ds);...
fc20: 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 /* Set list of C
fc30: 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c As to send to cl
fc40: 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 ient when reques
fc50: 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 ting a client ce
fc60: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 rtificate */..
fc70: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
fc80: 74 28 26 64 73 29 3b 0a 09 20 20 20 20 53 54 41 t(&ds);.. STA
fc90: 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 CK_OF(X509_NAME)
fca0: 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 *certNames = SS
fcb0: 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 L_load_client_CA
fcc0: 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 _file(F2N(CAfile
fcd0: 2c 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69 66 , &ds));.. if
fce0: 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e (certNames != N
fcf0: 55 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 ULL) {...SSL_CTX
fd00: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c _set_client_CA_l
fd10: 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d ist(ctx, certNam
fd20: 65 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 es);.. }..
fd30: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
fd40: 28 26 64 73 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 (&ds);..}.#endif
fd50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 . }.. retu
fd60: 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 rn ctx;.}.../*.
fd70: 2a 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 2d ----------------
fd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fdb0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 ----. *. * Statu
fdc0: 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 sObjCmd -- retur
fdd0: 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f n certificate fo
fde0: 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 r connected peer
fdf0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
fe00: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
fe10: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
fe20: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
fe30: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
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 2d 2d 2d 2d 2d ----------------
fe60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe80: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
fe90: 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 StatusObjCmd(Cli
fea0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
feb0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
fec0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
fed0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
fee0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 objv[]) {. S
fef0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a tate *statePtr;.
ff00: 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a X509 *peer;.
ff10: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
ff20: 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 Ptr;. Tcl_Cha
ff30: 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 nnel chan;. c
ff40: 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 har *channelName
ff50: 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 , *ciphers;.
ff60: 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f int mode;. co
ff70: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
ff80: 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e r *proto;. un
ff90: 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a signed int len;.
ffa0: 20 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 int nid, res
ffb0: 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 ;. (void) cli
ffc0: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 entData;.. dp
ffd0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
ffe0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c .. if (objc <
fff0: 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 2 || objc > 3 |
10000 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 | (objc == 3 &&
10010 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 !strcmp(Tcl_GetS
10020 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 tring(objv[1]),
10030 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 "-local"))) {..T
10040 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
10050 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
10060 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e "?-local? chann
10070 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 el");..return TC
10080 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
10090 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e /* Get chann
100a0 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 el Id */. cha
100b0 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 nnelName = Tcl_G
100c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 28 6f etString(objv[(o
100d0 62 6a 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 bjc == 2 ? 1 : 2
100e0 29 5d 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 )]);. chan =
100f0 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
10100 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 nterp, channelNa
10110 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 me, &mode);.
10120 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
10130 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
10140 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
10150 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
10160 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
10170 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
10180 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
10190 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
101a0 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
101b0 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 han);. if (Tc
101c0 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
101d0 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
101e0 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
101f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
10200 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
10210 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
10220 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
10230 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 an),..."\": not
10240 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 a TLS channel",
10250 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
10260 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
10270 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
10280 20 22 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e "STATUS", "CHAN
10290 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c NEL", "INVALID",
102a0 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
102b0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
102c0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 OR;. }. st
102d0 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
102e0 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *) Tcl_GetChanne
102f0 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
10300 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 an);.. /* Get
10310 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 certificate for
10320 20 70 65 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f peer or self */
10330 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d . if (objc ==
10340 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 2) {..peer = SS
10350 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 L_get_peer_certi
10360 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d ficate(statePtr-
10370 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 >ssl);. } els
10380 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f e {..peer = SSL_
10390 67 65 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 get_certificate(
103a0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
103b0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74 }. /* Get
103c0 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 X509 certificat
103d0 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 e info */. if
103e0 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 (peer) {..objPt
103f0 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f r = Tls_NewX509O
10400 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 bj(interp, peer)
10410 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 ;..if (objc == 2
10420 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 72 ) {.. X509_fr
10430 65 65 28 70 65 65 72 29 3b 0a 09 20 20 20 20 70 ee(peer);.. p
10440 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 eer = NULL;..}.
10450 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a } else {..obj
10460 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
10470 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 tObj(0, NULL);.
10480 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 }.. /* Pee
10490 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 r name */. LA
104a0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
104b0 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65 65 72 6e , objPtr, "peern
104c0 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f 70 ame", SSL_get0_p
104d0 65 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 eername(statePtr
104e0 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 ->ssl), -1);.
104f0 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 LAPPEND_INT(int
10500 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 62 erp, objPtr, "sb
10510 69 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63 69 its", SSL_get_ci
10520 70 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 pher_bits(stateP
10530 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b tr->ssl, NULL));
10540 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 .. ciphers =
10550 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 (char*)SSL_get_c
10560 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e ipher(statePtr->
10570 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e ssl);. LAPPEN
10580 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
10590 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 jPtr, "cipher",
105a0 63 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 ciphers, -1);..
105b0 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 /* Verify the
105c0 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 X509 certificat
105d0 65 20 70 72 65 73 65 6e 74 65 64 20 62 79 20 74 e presented by t
105e0 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 4c he peer */. L
105f0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
10600 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 p, objPtr, "veri
10610 66 79 52 65 73 75 6c 74 22 2c 0a 09 58 35 30 39 fyResult",..X509
10620 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 _verify_cert_err
10630 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 or_string(SSL_ge
10640 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 t_verify_result(
10650 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c statePtr->ssl)),
10660 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 -1);.. /* Ve
10670 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 rify mode */.
10680 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74 5f mode = SSL_get_
10690 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61 74 verify_mode(stat
106a0 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
106b0 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f if (mode && SSL_
106c0 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 VERIFY_NONE) {..
106d0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
106e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 rp, objPtr, "ver
106f0 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 ifyMode", "none"
10700 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73 , -1);. } els
10710 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 e {..Tcl_Obj *li
10720 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e stObjPtr = Tcl_N
10730 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
10740 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 L);..if (mode &&
10750 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 SSL_VERIFY_PEER
10760 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
10770 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
10780 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 t(interp, listOb
10790 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
107a0 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d ingObj("peer", -
107b0 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 1));..}..if (mod
107c0 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f e && SSL_VERIFY_
107d0 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f FAIL_IF_NO_PEER_
107e0 43 45 52 54 29 20 7b 0a 09 20 20 20 20 54 63 6c CERT) {.. Tcl
107f0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
10800 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 ement(interp, li
10810 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 stObjPtr, Tcl_Ne
10820 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c wStringObj("fail
10830 20 69 66 20 6e 6f 20 70 65 65 72 20 63 65 72 74 if no peer cert
10840 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 ", -1));..}..if
10850 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 (mode && SSL_VER
10860 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 IFY_CLIENT_ONCE)
10870 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
10880 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
10890 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a (interp, listObj
108a0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
108b0 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e ngObj("client on
108c0 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 ce", -1));..}..i
108d0 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 f (mode && SSL_V
108e0 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 ERIFY_POST_HANDS
108f0 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 54 63 6c HAKE) {.. Tcl
10900 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
10910 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 ement(interp, li
10920 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 stObjPtr, Tcl_Ne
10930 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73 74 wStringObj("post
10940 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29 handshake", -1)
10950 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f );..}..LAPPEND_O
10960 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 BJ(interp, objPt
10970 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c r, "verifyMode",
10980 20 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20 20 20 listObjPtr).
10990 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 }.. /* Verif
109a0 79 20 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f 0a y mode depth */.
109b0 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 LAPPEND_INT(
109c0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
109d0 22 76 65 72 69 66 79 44 65 70 74 68 22 2c 20 53 "verifyDepth", S
109e0 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65 SL_get_verify_de
109f0 70 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 pth(statePtr->ss
10a00 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 l));.. /* Rep
10a10 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 ort the selected
10a20 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 protocol as a r
10a30 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 esult of the neg
10a40 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 otiation */.
10a50 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 SSL_get0_alpn_se
10a60 6c 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d lected(statePtr-
10a70 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c >ssl, &proto, &l
10a80 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 en);. LAPPEND
10a90 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
10aa0 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 Ptr, "alpn", (ch
10ab0 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c ar *)proto, (Tcl
10ac0 5f 53 69 7a 65 29 20 6c 65 6e 29 3b 0a 20 20 20 _Size) len);.
10ad0 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
10ae0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 erp, objPtr, "pr
10af0 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 otocol", SSL_get
10b00 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 _version(statePt
10b10 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 r->ssl), -1);..
10b20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 /* Valid for
10b30 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72 non-RSA signatur
10b40 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f e and TLS 1.3 */
10b50 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d . if (objc ==
10b60 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 2) {..res = SSL
10b70 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 _get_peer_signat
10b80 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 ure_nid(statePtr
10b90 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 ->ssl, &nid);.
10ba0 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 } else {..res
10bb0 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 = SSL_get_signat
10bc0 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 ure_nid(statePtr
10bd0 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 ->ssl, &nid);.
10be0 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 }. if (!res
10bf0 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 ) {nid = 0;}.
10c00 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
10c10 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 erp, objPtr, "si
10c20 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72 gnatureHashAlgor
10c30 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c ithm", OBJ_nid2l
10c40 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 n(nid), -1);..
10c50 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 if (objc == 2)
10c60 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 {..res = SSL_ge
10c70 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 t_peer_signature
10c80 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 _type_nid(stateP
10c90 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a tr->ssl, &nid);.
10ca0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 } else {..re
10cb0 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e s = SSL_get_sign
10cc0 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 ature_type_nid(s
10cd0 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e tatePtr->ssl, &n
10ce0 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 id);. }. i
10cf0 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 f (!res) {nid =
10d00 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 0;}. LAPPEND_
10d10 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
10d20 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54 79 tr, "signatureTy
10d30 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 pe", OBJ_nid2ln(
10d40 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 nid), -1);..
10d50 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
10d60 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
10d70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
10d80 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
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 2d 2d 2d 2d ----------------
10db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10dd0 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 -. *. * Connecti
10de0 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 onInfoObjCmd --
10df0 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f return connectio
10e00 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e n info from Open
10e10 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c SSL.. *. * Resul
10e20 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 ts:. *.A list of
10e30 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f connection info
10e40 0a 20 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
10e90 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 static int Conne
10ea0 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 ctionInfoObjCmd(
10eb0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
10ec0 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
10ed0 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
10ee0 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
10ef0 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
10f00 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
10f10 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e an;../* The chan
10f20 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 nel to set a mod
10f30 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 e on */. Stat
10f40 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a e *statePtr;../*
10f50 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f client state fo
10f60 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a r ssl socket */.
10f70 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
10f80 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 Ptr, *listPtr;.
10f90 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 const SSL *ss
10fa0 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c l;. const SSL
10fb0 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b _CIPHER *cipher;
10fc0 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 . const SSL_S
10fd0 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b ESSION *session;
10fe0 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d . const EVP_M
10ff0 44 20 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69 64 D *md;. (void
11000 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
11010 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 if (objc != 2
11020 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
11030 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
11040 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 objv, "channel"
11050 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
11060 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
11070 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
11080 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
11090 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a cl_GetString(obj
110a0 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 v[1]), NULL);.
110b0 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 if (chan == (T
110c0 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
110d0 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
110e0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
110f0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 /* Make sure t
11100 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
11110 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
11120 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 */. chan = T
11130 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
11140 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 (chan);. if (
11150 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
11160 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f pe(chan) != Tls_
11170 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b ChannelType()) {
11180 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
11190 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 lt(interp, "bad
111a0 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c channel \"", Tcl
111b0 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
111c0 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a chan),.. "\":
111d0 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e not a TLS chann
111e0 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 el", (char *) NU
111f0 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 LL);..Tcl_SetErr
11200 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
11210 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f TLS", "CONNECTIO
11220 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 N", "CHANNEL", "
11230 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
11240 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
11250 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
11260 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d }.. objPtr =
11270 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
11280 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 0, NULL);.. /
11290 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 * Connection inf
112a0 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 o */. statePt
112b0 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c r = (State *)Tcl
112c0 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
112d0 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 nceData(chan);.
112e0 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74 ssl = statePt
112f0 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 r->ssl;. if (
11300 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ssl != NULL) {..
11310 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 /* connection st
11320 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ate */..LAPPEND_
11330 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11340 74 72 2c 20 22 73 74 61 74 65 22 2c 20 53 53 4c tr, "state", SSL
11350 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f _state_string_lo
11360 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 ng(ssl), -1);...
11370 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 65 /* Get SNI reque
11380 73 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d 65 sted server name
11390 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 */..LAPPEND_STR
113a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
113b0 20 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 53 "servername", S
113c0 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d SL_get_servernam
113d0 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 e(ssl, TLSEXT_NA
113e0 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 METYPE_host_name
113f0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 ), -1);.../* Get
11400 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 protocol */..LA
11410 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11420 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f , objPtr, "proto
11430 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 col", SSL_get_ve
11440 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 3b rsion(ssl), -1);
11450 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 .../* Renegotiat
11460 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 ion allowed */..
11470 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
11480 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 erp, objPtr, "re
11490 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f negotiation_allo
114a0 77 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 wed", SSL_get_se
114b0 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 cure_renegotiati
114c0 6f 6e 5f 73 75 70 70 6f 72 74 28 28 53 53 4c 20 on_support((SSL
114d0 2a 29 20 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 *) ssl));.../* G
114e0 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 et security leve
114f0 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e l */..LAPPEND_IN
11500 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
11510 2c 20 22 73 65 63 75 72 69 74 79 5f 6c 65 76 65 , "security_leve
11520 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 l", SSL_get_secu
11530 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 rity_level(ssl))
11540 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 ;.../* Session i
11550 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f nfo */..LAPPEND_
11560 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
11570 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 65 Ptr, "session_re
11580 75 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 69 used", SSL_sessi
11590 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 3b on_reused(ssl));
115a0 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 .../* Is server
115b0 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 info */..LAPPEND
115c0 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
115d0 6a 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65 72 jPtr, "is_server
115e0 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 ", SSL_is_server
115f0 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 (ssl));.../* Is
11600 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 DTLS */..LAPPEND
11610 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
11620 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 2c jPtr, "is_dtls",
11630 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 6c SSL_is_dtls(ssl
11640 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ));. }.. /
11650 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f * Cipher info */
11660 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 . cipher = SS
11670 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 L_get_current_ci
11680 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 pher(ssl);. i
11690 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c f (cipher != NUL
116a0 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 L) {..char buf[B
116b0 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 UFSIZ] = {0};..i
116c0 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 nt bits, alg_bit
116d0 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e s;.../* Cipher n
116e0 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ame */..LAPPEND_
116f0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11700 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53 53 tr, "cipher", SS
11710 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d L_CIPHER_get_nam
11720 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a e(cipher), -1);.
11730 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66 ../* RFC name of
11740 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 cipher */..LAPP
11750 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11760 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 72 objPtr, "standar
11770 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50 d_name", SSL_CIP
11780 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d HER_standard_nam
11790 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a e(cipher), -1);.
117a0 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d ../* OpenSSL nam
117b0 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 e of cipher */..
117c0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
117d0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65 rp, objPtr, "ope
117e0 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e nssl_name", OPEN
117f0 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28 SSL_cipher_name(
11800 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 SSL_CIPHER_stand
11810 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 ard_name(cipher)
11820 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d ), -1);.../* num
11830 62 65 72 20 6f 66 20 73 65 63 72 65 74 20 62 69 ber of secret bi
11840 74 73 20 75 73 65 64 20 66 6f 72 20 63 69 70 68 ts used for ciph
11850 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53 er */..bits = SS
11860 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 L_CIPHER_get_bit
11870 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 s(cipher, &alg_b
11880 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 its);..LAPPEND_I
11890 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
118a0 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73 22 r, "secret_bits"
118b0 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e , bits);..LAPPEN
118c0 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
118d0 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d jPtr, "algorithm
118e0 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 73 _bits", alg_bits
118f0 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 );../* alg_bits
11900 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 is actual key se
11910 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 cret bits. If us
11920 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 e bits and secre
11930 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 t (algorithm) bi
11940 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74 ts differ,.. t
11950 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 he rest of the b
11960 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 its are fixed, i
11970 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 .e. for limited
11980 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 export ciphers (
11990 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 bits < 56) */...
119a0 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68 69 /* Indicates whi
119b0 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f ch SSL/TLS proto
119c0 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 73 col version firs
119d0 74 20 64 65 66 69 6e 65 64 20 74 68 65 20 63 69 t defined the ci
119e0 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 pher */..LAPPEND
119f0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11a00 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f Ptr, "min_versio
11a10 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 n", SSL_CIPHER_g
11a20 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 et_version(ciphe
11a30 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 r), -1);.../* Ci
11a40 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 pher NID */..LAP
11a50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11a60 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 objPtr, "cipher
11a70 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 NID", (char *)OB
11a80 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 J_nid2ln(SSL_CIP
11a90 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e HER_get_cipher_n
11aa0 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 id(cipher)), -1)
11ab0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
11ac0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11ad0 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68 61 digestNID", (cha
11ae0 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 r *)OBJ_nid2ln(S
11af0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 69 SL_CIPHER_get_di
11b00 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72 29 gest_nid(cipher)
11b10 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 ), -1);..LAPPEND
11b20 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11b30 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 Ptr, "keyExchang
11b40 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f eNID", (char *)O
11b50 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 BJ_nid2ln(SSL_CI
11b60 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 PHER_get_kx_nid(
11b70 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 cipher)), -1);..
11b80 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11b90 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 rp, objPtr, "aut
11ba0 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c henticationNID",
11bb0 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 (char *)OBJ_nid
11bc0 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 2ln(SSL_CIPHER_g
11bd0 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 68 et_auth_nid(ciph
11be0 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 er)), -1);.../*
11bf0 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 69 message authenti
11c00 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 cation code - Ci
11c10 70 68 65 72 20 69 73 20 41 45 41 44 20 28 65 2e pher is AEAD (e.
11c20 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68 61 g. GCM or ChaCha
11c30 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 20/Poly1305) or
11c40 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 not */../* Authe
11c50 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79 70 74 nticated Encrypt
11c60 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69 61 ion with associa
11c70 74 65 64 20 64 61 74 61 20 28 41 45 41 44 29 20 ted data (AEAD)
11c80 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e check */..LAPPEN
11c90 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
11ca0 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 bjPtr, "cipher_i
11cb0 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 s_aead", SSL_CIP
11cc0 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70 68 HER_is_aead(ciph
11cd0 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 73 er));.../* Diges
11ce0 74 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 68 t used during th
11cf0 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68 e SSL/TLS handsh
11d00 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 74 ake when using t
11d10 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d he cipher. */..m
11d20 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 d = SSL_CIPHER_g
11d30 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 et_handshake_dig
11d40 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c 41 est(cipher);..LA
11d50 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11d60 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 73 , objPtr, "hands
11d70 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 63 hake_digest", (c
11d80 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d har *)EVP_MD_nam
11d90 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a e(md), -1);.../*
11da0 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 Get OpenSSL-spe
11db0 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 cific ID, not IA
11dc0 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e NA ID */..LAPPEN
11dd0 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
11de0 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 64 jPtr, "cipher_id
11df0 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 ", (int) SSL_CIP
11e00 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 HER_get_id(ciphe
11e10 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 r));.../* Two-by
11e20 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 68 te ID used in th
11e30 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f e TLS protocol o
11e40 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 68 f the given ciph
11e50 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 er */..LAPPEND_I
11e60 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
11e70 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 r, "protocol_id"
11e80 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 , (int) SSL_CIPH
11e90 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f ER_get_protocol_
11ea0 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f id(cipher));.../
11eb0 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 69 * Textual descri
11ec0 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 ption of the cip
11ed0 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f her */..if (SSL_
11ee0 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 CIPHER_descripti
11ef0 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 on(cipher, buf,
11f00 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 sizeof(buf)) !=
11f10 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50 NULL) {.. LAP
11f20 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11f30 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72 69 objPtr, "descri
11f40 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29 ption", buf, -1)
11f50 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
11f60 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 /* Session info
11f70 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d */. session =
11f80 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e SSL_get_session
11f90 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 (ssl);. if (s
11fa0 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 ession != NULL)
11fb0 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 {..const unsigne
11fc0 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a d char *ticket;.
11fd0 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 .size_t len2;..u
11fe0 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e nsigned int ulen
11ff0 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 ;..const unsigne
12000 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f d char *session_
12010 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e 73 id, *proto;..uns
12020 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 65 igned char buffe
12030 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 r[SSL_MAX_MASTER
12040 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 _KEY_LENGTH];...
12050 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 /* Report the se
12060 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
12070 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 as a result of t
12080 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 he ALPN negotiat
12090 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 ion */..SSL_SESS
120a0 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 ION_get0_alpn_se
120b0 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 lected(session,
120c0 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a &proto, &len2);.
120d0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
120e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c erp, objPtr, "al
120f0 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 pn", (char *) pr
12100 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 oto, (Tcl_Size)
12110 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f len2);.../* Repo
12120 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 rt the selected
12130 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 protocol as a re
12140 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 sult of the NPN
12150 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 negotiation */.#
12160 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 ifdef USE_NPN..S
12170 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f SL_get0_next_pro
12180 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 73 to_negotiated(ss
12190 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e l, &proto, &ulen
121a0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
121b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
121c0 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 "npn", (char *)
121d0 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 proto, (Tcl_Size
121e0 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 0a ) ulen);.#endif.
121f0 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 ../* Resumable s
12200 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 ession */..LAPPE
12210 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
12220 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 62 objPtr, "resumab
12230 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e le", SSL_SESSION
12240 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 _is_resumable(se
12250 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 ssion));.../* Se
12260 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 ssion start time
12270 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 (seconds since
12280 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 45 epoch) */..LAPPE
12290 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
122a0 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f 74 objPtr, "start_t
122b0 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f ime", SSL_SESSIO
122c0 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 N_get_time(sessi
122d0 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f on));.../* Timeo
122e0 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 ut value - SSL_C
122f0 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 TX_get_timeout (
12300 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 in seconds) */..
12310 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 LAPPEND_LONG(int
12320 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 erp, objPtr, "ti
12330 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 53 meout", SSL_SESS
12340 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 ION_get_timeout(
12350 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 session));.../*
12360 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53 Session id - TLS
12370 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f v1.2 and below o
12380 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f nly */..session_
12390 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e id = SSL_SESSION
123a0 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c _get_id(session,
123b0 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e &ulen);..LAPPEN
123c0 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c D_BARRAY(interp,
123d0 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
123e0 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 n_id", session_i
123f0 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c d, (Tcl_Size) ul
12400 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f en);.../* Sessio
12410 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 n context */..se
12420 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 ssion_id = SSL_S
12430 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 ESSION_get0_id_c
12440 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 ontext(session,
12450 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 &ulen);..LAPPEND
12460 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 _BARRAY(interp,
12470 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e objPtr, "session
12480 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 69 _context", sessi
12490 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 on_id, (Tcl_Size
124a0 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 ) ulen);.../* Se
124b0 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 ssion ticket - c
124c0 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 lient only */..S
124d0 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f SL_SESSION_get0_
124e0 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 ticket(session,
124f0 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b &ticket, &len2);
12500 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 ..LAPPEND_BARRAY
12510 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12520 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 "session_ticket
12530 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f ", ticket, (Tcl_
12540 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f Size) len2);.../
12550 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 * Session ticket
12560 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28 lifetime hint (
12570 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 in seconds) */..
12580 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 LAPPEND_LONG(int
12590 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69 erp, objPtr, "li
125a0 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 fetime", SSL_SES
125b0 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f SION_get_ticket_
125c0 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 lifetime_hint(se
125d0 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 ssion));.../* Ti
125e0 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f cket app data */
125f0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
12600 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
12610 33 30 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f 53 30000000L..SSL_S
12620 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b ESSION_get0_tick
12630 65 74 5f 61 70 70 64 61 74 61 28 28 53 53 4c 5f et_appdata((SSL_
12640 53 45 53 53 49 4f 4e 20 2a 29 20 73 65 73 73 69 SESSION *) sessi
12650 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 on, &ticket, &le
12660 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 n2);..LAPPEND_BA
12670 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a RRAY(interp, obj
12680 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 70 Ptr, "ticket_app
12690 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c 20 _data", ticket,
126a0 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 (Tcl_Size) len2)
126b0 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47 65 ;.#endif.../* Ge
126c0 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a t master key */.
126d0 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 .len2 = SSL_SESS
126e0 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b ION_get_master_k
126f0 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 ey(session, buff
12700 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 er, SSL_MAX_MAST
12710 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a ER_KEY_LENGTH);.
12720 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
12730 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12740 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 75 "master_key", bu
12750 66 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65 29 ffer, (Tcl_Size)
12760 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d len2);.../* Com
12770 70 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 pression id */..
12780 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 20 unsigned int id
12790 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 = SSL_SESSION_ge
127a0 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 65 t_compress_id(se
127b0 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 ssion);..LAPPEND
127c0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
127d0 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f Ptr, "compressio
127e0 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 3f n_id", id == 1 ?
127f0 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 22 "zlib" : "none"
12800 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 , -1);. }..
12810 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e /* Compression
12820 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 info */. if
12830 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl != NULL) {.
12840 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f #ifdef HAVE_SSL_
12850 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e COMPRESSION..con
12860 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a st COMP_METHOD *
12870 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f comp, *expn;..co
12880 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 mp = SSL_get_cur
12890 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e rent_compression
128a0 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 (ssl);..expn = S
128b0 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 SL_get_current_e
128c0 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a xpansion(ssl);..
128d0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
128e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f erp, objPtr, "co
128f0 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 mpression", comp
12900 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f ? SSL_COMP_get_
12910 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e 6f name(comp) : "no
12920 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 ne", -1);..LAPPE
12930 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
12940 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f bjPtr, "expansio
12950 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f 43 n", expn ? SSL_C
12960 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 OMP_get_name(exp
12970 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 n) : "none", -1)
12980 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44 ;.#else..LAPPEND
12990 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
129a0 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f Ptr, "compressio
129b0 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b n", "none", -1);
129c0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
129d0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 terp, objPtr, "e
129e0 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 xpansion", "none
129f0 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 ", -1);.#endif.
12a00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 }.. /* Ser
12a10 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 ver info */.
12a20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 {..long mode = S
12a30 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 SL_CTX_get_sessi
12a40 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 on_cache_mode(st
12a50 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 63 atePtr->ctx);..c
12a60 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 har *msg;...if (
12a70 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f mode & SSL_SESS_
12a80 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20 CACHE_OFF) {..
12a90 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09 msg = "off";..
12aa0 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 } else if (mode
12ab0 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
12ac0 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 _CLIENT) {..
12ad0 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a msg = "client";.
12ae0 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 .} else if (mode
12af0 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
12b00 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 E_SERVER) {..
12b10 20 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22 3b msg = "server";
12b20 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 ..} else if (mod
12b30 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 e & SSL_SESS_CAC
12b40 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 20 HE_BOTH) {..
12b50 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d msg = "both";..}
12b60 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 67 else {.. msg
12b70 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d = "unknown";..}
12b80 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
12b90 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
12ba0 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 ession_cache_mod
12bb0 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 e", msg, -1);.
12bc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c }.. /* CA L
12bd0 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 ist */. /* IF
12be0 20 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20 73 not a server, s
12bf0 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30 5f ame as SSL_get0_
12c00 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66 peer_CA_list. If
12c10 20 73 65 72 76 65 72 20 73 61 6d 65 20 61 73 20 server same as
12c20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65 SSL_CTX_get_clie
12c30 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 nt_CA_list */.
12c40 20 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f listPtr = Tcl_
12c50 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
12c60 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f LL);. STACK_O
12c70 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61 F(X509_NAME) *ca
12c80 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28 28 _list;. if ((
12c90 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65 ca_list = SSL_ge
12ca0 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 t_client_CA_list
12cb0 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 (ssl)) != NULL)
12cc0 7b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b 42 {..char buffer[B
12cd0 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e UFSIZ];..for (in
12ce0 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f t i = 0; i < sk_
12cf0 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 X509_NAME_num(ca
12d00 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 _list); i++) {..
12d10 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e X509_NAME *n
12d20 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 ame = sk_X509_NA
12d30 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 74 ME_value(ca_list
12d40 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 6e , i);.. if (n
12d50 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41 ame) {...X509_NA
12d60 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c ME_oneline(name,
12d70 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 buffer, BUFSIZ)
12d80 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 ;...Tcl_ListObjA
12d90 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
12da0 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 erp, listPtr, Tc
12db0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 l_NewStringObj(b
12dc0 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20 uffer, -1));..
12dd0 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 }..}. }.
12de0 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 LAPPEND_OBJ(int
12df0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 erp, objPtr, "ca
12e00 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 72 29 3b List", listPtr);
12e10 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 . LAPPEND_INT
12e20 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12e30 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c 20 "caListCount",
12e40 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d sk_X509_NAME_num
12e50 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20 20 (ca_list));..
12e60 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
12e70 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
12e80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
12e90 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
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 2d 2d 2d ----------------
12ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ee0 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e --. *. * Version
12ef0 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e ObjCmd -- return
12f00 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 version string
12f10 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a from OpenSSL.. *
12f20 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
12f30 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
12f40 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
12f50 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
12f60 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
12fb0 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 .static int.Vers
12fc0 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 ionObjCmd(Client
12fd0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
12fe0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
12ff0 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
13000 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
13010 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f jv[]) {. Tcl_
13020 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 Obj *objPtr;.
13030 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 (void) clientDa
13040 74 61 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 6f ta;. (void) o
13050 62 6a 63 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 bjc;. (void)
13060 6f 62 6a 76 3b 0a 0a 20 20 20 20 64 70 72 69 6e objv;.. dprin
13070 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
13080 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
13090 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 45 NewStringObj(OPE
130a0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 58 NSSL_VERSION_TEX
130b0 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c 5f T, -1);. Tcl_
130c0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
130d0 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 erp, objPtr);..
130e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
130f0 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d ----------------
13120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
13140 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 *. * MiscObjCmd
13150 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 -- misc commands
13160 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
13170 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
13180 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
13190 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
131a0 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
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 2d 2d 2d 2d 2d 2d ----------------
131d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
131f0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d */.static int.M
13200 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 iscObjCmd(Client
13210 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
13220 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
13230 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
13240 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
13250 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 jv[]) {. stat
13260 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 ic const char *c
13270 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 ommands [] = { "
13280 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 req", "strreq",
13290 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d NULL };. enum
132a0 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 command { C_REQ
132b0 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 , C_STRREQ, C_DU
132c0 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 53 MMY };. Tcl_S
132d0 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e 74 ize cmd;. int
132e0 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 isStr;. char
132f0 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a buffer[16384];.
13300 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e (void) clien
13310 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 tData;.. dpri
13320 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
13330 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
13340 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
13350 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
13360 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 objv, "subcomma
13370 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 nd ?args?");..re
13380 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
13390 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 }. if (Tc
133a0 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 l_GetIndexFromOb
133b0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 j(interp, objv[1
133c0 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f ], commands, "co
133d0 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64 29 mmand", 0, &cmd)
133e0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
133f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
13400 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
13410 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
13420 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64 isStr = (cmd
13430 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 == C_STRREQ);.
13440 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d switch ((enum
13450 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b command) cmd) {
13460 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 ..case C_REQ:..c
13470 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a ase C_STRREQ: {.
13480 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 . EVP_PKEY *p
13490 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 key=NULL;.. X
134a0 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 509 *cert=NULL;.
134b0 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a . X509_NAME *
134c0 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 name=NULL;..
134d0 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b Tcl_Obj **listv;
134e0 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c .. Tcl_Size l
134f0 69 73 74 63 3b 0a 09 20 20 20 20 69 6e 74 20 69 istc;.. int i
13500 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 ;... BIO *out
13510 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 =NULL;... cha
13520 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d r *k_C="",*k_ST=
13530 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d "",*k_L="",*k_O=
13540 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 "",*k_OU="",*k_C
13550 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 N="",*k_Email=""
13560 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 ;.. char *key
13570 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 out,*pemout,*str
13580 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 ;.. int keysi
13590 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 ze,serial=0,days
135a0 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 =365;..#if OPENS
135b0 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
135c0 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
135d0 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 . BIGNUM *bne
135e0 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 = NULL;.. RS
135f0 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 A *rsa = NULL;.#
13600 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b else.. EVP_PK
13610 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 EY_CTX *ctx = NU
13620 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 LL;.#endif...
13630 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c if ((objc<5) ||
13640 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 (objc>6)) {...T
13650 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
13660 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c interp, 2, objv,
13670 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c "keysize keyfil
13680 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f e certfile ?info
13690 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 ?");...return TC
136a0 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a L_ERROR;.. }.
136b0 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 .. if (Tcl_Ge
136c0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 tIntFromObj(inte
136d0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 rp, objv[2], &ke
136e0 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b ysize) != TCL_OK
136f0 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c ) {...return TCL
13700 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 _ERROR;.. }..
13710 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 keyout=Tcl_G
13720 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d etString(objv[3]
13730 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 );.. pemout=T
13740 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a cl_GetString(obj
13750 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 v[4]);.. if (
13760 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 isStr) {...Tcl_S
13770 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 etVar(interp,key
13780 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c out,"",0);...Tcl
13790 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 _SetVar(interp,p
137a0 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 emout,"",0);..
137b0 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 }... if (ob
137c0 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 jc>=6) {...if (T
137d0 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 cl_ListObjGetEle
137e0 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 ments(interp, ob
137f0 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20 26 jv[5], &listc, &
13800 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b listv) != TCL_OK
13810 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e ) {... return
13820 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a TCL_ERROR;...}.
13830 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 ...if ((listc%2)
13840 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 != 0) {... T
13850 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
13860 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e erp,"Information
13870 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 list must have
13880 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 even number of a
13890 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b rguments",NULL);
138a0 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
138b0 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 L_ERROR;...}...f
138c0 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 or (i=0; i<listc
138d0 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 ; i+=2) {...
138e0 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e str=Tcl_GetStrin
138f0 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 g(listv[i]);...
13900 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 if (strcmp(st
13910 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a r,"days")==0) {.
13920 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e ...if (Tcl_GetIn
13930 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c tFromObj(interp,
13940 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 listv[i+1],&days
13950 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 )!=TCL_OK)....
13960 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
13970 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 OR;... } else
13980 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
13990 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a "serial")==0) {.
139a0 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e ...if (Tcl_GetIn
139b0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c tFromObj(interp,
139c0 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 listv[i+1],&seri
139d0 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 al)!=TCL_OK)....
139e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
139f0 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c RROR;... } el
13a00 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
13a10 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 r,"C")==0) {....
13a20 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e k_C=Tcl_GetStrin
13a30 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
13a40 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
13a50 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 strcmp(str,"ST")
13a60 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 ==0) {....k_ST=T
13a70 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
13a80 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
13a90 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
13aa0 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b p(str,"L")==0) {
13ab0 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 ....k_L=Tcl_GetS
13ac0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
13ad0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
13ae0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
13af0 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f O")==0) {....k_O
13b00 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
13b10 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
13b20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
13b30 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 cmp(str,"OU")==0
13b40 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f ) {....k_OU=Tcl_
13b50 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
13b60 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
13b70 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
13b80 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 tr,"CN")==0) {..
13b90 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 ..k_CN=Tcl_GetSt
13ba0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
13bb0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
13bc0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 f (strcmp(str,"E
13bd0 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 mail")==0) {....
13be0 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 k_Email=Tcl_GetS
13bf0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
13c00 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
13c10 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 {....Tcl_SetResu
13c20 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f lt(interp,"Unkno
13c30 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 wn parameter",NU
13c40 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 LL);....return T
13c50 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 CL_ERROR;...
13c60 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 }...}.. }..#i
13c70 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
13c80 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
13c90 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 00000L.. bne
13ca0 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 = BN_new();..
13cb0 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 rsa = RSA_new()
13cc0 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 ;.. pkey = EV
13cd0 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 P_PKEY_new();..
13ce0 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 if (bne == NU
13cf0 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c LL || rsa == NUL
13d00 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c L || pkey == NUL
13d10 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 L || !BN_set_wor
13d20 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c d(bne,RSA_F4) ||
13d30 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 ...!RSA_generate
13d40 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 _key_ex(rsa, key
13d50 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 size, bne, NULL)
13d60 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 || !EVP_PKEY_as
13d70 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 sign_RSA(pkey, r
13d80 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 sa)) {...EVP_PKE
13d90 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 Y_free(pkey);...
13da0 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 /* RSA_free(rsa)
13db0 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 ; freed by EVP_P
13dc0 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e KEY_free */...BN
13dd0 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 _free(bne);.#els
13de0 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 e.. pkey = EV
13df0 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 P_RSA_gen((unsig
13e00 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 ned int) keysize
13e10 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 );.. ctx = EV
13e20 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 P_PKEY_CTX_new(p
13e30 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 key,NULL);..
13e40 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c if (pkey == NULL
13e50 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 || ctx == NULL
13e60 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 || !EVP_PKEY_key
13e70 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c gen_init(ctx) ||
13e80 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 ...!EVP_PKEY_CTX
13e90 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f _set_rsa_keygen_
13ea0 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a bits(ctx, keysiz
13eb0 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f e) || !EVP_PKEY_
13ec0 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 keygen(ctx, &pke
13ed0 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 y)) {...EVP_PKEY
13ee0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 _free(pkey);...E
13ef0 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 VP_PKEY_CTX_free
13f00 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 (ctx);.#endif...
13f10 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
13f20 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 terp,"Error gene
13f30 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b rating private k
13f40 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 ey",NULL);...ret
13f50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
13f60 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 } else {...i
13f70 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 f (isStr) {...
13f80 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 out=BIO_new(BI
13f90 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 O_s_mem());...
13fa0 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f PEM_write_bio_
13fb0 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 PrivateKey(out,p
13fc0 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c key,NULL,NULL,0,
13fd0 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 NULL,NULL);...
13fe0 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 i=BIO_read(out
13ff0 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 ,buffer,sizeof(b
14000 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 uffer)-1);...
14010 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 i=(i<0) ? 0 : i
14020 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 ;... buffer[i
14030 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 ]='\0';... Tc
14040 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
14050 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 keyout,buffer,0)
14060 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 ;... BIO_flus
14070 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 h(out);... BI
14080 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d O_free(out);...}
14090 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 else {... ou
140a0 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
140b0 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 file());... B
140c0 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d IO_write_filenam
140d0 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 e(out,keyout);..
140e0 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
140f0 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 io_PrivateKey(ou
14100 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c t,pkey,NULL,NULL
14110 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 ,0,NULL,NULL);..
14120 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 . /* PEM_writ
14130 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 e_bio_RSAPrivate
14140 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 Key(out, rsa, NU
14150 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c LL, NULL, 0, NUL
14160 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 L, NULL); */...
14170 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 BIO_free_all(
14180 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 out);.. .}....if
14190 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 ((cert=X509_new
141a0 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 ())==NULL) {...
141b0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 Tcl_SetResult
141c0 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 (interp,"Error g
141d0 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 enerating certif
141e0 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e icate request",N
141f0 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f ULL);... EVP_
14200 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
14210 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
14220 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
14230 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 30000000L...
14240 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
14250 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 ndif... retur
14260 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
14270 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72 ....X509_set_ver
14280 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 sion(cert,2);...
14290 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 ASN1_INTEGER_set
142a0 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c (X509_get_serial
142b0 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72 Number(cert),ser
142c0 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 ial);...X509_gmt
142d0 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 ime_adj(X509_get
142e0 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 m_notBefore(cert
142f0 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 ),0);...X509_gmt
14300 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 ime_adj(X509_get
14310 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 m_notAfter(cert)
14320 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a ,(long)60*60*24*
14330 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 days);...X509_se
14340 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b t_pubkey(cert,pk
14350 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 ey);....name=X50
14360 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 9_get_subject_na
14370 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 me(cert);....X50
14380 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
14390 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 _by_txt(name,"C"
143a0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
143b0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
143c0 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c char *) k_C, -1,
143d0 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
143e0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
143f0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c y_txt(name,"ST",
14400 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
14410 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
14420 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c har *) k_ST, -1,
14430 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
14440 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
14450 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 y_txt(name,"L",
14460 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
14470 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
14480 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d ar *) k_L, -1, -
14490 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
144a0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
144b0 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 txt(name,"O", MB
144c0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
144d0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
144e0 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c *) k_O, -1, -1,
144f0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
14500 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
14510 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 t(name,"OU", MBS
14520 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
14530 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
14540 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c *) k_OU, -1, -1,
14550 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
14560 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
14570 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 t(name,"CN", MBS
14580 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
14590 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
145a0 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c *) k_CN, -1, -1,
145b0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
145c0 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
145d0 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 t(name,"Email",
145e0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
145f0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
14600 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d ar *) k_Email, -
14610 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 1, -1, 0);....X5
14620 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 09_set_subject_n
14630 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a ame(cert,name);.
14640 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 67 ...if (!X509_sig
14650 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f n(cert,pkey,EVP_
14660 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20 sha256())) {...
14670 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 72 X509_free(cer
14680 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b t);... EVP_PK
14690 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 EY_free(pkey);.#
146a0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
146b0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
146c0 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 000000L... BN
146d0 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 _free(bne);.#end
146e0 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 if... Tcl_Set
146f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 Result(interp,"E
14700 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72 rror signing cer
14710 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b tificate",NULL);
14720 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
14730 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 L_ERROR;...}....
14740 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 if (isStr) {...
14750 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
14760 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 IO_s_mem());...
14770 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
14780 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b _X509(out,cert);
14790 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 ... i=BIO_rea
147a0 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a d(out,buffer,siz
147b0 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a eof(buffer)-1);.
147c0 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 .. i=(i<0) ?
147d0 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 0 : i;... buf
147e0 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 fer[i]='\0';...
147f0 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e Tcl_SetVar(in
14800 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 terp,pemout,buff
14810 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f er,0);... BIO
14820 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 _flush(out);...
14830 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 BIO_free(out)
14840 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 ;...} else {...
14850 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
14860 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 IO_s_file());...
14870 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 BIO_write_fi
14880 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 lename(out,pemou
14890 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 t);... PEM_wr
148a0 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 ite_bio_X509(out
148b0 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49 ,cert);... BI
148c0 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b O_free_all(out);
148d0 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 ...}....X509_fre
148e0 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 e(cert);...EVP_P
148f0 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
14900 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
14910 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
14920 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 0000000L...BN_fr
14930 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a ee(bne);.#endif.
14940 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b . }..}..break
14950 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 ;. default:..
14960 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 break;. }.
14970 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
14980 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a }.../***********
14990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e *********/./* In
149a0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2a it *
149b0 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /./*************
149c0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d ----------------
149f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a10 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 --. *. * Tls_Fre
14a20 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 e --. *. *.This
14a30 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 procedure cleans
14a40 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 up when a SSL s
14a50 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e ocket based chan
14a60 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 nel. *.is closed
14a70 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e and its referen
14a80 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 ce count falls b
14a90 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 elow 1. *. * Res
14aa0 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ults:. *.none. *
14ab0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
14ac0 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 :. *.Frees all t
14ad0 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d he state. *. *--
14ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b20 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 -. */.void.Tls_F
14b30 72 65 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b 50 ree(char *blockP
14b40 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 tr) {. State
14b50 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
14b60 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a te *)blockPtr;..
14b70 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
14b80 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f led");.. Tls_
14b90 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b Clean(statePtr);
14ba0 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 . ckfree(bloc
14bb0 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a kPtr);.}.../*. *
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 2d 2d ----------------
14be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c00 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c ---. *. * Tls_Cl
14c10 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 ean --. *. *.Thi
14c20 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 s procedure clea
14c30 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c ns up when a SSL
14c40 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 socket based ch
14c50 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 annel. *.is clos
14c60 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 ed and its refer
14c70 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 ence count falls
14c80 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 below 1. This
14c90 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c should. *.be cal
14ca0 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c led synchronousl
14cb0 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 y by the ClosePr
14cc0 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 oc, not in the.
14cd0 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 *.EventuallyFree
14ce0 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a callback.. *. *
14cf0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e Results:. *.non
14d00 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
14d10 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 ects:. *.Frees a
14d20 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a ll the state. *.
14d30 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d70 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 -----. */.void T
14d80 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a ls_Clean(State *
14d90 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 statePtr) {.
14da0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
14db0 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 );.. /*.
14dc0 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 * we're assuming
14dd0 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72 65 here that we're
14de0 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 single-threaded
14df0 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 . */. if
14e00 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 (statePtr->timer
14e10 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f != (Tcl_TimerTo
14e20 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 ken) NULL) {..Tc
14e30 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e l_DeleteTimerHan
14e40 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 dler(statePtr->t
14e50 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 imer);..statePtr
14e60 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a ->timer = NULL;.
14e70 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
14e80 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 tatePtr->protos)
14e90 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65 {..ckfree(state
14ea0 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 Ptr->protos);..s
14eb0 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
14ec0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
14ed0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
14ee0 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 bio) {../* This
14ef0 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 will call SSL_sh
14f00 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 utdown. Bug 1414
14f10 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 045 */..dprintf(
14f20 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 "BIO_free_all(%p
14f30 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69 )", statePtr->bi
14f40 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c o);..BIO_free_al
14f50 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 l(statePtr->bio)
14f60 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ;..statePtr->bio
14f70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
14f80 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
14f90 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 >ssl) {..dprintf
14fa0 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c ("SSL_free(%p)",
14fb0 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b statePtr->ssl);
14fc0 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 ..SSL_free(state
14fd0 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 Ptr->ssl);..stat
14fe0 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c ePtr->ssl = NULL
14ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
15000 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b statePtr->ctx) {
15010 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 ..SSL_CTX_free(s
15020 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 tatePtr->ctx);..
15030 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 statePtr->ctx =
15040 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
15050 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 if (statePtr->ca
15060 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 llback) {..Tcl_D
15070 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ecrRefCount(stat
15080 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
15090 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c ..statePtr->call
150a0 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 back = NULL;.
150b0 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
150c0 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b Ptr->password) {
150d0 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 ..Tcl_DecrRefCou
150e0 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 nt(statePtr->pas
150f0 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 sword);..statePt
15100 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 r->password = NU
15110 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
15120 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 (statePtr->vcmd
15130 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 ) {..Tcl_DecrRef
15140 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
15150 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 72 vcmd);..statePtr
15160 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 ->vcmd = NULL;.
15170 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
15180 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a f("Returning");.
15190 7d 0a 0c 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f }...#if TCL_MAJO
151a0 52 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23 64 R_VERSION > 8.#d
151b0 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f efine MIN_VERSIO
151c0 4e 20 22 39 2e 30 22 0a 23 65 6c 73 65 0a 23 64 N "9.0".#else.#d
151d0 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f efine MIN_VERSIO
151e0 4e 20 22 38 2e 35 22 0a 23 65 6e 64 69 66 0a 0a N "8.5".#endif..
151f0 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15230 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
15240 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a ls_Init --. *. *
15250 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 .This is a packa
15260 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f ge initializatio
15270 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 n procedure, whi
15280 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 ch is called. *.
15290 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 by Tcl when this
152a0 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 package is to b
152b0 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e e added to an in
152c0 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a terpreter.. *. *
152d0 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 Results: Ssl c
152e0 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f onfigured and lo
152f0 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 aded. *. * Side
15300 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 effects:. *. cre
15310 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d ate the ssl comm
15320 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 and, initialize
15330 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 ssl context. *.
15340 2a 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 2d ----------------
15360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15380 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f ----. */.DLLEXPO
15390 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 RT int Tls_Init(
153a0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
153b0 72 70 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 rp) {. const
153c0 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 char tlsTclInitS
153d0 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 cript[] = {.#inc
153e0 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 lude "tls.tcl.h"
153f0 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 ..0x00. };..
15400 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
15410 65 64 22 29 3b 0a 0a 23 69 66 64 65 66 20 55 53 ed");..#ifdef US
15420 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 20 E_TCL_STUBS.
15430 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 if (Tcl_InitStub
15440 73 28 69 6e 74 65 72 70 2c 20 4d 49 4e 5f 56 45 s(interp, MIN_VE
15450 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c RSION, 0) == NUL
15460 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
15470 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 _ERROR;. }.#e
15480 6e 64 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c ndif. if (Tcl
15490 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 _PkgRequire(inte
154a0 72 70 2c 20 22 54 63 6c 22 2c 20 4d 49 4e 5f 56 rp, "Tcl", MIN_V
154b0 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 ERSION, 0) == NU
154c0 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
154d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
154e0 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e if (TlsLibIn
154f0 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 it(0) != TCL_OK)
15500 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
15510 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f sult(interp, "co
15520 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 uld not initiali
15530 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c ze SSL library",
15540 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
15550 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
15560 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
15570 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
15580 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
15590 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 ::ciphers", Ciph
155a0 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 ersObjCmd, (Clie
155b0 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
155c0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
155d0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
155e0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
155f0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
15600 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 ::connection", C
15610 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a onnectionInfoObj
15620 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
15630 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 ) NULL, (Tcl_Cmd
15640 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
15650 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
15660 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
15670 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 terp, "tls::hand
15680 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b shake", Handshak
15690 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 eObjCmd, (Client
156a0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c Data) NULL, (Tcl
156b0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
156c0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
156d0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
156e0 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
156f0 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f import", ImportO
15700 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
15710 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 ta) NULL, (Tcl_C
15720 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
15730 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
15740 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
15750 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e interp, "tls::un
15760 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 import", Unimpor
15770 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 tObjCmd, (Client
15780 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c Data) NULL, (Tcl
15790 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
157a0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
157b0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
157c0 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
157d0 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f status", StatusO
157e0 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
157f0 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 ta) NULL, (Tcl_C
15800 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
15810 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
15820 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
15830 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 interp, "tls::ve
15840 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f rsion", VersionO
15850 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
15860 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 ta) NULL, (Tcl_C
15870 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
15880 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
15890 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
158a0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 interp, "tls::mi
158b0 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c sc", MiscObjCmd,
158c0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
158d0 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
158e0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
158f0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
15900 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
15910 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c , "tls::protocol
15920 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a s", ProtocolsObj
15930 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
15940 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 ) NULL, (Tcl_Cmd
15950 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
15960 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e LL);.. if (in
15970 74 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 terp) {..Tcl_Eva
15980 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c l(interp, tlsTcl
15990 49 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20 20 InitScript);.
159a0 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }.. return T
159b0 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e cl_PkgProvide(in
159c0 74 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 terp, PACKAGE_NA
159d0 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 ME, PACKAGE_VERS
159e0 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d ION);.}../*. *--
159f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a20 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f ----*. *. *.Tls_
15a30 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 SafeInit --. *.
15a40 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
15a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a70 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 --*. *.Standard
15a80 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 procedure requir
15a90 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a ed by 'load'.. *
15aa0 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 .Initializes thi
15ab0 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 s extension for
15ac0 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 a safe interpret
15ad0 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d er.. *.---------
15ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b00 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 -------*. *. *.S
15b10 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
15b20 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 .As of 'Tls_Init
15b30 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a '. *. *.Result:.
15b40 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 *..A standard T
15b50 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 cl error code..
15b60 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
15b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a ----------*. */.
15ba0 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c DLLEXPORT int Tl
15bb0 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 s_SafeInit(Tcl_I
15bc0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b nterp *interp) {
15bd0 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
15be0 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 lled");. retu
15bf0 72 6e 20 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 rn Tls_Init(inte
15c00 72 70 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d rp);.}../*. *---
15c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c40 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 ---*. *. *.TlsLi
15c50 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d bInit --. *. *.-
15c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
15c90 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 . *.Initializes
15ca0 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 SSL library once
15cb0 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e per application
15cc0 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.------------
15cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15cf0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 ----*. *. *.Side
15d00 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e effects:. *..in
15d10 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 itializes SSL li
15d20 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 brary. *. *.Resu
15d30 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a lt:. *..none. *.
15d40 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
15d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d70 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 --------*. */.st
15d80 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 atic int TlsLibI
15d90 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 nit(int uninitia
15da0 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 lize) {. stat
15db0 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a ic int initializ
15dc0 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 ed = 0;. int
15dd0 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b status = TCL_OK;
15de0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
15df0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
15e00 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
15e10 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 EADS). size_t
15e20 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 num_locks;.#end
15e30 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e if.. if (unin
15e40 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 itialize) {..if
15e50 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b (!initialized) {
15e60 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 .. dprintf("A
15e70 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 sked to uninitia
15e80 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 lize, but we are
15e90 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 not initialized
15ea0 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e ");... return
15eb0 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09 64 70 TCL_OK;..}...dp
15ec0 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 rintf("Asked to
15ed0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a uninitialize");.
15ee0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
15ef0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
15f00 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
15f10 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 EADS)..Tcl_Mutex
15f20 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a Lock(&init_mx);.
15f30 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 ..if (locks) {..
15f40 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b free(locks);
15f50 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 .. locks = NU
15f60 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f LL;.. locksCo
15f70 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 unt = 0;..}.#end
15f80 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 if..initialized
15f90 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 = 0;..#if define
15fa0 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
15fb0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
15fc0 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f L_THREADS)..Tcl_
15fd0 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 MutexUnlock(&ini
15fe0 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 t_mx);.#endif...
15ff0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 return TCL_OK;.
16000 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e }.. if (in
16010 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 itialized) {..dp
16020 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 rintf("Called, b
16030 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 ut using cached
16040 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e value");..return
16050 20 73 74 61 74 75 73 3b 0a 20 20 20 20 7d 0a 0a status;. }..
16060 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
16070 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 led");..#if defi
16080 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 ned(OPENSSL_THRE
16090 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 ADS) && defined(
160a0 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 TCL_THREADS).
160b0 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 Tcl_MutexLock(&
160c0 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 init_mx);.#endif
160d0 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 . initialized
160e0 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e = 1;..#if defin
160f0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
16100 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
16110 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 CL_THREADS).
16120 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 num_locks = 1;.
16130 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 locksCount =
16140 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b (int) num_locks;
16150 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c . locks = mal
16160 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b loc(sizeof(*lock
16170 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b s) * num_locks);
16180 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b . memset(lock
16190 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f s, 0, sizeof(*lo
161a0 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 cks) * num_locks
161b0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f );.#endif.. /
161c0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 * Initialize BOT
161d0 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 H libcrypto and
161e0 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f libssl. */. O
161f0 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 PENSSL_init_ssl(
16200 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 OPENSSL_INIT_LOA
16210 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 D_SSL_STRINGS |
16220 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 OPENSSL_INIT_LOA
16230 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 D_CRYPTO_STRINGS
16240 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 ..| OPENSSL_INIT
16250 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 _ADD_ALL_CIPHERS
16260 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f | OPENSSL_INIT_
16270 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c ADD_ALL_DIGESTS,
16280 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f NULL);.. BIO
16290 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 _new_tcl(NULL, 0
162a0 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a );..#if 0. /*
162b0 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f . * XXX:TODO
162c0 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f : Remove this co
162d0 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 de and replace i
162e0 74 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 t with a check.
162f0 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 * for enough
16300 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 entropy and do
16310 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 not try to creat
16320 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a e our own. *
16330 20 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 terrible entrop
16340 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a y. */. /*
16350 0a 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 . * Seed the
16360 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 random number g
16370 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 enerator in the
16380 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 SSL library,.
16390 20 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f * using the do
163a0 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 /while construct
163b0 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 because of the
163c0 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a bug note in the.
163d0 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 * OpenSSL F
163e0 41 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 AQ at http://www
163f0 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 .openssl.org/sup
16400 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 port/faq.html#US
16410 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 ER1. *.
16420 2a 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 * The crux of th
16430 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 e problem is tha
16440 74 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 t Solaris 7 does
16450 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 not have a.
16460 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f * /dev/random o
16470 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 r /dev/urandom d
16480 65 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e evice so it cann
16490 6f 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 ot gather enough
164a0 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 . * entropy
164b0 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 from the RAND_se
164c0 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e ed() when TLS in
164d0 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 itializes and re
164e0 66 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 fuses. * to
164f0 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c go further. Earl
16500 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 ier versions of
16510 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 OpenSSL carried
16520 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 on regardless..
16530 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 */. srand
16540 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 ((unsigned int)
16550 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 time((time_t *)
16560 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b NULL));. do {
16570 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 ..for (i = 0; i
16580 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 < 16; i++) {..
16590 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 rnd_seed[i] =
165a0 31 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 1 + (char) (255.
165b0 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 0 * rand()/(RAND
165c0 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 _MAX+1.0));..}..
165d0 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 RAND_seed(rnd_se
165e0 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 ed, sizeof(rnd_s
165f0 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 eed));. } whi
16600 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 le (RAND_status(
16610 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a ) != 1);.#endif.
16620 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
16630 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
16640 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
16650 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 EADS)..Tcl_Mutex
16660 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 Unlock(&init_mx)
16670 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 ;.#endif.. re
16680 74 75 72 6e 20 73 74 61 74 75 73 3b 0a 7d 0a turn status;.}.