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 28 6f 6b 29 3b 09 2f 2a return(ok);./*
2f90: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 61 By default, lea
2fa0: 76 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 ve verification
2fb0: 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a unchanged. */.}.
2fc0: 0c 0a 2f 2a 0a 20 2a 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 2d 0a 20 2a 0a 20 2a ----------. *. *
3010: 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a Tls_Error --. *
3020: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
3030: 63 6b 20 77 69 74 68 20 6c 69 73 74 20 6f 66 20 ck with list of
3040: 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 errors.. *. * Si
3050: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 de effects:. *.T
3060: 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 he err field of
3070: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 the currently op
3080: 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73 erative State is
3090: 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 set. *. to a s
30a0: 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 tring describing
30b0: 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 the SSL negotia
30c0: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 tion failure rea
30d0: 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d son. *. *-------
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 2d 0a 20 2a 2f ------------. */
3120: 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 .void.Tls_Error(
3130: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c State *statePtr,
3140: 20 63 68 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 char *msg) {.
3150: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
3160: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
3170: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
3180: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c _Obj *cmdPtr, *l
3190: 69 73 74 50 74 72 3b 0a 20 20 20 20 75 6e 73 69 istPtr;. unsi
31a0: 67 6e 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 gned long err;.
31b0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 statePtr->err
31c0: 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72 = msg;.. dpr
31d0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
31e0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
31f0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 r->callback == (
3200: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 Tcl_Obj*)NULL)..
3210: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 return;.. /*
3220: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
3230: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
3240: 63 68 61 6e 2c 20 61 6e 64 20 6d 65 73 73 61 67 chan, and messag
3250: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d e args */. cm
3260: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
3270: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
3280: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 ->callback);.
3290: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
32a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
32b0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
32c0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f wStringObj("erro
32d0: 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 r", -1));. Tc
32e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
32f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
3300: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
3310: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
3320: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
3330: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
3340: 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6d -1));. if (m
3350: 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 sg != NULL) {..T
3360: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3370: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
3380: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
3390: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 tringObj(msg, -1
33a0: 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 ));.. } else
33b0: 69 66 20 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47 if ((msg = Tcl_G
33c0: 65 74 53 74 72 69 6e 67 28 54 63 6c 5f 47 65 74 etString(Tcl_Get
33d0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
33e0: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ))) != NULL) {..
33f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
3400: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
3410: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
3420: 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d StringObj(msg, -
3430: 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 1));.. } else
3440: 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63 {..listPtr = Tc
3450: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
3460: 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 NULL);..while ((
3470: 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 err = ERR_get_er
3480: 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 ror()) != 0) {..
3490: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
34a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
34b0: 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 erp, listPtr, Tc
34c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 l_NewStringObj(E
34d0: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f RR_reason_error_
34e0: 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 string(err), -1)
34f0: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f );..}..Tcl_ListO
3500: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3510: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
3520: 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a listPtr);. }.
3530: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
3540: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
3550: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
3560: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
3570: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 EvalCallback(
3580: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
3590: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 , cmdPtr);. T
35a0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
35b0: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a cmdPtr);.}.../*.
35c0: 20 2a 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 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c -----. *. * KeyL
3610: 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a ogCallback --. *
3620: 0a 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 . *.Write receiv
3630: 65 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c ed key data to l
3640: 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 og file.. *. * S
3650: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
3660: 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d none. *. *------
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 2d 0a 20 2a -------------. *
36b0: 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c /.void KeyLogCal
36c0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 lback(const SSL
36d0: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 *ssl, const char
36e0: 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 *line) {. ch
36f0: 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 ar *str = getenv
3700: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b (SSLKEYLOGFILE);
3710: 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a . FILE *fd;..
3720: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
3730: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
3740: 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 str) {..fd = fop
3750: 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 en(str, "a");..f
3760: 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e printf(fd, "%s\n
3770: 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 ",line);..fclose
3780: 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a (fd);. }.}...
3790: 2f 2a 0a 20 2a 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 2d 0a 20 2a 0a 20 2a 20 50 --------. *. * P
37e0: 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b assword Callback
37f0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 --. *. *.Called
3800: 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 when a password
3810: 20 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b for a private k
3820: 65 79 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 69 ey loading/stori
3830: 6e 67 20 61 20 50 45 4d 0a 20 2a 09 63 65 72 74 ng a PEM. *.cert
3840: 69 66 69 63 61 74 65 20 77 69 74 68 20 65 6e 63 ificate with enc
3850: 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 ryption. Evals c
3860: 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 61 allback script a
3870: 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a 09 74 68 nd returns. *.th
3880: 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 e result as the
3890: 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 password string
38a0: 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 in buf.. *. * Re
38b0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 sults:. *.None.
38c0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
38d0: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c s:. *.Calls call
38e0: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 back (if defined
38f0: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a ). *. * Returns:
3900: 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69 7a . *.Password siz
3910: 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 e in bytes or -1
3920: 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 for an error..
3930: 2a 0a 20 2a 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 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
3980: 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 ic int.PasswordC
3990: 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 allback(char *bu
39a0: 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 f, int size, int
39b0: 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 rwflag, void *u
39c0: 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 data) {. Stat
39d0: 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 e *statePtr.= (S
39e0: 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 tate *) udata;.
39f0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
3a00: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
3a10: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 ->interp;. Tc
3a20: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
3a30: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 int code;..
3a40: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
3a50: 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 d");.. /* If
3a60: 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 no callback, use
3a70: 20 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 default callbac
3a80: 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 k */. if (sta
3a90: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 tePtr->password
3aa0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 == NULL) {..if (
3ab0: 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 Tcl_EvalEx(inter
3ac0: 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 p, "tls::passwor
3ad0: 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c d", -1, TCL_EVAL
3ae0: 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f _GLOBAL) == TCL_
3af0: 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 OK) {.. char
3b00: 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 *ret = (char *)
3b10: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 Tcl_GetStringRes
3b20: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 ult(interp);..
3b30: 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 strncpy(buf, r
3b40: 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a et, (size_t) siz
3b50: 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 e);.. return
3b60: 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 (int)strlen(ret)
3b70: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ;..} else {..
3b80: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 return -1;..}.
3b90: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
3ba0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
3bb0: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 72 77 66 val with fn, rwf
3bc0: 6c 61 67 2c 20 61 6e 64 20 73 69 7a 65 20 61 72 lag, and size ar
3bd0: 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 gs */. cmdPtr
3be0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
3bf0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 Obj(statePtr->pa
3c00: 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 6c ssword);. Tcl
3c10: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3c20: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3c30: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
3c40: 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 64 ingObj("password
3c50: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
3c60: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3c70: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3c80: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 dPtr, Tcl_NewInt
3c90: 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 20 Obj(rwflag));.
3ca0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
3cb0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
3cc0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
3cd0: 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 3b ewIntObj(size));
3ce0: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 .. Tcl_Preser
3cf0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
3d00: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c interp);. Tcl
3d10: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
3d20: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
3d30: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
3d40: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
3d50: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 */. Tcl_IncrR
3d60: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
3d70: 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f . code = Tcl_
3d80: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 EvalObjEx(interp
3d90: 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 , cmdPtr, TCL_EV
3da0: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 AL_GLOBAL);.
3db0: 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f if (code != TCL_
3dc0: 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d OK) {.#if (TCL_M
3dd0: 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 AJOR_VERSION ==
3de0: 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 8) && (TCL_MINOR
3df0: 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 _VERSION < 6)..T
3e00: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 cl_BackgroundErr
3e10: 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 or(interp);.#els
3e20: 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e e..Tcl_Backgroun
3e30: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 dException(inter
3e40: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 p, code);.#endif
3e50: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 . }. Tcl_D
3e60: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ecrRefCount(cmdP
3e70: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 tr);.. Tcl_Re
3e80: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 lease((ClientDat
3e90: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 a) statePtr);..
3ea0: 20 20 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73 /* If success
3eb0: 66 75 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70 ful, pass back p
3ec0: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61 assword string a
3ed0: 6e 64 20 74 72 75 6e 63 61 74 65 20 69 66 20 74 nd truncate if t
3ee0: 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 oo long */. i
3ef0: 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f f (code == TCL_O
3f00: 4b 29 20 7b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c K) {..Tcl_Size l
3f10: 65 6e 3b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d en;..char *ret =
3f20: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 (char *) Tcl_Ge
3f30: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 tStringFromObj(T
3f40: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_GetObjResult(
3f50: 69 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a interp), &len);.
3f60: 09 69 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f .if (len > (Tcl_
3f70: 53 69 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a Size) size-1) {.
3f80: 09 20 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f . len = (Tcl_
3f90: 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d Size) size-1;..}
3fa0: 0a 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 ..strncpy(buf, r
3fb0: 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e et, (size_t) len
3fc0: 29 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 );..buf[len] = '
3fd0: 5c 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 \0';..Tcl_Releas
3fe0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
3ff0: 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28 nterp);..return(
4000: 28 69 6e 74 29 20 6c 65 6e 29 3b 0a 20 20 20 20 (int) len);.
4010: 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 }. Tcl_Releas
4020: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 e((ClientData) i
4030: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 nterp);. retu
4040: 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a rn -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 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f ---. *. * Sessio
40a0: 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 n Callback for C
40b0: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 lients --. *. *.
40c0: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 Called when a ne
40d0: 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64 w session is add
40e0: 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e ed to the cache.
40f0: 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 In TLS 1.3. *.t
4100: 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65 69 his may be recei
4110: 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d ved multiple tim
4120: 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61 6e es after the han
4130: 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 dshake. For. *.e
4140: 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c arlier versions,
4150: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65 this will be re
4160: 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74 68 ceived during th
4170: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 e handshake.. *.
4180: 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65 66 This is the pref
4190: 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74 erred way to obt
41a0: 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20 ain a resumable
41b0: 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 session.. *. * R
41c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
41d0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
41e0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
41f0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
4200: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 d). *. * Return
4210: 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 codes:. *.0 = er
4220: 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69 6f ror where sessio
4230: 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 n will be immedi
4240: 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 ately removed fr
4250: 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 om the internal
4260: 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 cache.. *.1 = su
4270: 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70 20 ccess where app
4280: 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 retains session
4290: 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65 in session cache
42a0: 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 , and must call
42b0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 SSL_SESSION_free
42c0: 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a () when done.. *
42d0: 0a 20 2a 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 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
4320: 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c c int.SessionCal
4330: 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 lback(SSL *ssl,
4340: 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 SSL_SESSION *ses
4350: 73 69 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 sion) {. Stat
4360: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
4370: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 tate*)SSL_get_ap
4380: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 p_data((SSL *)ss
4390: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 l);. Tcl_Inte
43a0: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
43b0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
43c0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
43d0: 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e tr;. const un
43e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 signed char *tic
43f0: 6b 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 ket;. const u
4400: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 nsigned char *se
4410: 73 73 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 ssion_id;. si
4420: 7a 65 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 ze_t len2;. u
4430: 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e nsigned int ulen
4440: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
4450: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
4460: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
4470: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
4480: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 j*)NULL) {..retu
4490: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
44a0: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 R_OK;. } else
44b0: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
44c0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
44d0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
44e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
44f0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
4500: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
4510: 63 68 61 6e 2c 20 73 65 73 73 69 6f 6e 20 69 64 chan, session id
4520: 2c 20 73 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 , session ticket
4530: 2c 20 61 6e 64 20 6c 69 66 65 74 69 6d 65 20 61 , and lifetime a
4540: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 rgs */. cmdPt
4550: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
4560: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 eObj(statePtr->c
4570: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 allback);. Tc
4580: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
4590: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
45a0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
45b0: 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e ringObj("session
45c0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
45d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
45e0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
45f0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
4600: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
4610: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
4620: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
4630: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 -1));.. /* Se
4640: 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 ssion id */.
4650: 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c session_id = SSL
4660: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 _SESSION_get_id(
4670: 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b session, &ulen);
4680: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4690: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
46a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
46b0: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 l_NewByteArrayOb
46c0: 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 j(session_id, (T
46d0: 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 29 3b cl_Size) ulen));
46e0: 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e .. /* Session
46f0: 20 74 69 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 ticket */. S
4700: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f SL_SESSION_get0_
4710: 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 ticket(session,
4720: 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b &ticket, &len2);
4730: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4740: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4750: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
4760: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 l_NewByteArrayOb
4770: 6a 28 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 j(ticket, (Tcl_S
4780: 69 7a 65 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 ize) len2));..
4790: 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 /* Lifetime -
47a0: 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 number of second
47b0: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 s */. Tcl_Lis
47c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
47d0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
47e0: 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 ,..Tcl_NewLongOb
47f0: 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 j((long) SSL_SES
4800: 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f SION_get_ticket_
4810: 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 lifetime_hint(se
4820: 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f ssion)));.. /
4830: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
4840: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
4850: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
4860: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 cmdPtr);. Eva
4870: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 lCallback(interp
4880: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 , statePtr, cmdP
4890: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 tr);. Tcl_Dec
48a0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
48b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b );. return 0;
48c0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 0a 20 2a -------------. *
4910: 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63 . * ALPN Callbac
4920: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 61 6e k for Servers an
4930: 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 d NPN Callback f
4940: 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a or Clients --. *
4950: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70 72 6f 74 . *.Perform prot
4960: 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 ocol (http/1.1,
4970: 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 73 65 h2, h3, etc.) se
4980: 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a lection for the.
4990: 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e *.incoming conn
49a0: 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 ection. Called a
49b0: 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73 fter Hello and s
49c0: 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e erver callbacks.
49d0: 0a 20 2a 09 57 68 65 72 65 20 27 6f 75 74 27 20 . *.Where 'out'
49e0: 69 73 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 is selected prot
49f0: 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20 69 73 ocol and 'in' is
4a00: 20 74 68 65 20 70 65 65 72 20 61 64 76 65 72 74 the peer advert
4a10: 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a ised list.. *. *
4a20: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
4a30: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
4a40: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 ects:. *.Calls c
4a50: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 allback (if defi
4a60: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ned). *. * Retur
4a70: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f n codes:. *.SSL_
4a80: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 TLSEXT_ERR_OK: A
4a90: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c LPN protocol sel
4aa0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 ected. The conne
4ab0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
4ac0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
4ad0: 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 RR_ALERT_FATAL:
4ae0: 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f 76 65 There was no ove
4af0: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74 68 65 rlap between the
4b00: 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20 20 client's. *.
4b10: 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 61 supplied list a
4b20: 6e 64 20 74 68 65 20 73 65 72 76 65 72 20 63 6f nd the server co
4b30: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 65 nfiguration. The
4b40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c connection will
4b50: 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09 be aborted.. *.
4b60: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
4b70: 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f OACK: ALPN proto
4b80: 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 col not selected
4b90: 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73 65 20 , e.g., because
4ba0: 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70 no ALPN. *. p
4bb0: 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e rotocols are con
4bc0: 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 figured for this
4bd0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 connection. The
4be0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
4bf0: 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d inues.. *. *----
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 2d 2d 0a ---------------.
4c40: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 */.static int.A
4c50: 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 LPNCallback(SSL
4c60: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 *ssl, const unsi
4c70: 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c gned char **out,
4c80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
4c90: 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 outlen,..const u
4ca0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e nsigned char *in
4cb0: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 , unsigned int i
4cc0: 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 nlen, void *arg)
4cd0: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
4ce0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a atePtr = (State*
4cf0: 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e )arg;. Tcl_In
4d00: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
4d10: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
4d20: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d . Tcl_Obj *cm
4d30: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f dPtr;. int co
4d40: 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 de, res;.. dp
4d50: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
4d60: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d .. if (ssl ==
4d70: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 NULL || arg ==
4d80: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
4d90: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
4da0: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 OACK;. }..
4db0: 20 2f 2a 20 53 65 6c 65 63 74 20 70 72 6f 74 6f /* Select proto
4dc0: 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 col */. if (S
4dd0: 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 SL_select_next_p
4de0: 72 6f 74 6f 28 28 75 6e 73 69 67 6e 65 64 20 63 roto((unsigned c
4df0: 68 61 72 20 2a 2a 29 20 6f 75 74 2c 20 6f 75 74 har **) out, out
4e00: 6c 65 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 len, statePtr->p
4e10: 72 6f 74 6f 73 2c 20 73 74 61 74 65 50 74 72 2d rotos, statePtr-
4e20: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e >protos_len,..in
4e30: 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e , inlen) == OPEN
4e40: 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 SSL_NPN_NEGOTIAT
4e50: 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 ED) {../* Match
4e60: 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73 20 3d 20 found */..res =
4e70: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
4e80: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a K;. } else {.
4e90: 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f ./* OPENSSL_NPN_
4ea0: 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20 4e 6f 20 NO_OVERLAP = No
4eb0: 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75 73 65 20 overlap, so use
4ec0: 66 69 72 73 74 20 69 74 65 6d 20 66 72 6f 6d 20 first item from
4ed0: 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 client protocol
4ee0: 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20 3d 20 53 list */..res = S
4ef0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
4f00: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ACK;. }..
4f10: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 if (statePtr->vc
4f20: 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 md == (Tcl_Obj*)
4f30: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
4f40: 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 res;. }..
4f50: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
4f60: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 d to eval with f
4f70: 6e 2c 20 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 n, chan, depth,
4f80: 63 65 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 cert info list,
4f90: 73 74 61 74 75 73 2c 20 61 6e 64 20 65 72 72 6f status, and erro
4fa0: 72 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d r args */. cm
4fb0: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
4fc0: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
4fd0: 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c ->vcmd);. Tcl
4fe0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
4ff0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
5000: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
5010: 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d ingObj("alpn", -
5020: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
5030: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
5040: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
5050: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
5060: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
5070: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
5080: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
5090: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
50a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
50b0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
50c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
50d0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 2a (const char *) *
50e0: 6f 75 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 out, -1));. T
50f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
5100: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
5110: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 cmdPtr, Tcl_NewB
5120: 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d ooleanObj(res ==
5130: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5140: 4f 4b 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 OK));.. /* Ev
5150: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
5160: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
5170: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
5180: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f tr);. if ((co
5190: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 de = EvalCallbac
51a0: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 k(interp, stateP
51b0: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 tr, cmdPtr)) > 1
51c0: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 ) {..res = SSL_T
51d0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
51e0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
51f0: 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 code == 1) {..re
5200: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
5210: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 RR_OK;. } els
5220: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 e {..res = SSL_T
5230: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
5240: 46 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 FATAL;. }.
5250: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
5260: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 t(cmdPtr);. r
5270: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f eturn res;.}.../
5280: 2a 0a 20 2a 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 2d 2d 0a 20 2a 0a 20 2a 20 41 64 -------. *. * Ad
52d0: 76 65 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c vertise Protocol
52e0: 73 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e s Callback for N
52f0: 65 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 ext Protocol Neg
5300: 6f 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 otiation (NPN) i
5310: 6e 20 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d n ServerHello --
5320: 0a 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 . *. *.called wh
5330: 65 6e 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 en a TLS server
5340: 6e 65 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 needs a list of
5350: 73 75 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 supported protoc
5360: 6f 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 ols for Next. *.
5370: 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 Protocol Negotia
5380: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 tion.. *. * Resu
5390: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
53a0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
53b0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
53c0: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 des:. *.SSL_TLSE
53d0: 58 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 XT_ERR_OK: NPN p
53e0: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
53f0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
5400: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 continues.. *.S
5410: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
5420: 41 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f ACK: NPN protoco
5430: 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 l not selected.
5440: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
5450: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d ontinues.. *. *-
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: 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 --. */.#ifdef US
54b0: 45 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 E_NPN.static int
54c0: 0a 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e .NPNCallback(con
54d0: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e st SSL *ssl, con
54e0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
54f0: 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 **out, unsigned
5500: 20 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f int *outlen, vo
5510: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
5520: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
5530: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 (State*)arg;..
5540: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
5550: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
5560: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 sl == NULL || ar
5570: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 g == NULL) {..re
5580: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
5590: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
55a0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f .. /* Set pro
55b0: 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 tocols list */.
55c0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
55d0: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 >protos != NULL)
55e0: 20 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 {..*out = state
55f0: 50 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f Ptr->protos;..*o
5600: 75 74 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 utlen = statePtr
5610: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 ->protos_len;.
5620: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 } else {..*out
5630: 20 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 = NULL;..*outle
5640: 6e 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 n = 0;..return S
5650: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
5660: 41 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ACK;. }. r
5670: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
5680: 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 _ERR_OK;.}.#endi
5690: 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d f.../*. *-------
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 2d 2d 0a 20 2a 0a ------------. *.
56e0: 20 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 * SNI Callback
56f0: 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 for Servers --.
5700: 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 *. *.Perform ser
5710: 76 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 ver-side SNI hos
5720: 74 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 tname selection
5730: 61 66 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 after receiving
5740: 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a SNI extension. *
5750: 09 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f .in Client Hello
5760: 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 . Called after h
5770: 65 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 ello callback bu
5780: 74 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 t before ALPN ca
5790: 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 llback.. *. * Re
57a0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 sults:. *.None.
57b0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
57c0: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c s:. *.Calls call
57d0: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 back (if defined
57e0: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 ). *. * Return c
57f0: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 odes:. *.SSL_TLS
5800: 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 EXT_ERR_OK: SNI
5810: 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 hostname is acce
5820: 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 pted. The connec
5830: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a tion continues..
5840: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
5850: 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 R_ALERT_FATAL: S
5860: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e NI hostname is n
5870: 6f 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 ot accepted. The
5880: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 connection. *.
5890: 20 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 is aborted. D
58a0: 65 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 efault for alert
58b0: 20 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 is SSL_AD_UNREC
58c0: 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a OGNIZED_NAME.. *
58d0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
58e0: 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 ALERT_WARNING: S
58f0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e NI hostname is n
5900: 6f 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 ot accepted, war
5910: 6e 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 ning alert. *.
5920: 20 20 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 sent (not supp
5930: 6f 72 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 orted in TLSv1.3
5940: 29 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f ). The connectio
5950: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 n continues.. *.
5960: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
5970: 4f 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 OACK: SNI hostna
5980: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 me is not accept
5990: 65 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f ed and not ackno
59a0: 77 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 wledged,. *.
59b0: 65 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 e.g. if SNI has
59c0: 6e 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 not been configu
59d0: 72 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 red. The connect
59e0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
59f0: 2a 0a 20 2a 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 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
5a40: 69 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 ic int.SNICallba
5a50: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 ck(const SSL *ss
5a60: 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 l, int *alert, v
5a70: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 oid *arg) {.
5a80: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
5a90: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 = (State*)arg;.
5aa0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
5ab0: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
5ac0: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 ->interp;. Tc
5ad0: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
5ae0: 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 int code, res
5af0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ;. const char
5b00: 20 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e *servername = N
5b10: 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ULL;.. dprint
5b20: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
5b30: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c if (ssl == NUL
5b40: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c L || arg == NULL
5b50: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
5b60: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
5b70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
5b80: 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 54 Only works for T
5b90: 4c 53 20 31 2e 32 20 61 6e 64 20 65 61 72 6c 69 LS 1.2 and earli
5ba0: 65 72 20 2a 2f 0a 20 20 20 20 73 65 72 76 65 72 er */. server
5bb0: 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 name = SSL_get_s
5bc0: 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 ervername(ssl, T
5bd0: 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 LSEXT_NAMETYPE_h
5be0: 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 ost_name);. i
5bf0: 66 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c f (!servername |
5c00: 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 | servername[0]
5c10: 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 72 65 74 75 == '\0') {..retu
5c20: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
5c30: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a R_NOACK;. }..
5c40: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
5c50: 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f ->vcmd == (Tcl_O
5c60: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 bj*)NULL) {..ret
5c70: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
5c80: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 RR_OK;. }..
5c90: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
5ca0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 and to eval with
5cb0: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 fn, chan, and s
5cc0: 65 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 erver name args
5cd0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 */. cmdPtr =
5ce0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
5cf0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 (statePtr->vcmd)
5d00: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
5d10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
5d20: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
5d30: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
5d40: 22 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 "sni", -1));.
5d50: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5d60: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5d70: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
5d80: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
5d90: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
5da0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
5db0: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 f), -1));. Tc
5dc0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
5dd0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
5de0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
5df0: 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 ringObj(serverna
5e00: 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 me , -1));..
5e10: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
5e20: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
5e30: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
5e40: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 (cmdPtr);. if
5e50: 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 ((code = EvalCa
5e60: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 llback(interp, s
5e70: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 tatePtr, cmdPtr)
5e80: 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 ) > 1) {..res =
5e90: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
5ea0: 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a LERT_WARNING;..*
5eb0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 alert = SSL_AD_U
5ec0: 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 NRECOGNIZED_NAME
5ed0: 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 ; /* Not support
5ee0: 65 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f ed by TLS 1.3 */
5ef0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
5f00: 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 code == 1) {..re
5f10: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
5f20: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 RR_OK;. } els
5f30: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 e {..res = SSL_T
5f40: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
5f50: 46 41 54 41 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d FATAL;..*alert =
5f60: 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e SSL_AD_UNRECOGN
5f70: 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f IZED_NAME; /* No
5f80: 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 54 t supported by T
5f90: 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a LS 1.3 */. }.
5fa0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
5fb0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
5fc0: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a return res;.}.
5fd0: 0c 0a 2f 2a 0a 20 2a 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 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
6020: 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 48 61 6e ClientHello Han
6030: 64 73 68 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20 dshake Callback
6040: 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 for Servers --.
6050: 2a 0a 20 2a 09 55 73 65 64 20 62 79 20 73 65 72 *. *.Used by ser
6060: 76 65 72 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 ver to examine t
6070: 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 he server name i
6080: 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 ndication (SNI)
6090: 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f extension. *.pro
60a0: 76 69 64 65 64 20 62 79 20 74 68 65 20 63 6c 69 vided by the cli
60b0: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 ent in order to
60c0: 73 65 6c 65 63 74 20 61 6e 20 61 70 70 72 6f 70 select an approp
60d0: 72 69 61 74 65 20 63 65 72 74 69 66 69 63 61 74 riate certificat
60e0: 65 20 74 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c e to. *.present,
60f0: 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 and make other
6100: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 64 configuration ad
6110: 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 justments releva
6120: 6e 74 20 74 6f 20 74 68 61 74 20 73 65 72 76 65 nt to that serve
6130: 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 r. *.name and it
6140: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e s configuration.
6150: 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20 73 This includes s
6160: 77 61 70 70 69 6e 67 20 6f 75 74 20 74 68 65 20 wapping out the
6170: 61 73 73 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 associated. *.SS
6180: 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d L_CTX pointer, m
6190: 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73 65 72 odifying the ser
61a0: 76 65 72 27 73 20 6c 69 73 74 20 6f 66 20 70 65 ver's list of pe
61b0: 72 6d 69 74 74 65 64 20 54 4c 53 20 76 65 72 73 rmitted TLS vers
61c0: 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e ions,. *.changin
61d0: 67 20 74 68 65 20 73 65 72 76 65 72 27 73 20 63 g the server's c
61e0: 69 70 68 65 72 20 6c 69 73 74 20 69 6e 20 72 65 ipher list in re
61f0: 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 63 6c sponse to the cl
6200: 69 65 6e 74 27 73 20 63 69 70 68 65 72 20 6c 69 ient's cipher li
6210: 73 74 2c 20 65 74 63 2e 0a 20 2a 09 43 61 6c 6c st, etc.. *.Call
6220: 65 64 20 62 65 66 6f 72 65 20 53 4e 49 20 61 6e ed before SNI an
6230: 64 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 73 d ALPN callbacks
6240: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
6250: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
6260: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
6270: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
6280: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
6290: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
62a0: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 *.SSL_CLIENT_HE
62b0: 4c 4c 4f 5f 52 45 54 52 59 3a 20 73 75 73 70 65 LLO_RETRY: suspe
62c0: 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 nd the handshake
62d0: 2c 20 61 6e 64 20 74 68 65 20 68 61 6e 64 73 68 , and the handsh
62e0: 61 6b 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c ake function wil
62f0: 6c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 l return immedia
6300: 74 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 tely. *.SSL_CLIE
6310: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 NT_HELLO_ERROR:
6320: 66 61 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 failure, termina
6330: 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 te connection. S
6340: 65 74 20 61 6c 65 72 74 20 74 6f 20 65 72 72 6f et alert to erro
6350: 72 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 r code.. *.SSL_C
6360: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 LIENT_HELLO_SUCC
6370: 45 53 53 3a 20 73 75 63 63 65 73 73 0a 20 2a 0a ESS: success. *.
6380: 20 2a 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 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
63d0: 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 int.HelloCallba
63e0: 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 ck(SSL *ssl, int
63f0: 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 *alert, void *a
6400: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 rg) {. State
6410: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
6420: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c te*)arg;. Tcl
6430: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
6440: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
6450: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
6460: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 *cmdPtr;. int
6470: 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 code, res;.
6480: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72 76 const char *serv
6490: 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 ername;. cons
64a0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
64b0: 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c *p;. size_t l
64c0: 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a en, remaining;..
64d0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
64e0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
64f0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
6500: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
6510: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
6520: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 CLIENT_HELLO_SUC
6530: 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 CESS;. } else
6540: 20 69 66 20 28 73 73 6c 20 3d 3d 20 28 63 6f 6e if (ssl == (con
6550: 73 74 20 53 53 4c 20 2a 29 4e 55 4c 4c 20 7c 7c st SSL *)NULL ||
6560: 20 61 72 67 20 3d 3d 20 28 76 6f 69 64 20 2a 29 arg == (void *)
6570: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
6580: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
6590: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
65a0: 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d 65 73 20 /* Get names
65b0: 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f */. if (!SSL_
65c0: 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 client_hello_get
65d0: 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c 53 45 58 0_ext(ssl, TLSEX
65e0: 54 5f 54 59 50 45 5f 73 65 72 76 65 72 5f 6e 61 T_TYPE_server_na
65f0: 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61 69 6e 69 me, &p, &remaini
6600: 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 ng) || remaining
6610: 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 <= 2) {..*alert
6620: 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 = SSL_R_SSLV3_A
6630: 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 LERT_ILLEGAL_PAR
6640: 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 AMETER;..return
6650: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
6660: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
6670: 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 /* Extract th
6680: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 e length of the
6690: 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 6f 66 supplied list of
66a0: 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 6c names. */. l
66b0: 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 en = (*(p++) <<
66c0: 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 8);. len += *
66d0: 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c (p++);. if (l
66e0: 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d 61 69 6e en + 2 != remain
66f0: 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d ing) {..*alert =
6700: 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 SSL_R_SSLV3_ALE
6710: 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d RT_ILLEGAL_PARAM
6720: 45 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 ETER;..return SS
6730: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
6740: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
6750: 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b remaining = len;
6760: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 .. /* The lis
6770: 74 20 69 6e 20 70 72 61 63 74 69 63 65 20 6f 6e t in practice on
6780: 6c 79 20 68 61 73 20 61 20 73 69 6e 67 6c 65 20 ly has a single
6790: 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77 65 20 6f element, so we o
67a0: 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20 74 68 65 nly consider the
67b0: 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 first one. */.
67c0: 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 if (remaining
67d0: 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d == 0 || *p++ !=
67e0: 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 TLSEXT_NAMETYPE
67f0: 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a _host_name) {..*
6800: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c alert = SSL_R_TL
6810: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e SV1_ALERT_INTERN
6820: 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 AL_ERROR;..retur
6830: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
6840: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
6850: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b remaining--;
6860: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 77 65 20 .. /* Now we
6870: 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70 75 6c 6c can finally pull
6880: 20 6f 75 74 20 74 68 65 20 62 79 74 65 20 61 72 out the byte ar
6890: 72 61 79 20 77 69 74 68 20 74 68 65 20 61 63 74 ray with the act
68a0: 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f ual hostname. */
68b0: 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69 . if (remaini
68c0: 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 ng <= 2) {..*ale
68d0: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 rt = SSL_R_TLSV1
68e0: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f _ALERT_INTERNAL_
68f0: 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 ERROR;..return S
6900: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
6910: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
6920: 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c len = (*(p++) <
6930: 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d < 8);. len +=
6940: 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 *(p++);. if
6950: 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65 6d 61 69 (len + 2 > remai
6960: 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 ning) {..*alert
6970: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c = SSL_R_TLSV1_AL
6980: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 ERT_INTERNAL_ERR
6990: 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f OR;..return SSL_
69a0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
69b0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 OR;. }. re
69c0: 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 maining = len;.
69d0: 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 servername =
69e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 3b (const char *)p;
69f0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
6a00: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
6a10: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 61 with fn, chan, a
6a20: 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 61 nd server name a
6a30: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 rgs */. cmdPt
6a40: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
6a50: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 eObj(statePtr->v
6a60: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 cmd);. Tcl_Li
6a70: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
6a80: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
6a90: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
6aa0: 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 Obj("hello", -1)
6ab0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
6ac0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
6ad0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
6ae0: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
6af0: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 ngObj(Tcl_GetCha
6b00: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
6b10: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a r->self), -1));.
6b20: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
6b30: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
6b40: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
6b50: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 _NewStringObj(se
6b60: 72 76 65 72 6e 61 6d 65 2c 20 28 54 63 6c 5f 53 rvername, (Tcl_S
6b70: 69 7a 65 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 ize) len));..
6b80: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 /* Eval callbac
6b90: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 k command */.
6ba0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
6bb0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 t(cmdPtr);. i
6bc0: 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 f ((code = EvalC
6bd0: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
6be0: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
6bf0: 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d )) > 1) {..res =
6c00: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
6c10: 4f 5f 52 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74 O_RETRY;..*alert
6c20: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
6c30: 4c 45 52 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c LERT_USER_CANCEL
6c40: 4c 45 44 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 LED;. } else
6c50: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b if (code == 1) {
6c60: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 ..res = SSL_CLIE
6c70: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 NT_HELLO_SUCCESS
6c80: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
6c90: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 res = SSL_CLIENT
6ca0: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a _HELLO_ERROR;..*
6cb0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c alert = SSL_R_TL
6cc0: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e SV1_ALERT_INTERN
6cd0: 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a AL_ERROR;. }.
6ce0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
6cf0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
6d00: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a return res;.}.
6d10: 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
6d20: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d *******/./* Comm
6d30: 61 6e 64 73 20 20 20 20 20 20 20 20 20 2a 2f 0a ands */.
6d40: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
6d50: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 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 2d 2d ----------------
6da0: 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 . *. * CiphersOb
6db0: 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 jCmd -- list ava
6dc0: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a 20 ilable ciphers.
6dd0: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
6de0: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 ure is invoked t
6df0: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 o process the "t
6e00: 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f 6d ls::ciphers" com
6e10: 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 mand. *.to list
6e20: 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 available cipher
6e30: 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70 72 s, based upon pr
6e40: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e otocol selected.
6e50: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
6e60: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
6e70: 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 l result list..
6e80: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
6e90: 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 s:. *.constructs
6ea0: 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53 53 and destroys SS
6eb0: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a L context (CTX).
6ec0: 20 2a 0a 20 2a 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 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
6f10: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a tic const char *
6f20: 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a protocols[] = {.
6f30: 09 22 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c ."ssl2", "ssl3",
6f40: 20 22 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 "tls1", "tls1.1
6f50: 22 2c 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c ", "tls1.2", "tl
6f60: 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 s1.3", NULL.};.e
6f70: 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 num protocol {.
6f80: 20 20 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 TLS_SSL2, TLS
6f90: 5f 53 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c _SSL3, TLS_TLS1,
6fa0: 20 54 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 TLS_TLS1_1, TLS
6fb0: 5f 54 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 _TLS1_2, TLS_TLS
6fc0: 31 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 1_3, TLS_NONE.};
6fd0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 69 70 ..static int.Cip
6fe0: 68 65 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e hersObjCmd(Clien
6ff0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
7000: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
7010: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
7020: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
7030: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
7040: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e _Obj *objPtr = N
7050: 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 ULL;. SSL_CTX
7060: 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *ctx = NULL;.
7070: 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c SSL *ssl = NUL
7080: 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 L;. STACK_OF(
7090: 53 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b SSL_CIPHER) *sk;
70a0: 0a 20 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62 . char *cp, b
70b0: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 uf[BUFSIZ];.
70c0: 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f int index, verbo
70d0: 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 se = 0, use_supp
70e0: 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 orted = 0;. c
70f0: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 onst SSL_METHOD
7100: 2a 6d 65 74 68 6f 64 3b 0a 20 20 20 20 28 76 6f *method;. (vo
7110: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a id) clientData;.
7120: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
7130: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
7140: 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 ((objc < 2) || (
7150: 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 objc > 4)) {..Tc
7160: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
7170: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
7180: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f "protocol ?verbo
7190: 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 se? ?supported?"
71a0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
71b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
71c0: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 if (Tcl_GetIndex
71d0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
71e0: 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f objv[1], protoco
71f0: 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 ls, "protocol",
7200: 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 0, &index) != TC
7210: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
7220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
7230: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e . if ((objc >
7240: 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 2) && Tcl_GetBo
7250: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 oleanFromObj(int
7260: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 erp, objv[2], &v
7270: 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f erbose) != TCL_O
7280: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
7290: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
72a0: 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 if ((objc > 3)
72b0: 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 && Tcl_GetBoole
72c0: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 anFromObj(interp
72d0: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f , objv[3], &use_
72e0: 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 supported) != TC
72f0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
7300: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
7310: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f .. ERR_clear_
7320: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 error();.. sw
7330: 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 itch ((enum prot
7340: 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 ocol)index) {..c
7350: 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 ase TLS_SSL2:.#i
7360: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
7370: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 N_NUMBER >= 0x10
7380: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 100000L || defin
7390: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 ed(NO_SSL2) || d
73a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
73b0: 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c O_SSL2).. Tcl
73c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
73d0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
73e0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
73f0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
7400: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
7410: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
7420: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
7430: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 .. method = S
7440: 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 SLv2_method(); b
7450: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 reak;.#endif..ca
7460: 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 se TLS_SSL3:.#if
7470: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 defined(NO_SSL3
7480: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
7490: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c NSSL_NO_SSL3) ||
74a0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
74b0: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 _NO_SSL3_METHOD)
74c0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
74d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
74e0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
74f0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
7500: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
7510: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
7520: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
7530: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
7540: 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 ethod = SSLv3_me
7550: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 thod(); break;.#
7560: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
7570: 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 TLS1:.#if define
7580: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 d(NO_TLS1) || de
7590: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
75a0: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 _TLS1) || define
75b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
75c0: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 1_METHOD).. T
75d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
75e0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
75f0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
7600: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
7610: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ted", (char *) N
7620: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ULL);.. retur
7630: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c n TCL_ERROR;.#el
7640: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d se.. method =
7650: 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b TLSv1_method();
7660: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
7670: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a case TLS_TLS1_1:
7680: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
7690: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e TLS1_1) || defin
76a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
76b0: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_1) || defined
76c0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
76d0: 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 _1_METHOD)..
76e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
76f0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
7700: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
7710: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
7720: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
7730: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
7740: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
7750: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 lse.. method
7760: 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 = TLSv1_1_method
7770: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 (); break;.#endi
7780: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 f..case TLS_TLS1
7790: 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 _2:.#if defined(
77a0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 NO_TLS1_2) || de
77b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
77c0: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
77d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
77e0: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 LS1_2_METHOD)..
77f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
7800: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
7810: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
7820: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
7830: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
7840: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 *) NULL);.. r
7850: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7860: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
7870: 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 od = TLSv1_2_met
7880: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 hod(); break;.#e
7890: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
78a0: 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e LS1_3:.#if defin
78b0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c ed(NO_TLS1_3) ||
78c0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
78d0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 _NO_TLS1_3)..
78e0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
78f0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
7900: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
7910: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
7920: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
7930: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
7940: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
7950: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 else.. method
7960: 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b = TLS_method();
7970: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
7980: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 t_min_proto_vers
7990: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
79a0: 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 VERSION);.. S
79b0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 SL_CTX_set_max_p
79c0: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
79d0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
79e0: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 );.. break;.#
79f0: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a endif..default:.
7a00: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c . method = TL
7a10: 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 S_method();..
7a20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 break;. }..
7a30: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 ctx = SSL_CTX
7a40: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 _new(method);.
7a50: 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c if (ctx == NUL
7a60: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
7a70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 Result(interp, G
7a80: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
7a90: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
7aa0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
7ab0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 OR;. }.. s
7ac0: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 sl = SSL_new(ctx
7ad0: 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d );. if (ssl =
7ae0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 = NULL) {..Tcl_A
7af0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
7b00: 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 rp, GET_ERR_REAS
7b10: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
7b20: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
7b30: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
7b40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
7b50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c }.. /* Use l
7b60: 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 ist and order as
7b70: 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 would be sent i
7b80: 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 n a ClientHello
7b90: 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 or all available
7ba0: 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 ciphers */.
7bb0: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 if (use_supporte
7bc0: 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 d) {..sk = SSL_g
7bd0: 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 et1_supported_ci
7be0: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 phers(ssl);.
7bf0: 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 } else {..sk = S
7c00: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 SL_get_ciphers(s
7c10: 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 sl);. }..
7c20: 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 if (sk != NULL)
7c30: 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 {..if (!verbose)
7c40: 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d {.. objPtr =
7c50: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
7c60: 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66 0, NULL);.. f
7c70: 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 or (int i = 0; i
7c80: 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 < sk_SSL_CIPHER
7c90: 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b _num(sk); i++) {
7ca0: 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 ...const SSL_CIP
7cb0: 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f HER *c = sk_SSL_
7cc0: 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c CIPHER_value(sk,
7cd0: 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 i);...if (c ==
7ce0: 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a NULL) continue;.
7cf0: 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d .../* cipher nam
7d00: 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 e or (NONE) */..
7d10: 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 .cp = SSL_CIPHER
7d20: 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 _get_name(c);...
7d30: 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 if (cp == NULL)
7d40: 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 break;...Tcl_Lis
7d50: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
7d60: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
7d70: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
7d80: 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 bj(cp, -1));..
7d90: 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 }...} else {..
7da0: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
7db0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 _NewStringObj(""
7dc0: 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 ,0);.. for (i
7dd0: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b nt i = 0; i < sk
7de0: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 _SSL_CIPHER_num(
7df0: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f sk); i++) {...co
7e00: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a nst SSL_CIPHER *
7e10: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 c = sk_SSL_CIPHE
7e20: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a R_value(sk, i);.
7e30: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 ..if (c == NULL)
7e40: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a continue;..../*
7e50: 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 textual descrip
7e60: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 tion of the ciph
7e70: 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f er */...if (SSL_
7e80: 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 CIPHER_descripti
7e90: 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f on(c, buf, sizeo
7ea0: 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 f(buf)) != NULL)
7eb0: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 {... Tcl_App
7ec0: 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c endToObj(objPtr,
7ed0: 20 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 buf, (Tcl_Size)
7ee0: 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 strlen(buf));..
7ef0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 .} else {...
7f00: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 Tcl_AppendToObj(
7f10: 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e objPtr, "UNKNOWN
7f20: 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 \n", 8);...}..
7f30: 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f }..}..if (use_
7f40: 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 supported) {..
7f50: 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f sk_SSL_CIPHER_
7f60: 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 free(sk);..}.
7f70: 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 }. SSL_free(
7f80: 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 ssl);. SSL_CT
7f90: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 X_free(ctx);..
7fa0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
7fb0: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
7fc0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
7fd0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8020: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 ---. *. * Protoc
8030: 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 olsObjCmd -- lis
8040: 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 t available prot
8050: 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 ocols. *. *.This
8060: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e procedure is in
8070: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 voked to process
8080: 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f the "tls::proto
8090: 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a cols" command. *
80a0: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 .to list availab
80b0: 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a le protocols.. *
80c0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
80d0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
80e0: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 esult list.. *.
80f0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
8100: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *.none. *. *---
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8150: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
8160: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 ProtocolsObjCmd(
8170: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
8180: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
8190: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
81a0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
81b0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
81c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
81d0: 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c r;. (void) cl
81e0: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 ientData;.. d
81f0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
8200: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
8210: 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 1) {..Tcl_Wro
8220: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
8230: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a , 1, objv, "");.
8240: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
8250: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 R;. }.. ER
8260: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b R_clear_error();
8270: 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
8280: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
8290: 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 NULL);..#if OPE
82a0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
82b0: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 BER < 0x10100000
82c0: 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f L && !defined(NO
82d0: 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e _SSL2) && !defin
82e0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
82f0: 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 L2). Tcl_List
8300: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
8310: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
8320: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
8330: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f j(protocols[TLS_
8340: 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e SSL2], -1));.#en
8350: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
8360: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 (NO_SSL3) && !de
8370: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8380: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
8390: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
83a0: 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 L3_METHOD). T
83b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
83c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
83d0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
83e0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
83f0: 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 ls[TLS_SSL3], -1
8400: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
8410: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
8420: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
8430: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 NSSL_NO_TLS1) &&
8440: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
8450: 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 L_NO_TLS1_METHOD
8460: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
8470: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
8480: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
8490: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
84a0: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c protocols[TLS_TL
84b0: 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 S1], -1));.#endi
84c0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
84d0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 O_TLS1_1) && !de
84e0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
84f0: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 _TLS1_1) && !def
8500: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8510: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 TLS1_1_METHOD).
8520: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
8530: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
8540: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
8550: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
8560: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f tocols[TLS_TLS1_
8570: 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 1], -1));.#endif
8580: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
8590: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
85a0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
85b0: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
85c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
85d0: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 LS1_2_METHOD).
85e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
85f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
8600: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
8610: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
8620: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 ocols[TLS_TLS1_2
8630: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
8640: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
8650: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 TLS1_3) && !defi
8660: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
8670: 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c LS1_3). Tcl_L
8680: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
8690: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
86a0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
86b0: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
86c0: 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 LS_TLS1_3], -1))
86d0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 ;.#endif.. Tc
86e0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
86f0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a nterp, objPtr);.
8700: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
8710: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
8720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
8760: 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f *. * HandshakeO
8770: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 bjCmd --. *. *.T
8780: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 his command is u
8790: 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 sed to verify wh
87a0: 65 74 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 ether the handsh
87b0: 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a ake is complete.
87c0: 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a *.or not.. *. *
87d0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
87e0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
87f0: 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 lt. 1 means hand
8800: 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 shake complete,
8810: 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0 means pending.
8820: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
8830: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 cts:. *.May forc
8840: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f e SSL negotiatio
8850: 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e n to take place.
8860: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
88b0: 61 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 atic int Handsha
88c0: 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 keObjCmd(ClientD
88d0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
88e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
88f0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
8900: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
8910: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]) {. Tcl_C
8920: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 hannel chan;
8930: 20 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e /* The chann
8940: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 el to set a mode
8950: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 on. */. Stat
8960: 65 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 e *statePtr;
8970: 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 /* client st
8980: 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b ate for ssl sock
8990: 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 et */. const
89a0: 63 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e char *errStr = N
89b0: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 ULL;. int ret
89c0: 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 = 1;. int er
89d0: 72 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 r = 0;. (void
89e0: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
89f0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
8a00: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
8a10: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
8a20: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
8a30: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
8a40: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
8a50: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
8a60: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c }.. ERR_cl
8a70: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 ear_error();..
8a80: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
8a90: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
8aa0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
8ab0: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 jv[1]), NULL);.
8ac0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
8ad0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
8ae0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c L) {..return(TCL
8af0: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a _ERROR);. }..
8b00: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
8b10: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
8b20: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
8b30: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
8b40: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
8b50: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 el(chan);. if
8b60: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
8b70: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
8b80: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
8b90: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
8ba0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
8bb0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
8bc0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
8bd0: 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c e(chan),.. "\
8be0: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
8bf0: 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 nnel", (char *)
8c00: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 NULL);..Tcl_SetE
8c10: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
8c20: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 "TLS", "HANDSHA
8c30: 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 KE", "CHANNEL",
8c40: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 "INVALID", (char
8c50: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
8c60: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
8c70: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 }. statePt
8c80: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c r = (State *)Tcl
8c90: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
8ca0: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a nceData(chan);..
8cb0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
8cc0: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 ling Tls_WaitFor
8cd0: 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 Connect");. r
8ce0: 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 et = Tls_WaitFor
8cf0: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 Connect(statePtr
8d00: 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 , &err, 1);.
8d10: 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 dprintf("Tls_Wai
8d20: 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 tForConnect retu
8d30: 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b rned: %i", ret);
8d40: 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 .. if (ret <
8d50: 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 0 && ((statePtr-
8d60: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c >flags & TLS_TCL
8d70: 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 _ASYNC) && (err
8d80: 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 == EAGAIN))) {..
8d90: 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 dprintf("Async s
8da0: 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 et and err = EAG
8db0: 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b AIN");..ret = 0;
8dc0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
8dd0: 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 ret < 0) {..long
8de0: 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 result;..errStr
8df0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 = statePtr->err
8e00: 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 ;..Tcl_ResetResu
8e10: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c lt(interp);..Tcl
8e20: 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a _SetErrno(err);.
8e30: 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c ..if (!errStr ||
8e40: 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 (*errStr == 0))
8e50: 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d {.. errStr =
8e60: 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 Tcl_PosixError(
8e70: 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 interp);..}...Tc
8e80: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
8e90: 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b nterp, "handshak
8ea0: 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 e failed: ", err
8eb0: 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 Str, (char *) NU
8ec0: 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75 6c LL);..if ((resul
8ed0: 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 t = SSL_get_veri
8ee0: 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 fy_result(stateP
8ef0: 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 30 tr->ssl)) != X50
8f00: 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 9_V_OK) {.. T
8f10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8f20: 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74 6f interp, " due to
8f30: 20 5c 22 22 2c 20 58 35 30 39 5f 76 65 72 69 66 \"", X509_verif
8f40: 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 y_cert_error_str
8f50: 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 22 5c 22 ing(result), "\"
8f60: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
8f70: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72 );..}..Tcl_SetEr
8f80: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
8f90: 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b "TLS", "HANDSHAK
8fa0: 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 E", "FAILED", (c
8fb0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 har *) NULL);..d
8fc0: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
8fd0: 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 g TCL_ERROR with
8fe0: 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 handshake faile
8ff0: 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29 3b d: %s", errStr);
9000: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
9010: 4f 52 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 OR);. } else
9020: 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29 {..if (err != 0)
9030: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
9040: 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69 "Got an error wi
9050: 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 th a completed h
9060: 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 andshake: err =
9070: 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 %i", err);..}..r
9080: 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 et = 1;. }..
9090: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 dprintf("Retu
90a0: 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 rning TCL_OK wit
90b0: 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 h data \"%i\"",
90c0: 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ret);. Tcl_Se
90d0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
90e0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a p, Tcl_NewIntObj
90f0: 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75 (ret));. retu
9100: 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 2f rn(TCL_OK);.}../
9110: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
9120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9150: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d -------. *. * Im
9160: 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a portObjCmd --. *
9170: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
9180: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f re is invoked to
9190: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 process the "ss
91a0: 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a l" command. *. *
91b0: 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 .The ssl command
91c0: 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 pushes SSL over
91d0: 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 a (newly connec
91e0: 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a ted) tcp socket.
91f0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
9200: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
9210: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
9220: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
9230: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 May modify the b
9240: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f ehavior of an IO
9250: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d channel.. *. *-
9260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92a0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
92b0: 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 t.ImportObjCmd(C
92c0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
92d0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
92e0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
92f0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
9300: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
9310: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
9320: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e n;../* The chann
9330: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 el to set a mode
9340: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 on. */. Stat
9350: 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a e *statePtr;../*
9360: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f client state fo
9370: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a r ssl socket */.
9380: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 SSL_CTX *ctx
9390: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 ..= NULL;. Tc
93a0: 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 09 3d l_Obj *script..=
93b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f NULL;. Tcl_O
93c0: 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 09 3d 20 bj *password..=
93d0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 NULL;. Tcl_Ob
93e0: 6a 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b j *vcmd..= NULL;
93f0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
9400: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 upperChannelTra
9410: 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 nslation, upperC
9420: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 hannelBlocking,
9430: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
9440: 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e ding, upperChann
9450: 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 elEOFChar;. i
9460: 6e 74 20 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f nt idx;. Tcl_
9470: 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e Size len;. in
9480: 74 20 66 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f t flags...= TLS_
9490: 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e TCL_INIT;. in
94a0: 74 20 73 65 72 76 65 72 09 09 09 3d 20 30 3b 09 t server...= 0;.
94b0: 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e /* is connection
94c0: 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 incoming or out
94d0: 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 going? */. ch
94e0: 61 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e ar *keyfile..= N
94f0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 ULL;. char *c
9500: 65 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b ertfile..= NULL;
9510: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
9520: 61 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b ar *key..= NULL;
9530: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 . Tcl_Size ke
9540: 79 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 y_len..= 0;.
9550: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 unsigned char *c
9560: 65 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ert..= NULL;.
9570: 20 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c Tcl_Size cert_l
9580: 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 68 61 en..= 0;. cha
9590: 72 20 2a 63 69 70 68 65 72 73 09 09 3d 20 4e 55 r *ciphers..= NU
95a0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 LL;. char *ci
95b0: 70 68 65 72 73 75 69 74 65 73 09 09 3d 20 4e 55 phersuites..= NU
95c0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 LL;. char *CA
95d0: 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 file..= NULL;.
95e0: 20 20 63 68 61 72 20 2a 43 41 70 61 74 68 09 09 char *CApath..
95f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
9600: 20 2a 44 48 70 61 72 61 6d 73 09 09 3d 20 4e 55 *DHparams..= NU
9610: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f LL;. char *mo
9620: 64 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 del...= NULL;.
9630: 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 char *serverna
9640: 6d 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 me..= NULL;./* h
9650: 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 ostname for Serv
9660: 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 er Name Indicati
9670: 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 on */. const
9680: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 unsigned char *s
9690: 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c ession_id = NULL
96a0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 ;. Tcl_Obj *a
96b0: 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 lpn..= NULL;.
96c0: 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 int ssl2 = 0, s
96d0: 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 sl3 = 0;. int
96e0: 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f tls1 = 1, tls1_
96f0: 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 1 = 1, tls1_2 =
9700: 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 1, tls1_3 = 1;.
9710: 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 int proto = 0
9720: 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 , level = -1;.
9730: 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30 int verify = 0
9740: 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72 , require = 0, r
9750: 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74 equest = 1, post
9760: 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a _handshake = 0;.
9770: 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e (void) clien
9780: 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 tData;.. dpri
9790: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
97a0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
97b0: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
97c0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
97d0: 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 . tls1 = 0;.#
97e0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
97f0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 d(NO_TLS1_1) ||
9800: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
9810: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 NO_TLS1_1). t
9820: 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 ls1_1 = 0;.#endi
9830: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
9840: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
9850: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
9860: 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f LS1_2). tls1_
9870: 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 2 = 0;.#endif.#i
9880: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
9890: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_3) || defined(
98a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
98b0: 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 3). tls1_3 =
98c0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 0;.#endif.. i
98d0: 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 f (objc < 2) {..
98e0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
98f0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
9900: 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 , "channel ?opti
9910: 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 ons?");..return
9920: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
9930: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f .. ERR_clear_
9940: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 error();.. ch
9950: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
9960: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f nel(interp, Tcl_
9970: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 GetString(objv[1
9980: 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 ]), NULL);. i
9990: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
99a0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
99b0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
99c0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
99d0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
99e0: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
99f0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
9a00: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
9a10: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
9a20: 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 an);.. for (i
9a30: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 dx = 2; idx < ob
9a40: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 jc; idx++) {..ch
9a50: 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 ar *opt = Tcl_Ge
9a60: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 64 78 tString(objv[idx
9a70: 5d 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d ]);...if (opt[0]
9a80: 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 != '-').. br
9a90: 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d eak;...OPTOBJ("-
9aa0: 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f alpn", alpn);..O
9ab0: 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c 20 PTSTR("-cadir",
9ac0: 43 41 70 61 74 68 29 3b 0a 09 4f 50 54 53 54 52 CApath);..OPTSTR
9ad0: 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69 ("-cafile", CAfi
9ae0: 6c 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d le);..OPTBYTE("-
9af0: 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72 cert", cert, cer
9b00: 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 t_len);..OPTSTR(
9b10: 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 "-certfile", cer
9b20: 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 tfile);..OPTSTR(
9b30: 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 "-cipher", ciphe
9b40: 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 rs);..OPTSTR("-c
9b50: 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 iphers", ciphers
9b60: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 );..OPTSTR("-cip
9b70: 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 hersuites", ciph
9b80: 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f ersuites);..OPTO
9b90: 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 BJ("-command", s
9ba0: 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 cript);..OPTSTR(
9bb0: 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 "-dhparams", DHp
9bc0: 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45 arams);..OPTBYTE
9bd0: 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 ("-key", key, ke
9be0: 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 y_len);..OPTSTR(
9bf0: 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 "-keyfile", keyf
9c00: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ile);..OPTSTR("-
9c10: 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a model", model);.
9c20: 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f .OPTOBJ("-passwo
9c30: 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a rd", password);.
9c40: 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f .OPTBOOL("-post_
9c50: 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74 handshake", post
9c60: 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50 _handshake);..OP
9c70: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 TBOOL("-request"
9c80: 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 , request);..OPT
9c90: 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c BOOL("-require",
9ca0: 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 49 require);..OPTI
9cb0: 4e 54 28 22 2d 73 65 63 75 72 69 74 79 5f 6c 65 NT("-security_le
9cc0: 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f vel", level);..O
9cd0: 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 PTBOOL("-server"
9ce0: 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 , server);..OPTS
9cf0: 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 TR("-servername"
9d00: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 , servername);..
9d10: 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e OPTSTR("-session
9d20: 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 _id", session_id
9d30: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 );..OPTBOOL("-ss
9d40: 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 l2", ssl2);..OPT
9d50: 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 BOOL("-ssl3", ss
9d60: 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d l3);..OPTBOOL("-
9d70: 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f tls1", tls1);..O
9d80: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 PTBOOL("-tls1.1"
9d90: 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 , tls1_1);..OPTB
9da0: 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 OOL("-tls1.2", t
9db0: 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c ls1_2);..OPTBOOL
9dc0: 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 ("-tls1.3", tls1
9dd0: 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 _3);..OPTOBJ("-v
9de0: 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c alidatecommand",
9df0: 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 vcmd);..OPTOBJ(
9e00: 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a "-vcmd", vcmd);.
9e10: 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e ..OPTBAD("option
9e20: 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 ", "-alpn, -cadi
9e30: 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 r, -cafile, -cer
9e40: 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 t, -certfile, -c
9e50: 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 ipher, -ciphersu
9e60: 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 ites, -command,
9e70: 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c -dhparams, -key,
9e80: 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 -keyfile, -mode
9e90: 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 l, -password, -p
9ea0: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d ost_handshake, -
9eb0: 72 65 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72 request, -requir
9ec0: 65 2c 20 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 e, -security_lev
9ed0: 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 el, -server, -se
9ee0: 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 rvername, -sessi
9ef0: 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 on_id, -ssl2, -s
9f00: 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 sl3, -tls1, -tls
9f10: 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 1.1, -tls1.2, -t
9f20: 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 ls1.3, or -valid
9f30: 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 atecommand");...
9f40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
9f50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
9f60: 72 65 71 75 65 73 74 29 09 09 76 65 72 69 66 79 request)..verify
9f70: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 |= SSL_VERIFY_C
9f80: 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c LIENT_ONCE | SSL
9f90: 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 _VERIFY_PEER;.
9fa0: 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26 if (request &&
9fb0: 20 72 65 71 75 69 72 65 29 09 76 65 72 69 66 79 require).verify
9fc0: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 |= SSL_VERIFY_F
9fd0: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 AIL_IF_NO_PEER_C
9fe0: 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71 ERT;. if (req
9ff0: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e uest && post_han
a000: 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c dshake).verify |
a010: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 = SSL_VERIFY_POS
a020: 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 T_HANDSHAKE;.
a030: 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30 if (verify == 0
a040: 29 09 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f )..verify = SSL_
a050: 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 VERIFY_NONE;..
a060: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 proto |= (ssl2
a070: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c ? TLS_PROTO_SSL
a080: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 2 : 0);. prot
a090: 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 o |= (ssl3 ? TLS
a0a0: 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 _PROTO_SSL3 : 0)
a0b0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
a0c0: 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f tls1 ? TLS_PROTO
a0d0: 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 _TLS1 : 0);.
a0e0: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 proto |= (tls1_1
a0f0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
a100: 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 1_1 : 0);. pr
a110: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f oto |= (tls1_2 ?
a120: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
a130: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 2 : 0);. prot
a140: 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 o |= (tls1_3 ? T
a150: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 LS_PROTO_TLS1_3
a160: 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 : 0);.. /* re
a170: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 set to NULL if b
a180: 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 lank string prov
a190: 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 ided */. if (
a1a0: 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 cert && !*cert).
a1b0: 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20 20 . cert.
a1c0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
a1d0: 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b if (key && !*k
a1e0: 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 ey).. key
a1f0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
a200: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c . if (certfil
a210: 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 e && !*certfile)
a220: 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69 6c certfil
a230: 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 e.= NULL;. if
a240: 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b (keyfile && !*k
a250: 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 eyfile)..keyfile
a260: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
a270: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 . if (ciphers
a280: 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 && !*ciphers).
a290: 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09 20 ciphers.
a2a0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
a2b0: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75 69 if (ciphersui
a2c0: 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 tes && !*ciphers
a2d0: 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75 69 uites) ciphersui
a2e0: 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 tes = NULL;.
a2f0: 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 if (CAfile &&
a300: 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 !*CAfile).
a310: 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 CAfile.
a320: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
a330: 20 28 43 41 70 61 74 68 20 26 26 20 21 2a 43 41 (CApath && !*CA
a340: 70 61 74 68 29 09 20 20 20 20 20 20 20 20 43 41 path). CA
a350: 70 61 74 68 09 20 20 20 20 20 20 20 20 3d 20 4e path. = N
a360: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 ULL;. if (DHp
a370: 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 arams && !*DHpar
a380: 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70 ams). DHp
a390: 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e arams = N
a3a0: 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 ULL;.. /* new
a3b0: 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 SSL state */.
a3c0: 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 statePtr..= (S
a3d0: 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 tate *) ckalloc(
a3e0: 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f (unsigned) sizeo
a3f0: 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d f(State));. m
a400: 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 emset(statePtr,
a410: 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 0, sizeof(State)
a420: 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 );.. statePtr
a430: 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b ->flags.= flags;
a440: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 . statePtr->i
a450: 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a nterp.= interp;.
a460: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 statePtr->vf
a470: 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 lags.= verify;.
a480: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 statePtr->err
a490: 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 .= "";.. /* a
a4a0: 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a llocate script *
a4b0: 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 74 /. if (script
a4c0: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f ) {..(void) Tcl_
a4d0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
a4e0: 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a (script, &len);.
a4f0: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 .if (len) {..
a500: 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 statePtr->callb
a510: 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 ack = script;..
a520: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
a530: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 unt(statePtr->ca
a540: 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 llback);..}.
a550: 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 }.. /* alloca
a560: 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 te password */.
a570: 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 if (password)
a580: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 {..(void) Tcl_G
a590: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
a5a0: 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b password, &len);
a5b0: 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 ..if (len) {..
a5c0: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 statePtr->pass
a5d0: 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b word = password;
a5e0: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
a5f0: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
a600: 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 >password);..}.
a610: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c }.. /* all
a620: 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 ocate validate c
a630: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 ommand */. if
a640: 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 (vcmd) {..(void
a650: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 ) Tcl_GetStringF
a660: 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 romObj(vcmd, &le
a670: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
a680: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 . statePtr->v
a690: 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 cmd = vcmd;..
a6a0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
a6b0: 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 t(statePtr->vcmd
a6c0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
a6d0: 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 if (model != NU
a6e0: 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b LL) {..int mode;
a6f0: 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f ../* Get the "mo
a700: 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a del" context */.
a710: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 .chan = Tcl_GetC
a720: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d hannel(interp, m
a730: 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 odel, &mode);..i
a740: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
a750: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
a760: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
a770: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
a780: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
a790: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
a7a0: 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 *.. * Make sure
a7b0: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
a7c0: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
a7d0: 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 l.. */..chan = T
a7e0: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
a7f0: 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c (chan);..if (Tcl
a800: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
a810: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
a820: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 nnelType()) {..
a830: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
a840: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
a850: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
a860: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
a870: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e (chan),..."\": n
a880: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
a890: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
a8a0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 );.. Tcl_SetE
a8b0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
a8c0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 "TLS", "IMPORT"
a8d0: 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e , "CHANNEL", "IN
a8e0: 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 VALID", (char *)
a8f0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 NULL);.. Tls
a900: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
a910: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
a920: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
a930: 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 ..}..ctx = ((Sta
a940: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e te *)Tcl_GetChan
a950: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
a960: 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 chan))->ctx;.
a970: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 } else {..if ((
a980: 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 ctx = CTX_Init(s
a990: 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c tatePtr, server,
a9a0: 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c proto, keyfile,
a9b0: 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 certfile, key,
a9c0: 63 65 72 74 2c 20 28 69 6e 74 29 20 6b 65 79 5f cert, (int) key_
a9d0: 6c 65 6e 2c 0a 09 20 20 20 20 28 69 6e 74 29 20 len,.. (int)
a9e0: 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 61 74 68 cert_len, CApath
a9f0: 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72 , CAfile, cipher
aa00: 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 2c s, ciphersuites,
aa10: 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 level, DHparams
aa20: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 )) == NULL) {..
aa30: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
aa40: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
aa50: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
aa60: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
aa70: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 . statePtr->c
aa80: 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f tx = ctx;.. /
aa90: 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 *. * We need
aaa0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 to make sure th
aab0: 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 at the channel w
aac0: 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 orks in binary (
aad0: 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 for the. * e
aae0: 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f ncryption not to
aaf0: 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e get goofed up).
ab00: 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 . * We only
ab10: 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74 want to adjust t
ab20: 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20 he buffering in
ab30: 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c pre-v2 channels,
ab40: 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61 where. * ea
ab50: 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 ch channel in th
ab60: 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e e stack maintain
ab70: 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65 ed its own buffe
ab80: 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 rs.. */.
ab90: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
aba0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 &upperChannelTra
abb0: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 nslation);. T
abc0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
abd0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
abe0: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 king);. Tcl_D
abf0: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
ac00: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 rChannelEOFChar)
ac10: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
ac20: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e gInit(&upperChan
ac30: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 nelEncoding);.
ac40: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c Tcl_GetChannel
ac50: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
ac60: 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c han, "-eofchar",
ac70: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f &upperChannelEO
ac80: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f FChar);. Tcl_
ac90: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e GetChannelOption
aca0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
acb0: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 -encoding", &upp
acc0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e erChannelEncodin
acd0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 g);. Tcl_GetC
ace0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
acf0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 erp, chan, "-tra
ad00: 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 nslation", &uppe
ad10: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
ad20: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 ion);. Tcl_Ge
ad30: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
ad40: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 nterp, chan, "-b
ad50: 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 locking", &upper
ad60: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 ChannelBlocking)
ad70: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
ad80: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
ad90: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 p, chan, "-trans
ada0: 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 lation", "binary
adb0: 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ");. Tcl_SetC
adc0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
add0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f erp, chan, "-blo
ade0: 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b cking", "true");
adf0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f . dprintf("Co
ae00: 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e nsuming Tcl chan
ae10: 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 nel %s", Tcl_Get
ae20: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
ae30: 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 ));. statePtr
ae40: 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 ->self = Tcl_Sta
ae50: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 ckChannel(interp
ae60: 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 , Tls_ChannelTyp
ae70: 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 e(), (ClientData
ae80: 29 20 73 74 61 74 65 50 74 72 2c 0a 09 28 54 43 ) statePtr,..(TC
ae90: 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c L_READABLE | TCL
aea0: 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e _WRITABLE), chan
aeb0: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 );. dprintf("
aec0: 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 Created channel
aed0: 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 named %s", Tcl_G
aee0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
aef0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a atePtr->self));.
af00: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
af10: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 ->self == (Tcl_C
af20: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
af30: 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f ./*.. * No use o
af40: 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 f Tcl_Eventually
af50: 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20 Free because no
af60: 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 possible Tcl_Pre
af70: 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 serve... */..Tls
af80: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
af90: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 tatePtr);..retur
afa0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
afb0: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 }.. Tcl_SetC
afc0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
afd0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
afe0: 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 elf, "-translati
aff0: 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 on", Tcl_DString
b000: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e Value(&upperChan
b010: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 nelTranslation))
b020: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
b030: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
b040: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
b050: 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 f, "-encoding",
b060: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
b070: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e (&upperChannelEn
b080: 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 coding));. Tc
b090: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
b0a0: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 on(interp, state
b0b0: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 Ptr->self, "-eof
b0c0: 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 char", Tcl_DStri
b0d0: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
b0e0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a annelEOFChar));.
b0f0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
b100: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
b110: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c statePtr->self,
b120: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 "-blocking", Tc
b130: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
b140: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
b150: 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f king));. Tcl_
b160: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 DStringFree(&upp
b170: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
b180: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 tion);. Tcl_D
b190: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 StringFree(&uppe
b1a0: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
b1b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
b1c0: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 ngFree(&upperCha
b1d0: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 nnelEOFChar);.
b1e0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
b1f0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 e(&upperChannelB
b200: 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 2f locking);.. /
b210: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 *. * SSL Ini
b220: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 tialization.
b230: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
b240: 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 ->ssl = SSL_new(
b250: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a statePtr->ctx);.
b260: 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 if (!statePt
b270: 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 r->ssl) {../* SS
b280: 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 L library error
b290: 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 */..Tcl_AppendRe
b2a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f sult(interp, "co
b2b0: 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 uldn't construct
b2c0: 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c ssl session: ",
b2d0: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 GET_ERR_REASON(
b2e0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
b2f0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 );.. Tcl_SetE
b300: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
b310: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 "TLS", "IMPORT"
b320: 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 , "INIT", "FAILE
b330: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
b340: 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 L);..Tls_Free((c
b350: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
b360: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
b370: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
b380: 2f 2a 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 /* Set host serv
b390: 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 er name */. i
b3a0: 66 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b f (servername) {
b3b0: 0a 09 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 ../* Sets the se
b3c0: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 rver name indica
b3d0: 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c tion (SNI) in Cl
b3e0: 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 ientHello extens
b3f0: 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 ion */../* Per R
b400: 46 43 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d FC 6066, hostnam
b410: 65 20 69 73 20 61 20 41 53 43 49 49 20 65 6e 63 e is a ASCII enc
b420: 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 74 68 6f oded string, tho
b430: 75 67 68 20 52 46 43 20 34 33 36 36 20 73 61 79 ugh RFC 4366 say
b440: 73 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 s UTF-8. */..if
b450: 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 (!SSL_set_tlsext
b460: 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 _host_name(state
b470: 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 Ptr->ssl, server
b480: 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 name) && require
b490: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
b4a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
b4b0: 2c 20 22 53 65 74 20 53 4e 49 20 65 78 74 65 6e , "Set SNI exten
b4c0: 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 sion failed: ",
b4d0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
b4e0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b4f0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
b500: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
b510: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
b520: 20 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 "SNI", "FAILED"
b530: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b540: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
b550: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
b560: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
b570: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 TCL_ERROR;..}...
b580: 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 /* Set hostname
b590: 66 6f 72 20 70 65 65 72 20 63 65 72 74 69 66 69 for peer certifi
b5a0: 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 cate hostname ve
b5b0: 72 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c rification in cl
b5c0: 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 ients... Don't
b5d0: 20 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f use SSL_set1_ho
b5e0: 73 74 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 st since it has
b5f0: 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a limitations. */.
b600: 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 .if (!SSL_add1_h
b610: 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ost(statePtr->ss
b620: 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20 l, servername))
b630: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
b640: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
b650: 22 53 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d "Set DNS hostnam
b660: 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 e failed: ", GET
b670: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
b680: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
b690: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 Tcl_SetError
b6a0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
b6b0: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 S", "IMPORT", "H
b6c0: 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 OSTNAME", "FAILE
b6d0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
b6e0: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 L);.. Tls_Fre
b6f0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
b700: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
b710: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
b720: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 }.. /* Re
b730: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 sume session id
b740: 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 */. if (sessi
b750: 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e 28 on_id && strlen(
b760: 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 session_id) <= S
b770: 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c SL_MAX_SID_CTX_L
b780: 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c ENGTH) {../* SSL
b790: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a _set_session() *
b7a0: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53 /..if (!SSL_SESS
b7b0: 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 ION_set1_id_cont
b7c0: 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 ext(SSL_get_sess
b7d0: 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ion(statePtr->ss
b7e0: 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 l), session_id,
b7f0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 (unsigned int) s
b800: 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 trlen(session_id
b810: 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 ))) {.. Tcl_A
b820: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
b830: 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73 73 rp, "Resume sess
b840: 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 ion failed: ", G
b850: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
b860: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b870: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
b880: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
b890: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
b8a0: 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c "SESSION", "FAIL
b8b0: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ED", (char *) NU
b8c0: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 LL);.. Tls_Fr
b8d0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
b8e0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
b8f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
b900: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 . }.. /* E
b910: 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f nable Applicatio
b920: 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c n-Layer Protocol
b930: 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 Negotiation. Ex
b940: 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 amples are: http
b950: 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c /1.0,..http/1.1,
b960: 20 68 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d h2, h3, ftp, im
b970: 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 ap, pop3, xmpp-c
b980: 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 lient, xmpp-serv
b990: 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 er, mqtt, irc, e
b9a0: 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 tc. */. if (a
b9b0: 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 lpn) {../* Conve
b9c0: 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e rt a TCL list in
b9d0: 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 to a protocol-li
b9e0: 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 st in wire-forma
b9f0: 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 t */..unsigned c
ba00: 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b har *protos, *p;
ba10: 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 ..unsigned int p
ba20: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 rotos_len = 0;..
ba30: 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b Tcl_Size cnt, i;
ba40: 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 ..int j;..Tcl_Ob
ba50: 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 j **list;...if (
ba60: 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c Tcl_ListObjGetEl
ba70: 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 ements(interp, a
ba80: 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 lpn, &cnt, &list
ba90: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
baa0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
bab0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
bac0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
bad0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 _ERROR;..}.../*
bae0: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 Determine the me
baf0: 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f mory required fo
bb00: 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c r the protocol-l
bb10: 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d ist */..for (i =
bb20: 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 0; i < cnt; i++
bb30: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 ) {.. Tcl_Get
bb40: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 StringFromObj(li
bb50: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 st[i], &len);..
bb60: 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 if (len > 255
bb70: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 ) {...Tcl_Append
bb80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
bb90: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 ALPN protocol na
bba0: 6d 65 73 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 mes too long", (
bbb0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
bbc0: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
bbd0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
bbe0: 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e "IMPORT", "ALPN
bbf0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 ", "FAILED", (ch
bc00: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 ar *) NULL);...T
bc10: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
bc20: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 statePtr);...re
bc30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
bc40: 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 . }.. prot
bc50: 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 os_len += 1 + (i
bc60: 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a nt) len;..}.../*
bc70: 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c Build the compl
bc80: 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 ete protocol-lis
bc90: 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 t */..protos = c
bca0: 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 kalloc(protos_le
bcb0: 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c n);../* protocol
bcc0: 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f -lists consist o
bcd0: 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 f 8-bit length-p
bce0: 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 refixed, byte st
bcf0: 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a rings */..for (j
bd00: 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 = 0, p = protos
bd10: 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 ; j < cnt; j++)
bd20: 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 {.. char *str
bd30: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
bd40: 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c FromObj(list[j],
bd50: 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b &len);.. *p+
bd60: 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 + = (unsigned ch
bd70: 61 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 ar) len;.. me
bd80: 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69 mcpy(p, str, (si
bd90: 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 ze_t) len);..
bda0: 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 p += len;..}...
bdb0: 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f /* SSL_set_alpn_
bdc0: 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 protos makes a c
bdd0: 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f opy of the proto
bde0: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 col-list */../*
bdf0: 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 Note: This funct
be00: 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 68 ions reverses th
be10: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 e return value c
be20: 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 onvention */..if
be30: 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 (SSL_set_alpn_p
be40: 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e rotos(statePtr->
be50: 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f ssl, protos, pro
be60: 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 tos_len)) {..
be70: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
be80: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41 t(interp, "Set A
be90: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 LPN protocols fa
bea0: 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 iled: ", GET_ERR
beb0: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 _REASON(), (char
bec0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
bed0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
bee0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
bef0: 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 "IMPORT", "ALPN"
bf00: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
bf10: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
bf20: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 Tls_Free((char
bf30: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
bf40: 20 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 ckfree(protos
bf50: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
bf60: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
bf70: 2a 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c * Store protocol
bf80: 73 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 s list */..state
bf90: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 Ptr->protos = pr
bfa0: 6f 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d otos;..statePtr-
bfb0: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 >protos_len = pr
bfc0: 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 otos_len;. }
bfd0: 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 else {..statePtr
bfe0: 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b ->protos = NULL;
bff0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
c000: 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 os_len = 0;.
c010: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
c020: 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 SSL Callbacks.
c030: 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 */. SSL_s
c040: 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 et_app_data(stat
c050: 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 ePtr->ssl, (void
c060: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a *)statePtr);./*
c070: 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 point back to u
c080: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 s */. SSL_set
c090: 5f 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 _verify(statePtr
c0a0: 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 ->ssl, verify, V
c0b0: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a erifyCallback);.
c0c0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f SSL_set_info
c0d0: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 _callback(stateP
c0e0: 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c tr->ssl, InfoCal
c0f0: 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 lback);.. /*
c100: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 Callback for obs
c110: 65 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 erving protocol
c120: 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e messages */.#ifn
c130: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 def OPENSSL_NO_S
c140: 53 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 SL_TRACE. /*
c150: 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 void SSL_CTX_set
c160: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 _msg_callback_ar
c170: 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c g(statePtr->ctx,
c180: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
c190: 72 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c r);. void SSL
c1a0: 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c _CTX_set_msg_cal
c1b0: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e lback(statePtr->
c1c0: 63 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c ctx, MessageCall
c1d0: 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 back); */. SS
c1e0: 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 L_set_msg_callba
c1f0: 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d ck_arg(statePtr-
c200: 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 >ssl, (void *)st
c210: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c atePtr);. SSL
c220: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 _set_msg_callbac
c230: 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c k(statePtr->ssl,
c240: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b MessageCallback
c250: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f );.#endif.. /
c260: 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 * Create Tcl_Cha
c270: 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 nnel BIO Handler
c280: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
c290: 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 ->p_bio.= BIO_ne
c2a0: 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 w_tcl(statePtr,
c2b0: 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 BIO_NOCLOSE);.
c2c0: 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 statePtr->bio.
c2d0: 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f = BIO_new(BIO_f_
c2e0: 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 ssl());.. if
c2f0: 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 (server) {../* S
c300: 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 erver callbacks
c310: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f */..SSL_CTX_set_
c320: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d tlsext_servernam
c330: 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e e_arg(statePtr->
c340: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ctx, (void *)sta
c350: 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 tePtr);..SSL_CTX
c360: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 _set_tlsext_serv
c370: 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 ername_callback(
c380: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 statePtr->ctx, S
c390: 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 NICallback);..SS
c3a0: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 L_CTX_set_client
c3b0: 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 _hello_cb(stateP
c3c0: 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 tr->ctx, HelloCa
c3d0: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 llback, (void *)
c3e0: 73 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 statePtr);..if (
c3f0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
c400: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
c410: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 SSL_CTX_set_alp
c420: 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 n_select_cb(stat
c430: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 ePtr->ctx, ALPNC
c440: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a allback, (void *
c450: 29 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 )statePtr);.#ifd
c460: 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 ef USE_NPN..
c470: 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 if (tls1_2 == 0
c480: 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 && tls1_3 == 0)
c490: 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {...SSL_CTX_set_
c4a0: 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 next_protos_adve
c4b0: 72 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 rtised_cb(stateP
c4c0: 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c tr->ctx, NPNCall
c4d0: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 back, (void *)st
c4e0: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a atePtr);.. }.
c4f0: 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 #endif..}.../* E
c500: 6e 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 nable server to
c510: 73 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 send cert reques
c520: 74 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b t after handshak
c530: 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 e (TLS 1.3 only)
c540: 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 */../* A write
c550: 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 operation must t
c560: 61 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 ake place for th
c570: 65 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65 e Certificate Re
c580: 71 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 quest to be..
c590: 73 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 sent to the clie
c5a0: 6e 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 nt, this can be
c5b0: 64 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f done with SSL_do
c5c0: 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f _handshake(). */
c5d0: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 ..if (request &&
c5e0: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 post_handshake
c5f0: 26 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 && tls1_3) {..
c600: 20 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 SSL_verify_cli
c610: 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 ent_post_handsha
c620: 6b 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ke(statePtr->ssl
c630: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 );..}.../* set a
c640: 75 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 utomatic curve s
c650: 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c election */..SSL
c660: 5f 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 _set_ecdh_auto(s
c670: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 tatePtr->ssl, 1)
c680: 3b 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 ;.../* Set serve
c690: 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 r mode */..state
c6a0: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c Ptr->flags |= TL
c6b0: 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 S_TCL_SERVER;..S
c6c0: 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 SL_set_accept_st
c6d0: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ate(statePtr->ss
c6e0: 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b l);. } else {
c6f0: 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c ../* Client call
c700: 62 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 backs */.#ifdef
c710: 55 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 USE_NPN..if (sta
c720: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d tePtr->protos !=
c730: 20 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 NULL && tls1_2
c740: 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d == 0 && tls1_3 =
c750: 3d 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f = 0) {.. SSL_
c760: 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f CTX_set_next_pro
c770: 74 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 to_select_cb(sta
c780: 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e tePtr->ctx, ALPN
c790: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 Callback, (void
c7a0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a *)statePtr);..}.
c7b0: 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 #endif.../* Sess
c7c0: 69 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 ion caching */..
c7d0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 SSL_CTX_set_sess
c7e0: 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 ion_cache_mode(s
c7f0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 tatePtr->ctx, SS
c800: 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 L_SESS_CACHE_CLI
c810: 45 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 ENT | SSL_SESS_C
c820: 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c ACHE_NO_INTERNAL
c830: 5f 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 _STORE);..SSL_CT
c840: 58 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 X_sess_set_new_c
c850: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c b(statePtr->ctx,
c860: 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b SessionCallback
c870: 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 );.../* Enable p
c880: 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 ost handshake Au
c890: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 thentication ext
c8a0: 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 ension. TLS 1.3
c8b0: 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 only, not http/2
c8c0: 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 . */..if (reques
c8d0: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 t && post_handsh
c8e0: 61 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f ake) {.. SSL_
c8f0: 73 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 set_post_handsha
c900: 6b 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 ke_auth(statePtr
c910: 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 ->ssl, 1);..}...
c920: 2f 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f /* Set client mo
c930: 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 de */..SSL_set_c
c940: 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 onnect_state(sta
c950: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
c960: 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 }. SSL_set_b
c970: 69 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c io(statePtr->ssl
c980: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 , statePtr->p_bi
c990: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 o, statePtr->p_b
c9a0: 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 io);. BIO_set
c9b0: 5f 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 _ssl(statePtr->b
c9c0: 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 io, statePtr->ss
c9d0: 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b l, BIO_NOCLOSE);
c9e0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
c9f0: 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a End of SSL Init.
ca00: 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 */. dpri
ca10: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 ntf("Returning %
ca20: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e s", Tcl_GetChann
ca30: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
ca40: 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c >self));. Tcl
ca50: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
ca60: 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f p, (char *) Tcl_
ca70: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
ca80: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
ca90: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a TCL_VOLATILE);..
caa0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
cab0: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
cac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
caf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
cb00: 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 *. * UnimportOb
cb10: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
cb20: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
cb30: 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 invoked to remov
cb40: 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 e the topmost ch
cb50: 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a annel filter.. *
cb60: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
cb70: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
cb80: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
cb90: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 e effects:. *.Ma
cba0: 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 y modify the beh
cbb0: 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 avior of an IO c
cbc0: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d hannel.. *. *---
cbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc10: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
cc20: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 UnimportObjCmd(C
cc30: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
cc40: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
cc50: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
cc60: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
cc70: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
cc80: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
cc90: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e n;../* The chann
cca0: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 el to set a mode
ccb0: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 28 76 6f 69 on. */. (voi
ccc0: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a d) clientData;..
ccd0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
cce0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
ccf0: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 objc != 2) {..Tc
cd00: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
cd10: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
cd20: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 "channel");..ret
cd30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
cd40: 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d }.. chan =
cd50: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
cd60: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
cd70: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 tring(objv[1]),
cd80: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
cd90: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
cda0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
cdb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
cdc0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
cdd0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
cde0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
cdf0: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
ce00: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
ce10: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
ce20: 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 .. if (Tcl_Ge
ce30: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 tChannelType(cha
ce40: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 n) != Tls_Channe
ce50: 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f lType()) {..Tcl_
ce60: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
ce70: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
ce80: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
ce90: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
cea0: 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c ..."\": not a TL
ceb0: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 S channel", (cha
cec0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
ced0: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 Tcl_SetErrorCod
cee0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
cef0: 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 "UNIMPORT", "CH
cf00: 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 ANNEL", "INVALID
cf10: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
cf20: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
cf30: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
cf40: 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b if (Tcl_Unstack
cf50: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
cf60: 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 chan) == TCL_ERR
cf70: 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OR) {..return TC
cf80: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
cf90: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
cfa0: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
cfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cfd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cfe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
cff0: 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d *. * CTX_Init -
d000: 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53 - construct a SS
d010: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 L_CTX instance.
d020: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
d030: 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 .A valid SSL_CTX
d040: 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c instance or NUL
d050: 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 L.. *. * Side ef
d060: 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 fects:. *.constr
d070: 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 ucts SSL context
d080: 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d (CTX). *. *----
d090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
d0d0: 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 */.static SSL_C
d0e0: 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 TX *.CTX_Init(St
d0f0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 ate *statePtr, i
d100: 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 nt isServer, int
d110: 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 proto, char *ke
d120: 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 yfile, char *cer
d130: 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 tfile,. unsig
d140: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 ned char *key, u
d150: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 nsigned char *ce
d160: 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c rt, int key_len,
d170: 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 int cert_len, c
d180: 68 61 72 20 2a 43 41 70 61 74 68 2c 0a 20 20 20 har *CApath,.
d190: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 char *CAfile, c
d1a0: 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 har *ciphers, ch
d1b0: 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 ar *ciphersuites
d1c0: 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 , int level, cha
d1d0: 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 r *DHparams) {.
d1e0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
d1f0: 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 nterp = statePtr
d200: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 ->interp;. SS
d210: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c L_CTX *ctx = NUL
d220: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 L;. Tcl_DStri
d230: 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 ng ds;. Tcl_D
d240: 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 String ds1;.
d250: 69 6e 74 20 6f 66 66 20 3d 20 30 2c 20 61 62 6f int off = 0, abo
d260: 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 rt = 0;. int
d270: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 load_private_key
d280: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f ;. const SSL_
d290: 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a METHOD *method;.
d2a0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
d2b0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
d2c0: 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f (!proto) {..Tcl_
d2d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d2e0: 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 erp, "no valid p
d2f0: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
d300: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
d310: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
d320: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 . }.. /* c
d330: 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 reate SSL contex
d340: 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c t */.#if OPENSSL
d350: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
d360: 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c >= 0x10100000L |
d370: 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c | defined(NO_SSL
d380: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
d390: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 ENSSL_NO_SSL2).
d3a0: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
d3b0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
d3c0: 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 SSL2)) {..Tcl_Ap
d3d0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
d3e0: 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f p, "SSL2 protoco
d3f0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
d400: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
d410: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
d420: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
d430: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 defined(NO_SSL3
d440: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
d450: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 NSSL_NO_SSL3).
d460: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
d470: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 oto, TLS_PROTO_S
d480: 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 SL3)) {..Tcl_App
d490: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
d4a0: 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c , "SSL3 protocol
d4b0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
d4c0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d4d0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
d4e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
d4f0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
d500: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
d510: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 SSL_NO_TLS1).
d520: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
d530: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
d540: 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 S1)) {..Tcl_Appe
d550: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
d560: 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 "TLS 1.0 protoc
d570: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
d580: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
d590: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
d5a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 . }.#endif.#i
d5b0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
d5c0: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_1) || defined(
d5d0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
d5e0: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 1). if (ENABL
d5f0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
d600: 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 OTO_TLS1_1)) {..
d610: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d620: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e (interp, "TLS 1.
d630: 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 1 protocol not s
d640: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
d650: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
d660: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
d670: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
d680: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 d(NO_TLS1_2) ||
d690: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d6a0: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 NO_TLS1_2). i
d6b0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
d6c0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
d6d0: 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 _2)) {..Tcl_Appe
d6e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
d6f0: 20 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 "TLS 1.2 protoc
d700: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
d710: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
d720: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
d730: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 . }.#endif.#i
d740: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
d750: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_3) || defined(
d760: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
d770: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 3). if (ENABL
d780: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
d790: 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 OTO_TLS1_3)) {..
d7a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d7b0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e (interp, "TLS 1.
d7c0: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 3 protocol not s
d7d0: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
d7e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
d7f0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
d800: 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 70 72 endif. if (pr
d810: 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 oto == 0) {../*
d820: 55 73 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a Use full range *
d830: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d /..SSL_CTX_set_m
d840: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e in_proto_version
d850: 28 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 (ctx, 0);..SSL_C
d860: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f TX_set_max_proto
d870: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 _version(ctx, 0)
d880: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 ;. }.. swi
d890: 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 tch (proto) {.#i
d8a0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
d8b0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
d8c0: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 00000L && !defin
d8d0: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 ed(NO_SSL2) && !
d8e0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d8f0: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 NO_SSL2). cas
d900: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 e TLS_PROTO_SSL2
d910: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 :..method = isSe
d920: 72 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 rver ? SSLv2_ser
d930: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 ver_method() : S
d940: 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 SLv2_client_meth
d950: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
d960: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
d970: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 d(NO_SSL3) && !d
d980: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
d990: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
d9a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
d9b0: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 SL3_METHOD).
d9c0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 case TLS_PROTO_S
d9d0: 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 SL3:..method = i
d9e0: 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f sServer ? SSLv3_
d9f0: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 server_method()
da00: 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d : SSLv3_client_m
da10: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b ethod();..break;
da20: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
da30: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 ined(NO_TLS1) &&
da40: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
da50: 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 L_NO_TLS1) && !d
da60: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
da70: 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 O_TLS1_METHOD).
da80: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
da90: 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 O_TLS1:..method
daa0: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 = isServer ? TLS
dab0: 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 v1_server_method
dac0: 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e () : TLSv1_clien
dad0: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
dae0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
daf0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
db00: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
db10: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
db20: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
db30: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f ENSSL_NO_TLS1_1_
db40: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 METHOD). case
db50: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
db60: 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 1:..method = isS
db70: 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f erver ? TLSv1_1_
db80: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 server_method()
db90: 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 : TLSv1_1_client
dba0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
dbb0: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 k;.#endif.#if !d
dbc0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
dbd0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
dbe0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
dbf0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
dc00: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d NSSL_NO_TLS1_2_M
dc10: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 ETHOD). case
dc20: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 TLS_PROTO_TLS1_2
dc30: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 :..method = isSe
dc40: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 rver ? TLSv1_2_s
dc50: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a erver_method() :
dc60: 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f TLSv1_2_client_
dc70: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
dc80: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
dc90: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
dca0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
dcb0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
dcc0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
dcd0: 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 TO_TLS1_3:../* U
dce0: 73 65 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d se the generic m
dcf0: 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 ethod and constr
dd00: 61 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72 aint range after
dd10: 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 context is crea
dd20: 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d ted */..method =
dd30: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f isServer ? TLS_
dd40: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 server_method()
dd50: 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 : TLS_client_met
dd60: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 hod();..break;.#
dd70: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c endif. defaul
dd80: 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 t:../* Negotiate
dd90: 20 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 highest availab
dda0: 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 le SSL/TLS versi
ddb0: 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 on */..method =
ddc0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 isServer ? TLS_s
ddd0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a erver_method() :
dde0: 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 TLS_client_meth
ddf0: 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 od();.#if OPENSS
de00: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
de10: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 < 0x10100000L &
de20: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 & !defined(NO_SS
de30: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L2) && !defined(
de40: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
de50: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
de60: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
de70: 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a TO_SSL2) ? 0 :
de80: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 SSL_OP_NO_SSLv2
de90: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
dea0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 efined(NO_SSL3)
deb0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
dec0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 SSL_NO_SSL3)..of
ded0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
dee0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 oto, TLS_PROTO_S
def0: 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c SL3) ? 0 : SSL
df00: 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 _OP_NO_SSLv3);.#
df10: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
df20: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 ed(NO_TLS1) && !
df30: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
df40: 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d NO_TLS1)..off |=
df50: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
df60: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 TLS_PROTO_TLS1)
df70: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f ? 0 : SSL_OP_
df80: 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 NO_TLSv1);.#endi
df90: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
dfa0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 O_TLS1_1) && !de
dfb0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
dfc0: 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d _TLS1_1)..off |=
dfd0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
dfe0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
dff0: 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 1) ? 0 : SSL_OP_
e000: 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e NO_TLSv1_1);.#en
e010: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
e020: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 (NO_TLS1_2) && !
e030: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
e040: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 NO_TLS1_2)..off
e050: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 |= (ENABLED(prot
e060: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
e070: 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 1_2) ? 0 : SSL_O
e080: 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 P_NO_TLSv1_2);.#
e090: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
e0a0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 ed(NO_TLS1_3) &&
e0b0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
e0c0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 L_NO_TLS1_3)..of
e0d0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
e0e0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
e0f0: 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c LS1_3) ? 0 : SSL
e100: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b _OP_NO_TLSv1_3);
e110: 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a .#endif..break;.
e120: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 }.. ERR_c
e130: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 lear_error();..
e140: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 ctx = SSL_CTX
e150: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 _new(method);.
e160: 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 if (!ctx) {..r
e170: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 eturn(NULL);.
e180: 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 }.. if (gete
e190: 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 nv(SSLKEYLOGFILE
e1a0: 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 )) {..SSL_CTX_se
e1b0: 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 t_keylog_callbac
e1c0: 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c k(ctx, KeyLogCal
e1d0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 lback);. }..#
e1e0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
e1f0: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
e200: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
e210: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 S1_3). if (pr
e220: 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f oto == TLS_PROTO
e230: 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f _TLS1_3) {..SSL_
e240: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 CTX_set_min_prot
e250: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 o_version(ctx, T
e260: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a LS1_3_VERSION);.
e270: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 .SSL_CTX_set_max
e280: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
e290: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 tx, TLS1_3_VERSI
e2a0: 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ON);. }.#endi
e2b0: 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 f.. /* Force
e2c0: 63 69 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e cipher selection
e2d0: 20 6f 72 64 65 72 20 62 79 20 73 65 72 76 65 72 order by server
e2e0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 */. if (!isS
e2f0: 65 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 erver) {..SSL_CT
e300: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 X_set_options(ct
e310: 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 x, SSL_OP_CIPHER
e320: 5f 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e _SERVER_PREFEREN
e330: 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 CE);. }..#if
e340: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
e350: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 NUMBER < 0x10100
e360: 30 30 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 000L. OpenSSL
e370: 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 _add_all_algorit
e380: 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 hms(); /* Load c
e390: 69 70 68 65 72 73 20 61 6e 64 20 64 69 67 65 73 iphers and diges
e3a0: 74 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 ts */.#endif..
e3b0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 SSL_CTX_set_ap
e3c0: 70 5f 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 p_data(ctx, (voi
e3d0: 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 d*)interp);./* r
e3e0: 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 emember the inte
e3f0: 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 rpreter */. S
e400: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
e410: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 ns(ctx, SSL_OP_A
e420: 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 LL);./* all SSL
e430: 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 bug workarounds
e440: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
e450: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
e460: 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 SSL_OP_NO_COMPRE
e470: 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 62 SSION);./* disab
e480: 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 le compression e
e490: 76 65 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64 ven if supported
e4a0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f */. SSL_CTX_
e4b0: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c set_options(ctx,
e4c0: 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 off);../* disab
e4d0: 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 le protocol vers
e4e0: 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e ions */.#if OPEN
e4f0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
e500: 45 52 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c ER < 0x10101000L
e510: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
e520: 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d _mode(ctx, SSL_M
e530: 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b ODE_AUTO_RETRY);
e540: 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 ./* handle new h
e550: 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 61 63 andshakes in bac
e560: 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64 kground. On by d
e570: 65 66 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53 efault in OpenSS
e580: 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 L 1.1.1. */.#end
e590: 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 if. SSL_CTX_s
e5a0: 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 ess_set_cache_si
e5b0: 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 ze(ctx, 128);..
e5c0: 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 /* Set user d
e5d0: 65 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 efined ciphers,
e5e0: 63 69 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 cipher suites, a
e5f0: 6e 64 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 nd security leve
e600: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 l */. if ((ci
e610: 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 phers != NULL) &
e620: 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 & !SSL_CTX_set_c
e630: 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 ipher_list(ctx,
e640: 63 69 70 68 65 72 73 29 29 20 7b 0a 09 54 63 6c ciphers)) {..Tcl
e650: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
e660: 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 terp, "Set ciphe
e670: 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 rs failed: No va
e680: 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 lid ciphers", (c
e690: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 har *) NULL);..S
e6a0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
e6b0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
e6c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 }. if ((c
e6d0: 69 70 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e iphersuites != N
e6e0: 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 ULL) && !SSL_CTX
e6f0: 5f 73 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 _set_ciphersuite
e700: 73 28 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 s(ctx, ciphersui
e710: 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 tes)) {..Tcl_App
e720: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
e730: 2c 20 22 53 65 74 20 63 69 70 68 65 72 20 73 75 , "Set cipher su
e740: 69 74 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 ites failed: No
e750: 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 valid ciphers",
e760: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
e770: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
e780: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c x);..return NULL
e790: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
e7a0: 53 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 Set security lev
e7b0: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 el */. if (le
e7c0: 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 vel > -1 && leve
e7d0: 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c l < 6) {../* SSL
e7e0: 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 _set_security_le
e7f0: 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f vel */..SSL_CTX_
e800: 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 set_security_lev
e810: 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a el(ctx, level);.
e820: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 }.. /* se
e830: 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 t some callbacks
e840: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f */. SSL_CTX_
e850: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 set_default_pass
e860: 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73 73 77 wd_cb(ctx, Passw
e870: 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 ordCallback);.
e880: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 SSL_CTX_set_de
e890: 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f fault_passwd_cb_
e8a0: 75 73 65 72 64 61 74 61 28 63 74 78 2c 20 28 76 userdata(ctx, (v
e8b0: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
e8c0: 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 61 20 .. /* read a
e8d0: 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 Diffie-Hellman p
e8e0: 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 arameters file,
e8f0: 6f 72 20 75 73 65 20 74 68 65 20 62 75 69 6c 74 or use the built
e900: 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 -in one */.#ifde
e910: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a f OPENSSL_NO_DH.
e920: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 if (DHparams
e930: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c != NULL) {..Tcl
e940: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
e950: 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d 65 terp, "DH parame
e960: 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 ter support not
e970: 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 available", (cha
e980: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c r *) NULL);..SSL
e990: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
e9a0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
e9b0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a }.#else. {.
e9c0: 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 .DH* dh;..if (DH
e9d0: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 params != NULL)
e9e0: 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b {.. BIO *bio;
e9f0: 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f .. bio = BIO_
ea00: 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 new_file(F2N(DHp
ea10: 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 arams, &ds), "r"
ea20: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f );.. if (!bio
ea30: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ) {...Tcl_DStrin
ea40: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 gFree(&ds);...Tc
ea50: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
ea60: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f nterp, "Could no
ea70: 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 t find DH parame
ea80: 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 ters file", (cha
ea90: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
eaa0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
eab0: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ...return NULL;.
eac0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 . }... dh
ead0: 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 = PEM_read_bio_D
eae0: 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c Hparams(bio, NUL
eaf0: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a L, NULL, NULL);.
eb00: 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 . BIO_free(bi
eb10: 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 o);.. Tcl_DSt
eb20: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
eb30: 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 if (!dh) {..
eb40: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
eb50: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 t(interp, "Could
eb60: 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 not read DH par
eb70: 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c ameters from fil
eb80: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c e", (char *) NUL
eb90: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
eba0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
ebb0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 n NULL;.. }..
ebc0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
ebd0: 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b tmp_dh(ctx, dh);
ebe0: 0a 09 20 20 20 20 44 48 5f 66 72 65 65 28 64 68 .. DH_free(dh
ebf0: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 );...} else {..
ec00: 20 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b /* Use well k
ec10: 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d 65 74 65 nown DH paramete
ec20: 72 73 20 74 68 61 74 20 68 61 76 65 20 62 75 69 rs that have bui
ec30: 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 20 69 6e lt-in support in
ec40: 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 OpenSSL */..
ec50: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 if (!SSL_CTX_se
ec60: 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 t_dh_auto(ctx, 1
ec70: 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e )) {...Tcl_Appen
ec80: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
ec90: 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c "Could not enabl
eca0: 65 20 73 65 74 20 44 48 20 61 75 74 6f 3a 20 22 e set DH auto: "
ecb0: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
ecc0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
ecd0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
ece0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
ecf0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 n NULL;.. }..
ed00: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a }. }.#endif..
ed10: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 /* set our c
ed20: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 ertificate */.
ed30: 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b load_private_k
ed40: 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 ey = 0;. if (
ed50: 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c certfile != NULL
ed60: 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 ) {..load_privat
ed70: 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 69 66 20 e_key = 1;...if
ed80: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 (SSL_CTX_use_cer
ed90: 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 tificate_file(ct
eda0: 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c x, F2N(certfile,
edb0: 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 &ds), SSL_FILET
edc0: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b YPE_PEM) <= 0) {
edd0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
ede0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 gFree(&ds);..
edf0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
ee00: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
ee10: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 e to set certifi
ee20: 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 cate file ", cer
ee30: 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 tfile, ": ",...G
ee40: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
ee50: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
ee60: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 .. SSL_CTX_fr
ee70: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 ee(ctx);.. re
ee80: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 turn NULL;..}..T
ee90: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
eea0: 64 73 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 ds);.. } else
eeb0: 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c if (cert != NUL
eec0: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 L) {..load_priva
eed0: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 te_key = 1;..if
eee0: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 (SSL_CTX_use_cer
eef0: 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 tificate_ASN1(ct
ef00: 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 x, cert_len, cer
ef10: 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 t) <= 0) {..
ef20: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
ef30: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
ef40: 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 to set certific
ef50: 61 74 65 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 ate: ",...GET_ER
ef60: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
ef70: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
ef80: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
ef90: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
efa0: 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 NULL;..}. } e
efb0: 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 lse {..certfile
efc0: 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 = (char*)X509_ge
efd0: 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 t_default_cert_f
efe0: 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c ile();...if (SSL
eff0: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 _CTX_use_certifi
f000: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 cate_file(ctx, c
f010: 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c ertfile, SSL_FIL
f020: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 ETYPE_PEM) <= 0)
f030: 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 {.#if 0.. Tc
f040: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
f050: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
f060: 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 o use default ce
f070: 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 rtificate file "
f080: 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 , certfile, ": "
f090: 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 ,...GET_ERR_REAS
f0a0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
f0b0: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
f0c0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
f0d0: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
f0e0: 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a #endif..}. }.
f0f0: 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 . /* set our
f100: 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 private key */.
f110: 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 if (load_priv
f120: 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 ate_key) {..if (
f130: 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 keyfile == NULL
f140: 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 && key == NULL)
f150: 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20 3d {.. keyfile =
f160: 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 certfile;..}...
f170: 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e if (keyfile != N
f180: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 ULL) {.. /* g
f190: 65 74 20 74 68 65 20 70 72 69 76 61 74 65 20 6b et the private k
f1a0: 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 ey associated wi
f1b0: 74 68 20 74 68 69 73 20 63 65 72 74 69 66 69 63 th this certific
f1c0: 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 ate */.. if (
f1d0: 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 keyfile == NULL)
f1e0: 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 {...keyfile = c
f1f0: 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a ertfile;.. }.
f200: 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 .. if (SSL_CT
f210: 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 X_use_PrivateKey
f220: 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b _file(ctx, F2N(k
f230: 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 eyfile, &ds), SS
f240: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 L_FILETYPE_PEM)
f250: 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 <= 0) {...Tcl_DS
f260: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
f270: 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 ../* flush the p
f280: 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 assphrase which
f290: 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e might be left in
f2a0: 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 the result */..
f2b0: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
f2c0: 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c nterp, NULL, TCL
f2d0: 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f _STATIC);...Tcl_
f2e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f2f0: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
f300: 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 set public key f
f310: 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 ile ", keyfile,
f320: 22 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 " ",... GET_E
f330: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
f340: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 ar *) NULL);...S
f350: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
f360: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
f370: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c .. }.. Tcl
f380: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
f390: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 );...} else if (
f3a0: 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 key != NULL) {..
f3b0: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f if (SSL_CTX_
f3c0: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 use_PrivateKey_A
f3d0: 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 SN1(EVP_PKEY_RSA
f3e0: 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c , ctx, key,key_l
f3f0: 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a en) <= 0) {.../*
f400: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 flush the passp
f410: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 hrase which migh
f420: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 t be left in the
f430: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c result */...Tcl
f440: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
f450: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 p, NULL, TCL_STA
f460: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 TIC);...Tcl_Appe
f470: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
f480: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
f490: 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 public key: ", G
f4a0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
f4b0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
f4c0: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
f4d0: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e ctx);...return N
f4e0: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 ULL;.. }..}..
f4f0: 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 /* Now we know t
f500: 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 hat a key and ce
f510: 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 rt have been set
f520: 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 against.. * the
f530: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a SSL context */.
f540: 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 .if (!SSL_CTX_ch
f550: 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 eck_private_key(
f560: 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c ctx)) {.. Tcl
f570: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
f580: 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b terp, "private k
f590: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 ey does not matc
f5a0: 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 h the certificat
f5b0: 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 e public key",..
f5c0: 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 .. (char *)
f5d0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
f5e0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
f5f0: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b return NULL;
f600: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
f610: 2a 20 53 65 74 20 74 6f 20 75 73 65 20 64 65 66 * Set to use def
f620: 61 75 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 61 6e ault location an
f630: 64 20 66 69 6c 65 20 66 6f 72 20 43 65 72 74 69 d file for Certi
f640: 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 74 79 ficate Authority
f650: 20 28 43 41 29 20 63 65 72 74 69 66 69 63 61 74 (CA) certificat
f660: 65 73 2e 20 54 68 65 0a 20 20 20 20 20 2a 20 76 es. The. * v
f670: 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 73 erify path and s
f680: 74 6f 72 65 20 63 61 6e 20 62 65 20 6f 76 65 72 tore can be over
f690: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 ridden by the SS
f6a0: 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 20 76 L_CERT_DIR env v
f6b0: 61 72 2e 20 54 68 65 20 76 65 72 69 66 79 20 66 ar. The verify f
f6c0: 69 6c 65 20 63 61 6e 0a 20 20 20 20 20 2a 20 62 ile can. * b
f6d0: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 e overridden by
f6e0: 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c the SSL_CERT_FIL
f6f0: 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 20 20 E env var. */.
f700: 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 if (!SSL_CTX_s
f710: 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 et_default_verif
f720: 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a y_paths(ctx)) {.
f730: 09 61 62 6f 72 74 2b 2b 3b 0a 20 20 20 20 7d 0a .abort++;. }.
f740: 0a 20 20 20 20 2f 2a 20 4f 76 65 72 72 69 64 65 . /* Override
f750: 73 20 66 6f 72 20 74 68 65 20 43 41 20 76 65 72 s for the CA ver
f760: 69 66 79 20 70 61 74 68 20 61 6e 64 20 66 69 6c ify path and fil
f770: 65 20 2a 2f 0a 20 20 20 20 7b 0a 23 69 66 20 4f e */. {.#if O
f780: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
f790: 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
f7a0: 30 30 4c 0a 09 69 66 20 28 43 41 70 61 74 68 20 00L..if (CApath
f7b0: 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41 66 69 6c != NULL || CAfil
f7c0: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 e != NULL) {..
f7d0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 Tcl_DString ds
f7e0: 31 3b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 1;.. if (!SSL
f7f0: 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 _CTX_load_verify
f800: 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 _locations(ctx,
f810: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 F2N(CAfile, &ds)
f820: 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 , F2N(CApath, &d
f830: 73 31 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b s1))) {...abort+
f840: 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 +;.. }.. T
f850: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
f860: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 ds);.. Tcl_DS
f870: 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b tringFree(&ds1);
f880: 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 ... /* Set li
f890: 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e st of CAs to sen
f8a0: 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e d to client when
f8b0: 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c requesting a cl
f8c0: 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 ient certificate
f8d0: 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74 70 */.. /* http
f8e0: 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e s://sourceforge.
f8f0: 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 net/p/tls/bugs/5
f900: 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 58 7/ */.. /* XX
f910: 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 X:TODO: Let the
f920: 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 user supply valu
f930: 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 es here instead
f940: 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 of something tha
f950: 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 t exists on the
f960: 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09 20 filesystem */..
f970: 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 STACK_OF(X509
f980: 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 _NAME) *certName
f990: 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 s = SSL_load_cli
f9a0: 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 ent_CA_file(F2N(
f9b0: 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 CAfile, &ds));..
f9c0: 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 if (certName
f9d0: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 s != NULL) {...S
f9e0: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e SL_CTX_set_clien
f9f0: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 t_CA_list(ctx, c
fa00: 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 ertNames);..
fa10: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
fa20: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a ngFree(&ds);..}.
fa30: 0a 23 65 6c 73 65 0a 09 69 66 20 28 43 41 70 61 .#else..if (CApa
fa40: 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 th != NULL) {..
fa50: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f if (!SSL_CTX_
fa60: 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 72 28 load_verify_dir(
fa70: 63 74 78 2c 20 46 32 4e 28 43 41 70 61 74 68 2c ctx, F2N(CApath,
fa80: 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 &ds))) {...abor
fa90: 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 t++;.. }..
faa0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
fab0: 28 26 64 73 29 3b 0a 09 7d 0a 09 69 66 20 28 43 (&ds);..}..if (C
fac0: 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b Afile != NULL) {
fad0: 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 .. if (!SSL_C
fae0: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 TX_load_verify_f
faf0: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 41 66 ile(ctx, F2N(CAf
fb00: 69 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 ile, &ds))) {...
fb10: 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a abort++;.. }.
fb20: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
fb30: 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 20 Free(&ds);...
fb40: 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 /* Set list of
fb50: 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 CAs to send to c
fb60: 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 lient when reque
fb70: 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 sting a client c
fb80: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 ertificate */..
fb90: 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 STACK_OF(X509
fba0: 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 _NAME) *certName
fbb0: 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 s = SSL_load_cli
fbc0: 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 ent_CA_file(F2N(
fbd0: 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 CAfile, &ds));..
fbe0: 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 if (certName
fbf0: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 s != NULL) {...S
fc00: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e SL_CTX_set_clien
fc10: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 t_CA_list(ctx, c
fc20: 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 ertNames);..
fc30: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
fc40: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a ngFree(&ds);..}.
fc50: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
fc60: 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a return ctx;.}.
fc70: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
fc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fcb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
fcc0: 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d StatusObjCmd --
fcd0: 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 return certific
fce0: 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 ate for connecte
fcf0: 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 d peer.. *. * Re
fd00: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
fd10: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
fd20: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
fd30: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
fd40: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
fd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fd80: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
fd90: 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 c int.StatusObjC
fda0: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
fdb0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
fdc0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
fdd0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
fde0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
fdf0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
fe00: 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a ePtr;. X509 *
fe10: 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 peer;. Tcl_Ob
fe20: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 j *objPtr;. T
fe30: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
fe40: 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e . char *chann
fe50: 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 elName, *ciphers
fe60: 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a ;. int mode;.
fe70: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
fe80: 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a ed char *proto;.
fe90: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 unsigned int
fea0: 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 len;. int ni
feb0: 64 2c 20 72 65 73 3b 0a 20 20 20 20 28 76 6f 69 d, res;. (voi
fec0: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a d) clientData;..
fed0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
fee0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
fef0: 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 objc < 2 || objc
ff00: 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d > 3 || (objc ==
ff10: 20 33 20 26 26 20 21 73 74 72 63 6d 70 28 54 63 3 && !strcmp(Tc
ff20: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
ff30: 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 [1]), "-local"))
ff40: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
ff50: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
ff60: 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f objv, "?-local?
ff70: 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 channel");..ret
ff80: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
ff90: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 }.. /* Get
ffa0: 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 channel Id */.
ffb0: 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d channelName =
ffc0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
ffd0: 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f bjv[(objc == 2 ?
ffe0: 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 20 20 63 1 : 2)]);. c
fff0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
10000 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 nnel(interp, cha
10010 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 nnelName, &mode)
10020 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
10030 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
10040 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
10050 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
10060 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
10070 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
10080 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
10090 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
100a0 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
100b0 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
100c0 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
100d0 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
100e0 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
100f0 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
10100 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
10110 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
10120 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
10130 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
10140 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
10150 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e nel", (char *) N
10160 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 ULL);..Tcl_SetEr
10170 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
10180 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c "TLS", "STATUS",
10190 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
101a0 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
101b0 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
101c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
101d0 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
101e0 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 State *) Tcl_Get
101f0 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
10200 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 ata(chan);..
10210 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61 /* Get certifica
10220 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 te for peer or s
10230 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f elf */. if (o
10240 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 bjc == 2) {..pee
10250 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 r = SSL_get_peer
10260 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 _certificate(sta
10270 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
10280 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 } else {..peer
10290 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 = SSL_get_certif
102a0 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e icate(statePtr->
102b0 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ssl);. }.
102c0 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65 72 74 /* Get X509 cert
102d0 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a ificate info */.
102e0 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a if (peer) {.
102f0 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 .objPtr = Tls_Ne
10300 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c wX509Obj(interp,
10310 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a peer);..if (obj
10320 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 c == 2) {.. X
10330 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 509_free(peer);.
10340 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c . peer = NULL
10350 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
10360 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f {..objPtr = Tcl_
10370 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
10380 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 LL);. }..
10390 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a /* Peer name */.
103a0 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
103b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
103c0 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f "peername", SSL_
103d0 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 get0_peername(st
103e0 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 atePtr->ssl), -1
103f0 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 );. LAPPEND_I
10400 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
10410 72 2c 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f r, "sbits", SSL_
10420 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 get_cipher_bits(
10430 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e statePtr->ssl, N
10440 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 ULL));.. ciph
10450 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c ers = (char*)SSL
10460 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 _get_cipher(stat
10470 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
10480 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
10490 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 rp, objPtr, "cip
104a0 68 65 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d her", ciphers, -
104b0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 1);.. /* Veri
104c0 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 fy the X509 cert
104d0 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 ificate presente
104e0 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f d by the peer */
104f0 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
10500 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10510 20 22 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c "verifyResult",
10520 0a 09 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 ..X509_verify_ce
10530 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 rt_error_string(
10540 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 SSL_get_verify_r
10550 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e esult(statePtr->
10560 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 ssl)), -1);..
10570 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 /* Verify mode
10580 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 */. mode = SS
10590 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 L_get_verify_mod
105a0 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
105b0 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 ;. if (mode &
105c0 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e & SSL_VERIFY_NON
105d0 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 E) {..LAPPEND_ST
105e0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
105f0 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 , "verifyMode",
10600 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 "none", -1);.
10610 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f } else {..Tcl_O
10620 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d bj *listObjPtr =
10630 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
10640 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 0, NULL);..if (m
10650 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 ode && SSL_VERIF
10660 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 Y_PEER) {.. T
10670 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10680 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10690 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f listObjPtr, Tcl_
106a0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 NewStringObj("pe
106b0 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 er", -1));..}..i
106c0 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 f (mode && SSL_V
106d0 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f ERIFY_FAIL_IF_NO
106e0 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 _PEER_CERT) {..
106f0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
10700 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10710 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 rp, listObjPtr,
10720 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
10730 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 ("fail if no pee
10740 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 r cert", -1));..
10750 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 }..if (mode && S
10760 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 SL_VERIFY_CLIENT
10770 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 _ONCE) {.. Tc
10780 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10790 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c lement(interp, l
107a0 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e istObjPtr, Tcl_N
107b0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 ewStringObj("cli
107c0 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b ent once", -1));
107d0 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 ..}..if (mode &&
107e0 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 SSL_VERIFY_POST
107f0 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 _HANDSHAKE) {..
10800 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
10810 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
10820 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 rp, listObjPtr,
10830 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
10840 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 ("post handshake
10850 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 ", -1));..}..LAP
10860 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c PEND_OBJ(interp,
10870 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 objPtr, "verify
10880 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 Mode", listObjPt
10890 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a r). }.. /*
108a0 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 Verify mode dep
108b0 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e th */. LAPPEN
108c0 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
108d0 6a 50 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 jPtr, "verifyDep
108e0 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 th", SSL_get_ver
108f0 69 66 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 ify_depth(stateP
10900 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 tr->ssl));..
10910 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 /* Report the se
10920 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
10930 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 as a result of t
10940 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a he negotiation *
10950 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 /. SSL_get0_a
10960 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 lpn_selected(sta
10970 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f tePtr->ssl, &pro
10980 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c to, &len);. L
10990 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
109a0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e p, objPtr, "alpn
109b0 22 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f ", (char *)proto
109c0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e , (Tcl_Size) len
109d0 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 );. LAPPEND_S
109e0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
109f0 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 r, "protocol", S
10a00 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 SL_get_version(s
10a10 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d tatePtr->ssl), -
10a20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 1);.. /* Vali
10a30 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 d for non-RSA si
10a40 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 gnature and TLS
10a50 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 1.3 */. if (o
10a60 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 bjc == 2) {..res
10a70 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f = SSL_get_peer_
10a80 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 signature_nid(st
10a90 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
10aa0 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b d);. } else {
10ab0 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f ..res = SSL_get_
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 0a 20 20 20 20 69 66 d);. }. if
10af0 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 (!res) {nid = 0
10b00 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 ;}. LAPPEND_S
10b10 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
10b20 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 r, "signatureHas
10b30 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a hAlgorithm", OBJ
10b40 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 _nid2ln(nid), -1
10b50 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
10b60 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 == 2) {..res =
10b70 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 SSL_get_peer_sig
10b80 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 nature_type_nid(
10b90 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 statePtr->ssl, &
10ba0 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 nid);. } else
10bb0 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 {..res = SSL_ge
10bc0 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 t_signature_type
10bd0 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 _nid(statePtr->s
10be0 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d sl, &nid);. }
10bf0 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b . if (!res) {
10c00 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 nid = 0;}. LA
10c10 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
10c20 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 , objPtr, "signa
10c30 74 75 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e tureType", OBJ_n
10c40 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b id2ln(nid), -1);
10c50 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
10c60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
10c70 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
10c80 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
10c90 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
10ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10cd0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f -------. *. * Co
10ce0 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 nnectionInfoObjC
10cf0 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e md -- return con
10d00 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f nection info fro
10d10 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a m OpenSSL.. *. *
10d20 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c Results:. *.A l
10d30 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f ist of connectio
10d40 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d n info. *. *---
10d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d90 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 . */..static int
10da0 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f ConnectionInfoO
10db0 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
10dc0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
10dd0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
10de0 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
10df0 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
10e00 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e ) {. Tcl_Chan
10e10 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 nel chan;../* Th
10e20 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 e channel to set
10e30 20 61 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 a mode on */.
10e40 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
10e50 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 r;../* client st
10e60 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b ate for ssl sock
10e70 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 et */. Tcl_Ob
10e80 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74 j *objPtr, *list
10e90 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 Ptr;. const S
10ea0 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e SL *ssl;. con
10eb0 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 st SSL_CIPHER *c
10ec0 69 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 ipher;. const
10ed0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 SSL_SESSION *se
10ee0 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 ssion;. const
10ef0 20 45 56 50 5f 4d 44 20 2a 6d 64 3b 0a 20 20 20 EVP_MD *md;.
10f00 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 (void) clientDa
10f10 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ta;.. if (obj
10f20 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
10f30 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
10f40 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
10f50 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
10f60 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
10f70 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
10f80 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
10f90 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
10fa0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 ing(objv[1]), NU
10fb0 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 LL);. if (cha
10fc0 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
10fd0 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
10fe0 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
10ff0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b }.. /* Mak
11000 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
11010 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
11020 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
11030 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
11040 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
11050 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
11060 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
11070 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
11080 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ype()) {..Tcl_Ap
11090 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
110a0 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
110b0 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
110c0 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
110d0 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 "\": not a T
110e0 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 LS channel", (ch
110f0 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 ar *) NULL);..Tc
11100 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
11110 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 nterp, "TLS", "C
11120 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 ONNECTION", "CHA
11130 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 NNEL", "INVALID"
11140 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
11150 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 ;..return(TCL_ER
11160 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ROR);. }..
11170 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 objPtr = Tcl_Ne
11180 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
11190 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 );.. /* Conne
111a0 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 ction info */.
111b0 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 statePtr = (St
111c0 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 ate *)Tcl_GetCha
111d0 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
111e0 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 (chan);. ssl
111f0 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b = statePtr->ssl;
11200 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 . if (ssl !=
11210 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e NULL) {../* conn
11220 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a ection state */.
11230 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
11240 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 erp, objPtr, "st
11250 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f ate", SSL_state_
11260 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 string_long(ssl)
11270 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 , -1);.../* Get
11280 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 65 SNI requested se
11290 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 rver name */..LA
112a0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
112b0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65 , objPtr, "serve
112c0 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f rname", SSL_get_
112d0 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 servername(ssl,
112e0 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f TLSEXT_NAMETYPE_
112f0 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b host_name), -1);
11300 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 .../* Get protoc
11310 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 ol */..LAPPEND_S
11320 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11330 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 r, "protocol", S
11340 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 SL_get_version(s
11350 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 sl), -1);.../* R
11360 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c enegotiation all
11370 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 owed */..LAPPEND
11380 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
11390 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 jPtr, "renegotia
113a0 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 tion_allowed", S
113b0 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 SL_get_secure_re
113c0 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 negotiation_supp
113d0 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 73 6c 29 ort((SSL *) ssl)
113e0 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 );.../* Get secu
113f0 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c rity level */..L
11400 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
11410 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 p, objPtr, "secu
11420 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c rity_level", SSL
11430 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 _get_security_le
11440 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 vel(ssl));.../*
11450 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a Session info */.
11460 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
11470 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
11480 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 ession_reused",
11490 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 SSL_session_reus
114a0 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 ed(ssl));.../* I
114b0 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f s server info */
114c0 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
114d0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
114e0 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c 5f is_server", SSL_
114f0 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 3b is_server(ssl));
11500 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f .../* Is DTLS */
11510 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
11520 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11530 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 is_dtls", SSL_is
11540 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20 _dtls(ssl));.
11550 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 }.. /* Ciphe
11560 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 r info */. ci
11570 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 pher = SSL_get_c
11580 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 urrent_cipher(ss
11590 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 l);. if (ciph
115a0 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 er != NULL) {..c
115b0 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 har buf[BUFSIZ]
115c0 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 = {0};..int bits
115d0 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a , alg_bits;.../*
115e0 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a Cipher name */.
115f0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
11600 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 erp, objPtr, "ci
11610 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 pher", SSL_CIPHE
11620 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 R_get_name(ciphe
11630 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 r), -1);.../* RF
11640 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 C name of cipher
11650 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 */..LAPPEND_STR
11660 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11670 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 "standard_name"
11680 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 , SSL_CIPHER_sta
11690 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 ndard_name(ciphe
116a0 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 r), -1);.../* Op
116b0 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 enSSL name of ci
116c0 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 pher */..LAPPEND
116d0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
116e0 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 Ptr, "openssl_na
116f0 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 me", OPENSSL_cip
11700 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 her_name(SSL_CIP
11710 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d HER_standard_nam
11720 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b e(cipher)), -1);
11730 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 .../* number of
11740 73 65 63 72 65 74 20 62 69 74 73 20 75 73 65 64 secret bits used
11750 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 for cipher */..
11760 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 bits = SSL_CIPHE
11770 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 R_get_bits(ciphe
11780 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 r, &alg_bits);..
11790 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
117a0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 rp, objPtr, "sec
117b0 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73 29 ret_bits", bits)
117c0 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 ;..LAPPEND_INT(i
117d0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
117e0 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c algorithm_bits",
117f0 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 alg_bits);../*
11800 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 alg_bits is actu
11810 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 al key secret bi
11820 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 ts. If use bits
11830 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f and secret (algo
11840 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 rithm) bits diff
11850 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74 er,.. the rest
11860 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 of the bits are
11870 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 fixed, i.e. for
11880 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 limited export
11890 63 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 ciphers (bits <
118a0 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 56) */.../* Indi
118b0 63 61 74 65 73 20 77 68 69 63 68 20 53 53 4c 2f cates which SSL/
118c0 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 TLS protocol ver
118d0 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69 6e sion first defin
118e0 65 64 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f ed the cipher */
118f0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
11900 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d terp, objPtr, "m
11910 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c in_version", SSL
11920 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 _CIPHER_get_vers
11930 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 ion(cipher), -1)
11940 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 ;.../* Cipher NI
11950 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 D */..LAPPEND_ST
11960 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11970 2c 20 22 63 69 70 68 65 72 4e 49 44 22 2c 20 28 , "cipherNID", (
11980 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c char *)OBJ_nid2l
11990 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 n(SSL_CIPHER_get
119a0 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 69 70 68 _cipher_nid(ciph
119b0 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 er)), -1);..LAPP
119c0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
119d0 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 73 74 4e objPtr, "digestN
119e0 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a ID", (char *)OBJ
119f0 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 _nid2ln(SSL_CIPH
11a00 45 52 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 ER_get_digest_ni
11a10 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b d(cipher)), -1);
11a20 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
11a30 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b terp, objPtr, "k
11a40 65 79 45 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 eyExchangeNID",
11a50 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 (char *)OBJ_nid2
11a60 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ln(SSL_CIPHER_ge
11a70 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 72 29 t_kx_nid(cipher)
11a80 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 ), -1);..LAPPEND
11a90 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11aa0 50 74 72 2c 20 22 61 75 74 68 65 6e 74 69 63 61 Ptr, "authentica
11ab0 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 tionNID", (char
11ac0 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c *)OBJ_nid2ln(SSL
11ad0 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 75 74 68 _CIPHER_get_auth
11ae0 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d _nid(cipher)), -
11af0 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 1);.../* message
11b00 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 authentication
11b10 63 6f 64 65 20 2d 20 43 69 70 68 65 72 20 69 73 code - Cipher is
11b20 20 41 45 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 AEAD (e.g. GCM
11b30 6f 72 20 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 or ChaCha20/Poly
11b40 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 1305) or not */.
11b50 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 74 65 ./* Authenticate
11b60 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 d Encryption wit
11b70 68 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 h associated dat
11b80 61 20 28 41 45 41 44 29 20 63 68 65 63 6b 20 2a a (AEAD) check *
11b90 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
11ba0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11bb0 22 63 69 70 68 65 72 5f 69 73 5f 61 65 61 64 22 "cipher_is_aead"
11bc0 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f , SSL_CIPHER_is_
11bd0 61 65 61 64 28 63 69 70 68 65 72 29 29 3b 0a 0a aead(cipher));..
11be0 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65 64 20 ./* Digest used
11bf0 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 during the SSL/T
11c00 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77 68 65 LS handshake whe
11c10 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69 70 68 n using the ciph
11c20 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c er. */..md = SSL
11c30 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 _CIPHER_get_hand
11c40 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63 69 70 shake_digest(cip
11c50 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 her);..LAPPEND_S
11c60 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11c70 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 r, "handshake_di
11c80 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a 29 45 gest", (char *)E
11c90 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 VP_MD_name(md),
11ca0 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 -1);.../* Get Op
11cb0 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 enSSL-specific I
11cc0 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a D, not IANA ID *
11cd0 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 /..LAPPEND_INT(i
11ce0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11cf0 63 69 70 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 cipher_id", (int
11d00 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 ) SSL_CIPHER_get
11d10 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 _id(cipher));...
11d20 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 20 75 /* Two-byte ID u
11d30 73 65 64 20 69 6e 20 74 68 65 20 54 4c 53 20 70 sed in the TLS p
11d40 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 rotocol of the g
11d50 69 76 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 iven cipher */..
11d60 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
11d70 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f rp, objPtr, "pro
11d80 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 tocol_id", (int)
11d90 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
11da0 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 protocol_id(ciph
11db0 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 er));.../* Textu
11dc0 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f al description o
11dd0 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a f the cipher */.
11de0 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f .if (SSL_CIPHER_
11df0 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 description(ciph
11e00 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 er, buf, sizeof(
11e10 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b buf)) != NULL) {
11e20 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 .. LAPPEND_ST
11e30 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11e40 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c , "description",
11e50 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 buf, -1);..}.
11e60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 }.. /* Sess
11e70 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 ion info */.
11e80 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 session = SSL_ge
11e90 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a t_session(ssl);.
11ea0 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20 if (session
11eb0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 != NULL) {..cons
11ec0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
11ed0 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 *ticket;..size_t
11ee0 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 len2;..unsigned
11ef0 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 int ulen;..cons
11f00 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
11f10 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 *session_id, *pr
11f20 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 oto;..unsigned c
11f30 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d har buffer[SSL_M
11f40 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 AX_MASTER_KEY_LE
11f50 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f NGTH];.../* Repo
11f60 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 rt the selected
11f70 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 protocol as a re
11f80 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e sult of the ALPN
11f90 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a negotiation */.
11fa0 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 .SSL_SESSION_get
11fb0 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 0_alpn_selected(
11fc0 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c session, &proto,
11fd0 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e &len2);..LAPPEN
11fe0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
11ff0 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 jPtr, "alpn", (c
12000 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 har *) proto, (T
12010 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a cl_Size) len2);.
12020 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 ../* Report the
12030 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f selected protoco
12040 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 l as a result of
12050 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 the NPN negotia
12060 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 tion */.#ifdef U
12070 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 SE_NPN..SSL_get0
12080 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f _next_proto_nego
12090 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72 6f tiated(ssl, &pro
120a0 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 to, &ulen);..LAP
120b0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
120c0 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 objPtr, "npn",
120d0 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 (char *) proto,
120e0 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 (Tcl_Size) ulen)
120f0 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 ;.#endif.../* Re
12100 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 sumable session
12110 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c */..LAPPEND_BOOL
12120 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12130 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 "resumable", SS
12140 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 L_SESSION_is_res
12150 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 umable(session))
12160 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 ;.../* Session s
12170 74 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f 6e tart time (secon
12180 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29 20 ds since epoch)
12190 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 */..LAPPEND_LONG
121a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
121b0 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 "start_time", S
121c0 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 SL_SESSION_get_t
121d0 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a ime(session));..
121e0 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 ./* Timeout valu
121f0 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f e - SSL_CTX_get_
12200 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 6f timeout (in seco
12210 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 nds) */..LAPPEND
12220 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 _LONG(interp, ob
12230 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c jPtr, "timeout",
12240 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
12250 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e _timeout(session
12260 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e ));.../* Session
12270 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e id - TLSv1.2 an
12280 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a d below only */.
12290 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 .session_id = SS
122a0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 L_SESSION_get_id
122b0 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 (session, &ulen)
122c0 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 ;..LAPPEND_BARRA
122d0 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 Y(interp, objPtr
122e0 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 , "session_id",
122f0 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c session_id, (Tcl
12300 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 _Size) ulen);...
12310 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 /* Session conte
12320 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 xt */..session_i
12330 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f d = SSL_SESSION_
12340 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 get0_id_context(
12350 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b session, &ulen);
12360 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 ..LAPPEND_BARRAY
12370 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12380 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 "session_contex
12390 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 t", session_id,
123a0 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 (Tcl_Size) ulen)
123b0 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 ;.../* Session t
123c0 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f icket - client o
123d0 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 nly */..SSL_SESS
123e0 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 ION_get0_ticket(
123f0 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 session, &ticket
12400 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 , &len2);..LAPPE
12410 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 ND_BARRAY(interp
12420 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 , objPtr, "sessi
12430 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 63 6b on_ticket", tick
12440 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c et, (Tcl_Size) l
12450 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 en2);.../* Sessi
12460 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 on ticket lifeti
12470 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f me hint (in seco
12480 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 nds) */..LAPPEND
12490 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 _LONG(interp, ob
124a0 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 jPtr, "lifetime"
124b0 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 , SSL_SESSION_ge
124c0 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d t_ticket_lifetim
124d0 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 e_hint(session))
124e0 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 ;.../* Ticket ap
124f0 70 20 64 61 74 61 20 2a 2f 0a 23 69 66 20 4f 50 p data */.#if OP
12500 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
12510 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
12520 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 0L..SSL_SESSION_
12530 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 get0_ticket_appd
12540 61 74 61 28 28 53 53 4c 5f 53 45 53 53 49 4f 4e ata((SSL_SESSION
12550 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26 74 69 *) session, &ti
12560 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c cket, &len2);..L
12570 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e APPEND_BARRAY(in
12580 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 terp, objPtr, "t
12590 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 2c icket_app_data",
125a0 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 ticket, (Tcl_Si
125b0 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e 64 69 ze) len2);.#endi
125c0 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 f.../* Get maste
125d0 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d r key */..len2 =
125e0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
125f0 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73 73 _master_key(sess
12600 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 4c ion, buffer, SSL
12610 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f _MAX_MASTER_KEY_
12620 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e LENGTH);..LAPPEN
12630 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c D_BARRAY(interp,
12640 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 objPtr, "master
12650 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c 20 28 _key", buffer, (
12660 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b Tcl_Size) len2);
12670 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f .../* Compressio
12680 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 n id */..unsigne
12690 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 d int id = SSL_S
126a0 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 ESSION_get_compr
126b0 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b ess_id(session);
126c0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
126d0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
126e0 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 ompression_id",
126f0 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 id == 1 ? "zlib"
12700 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a : "none", -1);.
12710 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f }.. /* Co
12720 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a mpression info *
12730 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d /. if (ssl !=
12740 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 NULL) {.#ifdef
12750 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 HAVE_SSL_COMPRES
12760 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 SION..const COMP
12770 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a _METHOD *comp, *
12780 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 expn;..comp = SS
12790 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f L_get_current_co
127a0 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a mpression(ssl);.
127b0 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f .expn = SSL_get_
127c0 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f current_expansio
127d0 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e n(ssl);...LAPPEN
127e0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
127f0 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 jPtr, "compressi
12800 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f on", comp ? SSL_
12810 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f COMP_get_name(co
12820 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 mp) : "none", -1
12830 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
12840 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12850 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 "expansion", exp
12860 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 n ? SSL_COMP_get
12870 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e _name(expn) : "n
12880 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 one", -1);.#else
12890 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
128a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
128b0 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f ompression", "no
128c0 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 ne", -1);..LAPPE
128d0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
128e0 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f bjPtr, "expansio
128f0 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b n", "none", -1);
12900 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 .#endif. }..
12910 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 /* Server inf
12920 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 o */. {..long
12930 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f mode = SSL_CTX_
12940 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 get_session_cach
12950 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d e_mode(statePtr-
12960 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 >ctx);..char *ms
12970 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 g;...if (mode &
12980 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f SSL_SESS_CACHE_O
12990 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d FF) {.. msg =
129a0 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 "off";..} else
129b0 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 if (mode & SSL_S
129c0 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 ESS_CACHE_CLIENT
129d0 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 ) {.. msg = "
129e0 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 client";..} else
129f0 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f if (mode & SSL_
12a00 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45 SESS_CACHE_SERVE
12a10 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 R) {.. msg =
12a20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 "server";..} els
12a30 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c e if (mode & SSL
12a40 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 _SESS_CACHE_BOTH
12a50 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 ) {.. msg = "
12a60 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b both";..} else {
12a70 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b .. msg = "unk
12a80 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 nown";..}..LAPPE
12a90 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
12aa0 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f bjPtr, "session_
12ab0 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 cache_mode", msg
12ac0 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 , -1);. }..
12ad0 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a /* CA List */.
12ae0 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 /* IF not a
12af0 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61 73 20 server, same as
12b00 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 SSL_get0_peer_CA
12b10 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76 65 72 _list. If server
12b20 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 same as SSL_CTX
12b30 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c _get_client_CA_l
12b40 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 ist */. listP
12b50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 tr = Tcl_NewList
12b60 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 Obj(0, NULL);.
12b70 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f STACK_OF(X509_
12b80 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a NAME) *ca_list;.
12b90 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69 73 74 if ((ca_list
12ba0 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e = SSL_get_clien
12bb0 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 t_CA_list(ssl))
12bc0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 != NULL) {..char
12bd0 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b buffer[BUFSIZ];
12be0 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 ..for (int i = 0
12bf0 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 ; i < sk_X509_NA
12c00 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b ME_num(ca_list);
12c10 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 i++) {.. X50
12c20 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 9_NAME *name = s
12c30 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 k_X509_NAME_valu
12c40 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 e(ca_list, i);..
12c50 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a if (name) {.
12c60 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c ..X509_NAME_onel
12c70 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 ine(name, buffer
12c80 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c , BUFSIZ);...Tcl
12c90 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
12ca0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 ement(interp, li
12cb0 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 stPtr, Tcl_NewSt
12cc0 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 ringObj(buffer,
12cd0 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a -1));.. }..}.
12ce0 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e }. LAPPEN
12cf0 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 D_OBJ(interp, ob
12d00 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 jPtr, "caList",
12d10 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 listPtr);. LA
12d20 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
12d30 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 , objPtr, "caLis
12d40 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 tCount", sk_X509
12d50 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 _NAME_num(ca_lis
12d60 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 t));.. Tcl_Se
12d70 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
12d80 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
12d90 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
12da0 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
12db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
12df0 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 * VersionObjCmd
12e00 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 6f -- return versio
12e10 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 n string from Op
12e20 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 enSSL.. *. * Res
12e30 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
12e40 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
12e50 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
12e60 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a ts:. *.None.. *.
12e70 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
12e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12eb0 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
12ec0 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 int.VersionObjC
12ed0 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
12ee0 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
12ef0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
12f00 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
12f10 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
12f20 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
12f30 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 jPtr;. (void)
12f40 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 clientData;.
12f50 20 28 76 6f 69 64 29 20 6f 62 6a 63 3b 0a 20 20 (void) objc;.
12f60 20 20 28 76 6f 69 64 29 20 6f 62 6a 76 3b 0a 0a (void) objv;..
12f70 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
12f80 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 led");.. objP
12f90 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 tr = Tcl_NewStri
12fa0 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 ngObj(OPENSSL_VE
12fb0 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b RSION_TEXT, -1);
12fc0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
12fd0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
12fe0 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 jPtr);.. retu
12ff0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
13000 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
13010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13040 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 -------. *. * Mi
13050 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 scObjCmd -- misc
13060 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 commands. *. *
13070 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
13080 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
13090 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
130a0 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a fects:. *.None..
130b0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
130c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
130d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
130e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
130f0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
13100 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 tic int.MiscObjC
13110 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
13120 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
13130 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
13140 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
13150 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
13160 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 . static cons
13170 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 t char *commands
13180 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 [] = { "req", "
13190 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b strreq", NULL };
131a0 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e . enum comman
131b0 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 d { C_REQ, C_STR
131c0 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a REQ, C_DUMMY };.
131d0 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 Tcl_Size cmd
131e0 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 74 72 3b ;. int isStr;
131f0 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 . char buffer
13200 5b 31 36 33 38 34 5d 3b 0a 20 20 20 20 28 76 6f [16384];. (vo
13210 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a id) clientData;.
13220 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
13230 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
13240 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 (objc < 2) {..Tc
13250 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
13260 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
13270 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 "subcommand ?arg
13280 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 s?");..return TC
13290 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
132a0 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e if (Tcl_GetIn
132b0 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
132c0 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d p, objv[1], comm
132d0 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c ands, "command",
132e0 20 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 0, &cmd) != TCL
132f0 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
13300 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
13310 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
13320 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 rror();.. isS
13330 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 tr = (cmd == C_S
13340 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 TRREQ);. swit
13350 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e ch ((enum comman
13360 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 d) cmd) {..case
13370 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 C_REQ:..case C_S
13380 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 TRREQ: {.. EV
13390 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c P_PKEY *pkey=NUL
133a0 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 L;.. X509 *ce
133b0 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 rt=NULL;.. X5
133c0 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 09_NAME *name=NU
133d0 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a LL;.. Tcl_Obj
133e0 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 **listv;.. T
133f0 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 cl_Size listc;..
13400 20 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 int i;...
13410 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a BIO *out=NULL;.
13420 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d .. char *k_C=
13430 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c "",*k_ST="",*k_L
13440 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f ="",*k_O="",*k_O
13450 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b U="",*k_CN="",*k
13460 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 _Email="";..
13470 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 char *keyout,*pe
13480 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 mout,*str;..
13490 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 int keysize,seri
134a0 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a al=0,days=365;..
134b0 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
134c0 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
134d0 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 0000000L.. BI
134e0 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c GNUM *bne = NULL
134f0 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 ;.. RSA *rsa
13500 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 = NULL;.#else..
13510 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 EVP_PKEY_CTX
13520 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e *ctx = NULL;.#en
13530 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f dif... if ((o
13540 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e bjc<5) || (objc>
13550 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 6)) {...Tcl_Wron
13560 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
13570 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 2, objv, "keysi
13580 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 ze keyfile certf
13590 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 ile ?info?");...
135a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
135b0 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 ;.. }... i
135c0 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f f (Tcl_GetIntFro
135d0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
135e0 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 v[2], &keysize)
135f0 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 != TCL_OK) {...r
13600 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
13610 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 .. }.. key
13620 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e out=Tcl_GetStrin
13630 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 g(objv[3]);..
13640 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 pemout=Tcl_GetS
13650 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a tring(objv[4]);.
13660 09 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20 . if (isStr)
13670 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 {...Tcl_SetVar(i
13680 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c nterp,keyout,"",
13690 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 0);...Tcl_SetVar
136a0 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 (interp,pemout,"
136b0 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 ",0);.. }...
136c0 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 if (objc>=6)
136d0 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 {...if (Tcl_List
136e0 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 ObjGetElements(i
136f0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 nterp, objv[5],
13700 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 &listc, &listv)
13710 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 != TCL_OK) {...
13720 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
13730 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 ROR;...}....if (
13740 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 (listc%2) != 0)
13750 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 {... Tcl_SetR
13760 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e esult(interp,"In
13770 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d formation list m
13780 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 ust have even nu
13790 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 mber of argument
137a0 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 s",NULL);...
137b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
137c0 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 ;...}...for (i=0
137d0 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 ; i<listc; i+=2)
137e0 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c {... str=Tcl
137f0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
13800 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 [i]);... if (
13810 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 strcmp(str,"days
13820 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 ")==0) {....if (
13830 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 Tcl_GetIntFromOb
13840 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 j(interp,listv[i
13850 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f +1],&days)!=TCL_
13860 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 OK).... retur
13870 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 n TCL_ERROR;...
13880 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
13890 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c rcmp(str,"serial
138a0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 ")==0) {....if (
138b0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 Tcl_GetIntFromOb
138c0 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 j(interp,listv[i
138d0 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 +1],&serial)!=TC
138e0 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 L_OK).... ret
138f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
13900 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
13910 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d strcmp(str,"C")=
13920 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c =0) {....k_C=Tcl
13930 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
13940 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
13950 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
13960 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a str,"ST")==0) {.
13970 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 ...k_ST=Tcl_GetS
13980 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
13990 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
139a0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
139b0 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c L")==0) {....k_L
139c0 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
139d0 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
139e0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
139f0 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 cmp(str,"O")==0)
13a00 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 {....k_O=Tcl_Ge
13a10 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
13a20 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
13a30 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
13a40 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 ,"OU")==0) {....
13a50 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 k_OU=Tcl_GetStri
13a60 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
13a70 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
13a80 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 (strcmp(str,"CN"
13a90 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d )==0) {....k_CN=
13aa0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
13ab0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
13ac0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
13ad0 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d mp(str,"Email")=
13ae0 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c =0) {....k_Email
13af0 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
13b00 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
13b10 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 } else {....Tc
13b20 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
13b30 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 rp,"Unknown para
13b40 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 meter",NULL);...
13b50 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
13b60 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 R;... }...}..
13b70 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 }..#if OPENS
13b80 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
13b90 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
13ba0 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 . bne = BN_ne
13bb0 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 w();.. rsa =
13bc0 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 RSA_new();..
13bd0 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f pkey = EVP_PKEY_
13be0 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 new();.. if (
13bf0 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 bne == NULL || r
13c00 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b sa == NULL || pk
13c10 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 ey == NULL || !B
13c20 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 N_set_word(bne,R
13c30 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 SA_F4) ||...!RSA
13c40 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 _generate_key_ex
13c50 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 (rsa, keysize, b
13c60 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 ne, NULL) || !EV
13c70 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 P_PKEY_assign_RS
13c80 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a A(pkey, rsa)) {.
13c90 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 ..EVP_PKEY_free(
13ca0 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f pkey);.../* RSA_
13cb0 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 free(rsa); freed
13cc0 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 by EVP_PKEY_fre
13cd0 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 e */...BN_free(b
13ce0 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ne);.#else..
13cf0 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 pkey = EVP_RSA_g
13d00 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 en((unsigned int
13d10 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 ) keysize);..
13d20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f ctx = EVP_PKEY_
13d30 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c CTX_new(pkey,NUL
13d40 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 L);.. if (pke
13d50 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 y == NULL || ctx
13d60 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 == NULL || !EVP
13d70 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 _PKEY_keygen_ini
13d80 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 t(ctx) ||...!EVP
13d90 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 _PKEY_CTX_set_rs
13da0 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 a_keygen_bits(ct
13db0 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 x, keysize) || !
13dc0 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 EVP_PKEY_keygen(
13dd0 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 ctx, &pkey)) {..
13de0 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 .EVP_PKEY_free(p
13df0 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 key);...EVP_PKEY
13e00 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
13e10 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 #endif...Tcl_Set
13e20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 Result(interp,"E
13e30 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 rror generating
13e40 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c private key",NUL
13e50 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c L);...return TCL
13e60 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 _ERROR;.. } e
13e70 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 lse {...if (isSt
13e80 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 r) {... out=B
13e90 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d IO_new(BIO_s_mem
13ea0 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ());... PEM_w
13eb0 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 rite_bio_Private
13ec0 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c Key(out,pkey,NUL
13ed0 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 L,NULL,0,NULL,NU
13ee0 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f LL);... i=BIO
13ef0 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 _read(out,buffer
13f00 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d ,sizeof(buffer)-
13f10 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 1);... i=(i<0
13f20 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 ) ? 0 : i;...
13f30 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b buffer[i]='\0';
13f40 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 ... Tcl_SetVa
13f50 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c r(interp,keyout,
13f60 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 buffer,0);...
13f70 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b BIO_flush(out);
13f80 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 ... BIO_free(
13f90 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b out);...} else {
13fa0 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e ... out=BIO_n
13fb0 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 ew(BIO_s_file())
13fc0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 ;... BIO_writ
13fd0 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b e_filename(out,k
13fe0 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 eyout);... PE
13ff0 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 M_write_bio_Priv
14000 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c ateKey(out,pkey,
14010 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c NULL,NULL,0,NULL
14020 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a ,NULL);... /*
14030 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 PEM_write_bio_R
14040 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 SAPrivateKey(out
14050 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c , rsa, NULL, NUL
14060 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c L, 0, NULL, NULL
14070 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f ); */... BIO_
14080 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 free_all(out);..
14090 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 .}....if ((cert
140a0 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 =X509_new())==NU
140b0 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f LL) {... Tcl_
140c0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
140d0 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 ,"Error generati
140e0 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 ng certificate r
140f0 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 equest",NULL);..
14100 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 . EVP_PKEY_fr
14110 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 ee(pkey);.#if OP
14120 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
14130 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
14140 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 0L... BN_free
14150 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 (bne);.#endif...
14160 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 return(TCL_E
14170 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 RROR);...}....X5
14180 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 09_set_version(c
14190 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 ert,2);...ASN1_I
141a0 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f NTEGER_set(X509_
141b0 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 get_serialNumber
141c0 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a (cert),serial);.
141d0 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 ..X509_gmtime_ad
141e0 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 j(X509_getm_notB
141f0 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a efore(cert),0);.
14200 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 ..X509_gmtime_ad
14210 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 j(X509_getm_notA
14220 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 fter(cert),(long
14230 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b )60*60*24*days);
14240 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b ...X509_set_pubk
14250 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a ey(cert,pkey);..
14260 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f ..name=X509_get_
14270 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 subject_name(cer
14280 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 t);....X509_NAME
14290 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
142a0 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 t(name,"C", MBST
142b0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
142c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
142d0 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 ) k_C, -1, -1, 0
142e0 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
142f0 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
14300 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 name,"ST", MBSTR
14310 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
14320 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
14330 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 k_ST, -1, -1, 0
14340 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
14350 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
14360 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 name,"L", MBSTRI
14370 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
14380 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
14390 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b k_L, -1, -1, 0);
143a0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
143b0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
143c0 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 me,"O", MBSTRING
143d0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
143e0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
143f0 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 O, -1, -1, 0);..
14400 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
14410 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
14420 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f ,"OU", MBSTRING_
14430 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
14440 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f gned char *) k_O
14450 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 U, -1, -1, 0);..
14460 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
14470 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
14480 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f ,"CN", MBSTRING_
14490 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
144a0 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 gned char *) k_C
144b0 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 N, -1, -1, 0);..
144c0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
144d0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
144e0 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 ,"Email", MBSTRI
144f0 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
14500 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
14510 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c k_Email, -1, -1,
14520 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 0);....X509_set
14530 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 _subject_name(ce
14540 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 rt,name);....if
14550 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 (!X509_sign(cert
14560 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 ,pkey,EVP_sha256
14570 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 ())) {... X50
14580 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 9_free(cert);...
14590 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 EVP_PKEY_fre
145a0 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 e(pkey);.#if OPE
145b0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
145c0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
145d0 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 L... BN_free(
145e0 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 bne);.#endif...
145f0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 Tcl_SetResult
14600 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 (interp,"Error s
14610 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 igning certifica
14620 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 te",NULL);...
14630 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
14640 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 R;...}....if (is
14650 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 Str) {... out
14660 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d =BIO_new(BIO_s_m
14670 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d em());... PEM
14680 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 _write_bio_X509(
14690 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 out,cert);...
146a0 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c i=BIO_read(out,
146b0 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 buffer,sizeof(bu
146c0 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 ffer)-1);...
146d0 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b i=(i<0) ? 0 : i;
146e0 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d ... buffer[i]
146f0 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c ='\0';... Tcl
14700 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 _SetVar(interp,p
14710 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b emout,buffer,0);
14720 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 ... BIO_flush
14730 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f (out);... BIO
14740 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 _free(out);...}
14750 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 else {... out
14760 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 =BIO_new(BIO_s_f
14770 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 ile());... BI
14780 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 O_write_filename
14790 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 (out,pemout);...
147a0 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 PEM_write_bi
147b0 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 o_X509(out,cert)
147c0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 ;... BIO_free
147d0 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a _all(out);...}..
147e0 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 ..X509_free(cert
147f0 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 );...EVP_PKEY_fr
14800 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 ee(pkey);.#if OP
14810 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
14820 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
14830 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 0L...BN_free(bne
14840 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d );.#endif.. }
14850 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 ..}..break;.
14860 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b default:..break;
14870 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
14880 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
14890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
148a0 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 ***/./* Init
148b0 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a */./***
148c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
148d0 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d */../*. *-------
148e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
148f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
14920 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 * Tls_Free --.
14930 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
14940 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 ure cleans up wh
14950 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 en a SSL socket
14960 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a based channel. *
14970 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 .is closed and i
14980 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 ts reference cou
14990 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 nt falls below 1
149a0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
149b0 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.none. *. * Si
149c0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 de effects:. *.F
149d0 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 rees all the sta
149e0 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d te. *. *--------
149f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
14a30 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 void.Tls_Free(ch
14a40 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a ar *blockPtr) {.
14a50 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
14a60 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 Ptr = (State *)b
14a70 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 lockPtr;.. dp
14a80 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
14a90 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 .. Tls_Clean(
14aa0 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 statePtr);. c
14ab0 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b kfree(blockPtr);
14ac0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
14ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
14b10 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d . * Tls_Clean --
14b20 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
14b30 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 edure cleans up
14b40 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 when a SSL socke
14b50 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a t based channel.
14b60 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 *.is closed and
14b70 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 its reference c
14b80 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 ount falls below
14b90 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 1. This should
14ba0 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 . *.be called sy
14bb0 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 nchronously by t
14bc0 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f he CloseProc, no
14bd0 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e t in the. *.Even
14be0 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 tuallyFree callb
14bf0 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ack.. *. * Resul
14c00 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 ts:. *.none. *.
14c10 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
14c20 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 *.Frees all the
14c30 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d state. *. *----
14c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
14c80 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 */.void Tls_Cle
14c90 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 an(State *stateP
14ca0 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 tr) {. dprint
14cb0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
14cc0 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 /*. * we'r
14cd0 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 e assuming here
14ce0 74 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c that we're singl
14cf0 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 e-threaded.
14d00 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
14d10 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 Ptr->timer != (T
14d20 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e cl_TimerToken) N
14d30 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 ULL) {..Tcl_Dele
14d40 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 teTimerHandler(s
14d50 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b tatePtr->timer);
14d60 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 ..statePtr->time
14d70 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a r = NULL;. }.
14d80 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
14d90 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b r->protos) {..ck
14da0 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 free(statePtr->p
14db0 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 rotos);..statePt
14dc0 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c r->protos = NULL
14dd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
14de0 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b statePtr->bio) {
14df0 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 ../* This will c
14e00 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e all SSL_shutdown
14e10 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f . Bug 1414045 */
14e20 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 ..dprintf("BIO_f
14e30 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 ree_all(%p)", st
14e40 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 atePtr->bio);..B
14e50 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 IO_free_all(stat
14e60 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 ePtr->bio);..sta
14e70 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c tePtr->bio = NUL
14e80 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
14e90 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 (statePtr->ssl)
14ea0 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f {..dprintf("SSL_
14eb0 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 free(%p)", state
14ec0 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f Ptr->ssl);..SSL_
14ed0 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 free(statePtr->s
14ee0 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e sl);..statePtr->
14ef0 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ssl = NULL;.
14f00 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
14f10 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f tr->ctx) {..SSL_
14f20 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 CTX_free(statePt
14f30 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 r->ctx);..stateP
14f40 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a tr->ctx = NULL;.
14f50 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
14f60 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
14f70 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 ) {..Tcl_DecrRef
14f80 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
14f90 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 callback);..stat
14fa0 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
14fb0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
14fc0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
14fd0 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f assword) {..Tcl_
14fe0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 DecrRefCount(sta
14ff0 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 tePtr->password)
15000 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 ;..statePtr->pas
15010 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 sword = NULL;.
15020 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
15030 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 ePtr->vcmd) {..T
15040 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
15050 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
15060 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 ..statePtr->vcmd
15070 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a = NULL;. }..
15080 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 dprintf("Ret
15090 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 23 69 urning");.}...#i
150a0 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 f TCL_MAJOR_VERS
150b0 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65 20 ION > 8.#define
150c0 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30 MIN_VERSION "9.0
150d0 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 ".#else.#define
150e0 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35 MIN_VERSION "8.5
150f0 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2d ".#endif../*. *-
15100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15140 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 --. *. * Tls_Ini
15150 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 t --. *. *.This
15160 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 is a package ini
15170 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 tialization proc
15180 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 edure, which is
15190 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c called. *.by Tcl
151a0 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 when this packa
151b0 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 ge is to be adde
151c0 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 d to an interpre
151d0 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ter.. *. * Resul
151e0 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 ts: Ssl configu
151f0 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 red and loaded.
15200 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
15210 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68 s:. *. create th
15220 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 e ssl command, i
15230 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f nitialize ssl co
15240 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d ntext. *. *-----
15250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
15290 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 */.DLLEXPORT int
152a0 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e Tls_Init(Tcl_In
152b0 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a terp *interp) {.
152c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 74 const char t
152d0 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b lsTclInitScript[
152e0 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 ] = {.#include "
152f0 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 tls.tcl.h"..0x00
15300 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 . };.. dpr
15310 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
15320 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f .#ifdef USE_TCL_
15330 53 54 55 42 53 0a 20 20 20 20 69 66 20 28 54 63 STUBS. if (Tc
15340 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 l_InitStubs(inte
15350 72 70 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c rp, MIN_VERSION,
15360 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 0) == NULL) {..
15370 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
15380 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 ;. }.#endif.
15390 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 if (Tcl_PkgRe
153a0 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 54 quire(interp, "T
153b0 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e cl", MIN_VERSION
153c0 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a , 0) == NULL) {.
153d0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
153e0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 R;. }.. if
153f0 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 (TlsLibInit(0)
15400 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 != TCL_OK) {..Tc
15410 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
15420 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f nterp, "could no
15430 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c t initialize SSL
15440 20 6c 69 62 72 61 72 79 22 2c 20 28 63 68 61 72 library", (char
15450 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
15460 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
15470 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 }.. Tcl_Cre
15480 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
15490 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 terp, "tls::ciph
154a0 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a ers", CiphersObj
154b0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
154c0 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 ) NULL, (Tcl_Cmd
154d0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
154e0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
154f0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
15500 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e terp, "tls::conn
15510 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 ection", Connect
15520 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 ionInfoObjCmd, (
15530 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
15540 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
15550 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
15560 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
15570 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
15580 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 "tls::handshake"
15590 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d , HandshakeObjCm
155a0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
155b0 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
155c0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
155d0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
155e0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
155f0 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 rp, "tls::import
15600 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c ", ImportObjCmd,
15610 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
15620 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
15630 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
15640 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
15650 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
15660 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 , "tls::unimport
15670 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d ", UnimportObjCm
15680 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
15690 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
156a0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
156b0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
156c0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
156d0 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 rp, "tls::status
156e0 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c ", StatusObjCmd,
156f0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
15700 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
15710 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
15720 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
15730 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
15740 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 , "tls::version"
15750 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c , VersionObjCmd,
15760 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
15770 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
15780 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
15790 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
157a0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
157b0 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d , "tls::misc", M
157c0 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 iscObjCmd, (Clie
157d0 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
157e0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
157f0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
15800 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
15810 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
15820 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 ::protocols", Pr
15830 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 otocolsObjCmd, (
15840 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
15850 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
15860 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a Proc *) NULL);..
15870 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 29 20 if (interp)
15880 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 {..Tcl_Eval(inte
15890 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 rp, tlsTclInitSc
158a0 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 ript);. }..
158b0 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 return Tcl_Pkg
158c0 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 Provide(interp,
158d0 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 PACKAGE_NAME, PA
158e0 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a CKAGE_VERSION);.
158f0 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
15900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
15930 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e *. *.Tls_SafeIn
15940 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d it --. *. *.----
15950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
15980 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64 .Standard proced
15990 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20 ure required by
159a0 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 'load'.. *.Initi
159b0 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 65 alizes this exte
159c0 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 nsion for a safe
159d0 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a interpreter.. *
159e0 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .---------------
159f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a10 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 -*. *. *.Side ef
15a20 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 fects:. *..As of
15a30 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 'Tls_Init'. *.
15a40 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 *.Result:. *..A
15a50 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 72 standard Tcl err
15a60 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d or code.. *. *--
15a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15aa0 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 ----*. */.DLLEXP
15ab0 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 ORT int Tls_Safe
15ac0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 Init(Tcl_Interp
15ad0 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64 *interp) {. d
15ae0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
15af0 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 6c 73 ;. return(Tls
15b00 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 29 3b 0a _Init(interp));.
15b10 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
15b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
15b50 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 *. *.TlsLibInit
15b60 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d --. *. *.------
15b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 ----------*. *.I
15ba0 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c nitializes SSL l
15bb0 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 ibrary once per
15bc0 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d application. *.-
15bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
15c00 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 . *. *.Side effe
15c10 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c cts:. *..initial
15c20 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 izes SSL library
15c30 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 . *. *.Result:.
15c40 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *..none. *. *---
15c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c80 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ---*. */.static
15c90 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 int TlsLibInit(i
15ca0 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 nt uninitialize)
15cb0 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e {. static in
15cc0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 t initialized =
15cd0 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75 0;. int statu
15ce0 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 s = TCL_OK;.#if
15cf0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
15d00 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
15d10 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
15d20 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f . size_t num_
15d30 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 locks;.#endif..
15d40 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61 6c if (uninitial
15d50 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 ize) {..if (!ini
15d60 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 tialized) {..
15d70 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 dprintf("Asked
15d80 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c to uninitialize,
15d90 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20 but we are not
15da0 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a initialized");..
15db0 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f . return(TCL_
15dc0 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 OK);..}...dprint
15dd0 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e f("Asked to unin
15de0 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 itialize");..#if
15df0 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
15e00 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
15e10 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
15e20 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b )..Tcl_MutexLock
15e30 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 (&init_mx);...if
15e40 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 (locks) {..
15e50 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 free(locks);..
15e60 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a locks = NULL;.
15e70 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 . locksCount
15e80 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 = 0;..}.#endif..
15e90 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b initialized = 0;
15ea0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ..#if defined(OP
15eb0 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
15ec0 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
15ed0 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 READS)..Tcl_Mute
15ee0 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 xUnlock(&init_mx
15ef0 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 );.#endif...retu
15f00 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 rn(TCL_OK);.
15f10 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 }.. if (initi
15f20 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e alized) {..dprin
15f30 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 tf("Called, but
15f40 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c using cached val
15f50 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 28 73 74 ue");..return(st
15f60 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 atus);. }..
15f70 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
15f80 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 d");..#if define
15f90 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
15fa0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
15fb0 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 L_THREADS). T
15fc0 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e cl_MutexLock(&in
15fd0 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 it_mx);.#endif.
15fe0 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d initialized =
15ff0 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 1;..#if defined
16000 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
16010 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
16020 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75 _THREADS). nu
16030 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 m_locks = 1;.
16040 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 locksCount = (i
16050 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 nt) num_locks;.
16060 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f locks = mallo
16070 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 c(sizeof(*locks)
16080 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 * num_locks);.
16090 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c memset(locks,
160a0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 0, sizeof(*lock
160b0 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b s) * num_locks);
160c0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 .#endif.. /*
160d0 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 Initialize BOTH
160e0 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 libcrypto and li
160f0 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 bssl. */. OPE
16100 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 NSSL_init_ssl(OP
16110 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f ENSSL_INIT_LOAD_
16120 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 SSL_STRINGS | OP
16130 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f ENSSL_INIT_LOAD_
16140 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 CRYPTO_STRINGS..
16150 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 | OPENSSL_INIT_A
16160 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c DD_ALL_CIPHERS |
16170 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 OPENSSL_INIT_AD
16180 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e D_ALL_DIGESTS, N
16190 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e ULL);.. BIO_n
161a0 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b ew_tcl(NULL, 0);
161b0 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 ..#if 0. /*.
161c0 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 * XXX:TODO:
161d0 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 65 Remove this code
161e0 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 and replace it
161f0 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20 20 with a check.
16200 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 * for enough e
16210 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f ntropy and do no
16220 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 t try to create
16230 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 our own. * t
16240 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a errible entropy.
16250 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 */. /*.
16260 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 20 72 * Seed the r
16270 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e andom number gen
16280 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53 erator in the SS
16290 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20 L library,.
162a0 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 * using the do/w
162b0 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62 hile construct b
162c0 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 62 75 ecause of the bu
162d0 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 g note in the.
162e0 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 * OpenSSL FAQ
162f0 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f at http://www.o
16300 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f penssl.org/suppo
16310 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 rt/faq.html#USER
16320 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 1. *. *
16330 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 The crux of the
16340 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 problem is that
16350 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e Solaris 7 does n
16360 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 20 2a ot have a. *
16370 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 /dev/random or
16380 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 /dev/urandom dev
16390 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 ice so it cannot
163a0 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 gather enough.
163b0 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 * entropy fr
163c0 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64 om the RAND_seed
163d0 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 () when TLS init
163e0 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75 ializes and refu
163f0 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f ses. * to go
16400 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65 further. Earlie
16410 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 r versions of Op
16420 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e enSSL carried on
16430 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 regardless..
16440 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 */. srand((
16450 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69 unsigned int) ti
16460 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 me((time_t *) NU
16470 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 LL));. do {..
16480 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 for (i = 0; i <
16490 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 16; i++) {..
164a0 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 rnd_seed[i] = 1
164b0 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 20 + (char) (255.0
164c0 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d * rand()/(RAND_M
164d0 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 AX+1.0));..}..RA
164e0 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64 ND_seed(rnd_seed
164f0 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 , sizeof(rnd_see
16500 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 d));. } while
16510 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20 (RAND_status()
16520 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 != 1);.#endif..#
16530 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
16540 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
16550 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
16560 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e DS)..Tcl_MutexUn
16570 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a lock(&init_mx);.
16580 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75 #endif.. retu
16590 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a rn(status);.}.