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 20 20 20 20 54 63 6c 5f 44 53 74 72 69 */. Tcl_DStri
e920: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 23 69 66 ngInit(&ds);.#if
e930: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 def OPENSSL_NO_D
e940: 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 H. if (DHpara
e950: 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 ms != NULL) {..T
e960: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
e970: 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 interp, "DH para
e980: 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f meter support no
e990: 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 t available", (c
e9a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 har *) NULL);..S
e9b0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
e9c0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
e9d0: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 }.#else.
e9e0: 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 {..DH* dh;..if (
e9f0: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c DHparams != NULL
ea00: 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 ) {.. BIO *bi
ea10: 6f 3b 0a 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 o;... bio = B
ea20: 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 IO_new_file(F2N(
ea30: 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 DHparams, &ds),
ea40: 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 "r");.. if (!
ea50: 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 bio) {...Tcl_DSt
ea60: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
ea70: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
ea80: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 t(interp, "Could
ea90: 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 not find DH par
eaa0: 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 ameters file", (
eab0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
eac0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
ead0: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c x);...return NUL
eae0: 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 L;.. }...
eaf0: 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 dh = PEM_read_bi
eb00: 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 o_DHparams(bio,
eb10: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c NULL, NULL, NULL
eb20: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 );.. BIO_free
eb30: 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f (bio);.. Tcl_
eb40: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
eb50: 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20 ;.. if (!dh)
eb60: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {...Tcl_AppendRe
eb70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f sult(interp, "Co
eb80: 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 uld not read DH
eb90: 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 parameters from
eba0: 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 file", (char *)
ebb0: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
ebc0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 _free(ctx);...re
ebd0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
ebe0: 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 }.. SSL_CTX_s
ebf0: 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 et_tmp_dh(ctx, d
ec00: 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 65 h);.. DH_free
ec10: 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b (dh);...} else {
ec20: 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c .. /* Use wel
ec30: 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d l known DH param
ec40: 65 74 65 72 73 20 74 68 61 74 20 68 61 76 65 20 eters that have
ec50: 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 built-in support
ec60: 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 in OpenSSL */..
ec70: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 if (!SSL_CTX
ec80: 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 _set_dh_auto(ctx
ec90: 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 , 1)) {...Tcl_Ap
eca0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
ecb0: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e p, "Could not en
ecc0: 61 62 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f able set DH auto
ecd0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
ece0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
ecf0: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
ed00: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 _free(ctx);...re
ed10: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
ed20: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 }..}. }.#endi
ed30: 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 f.. /* set ou
ed40: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f r certificate */
ed50: 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 . load_privat
ed60: 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 e_key = 0;. i
ed70: 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e f (certfile != N
ed80: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 ULL) {..load_pri
ed90: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 vate_key = 1;...
eda0: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f if (SSL_CTX_use_
edb0: 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 certificate_file
edc0: 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69 (ctx, F2N(certfi
edd0: 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 le, &ds), SSL_FI
ede0: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 LETYPE_PEM) <= 0
edf0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 ) {.. Tcl_DSt
ee00: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
ee10: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
ee20: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e sult(interp, "un
ee30: 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 able to set cert
ee40: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 ificate file ",
ee50: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a certfile, ": ",.
ee60: 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e ..GET_ERR_REASON
ee70: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
ee80: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
ee90: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
eea0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d return NULL;..}
eeb0: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
eec0: 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 7d 20 65 e(&ds);.. } e
eed0: 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 lse if (cert !=
eee0: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 NULL) {..load_pr
eef0: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 ivate_key = 1;..
ef00: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f if (SSL_CTX_use_
ef10: 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 certificate_ASN1
ef20: 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 (ctx, cert_len,
ef30: 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 cert) <= 0) {..
ef40: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
ef50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
ef60: 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 ble to set certi
ef70: 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 47 45 54 ficate: ",...GET
ef80: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
ef90: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
efa0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 SSL_CTX_free
efb0: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 (ctx);.. retu
efc0: 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 rn NULL;..}.
efd0: 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 } else {..certfi
efe0: 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 le = (char*)X509
eff0: 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 _get_default_cer
f000: 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 t_file();...if (
f010: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 SSL_CTX_use_cert
f020: 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 ificate_file(ctx
f030: 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f , certfile, SSL_
f040: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d FILETYPE_PEM) <=
f050: 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 0) {.#if 0..
f060: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
f070: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
f080: 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 e to use default
f090: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c certificate fil
f0a0: 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 e ", certfile, "
f0b0: 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 : ",...GET_ERR_R
f0c0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
f0d0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 ) NULL);.. SS
f0e0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
f0f0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c .. return NUL
f100: 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 L;.#endif..}.
f110: 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f }.. /* set o
f120: 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a ur private key *
f130: 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 /. if (load_p
f140: 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 rivate_key) {..i
f150: 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 f (keyfile == NU
f160: 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c LL && key == NUL
f170: 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c L) {.. keyfil
f180: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d e = certfile;..}
f190: 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 ...if (keyfile !
f1a0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f = NULL) {.. /
f1b0: 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74 * get the privat
f1c0: 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 e key associated
f1d0: 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69 with this certi
f1e0: 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 ficate */.. i
f1f0: 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 f (keyfile == NU
f200: 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 LL) {...keyfile
f210: 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 = certfile;..
f220: 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c }... if (SSL
f230: 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 _CTX_use_Private
f240: 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 Key_file(ctx, F2
f250: 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c N(keyfile, &ds),
f260: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 SSL_FILETYPE_PE
f270: 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c M) <= 0) {...Tcl
f280: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
f290: 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 );.../* flush th
f2a0: 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 e passphrase whi
f2b0: 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 ch might be left
f2c0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a in the result *
f2d0: 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c /...Tcl_SetResul
f2e0: 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 t(interp, NULL,
f2f0: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 TCL_STATIC);...T
f300: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
f310: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
f320: 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 to set public ke
f330: 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c y file ", keyfil
f340: 65 2c 20 22 20 22 2c 0a 09 09 20 20 20 20 47 45 e, " ",... GE
f350: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 T_ERR_REASON(),
f360: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
f370: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
f380: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
f390: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 LL;.. }..
f3a0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
f3b0: 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 &ds);...} else i
f3c0: 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 f (key != NULL)
f3d0: 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 {.. if (SSL_C
f3e0: 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 TX_use_PrivateKe
f3f0: 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f y_ASN1(EVP_PKEY_
f400: 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 RSA, ctx, key,ke
f410: 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 y_len) <= 0) {..
f420: 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 ./* flush the pa
f430: 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d ssphrase which m
f440: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 ight be left in
f450: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 the result */...
f460: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
f470: 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f terp, NULL, TCL_
f480: 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 STATIC);...Tcl_A
f490: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
f4a0: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
f4b0: 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 et public key: "
f4c0: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
f4d0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
f4e0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
f4f0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
f500: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 n NULL;.. }..
f510: 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f }../* Now we kno
f520: 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 w that a key and
f530: 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 cert have been
f540: 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 set against.. *
f550: 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 the SSL context
f560: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 */..if (!SSL_CTX
f570: 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b _check_private_k
f580: 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 ey(ctx)) {..
f590: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
f5a0: 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 (interp, "privat
f5b0: 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d e key does not m
f5c0: 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69 atch the certifi
f5d0: 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 cate public key"
f5e0: 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 20 ,.... (char
f5f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
f600: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
f610: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
f620: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 LL;..}. }..
f630: 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 73 65 20 /* Set to use
f640: 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f 6e default location
f650: 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43 65 and file for Ce
f660: 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 rtificate Author
f670: 69 74 79 20 28 43 41 29 20 63 65 72 74 69 66 69 ity (CA) certifi
f680: 63 61 74 65 73 2e 20 54 68 65 0a 20 20 20 20 20 cates. The.
f690: 2a 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e * verify path an
f6a0: 64 20 73 74 6f 72 65 20 63 61 6e 20 62 65 20 6f d store can be o
f6b0: 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 verridden by the
f6c0: 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e SSL_CERT_DIR en
f6d0: 76 20 76 61 72 2e 20 54 68 65 20 76 65 72 69 66 v var. The verif
f6e0: 79 20 66 69 6c 65 20 63 61 6e 0a 20 20 20 20 20 y file can.
f6f0: 2a 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 * be overridden
f700: 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f by the SSL_CERT_
f710: 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f FILE env var. */
f720: 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 . if (!SSL_CT
f730: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 X_set_default_ve
f740: 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 rify_paths(ctx))
f750: 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20 20 {..abort++;.
f760: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 72 }.. /* Overr
f770: 69 64 65 73 20 66 6f 72 20 74 68 65 20 43 41 20 ides for the CA
f780: 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 verify path and
f790: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23 69 file */. {.#i
f7a0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
f7b0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
f7c0: 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41 70 61 00000L..if (CApa
f7d0: 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41 th != NULL || CA
f7e0: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
f7f0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
f800: 20 64 73 31 3b 0a 09 20 20 20 20 54 63 6c 5f 44 ds1;.. Tcl_D
f810: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 StringInit(&ds1)
f820: 3b 0a 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c ;... if (!SSL
f830: 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 _CTX_load_verify
f840: 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 _locations(ctx,
f850: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 F2N(CAfile, &ds)
f860: 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 , F2N(CApath, &d
f870: 73 31 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b s1))) {...abort+
f880: 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 +;.. }.. T
f890: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
f8a0: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 ds);.. Tcl_DS
f8b0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b tringFree(&ds1);
f8c0: 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 ... /* Set li
f8d0: 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e st of CAs to sen
f8e0: 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e d to client when
f8f0: 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c requesting a cl
f900: 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 ient certificate
f910: 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74 70 */.. /* http
f920: 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e s://sourceforge.
f930: 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 net/p/tls/bugs/5
f940: 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 58 7/ */.. /* XX
f950: 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 X:TODO: Let the
f960: 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 user supply valu
f970: 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 es here instead
f980: 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 of something tha
f990: 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 t exists on the
f9a0: 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09 20 filesystem */..
f9b0: 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 STACK_OF(X509
f9c0: 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 _NAME) *certName
f9d0: 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 s = SSL_load_cli
f9e0: 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 ent_CA_file(F2N(
f9f0: 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 CAfile, &ds));..
fa00: 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 if (certName
fa10: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 s != NULL) {...S
fa20: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e SL_CTX_set_clien
fa30: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 t_CA_list(ctx, c
fa40: 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 ertNames);..
fa50: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
fa60: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a ngFree(&ds);..}.
fa70: 0a 23 65 6c 73 65 0a 09 69 66 20 28 43 41 70 61 .#else..if (CApa
fa80: 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 th != NULL) {..
fa90: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f if (!SSL_CTX_
faa0: 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 72 28 load_verify_dir(
fab0: 63 74 78 2c 20 46 32 4e 28 43 41 70 61 74 68 2c ctx, F2N(CApath,
fac0: 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 &ds))) {...abor
fad0: 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 t++;.. }..
fae0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
faf0: 28 26 64 73 29 3b 0a 09 7d 0a 09 69 66 20 28 43 (&ds);..}..if (C
fb00: 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b Afile != NULL) {
fb10: 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 .. if (!SSL_C
fb20: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 TX_load_verify_f
fb30: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 41 66 ile(ctx, F2N(CAf
fb40: 69 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 ile, &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 0a 09 20 20 20 Free(&ds);...
fb80: 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 /* Set list of
fb90: 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 CAs to send to c
fba0: 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 lient when reque
fbb0: 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 sting a client c
fbc0: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 ertificate */..
fbd0: 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 STACK_OF(X509
fbe0: 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 _NAME) *certName
fbf0: 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 s = SSL_load_cli
fc00: 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 ent_CA_file(F2N(
fc10: 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 CAfile, &ds));..
fc20: 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 if (certName
fc30: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 s != NULL) {...S
fc40: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e SL_CTX_set_clien
fc50: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 t_CA_list(ctx, c
fc60: 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 ertNames);..
fc70: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
fc80: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a ngFree(&ds);..}.
fc90: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
fca0: 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a return ctx;.}.
fcb0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
fcc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fcd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fcf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
fd00: 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d StatusObjCmd --
fd10: 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 return certific
fd20: 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 ate for connecte
fd30: 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 d peer.. *. * Re
fd40: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
fd50: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
fd60: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
fd70: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
fd80: 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fdc0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
fdd0: 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 c int.StatusObjC
fde0: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
fdf0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
fe00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
fe10: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
fe20: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
fe30: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
fe40: 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a ePtr;. X509 *
fe50: 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 peer;. Tcl_Ob
fe60: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 j *objPtr;. T
fe70: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
fe80: 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e . char *chann
fe90: 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 elName, *ciphers
fea0: 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a ;. int mode;.
feb0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
fec0: 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a ed char *proto;.
fed0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 unsigned int
fee0: 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 len;. int ni
fef0: 64 2c 20 72 65 73 3b 0a 20 20 20 20 28 76 6f 69 d, res;. (voi
ff00: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a d) clientData;..
ff10: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
ff20: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
ff30: 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 objc < 2 || objc
ff40: 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d > 3 || (objc ==
ff50: 20 33 20 26 26 20 21 73 74 72 63 6d 70 28 54 63 3 && !strcmp(Tc
ff60: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
ff70: 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 [1]), "-local"))
ff80: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
ff90: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
ffa0: 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f objv, "?-local?
ffb0: 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 channel");..ret
ffc0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
ffd0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 }.. /* Get
ffe0: 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 channel Id */.
fff0: 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d channelName =
10000 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
10010 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f bjv[(objc == 2 ?
10020 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 20 20 63 1 : 2)]);. c
10030 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
10040 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 nnel(interp, cha
10050 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 nnelName, &mode)
10060 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
10070 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
10080 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
10090 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
100a0 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
100b0 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
100c0 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
100d0 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
100e0 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
100f0 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
10100 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
10110 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
10120 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
10130 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
10140 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
10150 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
10160 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
10170 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
10180 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
10190 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e nel", (char *) N
101a0 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 ULL);..Tcl_SetEr
101b0 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
101c0 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c "TLS", "STATUS",
101d0 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
101e0 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
101f0 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
10200 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
10210 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
10220 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 State *) Tcl_Get
10230 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
10240 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 ata(chan);..
10250 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61 /* Get certifica
10260 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 te for peer or s
10270 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f elf */. if (o
10280 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 bjc == 2) {..pee
10290 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 r = SSL_get_peer
102a0 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 _certificate(sta
102b0 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
102c0 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 } else {..peer
102d0 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 = SSL_get_certif
102e0 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e icate(statePtr->
102f0 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ssl);. }.
10300 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65 72 74 /* Get X509 cert
10310 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a ificate info */.
10320 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a if (peer) {.
10330 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 .objPtr = Tls_Ne
10340 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c wX509Obj(interp,
10350 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a peer);..if (obj
10360 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 c == 2) {.. X
10370 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 509_free(peer);.
10380 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c . peer = NULL
10390 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
103a0 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f {..objPtr = Tcl_
103b0 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
103c0 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 LL);. }..
103d0 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a /* Peer name */.
103e0 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
103f0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10400 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f "peername", SSL_
10410 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 get0_peername(st
10420 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 atePtr->ssl), -1
10430 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 );. LAPPEND_I
10440 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
10450 72 2c 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f r, "sbits", SSL_
10460 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 get_cipher_bits(
10470 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e statePtr->ssl, N
10480 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 ULL));.. ciph
10490 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c ers = (char*)SSL
104a0 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 _get_cipher(stat
104b0 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
104c0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
104d0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 rp, objPtr, "cip
104e0 68 65 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d her", ciphers, -
104f0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 1);.. /* Veri
10500 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 fy the X509 cert
10510 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 ificate presente
10520 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f d by the peer */
10530 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
10540 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10550 20 22 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c "verifyResult",
10560 0a 09 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 ..X509_verify_ce
10570 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 rt_error_string(
10580 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 SSL_get_verify_r
10590 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e esult(statePtr->
105a0 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 ssl)), -1);..
105b0 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 /* Verify mode
105c0 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 */. mode = SS
105d0 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 L_get_verify_mod
105e0 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
105f0 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 ;. if (mode &
10600 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e & SSL_VERIFY_NON
10610 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 E) {..LAPPEND_ST
10620 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
10630 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 , "verifyMode",
10640 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 "none", -1);.
10650 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f } else {..Tcl_O
10660 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d bj *listObjPtr =
10670 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
10680 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 0, NULL);..if (m
10690 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 ode && SSL_VERIF
106a0 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 Y_PEER) {.. T
106b0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
106c0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
106d0 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f listObjPtr, Tcl_
106e0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 NewStringObj("pe
106f0 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 er", -1));..}..i
10700 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 f (mode && SSL_V
10710 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f ERIFY_FAIL_IF_NO
10720 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 _PEER_CERT) {..
10730 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
10740 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10750 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 rp, listObjPtr,
10760 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
10770 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 ("fail if no pee
10780 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 r cert", -1));..
10790 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 }..if (mode && S
107a0 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 SL_VERIFY_CLIENT
107b0 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 _ONCE) {.. Tc
107c0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
107d0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c lement(interp, l
107e0 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e istObjPtr, Tcl_N
107f0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 ewStringObj("cli
10800 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b ent once", -1));
10810 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 ..}..if (mode &&
10820 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 SSL_VERIFY_POST
10830 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 _HANDSHAKE) {..
10840 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
10850 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10860 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 rp, listObjPtr,
10870 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
10880 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 ("post handshake
10890 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 ", -1));..}..LAP
108a0 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c PEND_OBJ(interp,
108b0 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 objPtr, "verify
108c0 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 Mode", listObjPt
108d0 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a r). }.. /*
108e0 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 Verify mode dep
108f0 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e th */. LAPPEN
10900 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
10910 6a 50 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 jPtr, "verifyDep
10920 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 th", SSL_get_ver
10930 69 66 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 ify_depth(stateP
10940 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 tr->ssl));..
10950 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 /* Report the se
10960 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
10970 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 as a result of t
10980 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a he negotiation *
10990 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 /. SSL_get0_a
109a0 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 lpn_selected(sta
109b0 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f tePtr->ssl, &pro
109c0 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c to, &len);. L
109d0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
109e0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e p, objPtr, "alpn
109f0 22 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f ", (char *)proto
10a00 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e , (Tcl_Size) len
10a10 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 );. LAPPEND_S
10a20 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
10a30 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 r, "protocol", S
10a40 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 SL_get_version(s
10a50 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d tatePtr->ssl), -
10a60 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 1);.. /* Vali
10a70 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 d for non-RSA si
10a80 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 gnature and TLS
10a90 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 1.3 */. if (o
10aa0 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 bjc == 2) {..res
10ab0 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f = SSL_get_peer_
10ac0 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 signature_nid(st
10ad0 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
10ae0 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b d);. } else {
10af0 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f ..res = SSL_get_
10b00 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 signature_nid(st
10b10 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
10b20 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 d);. }. if
10b30 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 (!res) {nid = 0
10b40 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 ;}. LAPPEND_S
10b50 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
10b60 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 r, "signatureHas
10b70 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a hAlgorithm", OBJ
10b80 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 _nid2ln(nid), -1
10b90 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
10ba0 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 == 2) {..res =
10bb0 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 SSL_get_peer_sig
10bc0 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 nature_type_nid(
10bd0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 statePtr->ssl, &
10be0 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 nid);. } else
10bf0 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 {..res = SSL_ge
10c00 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 t_signature_type
10c10 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 _nid(statePtr->s
10c20 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d sl, &nid);. }
10c30 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b . if (!res) {
10c40 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 nid = 0;}. LA
10c50 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
10c60 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 , objPtr, "signa
10c70 74 75 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e tureType", OBJ_n
10c80 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b id2ln(nid), -1);
10c90 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
10ca0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
10cb0 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
10cc0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
10cd0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
10ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d10 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f -------. *. * Co
10d20 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 nnectionInfoObjC
10d30 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e md -- return con
10d40 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f nection info fro
10d50 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a m OpenSSL.. *. *
10d60 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c Results:. *.A l
10d70 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f ist of connectio
10d80 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d n info. *. *---
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 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 . */..static int
10de0 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f ConnectionInfoO
10df0 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
10e00 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
10e10 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
10e20 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
10e30 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
10e40 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e ) {. Tcl_Chan
10e50 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 nel chan;../* Th
10e60 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 e channel to set
10e70 20 61 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 a mode on */.
10e80 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
10e90 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 r;../* client st
10ea0 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b ate for ssl sock
10eb0 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 et */. Tcl_Ob
10ec0 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74 j *objPtr, *list
10ed0 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 Ptr;. const S
10ee0 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e SL *ssl;. con
10ef0 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 st SSL_CIPHER *c
10f00 69 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 ipher;. const
10f10 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 SSL_SESSION *se
10f20 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 ssion;. const
10f30 20 45 56 50 5f 4d 44 20 2a 6d 64 3b 0a 20 20 20 EVP_MD *md;.
10f40 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 (void) clientDa
10f50 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ta;.. if (obj
10f60 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
10f70 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
10f80 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
10f90 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
10fa0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
10fb0 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 }.. chan = Tc
10fc0 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
10fd0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 erp, Tcl_GetStri
10fe0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c ng(objv[1]), NUL
10ff0 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e L);. if (chan
11000 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
11010 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
11020 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
11030 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 }.. /* Make
11040 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
11050 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
11060 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
11070 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
11080 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 hannel(chan);.
11090 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 if (Tcl_GetCha
110a0 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 nnelType(chan) !
110b0 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 = Tls_ChannelTyp
110c0 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 e()) {..Tcl_Appe
110d0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
110e0 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
110f0 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
11100 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 lName(chan),..
11110 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 "\": not a TLS
11120 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 channel", (char
11130 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f *) NULL);..Tcl_
11140 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
11150 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e erp, "TLS", "CON
11160 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e NECTION", "CHANN
11170 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 EL", "INVALID",
11180 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
11190 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
111a0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 R;. }.. ob
111b0 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
111c0 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
111d0 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 . /* Connecti
111e0 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 on info */. s
111f0 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
11200 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *)Tcl_GetChanne
11210 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
11220 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 an);. ssl = s
11230 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 tatePtr->ssl;.
11240 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c if (ssl != NUL
11250 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 L) {../* connect
11260 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41 ion state */..LA
11270 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11280 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 65 , objPtr, "state
11290 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 ", SSL_state_str
112a0 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d ing_long(ssl), -
112b0 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 1);.../* Get SNI
112c0 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76 65 requested serve
112d0 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 r name */..LAPPE
112e0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
112f0 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 6e 61 bjPtr, "serverna
11300 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72 me", SSL_get_ser
11310 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 vername(ssl, TLS
11320 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 EXT_NAMETYPE_hos
11330 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 t_name), -1);...
11340 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 /* Get protocol
11350 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
11360 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11370 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f "protocol", SSL_
11380 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 get_version(ssl)
11390 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 , -1);.../* Rene
113a0 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 gotiation allowe
113b0 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f d */..LAPPEND_BO
113c0 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 OL(interp, objPt
113d0 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 69 6f r, "renegotiatio
113e0 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f n_allowed", SSL_
113f0 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 get_secure_reneg
11400 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 otiation_support
11410 28 28 53 53 4c 20 2a 29 20 73 73 6c 29 29 3b 0a ((SSL *) ssl));.
11420 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 ../* Get securit
11430 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 y level */..LAPP
11440 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 END_INT(interp,
11450 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 72 69 74 objPtr, "securit
11460 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 y_level", SSL_ge
11470 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c t_security_level
11480 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 (ssl));.../* Ses
11490 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 sion info */..LA
114a0 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
114b0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 p, objPtr, "sess
114c0 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c ion_reused", SSL
114d0 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 _session_reused(
114e0 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 ssl));.../* Is s
114f0 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c erver info */..L
11500 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
11510 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f rp, objPtr, "is_
11520 73 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f server", SSL_is_
11530 73 65 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 server(ssl));...
11540 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c /* Is DTLS */..L
11550 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
11560 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f rp, objPtr, "is_
11570 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 dtls", SSL_is_dt
11580 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a ls(ssl));. }.
11590 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 . /* Cipher i
115a0 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 nfo */. ciphe
115b0 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 r = SSL_get_curr
115c0 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b ent_cipher(ssl);
115d0 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 20 . if (cipher
115e0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 != NULL) {..char
115f0 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b buf[BUFSIZ] = {
11600 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 0};..int bits, a
11610 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 lg_bits;.../* Ci
11620 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 pher name */..LA
11630 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11640 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 , objPtr, "ciphe
11650 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 r", SSL_CIPHER_g
11660 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c et_name(cipher),
11670 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e -1);.../* RFC n
11680 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f ame of cipher */
11690 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
116a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
116b0 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 tandard_name", S
116c0 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 SL_CIPHER_standa
116d0 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c rd_name(cipher),
116e0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 -1);.../* OpenS
116f0 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 SL name of ciphe
11700 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 r */..LAPPEND_ST
11710 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11720 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 , "openssl_name"
11730 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 , OPENSSL_cipher
11740 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 _name(SSL_CIPHER
11750 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 _standard_name(c
11760 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 ipher)), -1);...
11770 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 /* number of sec
11780 72 65 74 20 62 69 74 73 20 75 73 65 64 20 66 6f ret bits used fo
11790 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 r cipher */..bit
117a0 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 s = SSL_CIPHER_g
117b0 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 et_bits(cipher,
117c0 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 &alg_bits);..LAP
117d0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
117e0 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74 objPtr, "secret
117f0 5f 62 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 _bits", bits);..
11800 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
11810 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 rp, objPtr, "alg
11820 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c orithm_bits", al
11830 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 g_bits);../* alg
11840 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 _bits is actual
11850 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e key secret bits.
11860 20 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 If use bits and
11870 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 secret (algorit
11880 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c hm) bits differ,
11890 0a 09 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 .. the rest of
118a0 20 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69 the bits are fi
118b0 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 xed, i.e. for li
118c0 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 mited export cip
118d0 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 hers (bits < 56)
118e0 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 */.../* Indicat
118f0 65 73 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 es which SSL/TLS
11900 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f protocol versio
11910 6e 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 n first defined
11920 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c the cipher */..L
11930 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11940 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f p, objPtr, "min_
11950 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 version", SSL_CI
11960 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e PHER_get_version
11970 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a (cipher), -1);..
11980 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 20 2a ./* Cipher NID *
11990 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
119a0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
119b0 63 69 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61 cipherNID", (cha
119c0 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 r *)OBJ_nid2ln(S
119d0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69 SL_CIPHER_get_ci
119e0 70 68 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29 pher_nid(cipher)
119f0 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 ), -1);..LAPPEND
11a00 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11a10 50 74 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22 Ptr, "digestNID"
11a20 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 , (char *)OBJ_ni
11a30 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f d2ln(SSL_CIPHER_
11a40 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 get_digest_nid(c
11a50 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c ipher)), -1);..L
11a60 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11a70 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 p, objPtr, "keyE
11a80 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 xchangeNID", (ch
11a90 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 ar *)OBJ_nid2ln(
11aa0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b SSL_CIPHER_get_k
11ab0 78 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 x_nid(cipher)),
11ac0 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 -1);..LAPPEND_ST
11ad0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11ae0 2c 20 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f , "authenticatio
11af0 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f nNID", (char *)O
11b00 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 BJ_nid2ln(SSL_CI
11b10 50 48 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 PHER_get_auth_ni
11b20 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b d(cipher)), -1);
11b30 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 .../* message au
11b40 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 thentication cod
11b50 65 20 2d 20 43 69 70 68 65 72 20 69 73 20 41 45 e - Cipher is AE
11b60 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 AD (e.g. GCM or
11b70 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 ChaCha20/Poly130
11b80 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 5) or not */../*
11b90 20 41 75 74 68 65 6e 74 69 63 61 74 65 64 20 45 Authenticated E
11ba0 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61 ncryption with a
11bb0 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 20 28 ssociated data (
11bc0 41 45 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 AEAD) check */..
11bd0 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
11be0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 erp, objPtr, "ci
11bf0 70 68 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 pher_is_aead", S
11c00 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61 SL_CIPHER_is_aea
11c10 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a d(cipher));.../*
11c20 20 44 69 67 65 73 74 20 75 73 65 64 20 64 75 72 Digest used dur
11c30 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 ing the SSL/TLS
11c40 68 61 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75 handshake when u
11c50 73 69 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e sing the cipher.
11c60 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 */..md = SSL_CI
11c70 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 PHER_get_handsha
11c80 6b 65 5f 64 69 67 65 73 74 28 63 69 70 68 65 72 ke_digest(cipher
11c90 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
11ca0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11cb0 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 "handshake_diges
11cc0 74 22 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f t", (char *)EVP_
11cd0 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 MD_name(md), -1)
11ce0 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 ;.../* Get OpenS
11cf0 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 SL-specific ID,
11d00 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 not IANA ID */..
11d10 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
11d20 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 rp, objPtr, "cip
11d30 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 her_id", (int) S
11d40 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 SL_CIPHER_get_id
11d50 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 (cipher));.../*
11d60 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64 Two-byte ID used
11d70 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74 in the TLS prot
11d80 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65 ocol of the give
11d90 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 n cipher */..LAP
11da0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
11db0 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 objPtr, "protoc
11dc0 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 ol_id", (int) SS
11dd0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f L_CIPHER_get_pro
11de0 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 tocol_id(cipher)
11df0 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 );.../* Textual
11e00 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 description of t
11e10 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 69 66 he cipher */..if
11e20 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 (SSL_CIPHER_des
11e30 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c cription(cipher,
11e40 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 buf, sizeof(buf
11e50 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 )) != NULL) {..
11e60 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
11e70 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11e80 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 description", bu
11e90 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d f, -1);..}. }
11ea0 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e .. /* Session
11eb0 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 info */. ses
11ec0 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 sion = SSL_get_s
11ed0 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 ession(ssl);.
11ee0 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 if (session !=
11ef0 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 NULL) {..const u
11f00 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 nsigned char *ti
11f10 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 cket;..size_t le
11f20 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e n2;..unsigned in
11f30 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 t ulen;..const u
11f40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 nsigned char *se
11f50 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f ssion_id, *proto
11f60 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ;..unsigned char
11f70 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f buffer[SSL_MAX_
11f80 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 MASTER_KEY_LENGT
11f90 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 H];.../* Report
11fa0 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f the selected pro
11fb0 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c tocol as a resul
11fc0 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 t of the ALPN ne
11fd0 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 gotiation */..SS
11fe0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 L_SESSION_get0_a
11ff0 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 lpn_selected(ses
12000 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c sion, &proto, &l
12010 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 en2);..LAPPEND_S
12020 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
12030 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 r, "alpn", (char
12040 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f *) proto, (Tcl_
12050 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f Size) len2);.../
12060 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c * Report the sel
12070 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 ected protocol a
12080 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 s a result of th
12090 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f e NPN negotiatio
120a0 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f n */.#ifdef USE_
120b0 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 NPN..SSL_get0_ne
120c0 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 xt_proto_negotia
120d0 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c ted(ssl, &proto,
120e0 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e &ulen);..LAPPEN
120f0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
12100 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 jPtr, "npn", (ch
12110 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 ar *) proto, (Tc
12120 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 l_Size) ulen);.#
12130 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d endif.../* Resum
12140 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a able session */.
12150 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
12160 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 terp, objPtr, "r
12170 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 esumable", SSL_S
12180 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 ESSION_is_resuma
12190 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a ble(session));..
121a0 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 ./* Session star
121b0 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 t time (seconds
121c0 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a since epoch) */.
121d0 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e .LAPPEND_LONG(in
121e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
121f0 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f tart_time", SSL_
12200 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 SESSION_get_time
12210 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a (session));.../*
12220 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d Timeout value -
12230 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d SSL_CTX_get_tim
12240 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 eout (in seconds
12250 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f ) */..LAPPEND_LO
12260 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NG(interp, objPt
12270 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 r, "timeout", SS
12280 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
12290 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b meout(session));
122a0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 .../* Session id
122b0 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 - TLSv1.2 and b
122c0 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 elow only */..se
122d0 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 ssion_id = SSL_S
122e0 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 ESSION_get_id(se
122f0 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 ssion, &ulen);..
12300 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 LAPPEND_BARRAY(i
12310 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12320 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 session_id", ses
12330 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 sion_id, (Tcl_Si
12340 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 ze) ulen);.../*
12350 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 Session context
12360 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d */..session_id =
12370 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
12380 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 0_id_context(ses
12390 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c sion, &ulen);..L
123a0 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e APPEND_BARRAY(in
123b0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
123c0 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c ession_context",
123d0 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 session_id, (Tc
123e0 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a l_Size) ulen);..
123f0 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b ./* Session tick
12400 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 et - client only
12410 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e */..SSL_SESSION
12420 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 _get0_ticket(ses
12430 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 sion, &ticket, &
12440 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f len2);..LAPPEND_
12450 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f BARRAY(interp, o
12460 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f bjPtr, "session_
12470 74 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c ticket", ticket,
12480 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
12490 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
124a0 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 ticket lifetime
124b0 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 hint (in seconds
124c0 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f ) */..LAPPEND_LO
124d0 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NG(interp, objPt
124e0 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 r, "lifetime", S
124f0 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 SL_SESSION_get_t
12500 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 icket_lifetime_h
12510 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a int(session));..
12520 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 ./* Ticket app d
12530 61 74 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 ata */.#if OPENS
12540 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
12550 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
12560 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 .SSL_SESSION_get
12570 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61 0_ticket_appdata
12580 28 28 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 29 ((SSL_SESSION *)
12590 20 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 session, &ticke
125a0 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 t, &len2);..LAPP
125b0 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 END_BARRAY(inter
125c0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b p, objPtr, "tick
125d0 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 69 et_app_data", ti
125e0 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 cket, (Tcl_Size)
125f0 20 6c 65 6e 32 29 3b 0a 23 65 6e 64 69 66 0a 0a len2);.#endif..
12600 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b ./* Get master k
12610 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 ey */..len2 = SS
12620 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 L_SESSION_get_ma
12630 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e ster_key(session
12640 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 , buffer, SSL_MA
12650 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e X_MASTER_KEY_LEN
12660 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 GTH);..LAPPEND_B
12670 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 ARRAY(interp, ob
12680 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 jPtr, "master_ke
12690 79 22 2c 20 62 75 66 66 65 72 2c 20 28 54 63 6c y", buffer, (Tcl
126a0 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 _Size) len2);...
126b0 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 /* Compression i
126c0 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 d */..unsigned i
126d0 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 nt id = SSL_SESS
126e0 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 ION_get_compress
126f0 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c _id(session);..L
12700 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
12710 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 p, objPtr, "comp
12720 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 ression_id", id
12730 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 == 1 ? "zlib" :
12740 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 "none", -1);.
12750 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 }.. /* Compr
12760 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 ession info */.
12770 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 if (ssl != NU
12780 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 LL) {.#ifdef HAV
12790 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f E_SSL_COMPRESSIO
127a0 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 N..const COMP_ME
127b0 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 THOD *comp, *exp
127c0 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 n;..comp = SSL_g
127d0 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 et_current_compr
127e0 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 ession(ssl);..ex
127f0 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 pn = SSL_get_cur
12800 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 rent_expansion(s
12810 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 sl);...LAPPEND_S
12820 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
12830 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 r, "compression"
12840 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d , comp ? SSL_COM
12850 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 P_get_name(comp)
12860 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a : "none", -1);.
12870 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
12880 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 erp, objPtr, "ex
12890 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f pansion", expn ?
128a0 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 SSL_COMP_get_na
128b0 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 me(expn) : "none
128c0 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c ", -1);.#else..L
128d0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
128e0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 p, objPtr, "comp
128f0 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 ression", "none"
12900 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f , -1);..LAPPEND_
12910 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12920 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c tr, "expansion",
12930 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 "none", -1);.#e
12940 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ndif. }..
12950 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a /* Server info *
12960 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f /. {..long mo
12970 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 de = SSL_CTX_get
12980 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d _session_cache_m
12990 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ode(statePtr->ct
129a0 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a x);..char *msg;.
129b0 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c ..if (mode & SSL
129c0 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 _SESS_CACHE_OFF)
129d0 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f {.. msg = "o
129e0 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 ff";..} else if
129f0 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 (mode & SSL_SESS
12a00 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b _CACHE_CLIENT) {
12a10 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 .. msg = "cli
12a20 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 ent";..} else if
12a30 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 (mode & SSL_SES
12a40 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 S_CACHE_SERVER)
12a50 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65 {.. msg = "se
12a60 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 rver";..} else i
12a70 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 f (mode & SSL_SE
12a80 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b SS_CACHE_BOTH) {
12a90 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 .. msg = "bot
12aa0 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 h";..} else {..
12ab0 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 msg = "unknow
12ac0 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f n";..}..LAPPEND_
12ad0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12ae0 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 tr, "session_cac
12af0 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d he_mode", msg, -
12b00 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 1);. }.. /
12b10 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 * CA List */.
12b20 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72 /* IF not a ser
12b30 76 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c ver, same as SSL
12b40 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 _get0_peer_CA_li
12b50 73 74 2e 20 49 66 20 73 65 72 76 65 72 20 73 61 st. If server sa
12b60 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 me as SSL_CTX_ge
12b70 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 t_client_CA_list
12b80 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20 */. listPtr
12b90 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
12ba0 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 (0, NULL);. S
12bb0 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d TACK_OF(X509_NAM
12bc0 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 E) *ca_list;.
12bd0 20 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 if ((ca_list =
12be0 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 SSL_get_client_C
12bf0 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20 A_list(ssl)) !=
12c00 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 NULL) {..char bu
12c10 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 ffer[BUFSIZ];..f
12c20 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 or (int i = 0; i
12c30 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f < sk_X509_NAME_
12c40 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b num(ca_list); i+
12c50 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e +) {.. X509_N
12c60 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 AME *name = sk_X
12c70 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 509_NAME_value(c
12c80 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 a_list, i);..
12c90 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 if (name) {...X
12ca0 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 509_NAME_oneline
12cb0 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 (name, buffer, B
12cc0 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 UFSIZ);...Tcl_Li
12cd0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
12ce0 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 nt(interp, listP
12cf0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
12d00 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 gObj(buffer, -1)
12d10 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 );.. }..}.
12d20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f }. LAPPEND_O
12d30 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 BJ(interp, objPt
12d40 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 r, "caList", lis
12d50 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 tPtr);. LAPPE
12d60 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
12d70 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f bjPtr, "caListCo
12d80 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 unt", sk_X509_NA
12d90 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 ME_num(ca_list))
12da0 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 ;.. Tcl_SetOb
12db0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
12dc0 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 objPtr);. ret
12dd0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a urn TCL_OK;.}...
12de0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
12df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e20 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 --------. *. * V
12e30 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 ersionObjCmd --
12e40 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 return version s
12e50 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 tring from OpenS
12e60 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 SL.. *. * Result
12e70 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
12e80 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
12e90 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
12ea0 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ef0 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
12f00 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 t.VersionObjCmd(
12f10 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
12f20 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
12f30 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
12f40 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
12f50 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
12f60 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
12f70 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c r;. (void) cl
12f80 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 28 76 ientData;. (v
12f90 6f 69 64 29 20 6f 62 6a 63 3b 0a 20 20 20 20 28 oid) objc;. (
12fa0 76 6f 69 64 29 20 6f 62 6a 76 3b 0a 0a 20 20 20 void) objv;..
12fb0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
12fc0 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 ");.. objPtr
12fd0 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f = Tcl_NewStringO
12fe0 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 bj(OPENSSL_VERSI
12ff0 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 ON_TEXT, -1);.
13000 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
13010 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
13020 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
13030 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 TCL_OK;.}.../*.
13040 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
13050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13080 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f ----. *. * MiscO
13090 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f bjCmd -- misc co
130a0 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 mmands. *. * Res
130b0 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
130c0 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
130d0 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
130e0 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a ts:. *.None.. *.
130f0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
13100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13110 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
13140 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 int.MiscObjCmd(
13150 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
13160 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
13170 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
13180 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
13190 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
131a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 static const c
131b0 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d har *commands []
131c0 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 = { "req", "str
131d0 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 req", NULL };.
131e0 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b enum command {
131f0 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 C_REQ, C_STRREQ
13200 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 , C_DUMMY };.
13210 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 Tcl_Size cmd;.
13220 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 int isStr;.
13230 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 char buffer[16
13240 33 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29 384];. (void)
13250 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 clientData;..
13260 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
13270 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
13280 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 jc < 2) {..Tcl_W
13290 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
132a0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 rp, 1, objv, "su
132b0 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 bcommand ?args?"
132c0 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
132d0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
132e0 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 if (Tcl_GetIndex
132f0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
13300 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 objv[1], command
13310 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c s, "command", 0,
13320 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b &cmd) != TCL_OK
13330 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
13340 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
13350 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
13360 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 r();.. isStr
13370 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 = (cmd == C_STRR
13380 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 EQ);. switch
13390 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 ((enum command)
133a0 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 cmd) {..case C_R
133b0 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 EQ:..case C_STRR
133c0 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 EQ: {.. EVP_P
133d0 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a KEY *pkey=NULL;.
133e0 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d . X509 *cert=
133f0 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f NULL;.. X509_
13400 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b NAME *name=NULL;
13410 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a .. Tcl_Obj **
13420 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f listv;.. Tcl_
13430 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20 20 Size listc;..
13440 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42 49 int i;... BI
13450 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 O *out=NULL;...
13460 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c char *k_C="",
13470 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 *k_ST="",*k_L=""
13480 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 ,*k_O="",*k_OU="
13490 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d ",*k_CN="",*k_Em
134a0 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 ail="";.. cha
134b0 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 r *keyout,*pemou
134c0 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 t,*str;.. int
134d0 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d keysize,serial=
134e0 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 0,days=365;..#if
134f0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
13500 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
13510 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 0000L.. BIGNU
13520 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 M *bne = NULL;..
13530 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e RSA *rsa = N
13540 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ULL;.#else..
13550 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 EVP_PKEY_CTX *ct
13560 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 x = NULL;.#endif
13570 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 ... if ((objc
13580 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 <5) || (objc>6))
13590 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 {...Tcl_WrongNu
135a0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c mArgs(interp, 2,
135b0 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 objv, "keysize
135c0 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 keyfile certfile
135d0 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 ?info?");...ret
135e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
135f0 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 }... if (
13600 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 Tcl_GetIntFromOb
13610 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 j(interp, objv[2
13620 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 ], &keysize) !=
13630 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 TCL_OK) {...retu
13640 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
13650 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 }.. keyout
13660 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f =Tcl_GetString(o
13670 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 bjv[3]);.. pe
13680 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 mout=Tcl_GetStri
13690 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 ng(objv[4]);..
136a0 20 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 if (isStr) {..
136b0 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 .Tcl_SetVar(inte
136c0 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b rp,keyout,"",0);
136d0 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e ...Tcl_SetVar(in
136e0 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 terp,pemout,"",0
136f0 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 );.. }...
13700 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 if (objc>=6) {..
13710 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a .if (Tcl_ListObj
13720 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 GetElements(inte
13730 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 rp, objv[5], &li
13740 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 stc, &listv) !=
13750 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 TCL_OK) {...
13760 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
13770 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 ;...}....if ((li
13780 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 stc%2) != 0) {..
13790 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 . Tcl_SetResu
137a0 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 lt(interp,"Infor
137b0 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 mation list must
137c0 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 have even numbe
137d0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c r of arguments",
137e0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 NULL);... ret
137f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
13800 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 .}...for (i=0; i
13810 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a <listc; i+=2) {.
13820 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 .. str=Tcl_Ge
13830 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d tString(listv[i]
13840 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 );... if (str
13850 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d cmp(str,"days")=
13860 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c =0) {....if (Tcl
13870 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 _GetIntFromObj(i
13880 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d nterp,listv[i+1]
13890 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 ,&days)!=TCL_OK)
138a0 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 .... return T
138b0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 CL_ERROR;...
138c0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
138d0 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d p(str,"serial")=
138e0 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c =0) {....if (Tcl
138f0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 _GetIntFromObj(i
13900 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d nterp,listv[i+1]
13910 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f ,&serial)!=TCL_O
13920 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e K).... return
13930 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 TCL_ERROR;...
13940 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
13950 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 cmp(str,"C")==0)
13960 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 {....k_C=Tcl_Ge
13970 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
13980 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
13990 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
139a0 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 ,"ST")==0) {....
139b0 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 k_ST=Tcl_GetStri
139c0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
139d0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
139e0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 (strcmp(str,"L")
139f0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 ==0) {....k_L=Tc
13a00 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
13a10 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
13a20 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
13a30 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a (str,"O")==0) {.
13a40 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 ...k_O=Tcl_GetSt
13a50 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
13a60 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
13a70 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f f (strcmp(str,"O
13a80 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f U")==0) {....k_O
13a90 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 U=Tcl_GetString(
13aa0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
13ab0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
13ac0 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d rcmp(str,"CN")==
13ad0 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 0) {....k_CN=Tcl
13ae0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
13af0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
13b00 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
13b10 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 str,"Email")==0)
13b20 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 {....k_Email=Tc
13b30 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
13b40 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
13b50 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 else {....Tcl_S
13b60 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
13b70 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 "Unknown paramet
13b80 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 er",NULL);....re
13b90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
13ba0 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 .. }...}..
13bb0 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f }..#if OPENSSL_
13bc0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
13bd0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 0x30000000L..
13be0 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 bne = BN_new()
13bf0 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 ;.. rsa = RSA
13c00 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 _new();.. pke
13c10 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 y = EVP_PKEY_new
13c20 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 ();.. if (bne
13c30 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 == NULL || rsa
13c40 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 == NULL || pkey
13c50 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 == NULL || !BN_s
13c60 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f et_word(bne,RSA_
13c70 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 F4) ||...!RSA_ge
13c80 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 nerate_key_ex(rs
13c90 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c a, keysize, bne,
13ca0 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 NULL) || !EVP_P
13cb0 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 KEY_assign_RSA(p
13cc0 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 key, rsa)) {...E
13cd0 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 VP_PKEY_free(pke
13ce0 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 y);.../* RSA_fre
13cf0 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 e(rsa); freed by
13d00 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a EVP_PKEY_free *
13d10 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 /...BN_free(bne)
13d20 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 ;.#else.. pke
13d30 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 y = EVP_RSA_gen(
13d40 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b (unsigned int) k
13d50 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 eysize);.. ct
13d60 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 x = EVP_PKEY_CTX
13d70 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b _new(pkey,NULL);
13d80 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d .. if (pkey =
13d90 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d = NULL || ctx ==
13da0 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b NULL || !EVP_PK
13db0 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 EY_keygen_init(c
13dc0 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b tx) ||...!EVP_PK
13dd0 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b EY_CTX_set_rsa_k
13de0 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 eygen_bits(ctx,
13df0 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 keysize) || !EVP
13e00 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 _PKEY_keygen(ctx
13e10 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 , &pkey)) {...EV
13e20 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 P_PKEY_free(pkey
13e30 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 );...EVP_PKEY_CT
13e40 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e X_free(ctx);.#en
13e50 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 dif...Tcl_SetRes
13e60 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f ult(interp,"Erro
13e70 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 r generating pri
13e80 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b vate key",NULL);
13e90 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
13ea0 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 ROR;.. } else
13eb0 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 {...if (isStr)
13ec0 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f {... out=BIO_
13ed0 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 new(BIO_s_mem())
13ee0 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 ;... PEM_writ
13ef0 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 e_bio_PrivateKey
13f00 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e (out,pkey,NULL,N
13f10 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 ULL,0,NULL,NULL)
13f20 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 ;... i=BIO_re
13f30 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 ad(out,buffer,si
13f40 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b zeof(buffer)-1);
13f50 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f ... i=(i<0) ?
13f60 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 0 : i;... bu
13f70 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 ffer[i]='\0';...
13f80 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 Tcl_SetVar(i
13f90 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 nterp,keyout,buf
13fa0 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 fer,0);... BI
13fb0 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 O_flush(out);...
13fc0 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 BIO_free(out
13fd0 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 );...} else {...
13fe0 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 out=BIO_new(
13ff0 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 BIO_s_file());..
14000 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 . BIO_write_f
14010 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f ilename(out,keyo
14020 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ut);... PEM_w
14030 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 rite_bio_Private
14040 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c Key(out,pkey,NUL
14050 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 L,NULL,0,NULL,NU
14060 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 LL);... /* PE
14070 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 M_write_bio_RSAP
14080 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 rivateKey(out, r
14090 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 sa, NULL, NULL,
140a0 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 0, NULL, NULL);
140b0 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 */... BIO_fre
140c0 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d e_all(out);.. .}
140d0 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 ....if ((cert=X5
140e0 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 09_new())==NULL)
140f0 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 {... Tcl_Set
14100 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 Result(interp,"E
14110 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 rror generating
14120 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75 certificate requ
14130 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 est",NULL);...
14140 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 EVP_PKEY_free(
14150 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 pkey);.#if OPENS
14160 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
14170 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
14180 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e .. BN_free(bn
14190 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 e);.#endif...
141a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
141b0 52 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 R;...}....X509_s
141c0 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c et_version(cert,
141d0 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 2);...ASN1_INTEG
141e0 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f ER_set(X509_get_
141f0 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 serialNumber(cer
14200 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 t),serial);...X5
14210 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 09_gmtime_adj(X5
14220 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 09_getm_notBefor
14230 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 e(cert),0);...X5
14240 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 09_gmtime_adj(X5
14250 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 09_getm_notAfter
14260 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a (cert),(long)60*
14270 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 60*24*days);...X
14280 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 509_set_pubkey(c
14290 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 ert,pkey);....na
142a0 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a me=X509_get_subj
142b0 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a ect_name(cert);.
142c0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
142d0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
142e0 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 me,"C", MBSTRING
142f0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
14300 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
14310 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 C, -1, -1, 0);..
14320 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
14330 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
14340 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f ,"ST", MBSTRING_
14350 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
14360 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 gned char *) k_S
14370 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 T, -1, -1, 0);..
14380 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
14390 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
143a0 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 ,"L", MBSTRING_A
143b0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
143c0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c ned char *) k_L,
143d0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
143e0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
143f0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
14400 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 O", MBSTRING_ASC
14410 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
14420 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d d char *) k_O, -
14430 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
14440 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
14450 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 _by_txt(name,"OU
14460 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
14470 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
14480 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d char *) k_OU, -
14490 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
144a0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
144b0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e _by_txt(name,"CN
144c0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
144d0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
144e0 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d char *) k_CN, -
144f0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
14500 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
14510 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d _by_txt(name,"Em
14520 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 ail", MBSTRING_A
14530 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
14540 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d ned char *) k_Em
14550 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b ail, -1, -1, 0);
14560 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 ....X509_set_sub
14570 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e ject_name(cert,n
14580 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 ame);....if (!X5
14590 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 09_sign(cert,pke
145a0 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 y,EVP_sha256()))
145b0 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 {... X509_fr
145c0 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 ee(cert);...
145d0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
145e0 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c ey);.#if OPENSSL
145f0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
14600 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 < 0x30000000L...
14610 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 BN_free(bne)
14620 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 ;.#endif... T
14630 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
14640 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 erp,"Error signi
14650 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c ng certificate",
14660 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 NULL);... ret
14670 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
14680 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 .}....if (isStr)
14690 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
146a0 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 _new(BIO_s_mem()
146b0 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 );... PEM_wri
146c0 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c te_bio_X509(out,
146d0 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 cert);... i=B
146e0 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 IO_read(out,buff
146f0 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 er,sizeof(buffer
14700 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 )-1);... i=(i
14710 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 <0) ? 0 : i;...
14720 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 buffer[i]='\0
14730 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 ';... Tcl_Set
14740 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 Var(interp,pemou
14750 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 t,buffer,0);...
14760 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 BIO_flush(out
14770 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
14780 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 e(out);...} else
14790 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
147a0 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 _new(BIO_s_file(
147b0 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 ));... BIO_wr
147c0 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 ite_filename(out
147d0 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 ,pemout);...
147e0 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 PEM_write_bio_X5
147f0 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 09(out,cert);...
14800 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c BIO_free_all
14810 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 (out);...}....X5
14820 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09_free(cert);..
14830 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 .EVP_PKEY_free(p
14840 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 key);.#if OPENSS
14850 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
14860 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
14870 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 .BN_free(bne);.#
14880 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a endif.. }..}.
14890 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 .break;. defa
148a0 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 ult:..break;.
148b0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 }. return TC
148c0 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a L_OK;.}.../*****
148d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
148e0 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 ./* Init
148f0 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a */./*******
14900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
14910 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
14920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14950 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
14960 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a ls_Free --. *. *
14970 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
14980 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 cleans up when a
14990 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
149a0 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 d channel. *.is
149b0 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 closed and its r
149c0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 eference count f
149d0 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a alls below 1. *.
149e0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e * Results:. *.n
149f0 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
14a00 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 ffects:. *.Frees
14a10 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 all the state.
14a20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
14a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a60 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
14a70 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20 2a .Tls_Free(char *
14a80 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 blockPtr) {.
14a90 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
14aa0 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b = (State *)block
14ab0 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 Ptr;.. dprint
14ac0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
14ad0 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 Tls_Clean(stat
14ae0 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 ePtr);. ckfre
14af0 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c e(blockPtr);.}..
14b00 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
14b50 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a Tls_Clean --. *.
14b60 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
14b70 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e e cleans up when
14b80 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
14b90 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 sed channel. *.i
14ba0 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 s closed and its
14bb0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 reference count
14bc0 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 falls below 1.
14bd0 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 This should. *.
14be0 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 be called synchr
14bf0 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 onously by the C
14c00 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e loseProc, not in
14c10 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c the. *.Eventual
14c20 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e lyFree callback.
14c30 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
14c40 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.none. *. * Si
14c50 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 de effects:. *.F
14c60 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 rees all the sta
14c70 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d te. *. *--------
14c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
14cc0 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 void Tls_Clean(S
14cd0 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 tate *statePtr)
14ce0 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 {. dprintf("C
14cf0 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a alled");.. /*
14d00 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 . * we're as
14d10 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 suming here that
14d20 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 we're single-th
14d30 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 readed. */.
14d40 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
14d50 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 >timer != (Tcl_T
14d60 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 imerToken) NULL)
14d70 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 {..Tcl_DeleteTi
14d80 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 merHandler(state
14d90 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 Ptr->timer);..st
14da0 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 atePtr->timer =
14db0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
14dc0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
14dd0 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 rotos) {..ckfree
14de0 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
14df0 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 s);..statePtr->p
14e00 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 rotos = NULL;.
14e10 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
14e20 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a ePtr->bio) {../*
14e30 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 This will call
14e40 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 SSL_shutdown. Bu
14e50 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 g 1414045 */..dp
14e60 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f rintf("BIO_free_
14e70 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 all(%p)", stateP
14e80 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 tr->bio);..BIO_f
14e90 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 ree_all(statePtr
14ea0 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 ->bio);..statePt
14eb0 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 r->bio = NULL;.
14ec0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
14ed0 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 tePtr->ssl) {..d
14ee0 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 printf("SSL_free
14ef0 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d (%p)", statePtr-
14f00 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 >ssl);..SSL_free
14f10 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
14f20 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 ..statePtr->ssl
14f30 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
14f40 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
14f50 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f ctx) {..SSL_CTX_
14f60 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 free(statePtr->c
14f70 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e tx);..statePtr->
14f80 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ctx = NULL;.
14f90 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
14fa0 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a tr->callback) {.
14fb0 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
14fc0 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c t(statePtr->call
14fd0 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 back);..statePtr
14fe0 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c ->callback = NUL
14ff0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
15000 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 (statePtr->passw
15010 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 ord) {..Tcl_Decr
15020 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
15030 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 r->password);..s
15040 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
15050 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a d = NULL;. }.
15060 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
15070 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 ->vcmd) {..Tcl_D
15080 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ecrRefCount(stat
15090 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 ePtr->vcmd);..st
150a0 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e atePtr->vcmd = N
150b0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
150c0 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
150d0 6e 67 22 29 3b 0a 7d 0a 0c 0a 23 69 66 20 54 43 ng");.}...#if TC
150e0 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MAJOR_VERSION
150f0 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f > 8.#define MIN_
15100 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23 65 VERSION "9.0".#e
15110 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f lse.#define MIN_
15120 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23 65 VERSION "8.5".#e
15130 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ndif../*. *-----
15140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
15180 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d *. * Tls_Init --
15190 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 . *. *.This is a
151a0 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c package initial
151b0 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 ization procedur
151c0 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c e, which is call
151d0 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 ed. *.by Tcl whe
151e0 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 n this package i
151f0 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f s to be added to
15200 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e an interpreter.
15210 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 . *. * Results:
15220 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 Ssl configured
15230 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a and loaded. *. *
15240 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
15250 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73 *. create the ss
15260 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 l command, initi
15270 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 alize ssl contex
15280 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d t. *. *---------
15290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
152a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
152b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
152c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 ----------. */.D
152d0 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 LLEXPORT int Tls
152e0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 _Init(Tcl_Interp
152f0 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 *interp) {.
15300 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 const char tlsTc
15310 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 lInitScript[] =
15320 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e {.#include "tls.
15330 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 tcl.h"..0x00.
15340 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 };.. dprintf
15350 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 ("Called");..#if
15360 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 def USE_TCL_STUB
15370 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e S. if (Tcl_In
15380 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 itStubs(interp,
15390 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 MIN_VERSION, 0)
153a0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
153b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
153c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 }.#endif. i
153d0 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 f (Tcl_PkgRequir
153e0 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c e(interp, "Tcl",
153f0 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 MIN_VERSION, 0)
15400 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
15410 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
15420 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c }.. if (Tl
15430 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 sLibInit(0) != T
15440 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 CL_OK) {..Tcl_Ap
15450 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
15460 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e p, "could not in
15470 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 itialize SSL lib
15480 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29 20 rary", (char *)
15490 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
154a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
154b0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
154c0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
154d0 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 , "tls::ciphers"
154e0 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c , CiphersObjCmd,
154f0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
15500 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
15510 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
15520 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
15530 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
15540 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 , "tls::connecti
15550 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 on", ConnectionI
15560 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 nfoObjCmd, (Clie
15570 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
15580 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
15590 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
155a0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
155b0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
155c0 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 ::handshake", Ha
155d0 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 ndshakeObjCmd, (
155e0 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
155f0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
15600 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
15610 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
15620 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
15630 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 "tls::import", I
15640 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c mportObjCmd, (Cl
15650 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
15660 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
15670 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
15680 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
15690 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
156a0 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 ls::unimport", U
156b0 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 nimportObjCmd, (
156c0 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
156d0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
156e0 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
156f0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
15700 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
15710 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 "tls::status", S
15720 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c tatusObjCmd, (Cl
15730 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
15740 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
15750 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
15760 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
15770 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
15780 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 ls::version", Ve
15790 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c rsionObjCmd, (Cl
157a0 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
157b0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
157c0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
157d0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
157e0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
157f0 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f ls::misc", MiscO
15800 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
15810 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 ta) NULL, (Tcl_C
15820 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
15830 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
15840 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
15850 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 interp, "tls::pr
15860 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 otocols", Protoc
15870 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 olsObjCmd, (Clie
15880 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
15890 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
158a0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 *) NULL);..
158b0 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 if (interp) {..T
158c0 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 cl_Eval(interp,
158d0 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 tlsTclInitScript
158e0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 );. }.. re
158f0 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 turn Tcl_PkgProv
15900 69 64 65 28 69 6e 74 65 72 70 2c 20 50 41 43 4b ide(interp, PACK
15910 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47 AGE_NAME, PACKAG
15920 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f E_VERSION);.}../
15930 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
15940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 ----------*. *.
15970 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d *.Tls_SafeInit -
15980 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d -. *. *.--------
15990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159b0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 --------*. *.Sta
159c0 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 ndard procedure
159d0 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 required by 'loa
159e0 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a d'.. *.Initializ
159f0 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f es this extensio
15a00 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74 n for a safe int
15a10 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d erpreter.. *.---
15a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
15a50 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 *. *.Side effect
15a60 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c s:. *..As of 'Tl
15a70 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 s_Init'. *. *.Re
15a80 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e sult:. *..A stan
15a90 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 dard Tcl error c
15aa0 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ode.. *. *------
15ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ae0 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 *. */.DLLEXPORT
15af0 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 int Tls_SafeInit
15b00 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
15b10 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e erp) {. dprin
15b20 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 tf("Called");.
15b30 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 49 6e 69 return Tls_Ini
15b40 74 28 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a 2f 2a t(interp);.}../*
15b50 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
15b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a ---------*. *. *
15b90 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 .TlsLibInit --.
15ba0 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *.-----------
15bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15bd0 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 -----*. *.Initia
15be0 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 lizes SSL librar
15bf0 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 y once per appli
15c00 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d cation. *.------
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 2a 0a 20 2a 0a 20 ----------*. *.
15c40 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a *.Side effects:.
15c50 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 20 *..initializes
15c60 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 SSL library. *.
15c70 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f *.Result:. *..no
15c80 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ne. *. *--------
15c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
15cc0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 */.static int T
15cd0 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e lsLibInit(int un
15ce0 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 initialize) {.
15cf0 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 static int ini
15d00 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 tialized = 0;.
15d10 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20 54 int status = T
15d20 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e CL_OK;.#if defin
15d30 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
15d40 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
15d50 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 CL_THREADS).
15d60 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 size_t num_locks
15d70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 ;.#endif.. if
15d80 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 (uninitialize)
15d90 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 61 6c 69 {..if (!initiali
15da0 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 70 72 69 zed) {.. dpri
15db0 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e ntf("Asked to un
15dc0 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 initialize, but
15dd0 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 we are not initi
15de0 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20 20 20 alized");...
15df0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
15e00 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 41 73 6b }...dprintf("Ask
15e10 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 ed to uninitiali
15e20 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e ze");..#if defin
15e30 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
15e40 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
15e50 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c CL_THREADS)..Tcl
15e60 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 _MutexLock(&init
15e70 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b _mx);...if (lock
15e80 73 29 20 7b 0a 09 20 20 20 20 66 72 65 65 28 6c s) {.. free(l
15e90 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f 63 6b ocks);.. lock
15ea0 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c s = NULL;.. l
15eb0 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 ocksCount = 0;..
15ec0 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 69 61 }.#endif..initia
15ed0 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20 lized = 0;..#if
15ee0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
15ef0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
15f00 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
15f10 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 ..Tcl_MutexUnloc
15f20 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e k(&init_mx);.#en
15f30 64 69 66 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c dif...return TCL
15f40 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 _OK;. }..
15f50 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 if (initialized)
15f60 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c {..dprintf("Cal
15f70 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67 20 63 led, but using c
15f80 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b 0a 09 ached value");..
15f90 72 65 74 75 72 6e 20 73 74 61 74 75 73 3b 0a 20 return status;.
15fa0 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
15fb0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 f("Called");..#i
15fc0 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 f defined(OPENSS
15fd0 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 L_THREADS) && de
15fe0 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 fined(TCL_THREAD
15ff0 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 S). Tcl_Mutex
16000 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a Lock(&init_mx);.
16010 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 69 #endif. initi
16020 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 alized = 1;..#if
16030 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
16040 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
16050 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
16060 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 ). num_locks
16070 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f = 1;. locksCo
16080 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f unt = (int) num_
16090 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 locks;. locks
160a0 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 = malloc(sizeof
160b0 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c (*locks) * num_l
160c0 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 ocks);. memse
160d0 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 t(locks, 0, size
160e0 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d of(*locks) * num
160f0 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a _locks);.#endif.
16100 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 . /* Initiali
16110 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70 74 ze BOTH libcrypt
16120 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f o and libssl. */
16130 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 . OPENSSL_ini
16140 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e t_ssl(OPENSSL_IN
16150 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 IT_LOAD_SSL_STRI
16160 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e NGS | OPENSSL_IN
16170 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 IT_LOAD_CRYPTO_S
16180 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 TRINGS..| OPENSS
16190 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 L_INIT_ADD_ALL_C
161a0 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c IPHERS | OPENSSL
161b0 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 _INIT_ADD_ALL_DI
161c0 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 GESTS, NULL);..
161d0 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e BIO_new_tcl(N
161e0 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a ULL, 0);..#if 0.
161f0 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 /*. * XX
16200 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 X:TODO: Remove t
16210 68 69 73 20 63 6f 64 65 20 61 6e 64 20 72 65 70 his code and rep
16220 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 20 63 lace it with a c
16230 68 65 63 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 heck. * for
16240 65 6e 6f 75 67 68 20 65 6e 74 72 6f 70 79 20 61 enough entropy a
16250 6e 64 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f nd do not try to
16260 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a create our own.
16270 20 20 20 20 20 2a 20 74 65 72 72 69 62 6c 65 20 * terrible
16280 65 6e 74 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a entropy. */.
16290 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 /*. * Se
162a0 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 ed the random nu
162b0 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 mber generator i
162c0 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 n the SSL librar
162d0 79 2c 0a 20 20 20 20 20 2a 20 75 73 69 6e 67 20 y,. * using
162e0 74 68 65 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e the do/while con
162f0 73 74 72 75 63 74 20 62 65 63 61 75 73 65 20 6f struct because o
16300 66 20 74 68 65 20 62 75 67 20 6e 6f 74 65 20 69 f the bug note i
16310 6e 20 74 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 n the. * Ope
16320 6e 53 53 4c 20 46 41 51 20 61 74 20 68 74 74 70 nSSL FAQ at http
16330 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f ://www.openssl.o
16340 72 67 2f 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 rg/support/faq.h
16350 74 6d 6c 23 55 53 45 52 31 0a 20 20 20 20 20 2a tml#USER1. *
16360 0a 20 20 20 20 20 2a 20 54 68 65 20 63 72 75 78 . * The crux
16370 20 6f 66 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 of the problem
16380 69 73 20 74 68 61 74 20 53 6f 6c 61 72 69 73 20 is that Solaris
16390 37 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 7 does not have
163a0 61 0a 20 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 a. * /dev/ra
163b0 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 ndom or /dev/ura
163c0 6e 64 6f 6d 20 64 65 76 69 63 65 20 73 6f 20 69 ndom device so i
163d0 74 20 63 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 t cannot gather
163e0 65 6e 6f 75 67 68 0a 20 20 20 20 20 2a 20 65 6e enough. * en
163f0 74 72 6f 70 79 20 66 72 6f 6d 20 74 68 65 20 52 tropy from the R
16400 41 4e 44 5f 73 65 65 64 28 29 20 77 68 65 6e 20 AND_seed() when
16410 54 4c 53 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 TLS initializes
16420 61 6e 64 20 72 65 66 75 73 65 73 0a 20 20 20 20 and refuses.
16430 20 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 * to go further
16440 2e 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f . Earlier versio
16450 6e 73 20 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 ns of OpenSSL ca
16460 72 72 69 65 64 20 6f 6e 20 72 65 67 61 72 64 6c rried on regardl
16470 65 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 ess.. */.
16480 20 73 72 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 srand((unsigned
16490 20 69 6e 74 29 20 74 69 6d 65 28 28 74 69 6d 65 int) time((time
164a0 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 _t *) NULL));.
164b0 20 20 64 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d do {..for (i =
164c0 20 30 3b 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 0; i < 16; i++)
164d0 20 7b 0a 09 20 20 20 20 72 6e 64 5f 73 65 65 64 {.. rnd_seed
164e0 5b 69 5d 20 3d 20 31 20 2b 20 28 63 68 61 72 29 [i] = 1 + (char)
164f0 20 28 32 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 (255.0 * rand()
16500 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 /(RAND_MAX+1.0))
16510 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 ;..}..RAND_seed(
16520 72 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 rnd_seed, sizeof
16530 28 72 6e 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 (rnd_seed));.
16540 20 7d 20 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 } while (RAND_s
16550 74 61 74 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 tatus() != 1);.#
16560 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e endif..#if defin
16570 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
16580 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
16590 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c CL_THREADS)..Tcl
165a0 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e _MutexUnlock(&in
165b0 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a it_mx);.#endif..
165c0 20 20 20 20 72 65 74 75 72 6e 20 73 74 61 74 75 return statu
165d0 73 3b 0a 7d 0a s;.}.