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 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
33d0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_GetObjResult
33e0: 28 69 6e 74 65 72 70 29 2c 20 28 54 63 6c 5f 53 (interp), (Tcl_S
33f0: 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 29 20 21 3d ize *) NULL)) !=
3400: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 NULL) {..Tcl_Li
3410: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
3420: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
3430: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
3440: 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a Obj(msg, -1));..
3450: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 } else {..li
3460: 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c stPtr = Tcl_NewL
3470: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
3480: 0a 09 77 68 69 6c 65 20 28 28 65 72 72 20 3d 20 ..while ((err =
3490: 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 ERR_get_error())
34a0: 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 != 0) {.. Tc
34b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
34c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c lement(interp, l
34d0: 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 istPtr, Tcl_NewS
34e0: 74 72 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61 tringObj(ERR_rea
34f0: 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 son_error_string
3500: 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a (err), -1));..}.
3510: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
3520: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3530: 2c 20 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 74 , cmdPtr, listPt
3540: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f r);. }.. /
3550: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
3560: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
3570: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
3580: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 cmdPtr);. Eva
3590: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 lCallback(interp
35a0: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 , statePtr, cmdP
35b0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 tr);. Tcl_Dec
35c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
35d0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3620: 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c *. * KeyLogCall
3630: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 back --. *. *.Wr
3640: 69 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 ite received key
3650: 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c data to log fil
3660: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
3670: 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 fects:. *.none.
3680: 2a 0a 20 2a 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 2d 2d 2d ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
36d0: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 KeyLogCallback(
36e0: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 const SSL *ssl,
36f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 const char *line
3700: 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 ) {. char *st
3710: 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 r = getenv(SSLKE
3720: 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 YLOGFILE);. F
3730: 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70 ILE *fd;.. dp
3740: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
3750: 0a 0a 20 20 20 20 69 66 20 28 73 74 72 29 20 7b .. if (str) {
3760: 0a 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 ..fd = fopen(str
3770: 2c 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 , "a");..fprintf
3780: 28 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 (fd, "%s\n",line
3790: 29 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a );..fclose(fd);.
37a0: 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37f0: 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 --. *. * Passwor
3800: 64 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a d Callback --. *
3810: 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 . *.Called when
3820: 61 20 70 61 73 73 77 6f 72 64 20 66 6f 72 20 61 a password for a
3830: 20 70 72 69 76 61 74 65 20 6b 65 79 20 6c 6f 61 private key loa
3840: 64 69 6e 67 2f 73 74 6f 72 69 6e 67 20 61 20 50 ding/storing a P
3850: 45 4d 0a 20 2a 09 63 65 72 74 69 66 69 63 61 74 EM. *.certificat
3860: 65 20 77 69 74 68 20 65 6e 63 72 79 70 74 69 6f e with encryptio
3870: 6e 2e 20 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 n. Evals callbac
3880: 6b 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 k script and ret
3890: 75 72 6e 73 0a 20 2a 09 74 68 65 20 72 65 73 75 urns. *.the resu
38a0: 6c 74 20 61 73 20 74 68 65 20 70 61 73 73 77 6f lt as the passwo
38b0: 72 64 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66 rd string in buf
38c0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
38d0: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
38e0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
38f0: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
3900: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
3910: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 * Returns:. *.Pa
3920: 73 73 77 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 ssword size in b
3930: 79 74 65 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 ytes or -1 for a
3940: 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d n error.. *. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3990: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
39a0: 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 .PasswordCallbac
39b0: 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 k(char *buf, int
39c0: 20 73 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 size, int rwfla
39d0: 67 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 g, void *udata)
39e0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
39f0: 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a tePtr.= (State *
3a00: 29 20 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c ) udata;. Tcl
3a10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
3a20: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
3a30: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
3a40: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 *cmdPtr;. int
3a50: 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 code;.. dpri
3a60: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
3a70: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c /* If no cal
3a80: 6c 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 lback, use defau
3a90: 6c 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 lt callback */.
3aa0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
3ab0: 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c >password == NUL
3ac0: 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 L) {..if (Tcl_Ev
3ad0: 61 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c alEx(interp, "tl
3ae0: 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 s::password", -1
3af0: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 , TCL_EVAL_GLOBA
3b00: 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a L) == TCL_OK) {.
3b10: 09 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d . char *ret =
3b20: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 (char *) Tcl_Ge
3b30: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e tStringResult(in
3b40: 74 65 72 70 29 3b 0a 09 20 20 20 20 73 74 72 6e terp);.. strn
3b50: 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 cpy(buf, ret, (s
3b60: 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 ize_t) size);..
3b70: 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 return (int)s
3b80: 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 trlen(ret);..} e
3b90: 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 lse {.. retur
3ba0: 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a n -1;..}. }..
3bb0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f /* Create co
3bc0: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 mmand to eval wi
3bd0: 74 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c 20 61 th fn, rwflag, a
3be0: 6e 64 20 73 69 7a 65 20 61 72 67 73 20 2a 2f 0a nd size args */.
3bf0: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
3c00: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
3c10: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
3c20: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
3c30: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3c40: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
3c50: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
3c60: 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 29 ("password", -1)
3c70: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
3c80: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3c90: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
3ca0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 77 Tcl_NewIntObj(rw
3cb0: 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f flag));. Tcl_
3cc0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3cd0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3ce0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
3cf0: 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 20 bj(size));..
3d00: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c Tcl_Preserve((Cl
3d10: 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 ientData) interp
3d20: 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 );. Tcl_Prese
3d30: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 rve((ClientData)
3d40: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 statePtr);..
3d50: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 /* Eval callbac
3d60: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 k command */.
3d70: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
3d80: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 t(cmdPtr);. c
3d90: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 ode = Tcl_EvalOb
3da0: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 jEx(interp, cmdP
3db0: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f tr, TCL_EVAL_GLO
3dc0: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f BAL);. if (co
3dd0: 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a de != TCL_OK) {.
3de0: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 #if (TCL_MAJOR_V
3df0: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 ERSION == 8) &&
3e00: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 (TCL_MINOR_VERSI
3e10: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 ON < 6)..Tcl_Bac
3e20: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 kgroundError(int
3e30: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c erp);.#else..Tcl
3e40: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 _BackgroundExcep
3e50: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 tion(interp, cod
3e60: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d e);.#endif. }
3e70: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
3e80: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a Count(cmdPtr);..
3e90: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
3ea0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
3eb0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 tePtr);.. /*
3ec0: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 If successful, p
3ed0: 61 73 73 20 62 61 63 6b 20 70 61 73 73 77 6f 72 ass back passwor
3ee0: 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74 72 75 d string and tru
3ef0: 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e ncate if too lon
3f00: 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f 64 g */. if (cod
3f10: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 e == TCL_OK) {..
3f20: 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 09 63 Tcl_Size len;..c
3f30: 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 har *ret = (char
3f40: 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e *) Tcl_GetStrin
3f50: 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 gFromObj(Tcl_Get
3f60: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
3f70: 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c ), &len);..if (l
3f80: 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 en > (Tcl_Size)
3f90: 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c size-1) {.. l
3fa0: 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 en = (Tcl_Size)
3fb0: 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e size-1;..}..strn
3fc0: 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 cpy(buf, ret, (s
3fd0: 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 ize_t) len);..bu
3fe0: 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 f[len] = '\0';..
3ff0: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
4000: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
4010: 3b 0a 09 72 65 74 75 72 6e 28 28 69 6e 74 29 20 ;..return((int)
4020: 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 len);. }.
4030: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
4040: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
4050: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b ;. return -1;
4060: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
40b0: 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c . * Session Call
40c0: 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 back for Clients
40d0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 --. *. *.Called
40e0: 20 77 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 when a new sess
40f0: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20 ion is added to
4100: 74 68 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c the cache. In TL
4110: 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 S 1.3. *.this ma
4120: 79 20 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 y be received mu
4130: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 ltiple times aft
4140: 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 er the handshake
4150: 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 . For. *.earlier
4160: 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 versions, this
4170: 77 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 will be received
4180: 20 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 during the hand
4190: 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 shake.. *.This i
41a0: 73 20 74 68 65 20 70 72 65 66 65 72 72 65 64 20 s the preferred
41b0: 77 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 way to obtain a
41c0: 72 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f resumable sessio
41d0: 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 n.. *. * Results
41e0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.None. *. *
41f0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
4200: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 .Calls callback
4210: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a (if defined). *.
4220: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a * Return codes:
4230: 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68 . *.0 = error wh
4240: 65 72 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c ere session will
4250: 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 be immediately
4260: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 removed from the
4270: 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e internal cache.
4280: 0a 20 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20 . *.1 = success
4290: 77 68 65 72 65 20 61 70 70 20 72 65 74 61 69 6e where app retain
42a0: 73 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 s session in ses
42b0: 73 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 sion cache, and
42c0: 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 must call SSL_SE
42d0: 53 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 SSION_free() whe
42e0: 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d n done.. *. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4330: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
4340: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 SessionCallback(
4350: 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 SSL *ssl, SSL_SE
4360: 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 SSION *session)
4370: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
4380: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
4390: 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 SSL_get_app_data
43a0: 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 ((SSL *)ssl);.
43b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
43c0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
43d0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
43e0: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
43f0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
4400: 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 char *ticket;.
4410: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 const unsigne
4420: 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f d char *session_
4430: 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c id;. size_t l
4440: 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 en2;. unsigne
4450: 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 d int ulen;..
4460: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
4470: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ");.. if (sta
4480: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
4490: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
44a0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
44b0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a _TLSEXT_ERR_OK;.
44c0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
44d0: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 sl == NULL) {..r
44e0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
44f0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
4500: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 }.. /* Create
4510: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c command to eval
4520: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 with fn, chan,
4530: 73 65 73 73 69 6f 6e 20 69 64 2c 20 73 65 73 73 session id, sess
4540: 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61 6e 64 20 ion ticket, and
4550: 6c 69 66 65 74 69 6d 65 20 61 72 67 73 20 2a 2f lifetime args */
4560: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 . cmdPtr = Tc
4570: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 l_DuplicateObj(s
4580: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
4590: 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 k);. Tcl_List
45a0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
45b0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
45c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
45d0: 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 j("session", -1)
45e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
45f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
4600: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
4610: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
4620: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 ngObj(Tcl_GetCha
4630: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
4640: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a r->self), -1));.
4650: 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 . /* Session
4660: 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f id */. sessio
4670: 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 n_id = SSL_SESSI
4680: 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f ON_get_id(sessio
4690: 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 n, &ulen);. T
46a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
46b0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
46c0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 cmdPtr, Tcl_NewB
46d0: 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 yteArrayObj(sess
46e0: 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a ion_id, (Tcl_Siz
46f0: 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 e) ulen));..
4700: 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 /* Session ticke
4710: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 t */. SSL_SES
4720: 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 SION_get0_ticket
4730: 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 (session, &ticke
4740: 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 t, &len2);. T
4750: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
4760: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
4770: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 cmdPtr, Tcl_NewB
4780: 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b yteArrayObj(tick
4790: 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c et, (Tcl_Size) l
47a0: 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c en2));.. /* L
47b0: 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 ifetime - number
47c0: 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 of seconds */.
47d0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
47e0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
47f0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c rp, cmdPtr,..Tcl
4800: 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e _NewLongObj((lon
4810: 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 g) SSL_SESSION_g
4820: 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 et_ticket_lifeti
4830: 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 me_hint(session)
4840: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c ));.. /* Eval
4850: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
4860: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
4870: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
4880: 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 );. EvalCallb
4890: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ack(interp, stat
48a0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 ePtr, cmdPtr);.
48b0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
48c0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
48d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f return 0;.}.../
48e0: 2a 0a 20 2a 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 2d 2d 2d ----------------
4910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4920: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c -------. *. * AL
4930: 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 PN Callback for
4940: 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 Servers and NPN
4950: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 Callback for Cli
4960: 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 ents --. *. *.Pe
4970: 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 rform protocol (
4980: 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 http/1.1, h2, h3
4990: 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f , etc.) selectio
49a0: 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 n for the. *.inc
49b0: 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e oming connection
49c0: 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 . Called after H
49d0: 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 ello and server
49e0: 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 callbacks.. *.Wh
49f0: 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65 6c ere 'out' is sel
4a00: 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 ected protocol a
4a10: 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20 70 nd 'in' is the p
4a20: 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20 6c eer advertised l
4a30: 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ist.. *. * Resul
4a40: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
4a50: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
4a60: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
4a70: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
4a80: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 *. * Return code
4a90: 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s:. *.SSL_TLSEXT
4aa0: 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 _ERR_OK: ALPN pr
4ab0: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e otocol selected.
4ac0: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
4ad0: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
4ae0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 L_TLSEXT_ERR_ALE
4af0: 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20 RT_FATAL: There
4b00: 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 was no overlap b
4b10: 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e etween the clien
4b20: 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c t's. *. suppl
4b30: 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65 ied list and the
4b40: 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72 server configur
4b50: 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 ation. The conne
4b60: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 ction will be ab
4b70: 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c orted.. *.SSL_TL
4b80: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 SEXT_ERR_NOACK:
4b90: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f ALPN protocol no
4ba0: 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e t selected, e.g.
4bb0: 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 , because no ALP
4bc0: 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f N. *. protoco
4bd0: 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 ls are configure
4be0: 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 d for this conne
4bf0: 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 ction. The conne
4c00: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
4c10: 0a 20 2a 0a 20 2a 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 2d ----------------
4c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
4c60: 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c atic int.ALPNCal
4c70: 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 lback(SSL *ssl,
4c80: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
4c90: 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 har **out, unsig
4ca0: 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 6e ned char *outlen
4cb0: 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 ,..const unsigne
4cc0: 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69 d char *in, unsi
4cd0: 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 gned int inlen,
4ce0: 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 void *arg) {.
4cf0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
4d00: 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a = (State*)arg;.
4d10: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
4d20: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
4d30: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
4d40: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
4d50: 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 int code, re
4d60: 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 s;.. dprintf(
4d70: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
4d80: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 if (ssl == NULL
4d90: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 || arg == NULL)
4da0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
4db0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4dc0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
4dd0: 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f lect protocol */
4de0: 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65 6c . if (SSL_sel
4df0: 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 28 ect_next_proto((
4e00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a unsigned char **
4e10: 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73 ) out, outlen, s
4e20: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c tatePtr->protos,
4e30: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f statePtr->proto
4e40: 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65 s_len,..in, inle
4e50: 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50 n) == OPENSSL_NP
4e60: 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b 0a N_NEGOTIATED) {.
4e70: 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 20 ./* Match found
4e80: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c */..res = SSL_TL
4e90: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
4ea0: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50 } else {../* OP
4eb0: 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 ENSSL_NPN_NO_OVE
4ec0: 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c 61 RLAP = No overla
4ed0: 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 20 p, so use first
4ee0: 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e 74 item from client
4ef0: 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 2a protocol list *
4f00: 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 /..res = SSL_TLS
4f10: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
4f20: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 }.. if (st
4f30: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 atePtr->vcmd ==
4f40: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 (Tcl_Obj*)NULL)
4f50: 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a 20 {..return res;.
4f60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
4f70: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
4f80: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 val with fn, cha
4f90: 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20 69 n, depth, cert i
4fa0: 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75 73 nfo list, status
4fb0: 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67 73 , and error args
4fc0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
4fd0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
4fe0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 j(statePtr->vcmd
4ff0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
5000: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
5010: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
5020: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
5030: 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 ("alpn", -1));.
5040: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
5050: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
5060: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
5070: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
5080: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
5090: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
50a0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 elf), -1));.
50b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
50c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
50d0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
50e0: 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e 73 74 StringObj((const
50f0: 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c 20 2d char *) *out, -
5100: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
5110: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
5120: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
5130: 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e , Tcl_NewBoolean
5140: 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f 54 Obj(res == SSL_T
5150: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a LSEXT_ERR_OK));.
5160: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
5170: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
5180: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
5190: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
51a0: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 if ((code = E
51b0: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 valCallback(inte
51c0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d rp, statePtr, cm
51d0: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 dPtr)) > 1) {..r
51e0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
51f0: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
5200: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d else if (code =
5210: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 = 1) {..res = SS
5220: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
5230: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 . } else {..r
5240: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
5250: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b ERR_ALERT_FATAL;
5260: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 . }. Tcl_D
5270: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ecrRefCount(cmdP
5280: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
5290: 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d res;.}.../*. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52e0: 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 73 -. *. * Advertis
52f0: 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c e Protocols Call
5300: 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 72 back for Next Pr
5310: 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 otocol Negotiati
5320: 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 76 on (NPN) in Serv
5330: 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a erHello --. *. *
5340: 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 54 .called when a T
5350: 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 73 20 LS server needs
5360: 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f 72 a list of suppor
5370: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f ted protocols fo
5380: 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63 r Next. *.Protoc
5390: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a ol Negotiation..
53a0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
53b0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
53c0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a e effects:. *. *
53d0: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 Return codes:.
53e0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
53f0: 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f _OK: NPN protoco
5400: 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 l selected. The
5410: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
5420: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 nues.. *.SSL_TLS
5430: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e EXT_ERR_NOACK: N
5440: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 PN protocol not
5450: 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f selected. The co
5460: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
5470: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d es.. *. *-------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
54c0: 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a .#ifdef USE_NPN.
54d0: 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61 static int.NPNCa
54e0: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
54f0: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 *ssl, const uns
5500: 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 igned char **out
5510: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a , unsigned int *
5520: 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 outlen, void *ar
5530: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a g) {. State *
5540: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
5550: 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 72 e*)arg;.. dpr
5560: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
5570: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 . if (ssl ==
5580: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e NULL || arg == N
5590: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
55a0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
55b0: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ACK;. }..
55c0: 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73 /* Set protocols
55d0: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 list */. if
55e0: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
55f0: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f s != NULL) {..*o
5600: 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 ut = statePtr->p
5610: 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 rotos;..*outlen
5620: 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 = statePtr->prot
5630: 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c os_len;. } el
5640: 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c se {..*out = NUL
5650: 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b L;..*outlen = 0;
5660: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
5670: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
5680: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
5690: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
56a0: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a K;.}.#endif.../*
56b0: 0a 20 2a 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 2d 2d 2d 2d ----------------
56e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56f0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 ------. *. * SNI
5700: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 Callback for Se
5710: 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 rvers --. *. *.P
5720: 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 69 erform server-si
5730: 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 de SNI hostname
5740: 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 20 selection after
5750: 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65 78 receiving SNI ex
5760: 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c tension. *.in Cl
5770: 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c ient Hello. Call
5780: 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 63 ed after hello c
5790: 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66 6f allback but befo
57a0: 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b re ALPN callback
57b0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
57c0: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
57d0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
57e0: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
57f0: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
5800: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
5810: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
5820: 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 R_OK: SNI hostna
5830: 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e 20 me is accepted.
5840: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
5850: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c ontinues.. *.SSL
5860: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 _TLSEXT_ERR_ALER
5870: 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73 T_FATAL: SNI hos
5880: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 tname is not acc
5890: 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 epted. The conne
58a0: 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20 ction. *. is
58b0: 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c 74 aborted. Default
58c0: 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53 53 for alert is SS
58d0: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 L_AD_UNRECOGNIZE
58e0: 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 D_NAME.. *.SSL_T
58f0: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
5900: 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73 WARNING: SNI hos
5910: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 tname is not acc
5920: 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 61 epted, warning a
5930: 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e 74 lert. *. sent
5940: 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 (not supported
5950: 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 in TLSv1.3). The
5960: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
5970: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c inues.. *.SSL_TL
5980: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 SEXT_ERR_NOACK:
5990: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 SNI hostname is
59a0: 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e 64 not accepted and
59b0: 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 not acknowledge
59c0: 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 d,. *. e.g. i
59d0: 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 f SNI has not be
59e0: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 en configured. T
59f0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
5a00: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d ntinues.. *. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a50: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
5a60: 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e .SNICallback(con
5a70: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 st SSL *ssl, int
5a80: 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 *alert, void *a
5a90: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 rg) {. State
5aa0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
5ab0: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c te*)arg;. Tcl
5ac0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
5ad0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
5ae0: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
5af0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 *cmdPtr;. int
5b00: 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 code, res;.
5b10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72 76 const char *serv
5b20: 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a ername = NULL;..
5b30: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
5b40: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
5b50: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 ssl == NULL || a
5b60: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 rg == NULL) {..r
5b70: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
5b80: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
5b90: 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 }.. /* Only w
5ba0: 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 orks for TLS 1.2
5bb0: 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a and earlier */.
5bc0: 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d servername =
5bd0: 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e SSL_get_servern
5be0: 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f ame(ssl, TLSEXT_
5bf0: 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 NAMETYPE_host_na
5c00: 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 me);. if (!se
5c10: 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 rvername || serv
5c20: 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 ername[0] == '\0
5c30: 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c ') {..return SSL
5c40: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
5c50: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 K;. }.. if
5c60: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 (statePtr->vcmd
5c70: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
5c80: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
5c90: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
5ca0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
5cb0: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
5cc0: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 eval with fn, c
5cd0: 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 han, and server
5ce0: 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 name args */.
5cf0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
5d00: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
5d10: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 Ptr->vcmd);.
5d20: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
5d30: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
5d40: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
5d50: 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c StringObj("sni",
5d60: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
5d70: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5d80: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
5d90: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
5da0: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 StringObj(Tcl_Ge
5db0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
5dc0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 tePtr->self), -1
5dd0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
5de0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
5df0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
5e00: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
5e10: 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 2d j(servername , -
5e20: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 1));.. /* Eva
5e30: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
5e40: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
5e50: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
5e60: 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 r);. if ((cod
5e70: 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b e = EvalCallback
5e80: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
5e90: 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 r, cmdPtr)) > 1)
5ea0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
5eb0: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 SEXT_ERR_ALERT_W
5ec0: 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 20 ARNING;..*alert
5ed0: 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 = SSL_AD_UNRECOG
5ee0: 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e NIZED_NAME; /* N
5ef0: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 ot supported by
5f00: 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d TLS 1.3 */. }
5f10: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d else if (code =
5f20: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 = 1) {..res = SS
5f30: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
5f40: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 . } else {..r
5f50: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
5f60: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b ERR_ALERT_FATAL;
5f70: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41 ..*alert = SSL_A
5f80: 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e D_UNRECOGNIZED_N
5f90: 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70 AME; /* Not supp
5fa0: 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33 orted by TLS 1.3
5fb0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 */. }. Tc
5fc0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
5fd0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 mdPtr);. retu
5fe0: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 rn res;.}.../*.
5ff0: 2a 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 2d 2d 2d 2d 2d 2d ----------------
6020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6030: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e ----. *. * Clien
6040: 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b 65 tHello Handshake
6050: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 Callback for Se
6060: 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 rvers --. *. *.U
6070: 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74 6f sed by server to
6080: 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65 72 examine the ser
6090: 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 ver name indicat
60a0: 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e 73 ion (SNI) extens
60b0: 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 20 ion. *.provided
60c0: 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69 6e by the client in
60d0: 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63 74 order to select
60e0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 an appropriate
60f0: 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a 20 certificate to.
6100: 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 6d *.present, and m
6110: 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 67 ake other config
6120: 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d 65 uration adjustme
6130: 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 nts relevant to
6140: 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09 6e that server. *.n
6150: 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e 66 ame and its conf
6160: 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 iguration. This
6170: 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69 6e includes swappin
6180: 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63 69 g out the associ
6190: 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 20 ated. *.SSL_CTX
61a0: 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 69 pointer, modifyi
61b0: 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 20 ng the server's
61c0: 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74 65 list of permitte
61d0: 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c 0a d TLS versions,.
61e0: 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65 20 *.changing the
61f0: 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72 20 server's cipher
6200: 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 65 list in response
6210: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 73 to the client's
6220: 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65 74 cipher list, et
6230: 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65 66 c.. *.Called bef
6240: 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50 4e ore SNI and ALPN
6250: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20 callbacks.. *.
6260: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
6270: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
6280: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 fects:. *.Calls
6290: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 callback (if def
62a0: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 ined). *. * Retu
62b0: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c rn codes:. *.SSL
62c0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 _CLIENT_HELLO_RE
62d0: 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68 65 TRY: suspend the
62e0: 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 20 handshake, and
62f0: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 75 the handshake fu
6300: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75 nction will retu
6310: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20 rn immediately.
6320: 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c *.SSL_CLIENT_HEL
6330: 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75 72 LO_ERROR: failur
6340: 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e e, terminate con
6350: 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c 65 nection. Set ale
6360: 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 65 rt to error code
6370: 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f .. *.SSL_CLIENT_
6380: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20 73 HELLO_SUCCESS: s
6390: 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d uccess. *. *----
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
63d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
63e0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 48 */.static int.H
63f0: 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 53 4c elloCallback(SSL
6400: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 *ssl, int *aler
6410: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a t, void *arg) {.
6420: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
6430: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
6440: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 g;. Tcl_Inter
6450: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
6460: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
6470: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
6480: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c r;. int code,
6490: 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 res;. const
64a0: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 char *servername
64b0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 ;. const unsi
64c0: 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 gned char *p;.
64d0: 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 size_t len, re
64e0: 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70 maining;.. dp
64f0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
6500: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
6510: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c tr->vcmd == (Tcl
6520: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 _Obj*)NULL) {..r
6530: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
6540: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a _HELLO_SUCCESS;.
6550: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
6560: 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 4c sl == (const SSL
6570: 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d *)NULL || arg =
6580: 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 20 = (void *)NULL)
6590: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c {..return SSL_CL
65a0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
65b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
65c0: 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 Get names */.
65d0: 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74 if (!SSL_client
65e0: 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28 _hello_get0_ext(
65f0: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 45 ssl, TLSEXT_TYPE
6600: 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70 _server_name, &p
6610: 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c , &remaining) ||
6620: 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 remaining <= 2)
6630: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
6640: 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 _R_SSLV3_ALERT_I
6650: 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 LLEGAL_PARAMETER
6660: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
6670: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
6680: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
6690: 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e 67 Extract the leng
66a0: 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 th of the suppli
66b0: 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 ed list of names
66c0: 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28 . */. len = (
66d0: 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 *(p++) << 8);.
66e0: 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b len += *(p++);
66f0: 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 . if (len + 2
6700: 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b != remaining) {
6710: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 ..*alert = SSL_R
6720: 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c _SSLV3_ALERT_ILL
6730: 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a EGAL_PARAMETER;.
6740: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 .return SSL_CLIE
6750: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a NT_HELLO_ERROR;.
6760: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e }. remain
6770: 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 ing = len;..
6780: 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 70 /* The list in p
6790: 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 73 ractice only has
67a0: 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e a single elemen
67b0: 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f t, so we only co
67c0: 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 74 nsider the first
67d0: 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 one. */. if
67e0: 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20 (remaining == 0
67f0: 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58 || *p++ != TLSEX
6800: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f T_NAMETYPE_host_
6810: 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 20 name) {..*alert
6820: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c = SSL_R_TLSV1_AL
6830: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 ERT_INTERNAL_ERR
6840: 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f OR;..return SSL_
6850: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
6860: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 OR;. }. re
6870: 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 maining--;..
6880: 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 69 /* Now we can fi
6890: 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74 nally pull out t
68a0: 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 69 he byte array wi
68b0: 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 6f th the actual ho
68c0: 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 stname. */. i
68d0: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 f (remaining <=
68e0: 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 2) {..*alert = S
68f0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 SL_R_TLSV1_ALERT
6900: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b _INTERNAL_ERROR;
6910: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 ..return SSL_CLI
6920: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b ENT_HELLO_ERROR;
6930: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d . }. len =
6940: 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a (*(p++) << 8);.
6950: 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b len += *(p++
6960: 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b );. if (len +
6970: 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 20 2 > remaining)
6980: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
6990: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e R_TLSV1_ALERT_IN
69a0: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 TERNAL_ERROR;..r
69b0: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
69c0: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
69d0: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e }. remainin
69e0: 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72 g = len;. ser
69f0: 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 vername = (const
6a00: 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20 char *)p;..
6a10: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
6a20: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 d to eval with f
6a30: 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 n, chan, and ser
6a40: 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f ver name args */
6a50: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 . cmdPtr = Tc
6a60: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 l_DuplicateObj(s
6a70: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a tatePtr->vcmd);.
6a80: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
6a90: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
6aa0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
6ab0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 _NewStringObj("h
6ac0: 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 ello", -1));.
6ad0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
6ae0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
6af0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
6b00: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
6b10: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
6b20: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
6b30: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 f), -1));. Tc
6b40: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
6b50: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
6b60: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
6b70: 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 ringObj(serverna
6b80: 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c me, (Tcl_Size) l
6b90: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 en));.. /* Ev
6ba0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
6bb0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
6bc0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
6bd0: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f tr);. if ((co
6be0: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 de = EvalCallbac
6bf0: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 k(interp, stateP
6c00: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 tr, cmdPtr)) > 1
6c10: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 ) {..res = SSL_C
6c20: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 LIENT_HELLO_RETR
6c30: 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c Y;..*alert = SSL
6c40: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55 _R_TLSV1_ALERT_U
6c50: 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 SER_CANCELLED;.
6c60: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f } else if (co
6c70: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 de == 1) {..res
6c80: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c = SSL_CLIENT_HEL
6c90: 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 LO_SUCCESS;.
6ca0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
6cb0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
6cc0: 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 _ERROR;..*alert
6cd0: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c = SSL_R_TLSV1_AL
6ce0: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 ERT_INTERNAL_ERR
6cf0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 OR;. }. Tc
6d00: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
6d10: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 mdPtr);. retu
6d20: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a rn res;.}.../***
6d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6d40: 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 */./* Commands
6d50: 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a */./*****
6d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
6d70: 0a 0a 2f 2a 0a 20 2a 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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
6dc0: 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d CiphersObjCmd -
6dd0: 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 - list available
6de0: 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 ciphers. *. *.T
6df0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
6e00: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 invoked to proc
6e10: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 ess the "tls::ci
6e20: 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 phers" command.
6e30: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 *.to list availa
6e40: 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 ble ciphers, bas
6e50: 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c ed upon protocol
6e60: 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a selected.. *. *
6e70: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
6e80: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
6e90: 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 lt list.. *. * S
6ea0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
6eb0: 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 constructs and d
6ec0: 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 estroys SSL cont
6ed0: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d ext (CTX). *. *-
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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f20: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f --. */.static co
6f30: 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 nst char *protoc
6f40: 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 ols[] = {.."ssl2
6f50: 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 ", "ssl3", "tls1
6f60: 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c ", "tls1.1", "tl
6f70: 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c s1.2", "tls1.3",
6f80: 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 NULL.};.enum pr
6f90: 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 otocol {. TLS
6fa0: 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c _SSL2, TLS_SSL3,
6fb0: 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 TLS_TLS1, TLS_T
6fc0: 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f LS1_1, TLS_TLS1_
6fd0: 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 2, TLS_TLS1_3, T
6fe0: 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 LS_NONE.};..stat
6ff0: 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 ic int.CiphersOb
7000: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
7010: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
7020: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
7030: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
7040: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
7050: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
7060: 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 objPtr = NULL;.
7070: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 SSL_CTX *ctx
7080: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 = NULL;. SSL
7090: 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 *ssl = NULL;.
70a0: 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 STACK_OF(SSL_CI
70b0: 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63 PHER) *sk;. c
70c0: 68 61 72 20 2a 63 70 2c 20 62 75 66 5b 42 55 46 har *cp, buf[BUF
70d0: 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e SIZ];. int in
70e0: 64 65 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 dex, verbose = 0
70f0: 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20 , use_supported
7100: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 = 0;. const S
7110: 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f SL_METHOD *metho
7120: 64 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c d;. (void) cl
7130: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 ientData;.. d
7140: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
7150: 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 ;.. if ((objc
7160: 20 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e < 2) || (objc >
7170: 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 4)) {..Tcl_Wron
7180: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
7190: 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 1, objv, "proto
71a0: 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 col ?verbose? ?s
71b0: 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 upported?");..re
71c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
71d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 }. if (Tc
71e0: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 l_GetIndexFromOb
71f0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 j(interp, objv[1
7200: 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 ], protocols, "p
7210: 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e rotocol", 0, &in
7220: 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 dex) != TCL_OK)
7230: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
7240: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
7250: 66 20 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 f ((objc > 2) &&
7260: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 Tcl_GetBooleanF
7270: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
7280: 62 6a 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 bjv[2], &verbose
7290: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
72a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
72b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
72c0: 28 6f 62 6a 63 20 3e 20 33 29 20 26 26 20 54 63 (objc > 3) && Tc
72d0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d l_GetBooleanFrom
72e0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
72f0: 5b 33 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 [3], &use_suppor
7300: 74 65 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ted) != TCL_OK)
7310: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
7320: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
7330: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
7340: 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 );.. switch (
7350: 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 (enum protocol)i
7360: 6e 64 65 78 29 20 7b 0a 09 63 61 73 65 20 54 4c ndex) {..case TL
7370: 53 5f 53 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e S_SSL2:.#if OPEN
7380: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
7390: 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 ER >= 0x10100000
73a0: 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f L || defined(NO_
73b0: 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL2) || defined
73c0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
73d0: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ).. Tcl_Appen
73e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
73f0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d protocols[index]
7400: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f , ": protocol no
7410: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
7420: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e LL);.. return
7430: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 TCL_ERROR;.#els
7440: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 e.. method =
7450: 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 SSLv2_method();
7460: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 break;.#endif..c
7470: 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 ase TLS_SSL3:.#i
7480: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c f defined(NO_SSL
7490: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
74a0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c ENSSL_NO_SSL3) |
74b0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
74c0: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 L_NO_SSL3_METHOD
74d0: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ).. Tcl_Appen
74e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
74f0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d protocols[index]
7500: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f , ": protocol no
7510: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
7520: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e LL);.. return
7530: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 TCL_ERROR;.#els
7540: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 e.. method =
7550: 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20 SSLv3_method();
7560: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 break;.#endif..c
7570: 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 ase TLS_TLS1:.#i
7580: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
7590: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
75a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c ENSSL_NO_TLS1) |
75b0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
75c0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 L_NO_TLS1_METHOD
75d0: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ).. Tcl_Appen
75e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
75f0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d protocols[index]
7600: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f , ": protocol no
7610: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
7620: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e LL);.. return
7630: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 TCL_ERROR;.#els
7640: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 e.. method =
7650: 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b 20 TLSv1_method();
7660: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 break;.#endif..c
7670: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a ase TLS_TLS1_1:.
7680: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
7690: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_1) || define
76a0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
76b0: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_1) || defined(
76c0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
76d0: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 1_METHOD).. T
76e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
76f0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
7700: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
7710: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
7720: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
7730: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
7740: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
7750: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f ethod = TLSv1_1_
7760: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b method(); break;
7770: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c .#endif..case TL
7780: 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 S_TLS1_2:.#if de
7790: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
77a0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
77b0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c SSL_NO_TLS1_2) |
77c0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
77d0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 L_NO_TLS1_2_METH
77e0: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 OD).. Tcl_App
77f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
7800: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
7810: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
7820: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
7830: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
7840: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
7850: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 lse.. method
7860: 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 = TLSv1_2_method
7870: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 (); break;.#endi
7880: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 f..case TLS_TLS1
7890: 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 _3:.#if defined(
78a0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
78b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
78c0: 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 54 63 _TLS1_3).. Tc
78d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
78e0: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
78f0: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
7900: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
7910: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
7920: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
7930: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 R;.#else.. me
7940: 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f thod = TLS_metho
7950: 64 28 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 d();.. SSL_CT
7960: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f X_set_min_proto_
7970: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 version(ctx, TLS
7980: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 1_3_VERSION);..
7990: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d SSL_CTX_set_m
79a0: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e ax_proto_version
79b0: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 (ctx, TLS1_3_VER
79c0: 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 SION);.. brea
79d0: 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 75 k;.#endif..defau
79e0: 6c 74 3a 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 lt:.. method
79f0: 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a = TLS_method();.
7a00: 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 . break;.
7a10: 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c }.. ctx = SSL
7a20: 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 _CTX_new(method)
7a30: 3b 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d ;. if (ctx ==
7a40: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 NULL) {..Tcl_Ap
7a50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
7a60: 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f p, GET_ERR_REASO
7a70: 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 N(), NULL);..ret
7a80: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
7a90: 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 }.. ssl =
7aa0: 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 SSL_new(ctx);.
7ab0: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c if (ssl == NUL
7ac0: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
7ad0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 Result(interp, G
7ae0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
7af0: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
7b00: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
7b10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
7b20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 }.. /* Use
7b30: 20 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 list and order
7b40: 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 as would be sent
7b50: 20 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c in a ClientHell
7b60: 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 o or all availab
7b70: 6c 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 le ciphers */.
7b80: 20 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 if (use_suppor
7b90: 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c ted) {..sk = SSL
7ba0: 5f 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f _get1_supported_
7bb0: 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 ciphers(ssl);.
7bc0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d } else {..sk =
7bd0: 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 SSL_get_ciphers
7be0: 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 (ssl);. }..
7bf0: 20 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c if (sk != NULL
7c00: 29 20 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 ) {..if (!verbos
7c10: 65 29 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 e) {.. objPtr
7c20: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
7c30: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 j(0, NULL);..
7c40: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b for (int i = 0;
7c50: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 i < sk_SSL_CIPH
7c60: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 ER_num(sk); i++)
7c70: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 {...const SSL_C
7c80: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 IPHER *c = sk_SS
7c90: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 L_CIPHER_value(s
7ca0: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d k, i);...if (c =
7cb0: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 = NULL) continue
7cc0: 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 6e ;..../* cipher n
7cd0: 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f ame or (NONE) */
7ce0: 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 ...cp = SSL_CIPH
7cf0: 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a ER_get_name(c);.
7d00: 09 09 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c ..if (cp == NULL
7d10: 29 20 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c ) break;...Tcl_L
7d20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
7d30: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
7d40: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
7d50: 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 gObj(cp, -1));..
7d60: 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b }...} else {
7d70: 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
7d80: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
7d90: 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 "",0);.. for
7da0: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 (int i = 0; i <
7db0: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 sk_SSL_CIPHER_nu
7dc0: 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 m(sk); i++) {...
7dd0: 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 const SSL_CIPHER
7de0: 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 *c = sk_SSL_CIP
7df0: 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 HER_value(sk, i)
7e00: 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c ;...if (c == NUL
7e10: 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 L) continue;....
7e20: 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 /* textual descr
7e30: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 iption of the ci
7e40: 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 pher */...if (SS
7e50: 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 L_CIPHER_descrip
7e60: 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a tion(c, buf, siz
7e70: 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c eof(buf)) != NUL
7e80: 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 L) {... Tcl_A
7e90: 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 ppendToObj(objPt
7ea0: 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a r, buf, (Tcl_Siz
7eb0: 65 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b e) strlen(buf));
7ec0: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 ...} else {...
7ed0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 Tcl_AppendToOb
7ee0: 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f j(objPtr, "UNKNO
7ef0: 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 WN\n", 8);...}..
7f00: 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 }..}..if (us
7f10: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 e_supported) {..
7f20: 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 sk_SSL_CIPHE
7f30: 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 R_free(sk);..}.
7f40: 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 }. SSL_fre
7f50: 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f e(ssl);. SSL_
7f60: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a CTX_free(ctx);..
7f70: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
7f80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
7f90: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
7fa0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
7fb0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
7fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ff0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 -----. *. * Prot
8000: 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c ocolsObjCmd -- l
8010: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 ist available pr
8020: 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 otocols. *. *.Th
8030: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
8040: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
8050: 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f ss the "tls::pro
8060: 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a tocols" command.
8070: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c *.to list avail
8080: 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a able protocols..
8090: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
80a0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
80b0: 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a result list.. *
80c0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
80d0: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d :. *.none. *. *-
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8120: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
8130: 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d t.ProtocolsObjCm
8140: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
8150: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
8160: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
8170: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
8180: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
8190: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
81a0: 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 Ptr;. (void)
81b0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
81c0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
81d0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ");.. if (obj
81e0: 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 c != 1) {..Tcl_W
81f0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
8200: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 rp, 1, objv, "")
8210: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
8220: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
8230: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
8240: 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d );.. objPtr =
8250: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
8260: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 0, NULL);..#if O
8270: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
8280: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
8290: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 00L && !defined(
82a0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 NO_SSL2) && !def
82b0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
82c0: 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 SSL2). Tcl_Li
82d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
82e0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
82f0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
8300: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
8310: 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 S_SSL2], -1));.#
8320: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
8330: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 ed(NO_SSL3) && !
8340: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
8350: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
8360: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8370: 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 SSL3_METHOD).
8380: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
8390: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
83a0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
83b0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
83c0: 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 cols[TLS_SSL3],
83d0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 -1));.#endif.#if
83e0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
83f0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
8400: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 PENSSL_NO_TLS1)
8410: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
8420: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 SSL_NO_TLS1_METH
8430: 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 OD). Tcl_List
8440: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
8450: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
8460: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
8470: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f j(protocols[TLS_
8480: 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e TLS1], -1));.#en
8490: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
84a0: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 (NO_TLS1_1) && !
84b0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
84c0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 NO_TLS1_1) && !d
84d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
84e0: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 O_TLS1_1_METHOD)
84f0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
8500: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
8510: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
8520: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
8530: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 rotocols[TLS_TLS
8540: 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 1_1], -1));.#end
8550: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
8560: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 NO_TLS1_2) && !d
8570: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
8580: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
8590: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
85a0: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a _TLS1_2_METHOD).
85b0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
85c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
85d0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
85e0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
85f0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 otocols[TLS_TLS1
8600: 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 _2], -1));.#endi
8610: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
8620: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 O_TLS1_3) && !de
8630: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8640: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 6c _TLS1_3). Tcl
8650: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
8660: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
8670: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
8680: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
8690: 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 [TLS_TLS1_3], -1
86a0: 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 ));.#endif..
86b0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
86c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
86d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
86e0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
86f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8730: 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b -. *. * Handshak
8740: 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a eObjCmd --. *. *
8750: 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 .This command is
8760: 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 used to verify
8770: 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e 64 whether the hand
8780: 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 shake is complet
8790: 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a e. *.or not.. *.
87a0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
87b0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
87c0: 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 sult. 1 means ha
87d0: 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 ndshake complete
87e0: 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e , 0 means pendin
87f0: 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 g.. *. * Side ef
8800: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f fects:. *.May fo
8810: 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 rce SSL negotiat
8820: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 ion to take plac
8830: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
8840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
8880: 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 73 static int Hands
8890: 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e hakeObjCmd(Clien
88a0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
88b0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
88c0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
88d0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
88e0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
88f0: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 _Channel chan;
8900: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 61 /* The cha
8910: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f nnel to set a mo
8920: 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 de on. */. St
8930: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 20 ate *statePtr;
8940: 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 /* client
8950: 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f state for ssl so
8960: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 cket */. cons
8970: 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 3d t char *errStr =
8980: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 NULL;. int r
8990: 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 et = 1;. int
89a0: 65 72 72 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f err = 0;. (vo
89b0: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a id) clientData;.
89c0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
89d0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
89e0: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
89f0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
8a00: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
8a10: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 "channel");..re
8a20: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
8a30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
8a40: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
8a50: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
8a60: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
8a70: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 , Tcl_GetStringF
8a80: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 romObj(objv[1],
8a90: 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c (Tcl_Size *) NUL
8aa0: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 L), NULL);. i
8ab0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
8ac0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
8ad0: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
8ae0: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
8af0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
8b00: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
8b10: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
8b20: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
8b30: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
8b40: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 han);. if (Tc
8b50: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
8b60: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
8b70: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
8b80: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
8b90: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
8ba0: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
8bb0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
8bc0: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e an),.. "\": n
8bd0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
8be0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 ", NULL);..Tcl_S
8bf0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
8c00: 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 rp, "TLS", "HAND
8c10: 53 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c SHAKE", "CHANNEL
8c20: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 ", "INVALID", (c
8c30: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
8c40: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
8c50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 ;. }. stat
8c60: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
8c70: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e Tcl_GetChannelIn
8c80: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 stanceData(chan)
8c90: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
8ca0: 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 Calling Tls_Wait
8cb0: 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 ForConnect");.
8cc0: 20 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 ret = Tls_Wait
8cd0: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 ForConnect(state
8ce0: 50 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 Ptr, &err, 1);.
8cf0: 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f dprintf("Tls_
8d00: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 WaitForConnect r
8d10: 65 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 eturned: %i", re
8d20: 74 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 t);.. if (ret
8d30: 20 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 50 < 0 && ((stateP
8d40: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f tr->flags & TLS_
8d50: 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 TCL_ASYNC) && (e
8d60: 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 rr == EAGAIN)))
8d70: 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e {..dprintf("Asyn
8d80: 63 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 c set and err =
8d90: 45 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d EAGAIN");..ret =
8da0: 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 0;. } else i
8db0: 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c f (ret < 0) {..l
8dc0: 6f 6e 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 ong result;..err
8dd0: 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e Str = statePtr->
8de0: 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 err;..Tcl_ResetR
8df0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 esult(interp);..
8e00: 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 Tcl_SetErrno(err
8e10: 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 );...if (!errStr
8e20: 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 || (*errStr ==
8e30: 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 0)) {.. errSt
8e40: 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 r = Tcl_PosixErr
8e50: 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a or(interp);..}..
8e60: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
8e70: 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 t(interp, "hands
8e80: 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 hake failed: ",
8e90: 65 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 errStr, (char *)
8ea0: 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 NULL);..if ((re
8eb0: 73 75 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 sult = SSL_get_v
8ec0: 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 erify_result(sta
8ed0: 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 tePtr->ssl)) !=
8ee0: 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 X509_V_OK) {..
8ef0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
8f00: 6c 74 28 69 6e 74 65 72 70 2c 20 22 20 64 75 65 lt(interp, " due
8f10: 20 74 6f 20 5c 22 22 2c 20 58 35 30 39 5f 76 65 to \"", X509_ve
8f20: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f rify_cert_error_
8f30: 73 74 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 string(result),
8f40: 22 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e "\"", (char *) N
8f50: 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 ULL);..}..Tcl_Se
8f60: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
8f70: 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 p, "TLS", "HANDS
8f80: 48 41 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c HAKE", "FAILED",
8f90: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
8fa0: 0a 09 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 ..dprintf("Retur
8fb0: 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 ning TCL_ERROR w
8fc0: 69 74 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 ith handshake fa
8fd0: 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 iled: %s", errSt
8fe0: 72 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f r);..return(TCL_
8ff0: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 20 65 6c ERROR);. } el
9000: 73 65 20 7b 0a 09 69 66 20 28 65 72 72 20 21 3d se {..if (err !=
9010: 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 0) {.. dprin
9020: 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 tf("Got an error
9030: 20 77 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 with a complete
9040: 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 d handshake: err
9050: 20 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d = %i", err);..}
9060: 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d ..ret = 1;. }
9070: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 .. dprintf("R
9080: 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 eturning TCL_OK
9090: 77 69 74 68 20 64 61 74 61 20 5c 22 25 69 5c 22 with data \"%i\"
90a0: 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 54 63 6c ", ret);. Tcl
90b0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
90c0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 terp, Tcl_NewInt
90d0: 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 72 Obj(ret));. r
90e0: 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d eturn(TCL_OK);.}
90f0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
9100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
9140: 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d ImportObjCmd --
9150: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
9160: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
9170: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 to process the
9180: 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a "ssl" command. *
9190: 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d . *.The ssl comm
91a0: 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f and pushes SSL o
91b0: 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e ver a (newly con
91c0: 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b nected) tcp sock
91d0: 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 et. *. * Results
91e0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
91f0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
9200: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
9210: 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 *.May modify th
9220: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e e behavior of an
9230: 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a IO channel.. *.
9240: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
9250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
9290: 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d int.ImportObjCm
92a0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
92b0: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
92c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
92d0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
92e0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
92f0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
9300: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 chan;../* The ch
9310: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
9320: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 ode on. */. S
9330: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 tate *statePtr;.
9340: 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 ./* client state
9350: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 for ssl socket
9360: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a */. SSL_CTX *
9370: 63 74 78 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ctx..= NULL;.
9380: 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 Tcl_Obj *script
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 70 61 73 73 77 6f 72 64 09 l_Obj *password.
93b0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c .= NULL;. Tcl
93c0: 5f 4f 62 6a 20 2a 76 63 6d 64 09 09 3d 20 4e 55 _Obj *vcmd..= NU
93d0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 LL;. Tcl_DStr
93e0: 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c ing upperChannel
93f0: 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 Translation, upp
9400: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
9410: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 g, upperChannelE
9420: 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 ncoding, upperCh
9430: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 annelEOFChar;.
9440: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 54 int idx;. T
9450: 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 cl_Size len;.
9460: 20 69 6e 74 20 66 6c 61 67 73 09 09 09 3d 20 54 int flags...= T
9470: 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 LS_TCL_INIT;.
9480: 20 69 6e 74 20 73 65 72 76 65 72 09 09 09 3d 20 int server...=
9490: 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 0;./* is connect
94a0: 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 ion incoming or
94b0: 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 outgoing? */.
94c0: 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 09 char *keyfile..
94d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
94e0: 20 2a 63 65 72 74 66 69 6c 65 09 09 3d 20 4e 55 *certfile..= NU
94f0: 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 LL;. unsigned
9500: 20 63 68 61 72 20 2a 6b 65 79 09 09 3d 20 4e 55 char *key..= NU
9510: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 LL;. Tcl_Size
9520: 20 6b 65 79 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 key_len..= 0;.
9530: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
9540: 20 2a 63 65 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a *cert..= NULL;.
9550: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 65 72 Tcl_Size cer
9560: 74 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 t_len..= 0;.
9570: 63 68 61 72 20 2a 63 69 70 68 65 72 73 09 09 3d char *ciphers..=
9580: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
9590: 2a 63 69 70 68 65 72 73 75 69 74 65 73 09 09 3d *ciphersuites..=
95a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
95b0: 2a 43 41 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b *CAfile..= NULL;
95c0: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 70 61 74 . char *CApat
95d0: 68 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 h..= NULL;. c
95e0: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 09 3d har *DHparams..=
95f0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
9600: 2a 6d 6f 64 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b *model...= NULL;
9610: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 . char *serve
9620: 72 6e 61 6d 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f rname..= NULL;./
9630: 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 * hostname for S
9640: 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 erver Name Indic
9650: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e ation */. con
9660: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
9670: 20 2a 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e *session_id = N
9680: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
9690: 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a *alpn..= NULL;.
96a0: 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 int ssl2 = 0
96b0: 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 , ssl3 = 0;.
96c0: 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c int tls1 = 1, tl
96d0: 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 s1_1 = 1, tls1_2
96e0: 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 = 1, tls1_3 = 1
96f0: 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 ;. int proto
9700: 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b = 0, level = -1;
9710: 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 . int verify
9720: 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 = 0, require = 0
9730: 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c 20 70 , request = 1, p
9740: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 ost_handshake =
9750: 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 0;. (void) cl
9760: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 ientData;.. d
9770: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
9780: 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e ;..#if defined(N
9790: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e O_TLS1) || defin
97a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
97b0: 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 S1). tls1 = 0
97c0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ;.#endif.#if def
97d0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
97e0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
97f0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 SL_NO_TLS1_1).
9800: 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 tls1_1 = 0;.#e
9810: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
9820: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 (NO_TLS1_2) || d
9830: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
9840: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c O_TLS1_2). tl
9850: 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 s1_2 = 0;.#endif
9860: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
9870: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e TLS1_3) || defin
9880: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
9890: 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 S1_3). tls1_3
98a0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 = 0;.#endif..
98b0: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 if (objc < 2)
98c0: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
98d0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
98e0: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f bjv, "channel ?o
98f0: 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 ptions?");..retu
9900: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
9910: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
9920: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
9930: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
9940: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
9950: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
9960: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 28 54 63 Obj(objv[1], (Tc
9970: 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 2c l_Size *) NULL),
9980: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 NULL);. if (
9990: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
99a0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
99b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
99c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
99d0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
99e0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
99f0: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
9a00: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
9a10: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
9a20: 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 ;.. for (idx
9a30: 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b = 2; idx < objc;
9a40: 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 idx++) {..char
9a50: 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 *opt = Tcl_GetSt
9a60: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
9a70: 5b 69 64 78 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 [idx], (Tcl_Size
9a80: 20 2a 29 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 *)NULL);...if (
9a90: 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 opt[0] != '-')..
9aa0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 break;...OPT
9ab0: 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 OBJ("-alpn", alp
9ac0: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 n);..OPTSTR("-ca
9ad0: 64 69 72 22 2c 20 43 41 70 61 74 68 29 3b 0a 09 dir", CApath);..
9ae0: 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 OPTSTR("-cafile"
9af0: 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 42 , CAfile);..OPTB
9b00: 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72 YTE("-cert", cer
9b10: 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f t, cert_len);..O
9b20: 50 54 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65 PTSTR("-certfile
9b30: 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f ", certfile);..O
9b40: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c PTSTR("-cipher",
9b50: 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 ciphers);..OPTS
9b60: 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63 TR("-ciphers", c
9b70: 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 iphers);..OPTSTR
9b80: 28 22 2d 63 69 70 68 65 72 73 75 69 74 65 73 22 ("-ciphersuites"
9b90: 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29 3b , ciphersuites);
9ba0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 ..OPTOBJ("-comma
9bb0: 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f nd", script);..O
9bc0: 50 54 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73 PTSTR("-dhparams
9bd0: 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f ", DHparams);..O
9be0: 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b PTBYTE("-key", k
9bf0: 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f ey, key_len);..O
9c00: 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 PTSTR("-keyfile"
9c10: 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 , keyfile);..OPT
9c20: 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f STR("-model", mo
9c30: 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d del);..OPTOBJ("-
9c40: 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77 password", passw
9c50: 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 ord);..OPTBOOL("
9c60: 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 -post_handshake"
9c70: 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 , post_handshake
9c80: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 );..OPTBOOL("-re
9c90: 71 75 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 quest", request)
9ca0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 ;..OPTBOOL("-req
9cb0: 75 69 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b uire", require);
9cc0: 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72 ..OPTINT("-secur
9cd0: 69 74 79 5f 6c 65 76 65 6c 22 2c 20 6c 65 76 65 ity_level", leve
9ce0: 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 l);..OPTBOOL("-s
9cf0: 65 72 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b erver", server);
9d00: 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 72 76 65 ..OPTSTR("-serve
9d10: 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 rname", serverna
9d20: 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 me);..OPTSTR("-s
9d30: 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 ession_id", sess
9d40: 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f ion_id);..OPTBOO
9d50: 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 L("-ssl2", ssl2)
9d60: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c ;..OPTBOOL("-ssl
9d70: 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 3", ssl3);..OPTB
9d80: 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 OOL("-tls1", tls
9d90: 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 1);..OPTBOOL("-t
9da0: 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b ls1.1", tls1_1);
9db0: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 ..OPTBOOL("-tls1
9dc0: 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f .2", tls1_2);..O
9dd0: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 PTBOOL("-tls1.3"
9de0: 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f , tls1_3);..OPTO
9df0: 42 4a 28 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d BJ("-validatecom
9e00: 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f mand", vcmd);..O
9e10: 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76 PTOBJ("-vcmd", v
9e20: 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 cmd);...OPTBAD("
9e30: 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c option", "-alpn,
9e40: 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 -cadir, -cafile
9e50: 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69 , -cert, -certfi
9e60: 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 le, -cipher, -ci
9e70: 70 68 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d phersuites, -com
9e80: 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c mand, -dhparams,
9e90: 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c -key, -keyfile,
9ea0: 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f -model, -passwo
9eb0: 72 64 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 68 rd, -post_handsh
9ec0: 61 6b 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d ake, -request, -
9ed0: 72 65 71 75 69 72 65 2c 20 2d 73 65 63 75 72 69 require, -securi
9ee0: 74 79 5f 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 ty_level, -serve
9ef0: 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 r, -servername,
9f00: 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 -session_id, -ss
9f10: 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 l2, -ssl3, -tls1
9f20: 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 , -tls1.1, -tls1
9f30: 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 .2, -tls1.3, or
9f40: 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 -validatecommand
9f50: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c ");...return TCL
9f60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
9f70: 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09 09 if (request)..
9f80: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 verify |= SSL_VE
9f90: 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 RIFY_CLIENT_ONCE
9fa0: 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 | SSL_VERIFY_PE
9fb0: 45 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 ER;. if (requ
9fc0: 65 73 74 20 26 26 20 72 65 71 75 69 72 65 29 09 est && require).
9fd0: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 verify |= SSL_VE
9fe0: 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f RIFY_FAIL_IF_NO_
9ff0: 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 PEER_CERT;. i
a000: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f f (request && po
a010: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65 st_handshake).ve
a020: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 rify |= SSL_VERI
a030: 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b FY_POST_HANDSHAK
a040: 45 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 E;. if (verif
a050: 79 20 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20 y == 0)..verify
a060: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e = SSL_VERIFY_NON
a070: 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d E;.. proto |=
a080: 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f (ssl2 ? TLS_PRO
a090: 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 TO_SSL2 : 0);.
a0a0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 proto |= (ssl3
a0b0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c ? TLS_PROTO_SSL
a0c0: 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 3 : 0);. prot
a0d0: 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 o |= (tls1 ? TLS
a0e0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 _PROTO_TLS1 : 0)
a0f0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
a100: 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f tls1_1 ? TLS_PRO
a110: 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a TO_TLS1_1 : 0);.
a120: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
a130: 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f s1_2 ? TLS_PROTO
a140: 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 _TLS1_2 : 0);.
a150: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
a160: 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 _3 ? TLS_PROTO_T
a170: 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 LS1_3 : 0);..
a180: 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c /* reset to NUL
a190: 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e L if blank strin
a1a0: 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 g provided */.
a1b0: 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a if (cert && !*
a1c0: 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63 cert).. c
a1d0: 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ert. = NU
a1e0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 LL;. if (key
a1f0: 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 && !*key)..
a200: 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d key. =
a210: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
a220: 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 ertfile && !*cer
a230: 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 tfile) c
a240: 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a ertfile.= NULL;.
a250: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 if (keyfile
a260: 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b && !*keyfile)..k
a270: 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d eyfile. =
a280: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
a290: 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 iphers && !*ciph
a2a0: 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70 ers). cip
a2b0: 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e hers. = N
a2c0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 ULL;. if (cip
a2d0: 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 hersuites && !*c
a2e0: 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70 iphersuites) cip
a2f0: 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e hersuites = N
a300: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 ULL;. if (CAf
a310: 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 ile && !*CAfile)
a320: 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 . CAfile.
a330: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
a340: 20 20 20 20 69 66 20 28 43 41 70 61 74 68 20 26 if (CApath &
a350: 26 20 21 2a 43 41 70 61 74 68 29 09 20 20 20 20 & !*CApath).
a360: 20 20 20 20 43 41 70 61 74 68 09 20 20 20 20 20 CApath.
a370: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
a380: 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20 21 f (DHparams && !
a390: 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20 20 *DHparams).
a3a0: 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20 20 DHparams
a3b0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 = NULL;..
a3c0: 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74 65 /* new SSL state
a3d0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
a3e0: 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6b ..= (State *) ck
a3f0: 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 alloc((unsigned)
a400: 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b sizeof(State));
a410: 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74 . memset(stat
a420: 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 ePtr, 0, sizeof(
a430: 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 State));.. st
a440: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 atePtr->flags.=
a450: 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74 65 flags;. state
a460: 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e Ptr->interp.= in
a470: 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 terp;. stateP
a480: 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 tr->vflags.= ver
a490: 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74 ify;. statePt
a4a0: 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 r->err.= "";..
a4b0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 /* allocate sc
a4c0: 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 ript */. if (
a4d0: 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 script) {..(void
a4e0: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 ) Tcl_GetStringF
a4f0: 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 romObj(script, &
a500: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 len);..if (len)
a510: 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d {.. statePtr-
a520: 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 >callback = scri
a530: 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 pt;.. Tcl_Inc
a540: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
a550: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 tr->callback);..
a560: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
a570: 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72 allocate passwor
a580: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73 d */. if (pas
a590: 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 sword) {..(void)
a5a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
a5b0: 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 omObj(password,
a5c0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 &len);..if (len)
a5d0: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 {.. statePtr
a5e0: 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61 73 ->password = pas
a5f0: 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f sword;.. Tcl_
a600: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 IncrRefCount(sta
a610: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 tePtr->password)
a620: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
a630: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69 /* allocate vali
a640: 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a date command */.
a650: 20 20 20 20 69 66 20 28 76 63 6d 64 29 20 7b 0a if (vcmd) {.
a660: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 .(void) Tcl_GetS
a670: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d tringFromObj(vcm
a680: 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c d, &len);..if (l
a690: 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 en) {.. state
a6a0: 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64 Ptr->vcmd = vcmd
a6b0: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 ;.. Tcl_IncrR
a6c0: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
a6d0: 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 ->vcmd);..}.
a6e0: 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 6c }.. if (model
a6f0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 != NULL) {..int
a700: 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 mode;../* Get t
a710: 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 he "model" conte
a720: 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 xt */..chan = Tc
a730: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
a740: 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 erp, model, &mod
a750: 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d e);..if (chan ==
a760: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
a770: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f ULL) {.. Tls_
a780: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
a790: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 atePtr);.. re
a7a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
a7b0: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 .}.../*.. * Make
a7c0: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
a7d0: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
a7e0: 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 channel.. */..ch
a7f0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
a800: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 hannel(chan);..i
a810: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
a820: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
a830: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
a840: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
a850: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
a860: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
a870: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
a880: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 elName(chan),...
a890: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
a8a0: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a hannel", NULL);.
a8b0: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f . Tcl_SetErro
a8c0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
a8d0: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 LS", "IMPORT", "
a8e0: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c CHANNEL", "INVAL
a8f0: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ID", (char *) NU
a900: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 LL);.. Tls_Fr
a910: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
a920: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
a930: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
a940: 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20 ..ctx = ((State
a950: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c *)Tcl_GetChannel
a960: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 InstanceData(cha
a970: 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 n))->ctx;. }
a980: 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 else {..if ((ctx
a990: 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74 = CTX_Init(stat
a9a0: 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72 ePtr, server, pr
a9b0: 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 oto, keyfile, ce
a9c0: 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 rtfile, key, cer
a9d0: 74 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e t, (int) key_len
a9e0: 2c 0a 09 20 20 20 20 28 69 6e 74 29 20 63 65 72 ,.. (int) cer
a9f0: 74 5f 6c 65 6e 2c 20 43 41 70 61 74 68 2c 20 43 t_len, CApath, C
aa00: 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 Afile, ciphers,
aa10: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65 ciphersuites, le
aa20: 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20 vel, DHparams))
aa30: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 == NULL) {..
aa40: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
aa50: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
aa60: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
aa70: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 OR;..}. }..
aa80: 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 statePtr->ctx
aa90: 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 = ctx;.. /*.
aaa0: 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f * We need to
aab0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 make sure that
aac0: 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b the channel work
aad0: 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 s in binary (for
aae0: 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 the. * encr
aaf0: 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 yption not to ge
ab00: 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 t goofed up)..
ab10: 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e * We only wan
ab20: 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 t to adjust the
ab30: 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65 buffering in pre
ab40: 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 -v2 channels, wh
ab50: 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20 ere. * each
ab60: 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 channel in the s
ab70: 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 tack maintained
ab80: 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e its own buffers.
ab90: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c . */. Tcl
aba0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 _DStringInit(&up
abb0: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
abc0: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f ation);. Tcl_
abd0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 DStringInit(&upp
abe0: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
abf0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 g);. Tcl_DStr
ac00: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
ac10: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 annelEOFChar);.
ac20: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
ac30: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
ac40: 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 Encoding);. T
ac50: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
ac60: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
ac70: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 , "-eofchar", &u
ac80: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
ac90: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 ar);. Tcl_Get
aca0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
acb0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e terp, chan, "-en
acc0: 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 coding", &upperC
acd0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b hannelEncoding);
ace0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
acf0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
ad00: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c , chan, "-transl
ad10: 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 ation", &upperCh
ad20: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
ad30: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
ad40: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
ad50: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 rp, chan, "-bloc
ad60: 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 king", &upperCha
ad70: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 nnelBlocking);.
ad80: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
ad90: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
ada0: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 chan, "-translat
adb0: 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b ion", "binary");
adc0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
add0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
ade0: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 , chan, "-blocki
adf0: 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 ng", "true");.
ae00: 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 dprintf("Consu
ae10: 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c ming Tcl channel
ae20: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 %s", Tcl_GetCha
ae30: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b nnelName(chan));
ae40: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 . statePtr->s
ae50: 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 elf = Tcl_StackC
ae60: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
ae70: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
ae80: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 , (ClientData) s
ae90: 74 61 74 65 50 74 72 2c 0a 09 28 54 43 4c 5f 52 tatePtr,..(TCL_R
aea0: 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 EADABLE | TCL_WR
aeb0: 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a ITABLE), chan);.
aec0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65 dprintf("Cre
aed0: 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d ated channel nam
aee0: 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 ed %s", Tcl_GetC
aef0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
af00: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 Ptr->self));.
af10: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 if (statePtr->s
af20: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e elf == (Tcl_Chan
af30: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a nel) NULL) {../*
af40: 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 .. * No use of T
af50: 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 cl_EventuallyFre
af60: 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 e because no pos
af70: 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 sible Tcl_Preser
af80: 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 ve... */..Tls_Fr
af90: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
afa0: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 ePtr);..return T
afb0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
afc0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
afd0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
afe0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
aff0: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
b000: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
b010: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ue(&upperChannel
b020: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 Translation));.
b030: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
b040: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
b050: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 statePtr->self,
b060: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c "-encoding", Tcl
b070: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
b080: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
b090: 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 ing));. Tcl_S
b0a0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
b0b0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
b0c0: 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 ->self, "-eofcha
b0d0: 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 r", Tcl_DStringV
b0e0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
b0f0: 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 elEOFChar));.
b100: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
b110: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 ption(interp, st
b120: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d atePtr->self, "-
b130: 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 blocking", Tcl_D
b140: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
b150: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
b160: 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 g));. Tcl_DSt
b170: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 ringFree(&upperC
b180: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
b190: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 n);. Tcl_DStr
b1a0: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 ingFree(&upperCh
b1b0: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a annelEncoding);.
b1c0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
b1d0: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 ree(&upperChanne
b1e0: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 lEOFChar);. T
b1f0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
b200: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
b210: 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 king);.. /*.
b220: 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 * SSL Initia
b230: 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f lization. */
b240: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 . statePtr->s
b250: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 sl = SSL_new(sta
b260: 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 tePtr->ctx);.
b270: 20 69 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e if (!statePtr->
b280: 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c ssl) {../* SSL l
b290: 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a ibrary error */.
b2a0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
b2b0: 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 t(interp, "could
b2c0: 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 n't construct ss
b2d0: 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 47 45 l session: ", GE
b2e0: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 T_ERR_REASON(),
b2f0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
b300: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f . Tcl_SetErro
b310: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
b320: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 LS", "IMPORT", "
b330: 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22 2c INIT", "FAILED",
b340: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b350: 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 ..Tls_Free((char
b360: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
b370: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
b380: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
b390: 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 Set host server
b3a0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 name */. if (
b3b0: 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f servername) {../
b3c0: 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 76 65 * Sets the serve
b3d0: 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f r name indicatio
b3e0: 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e n (SNI) in Clien
b3f0: 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e tHello extension
b400: 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 */../* Per RFC
b410: 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 6066, hostname i
b420: 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65 s a ASCII encode
b430: 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 d string, though
b440: 20 52 46 43 20 34 33 36 36 20 73 61 79 73 20 55 RFC 4366 says U
b450: 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 TF-8. */..if (!S
b460: 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f SL_set_tlsext_ho
b470: 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 st_name(statePtr
b480: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d ->ssl, servernam
b490: 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20 7b e) && require) {
b4a0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
b4b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
b4c0: 53 65 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f Set SNI extensio
b4d0: 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 n failed: ", GET
b4e0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
b4f0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
b500: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 Tcl_SetError
b510: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
b520: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 S", "IMPORT", "S
b530: 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 NI", "FAILED", (
b540: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
b550: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
b560: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
b570: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
b580: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 _ERROR;..}.../*
b590: 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 Set hostname for
b5a0: 20 70 65 65 72 20 63 65 72 74 69 66 69 63 61 74 peer certificat
b5b0: 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 69 66 e hostname verif
b5c0: 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e ication in clien
b5d0: 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75 73 ts... Don't us
b5e0: 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 e SSL_set1_host
b5f0: 73 69 6e 63 65 20 69 74 20 68 61 73 20 6c 69 6d since it has lim
b600: 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 itations. */..if
b610: 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 (!SSL_add1_host
b620: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
b630: 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 servername)) {..
b640: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
b650: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 sult(interp, "Se
b660: 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 66 t DNS hostname f
b670: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 ailed: ", GET_ER
b680: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
b690: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
b6a0: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 Tcl_SetErrorCod
b6b0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
b6c0: 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54 "IMPORT", "HOST
b6d0: 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 2c NAME", "FAILED",
b6e0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b6f0: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
b700: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
b710: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
b720: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 CL_ERROR;..}.
b730: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d }.. /* Resum
b740: 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a e session id */.
b750: 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f if (session_
b760: 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 id && strlen(ses
b770: 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f sion_id) <= SSL_
b780: 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 MAX_SID_CTX_LENG
b790: 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 TH) {../* SSL_se
b7a0: 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 t_session() */..
b7b0: 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e if (!SSL_SESSION
b7c0: 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 _set1_id_context
b7d0: 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e (SSL_get_session
b7e0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c (statePtr->ssl),
b7f0: 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e session_id, (un
b800: 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c signed int) strl
b810: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 en(session_id)))
b820: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
b830: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
b840: 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e "Resume session
b850: 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f failed: ", GET_
b860: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
b870: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
b880: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
b890: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
b8a0: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 ", "IMPORT", "SE
b8b0: 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 SSION", "FAILED"
b8c0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b8d0: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
b8e0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
b8f0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
b900: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
b910: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 }.. /* Enab
b920: 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c le Application-L
b930: 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 ayer Protocol Ne
b940: 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 gotiation. Examp
b950: 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f 31 2e les are: http/1.
b960: 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 0,..http/1.1, h2
b970: 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c , h3, ftp, imap,
b980: 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 pop3, xmpp-clie
b990: 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 2c nt, xmpp-server,
b9a0: 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 63 2e mqtt, irc, etc.
b9b0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 6e */. if (alpn
b9c0: 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 ) {../* Convert
b9d0: 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 a TCL list into
b9e0: 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 a protocol-list
b9f0: 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a in wire-format *
ba00: 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 /..unsigned char
ba10: 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 *protos, *p;..u
ba20: 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 nsigned int prot
ba30: 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c os_len = 0;..Tcl
ba40: 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 _Size cnt, i;..i
ba50: 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a nt j;..Tcl_Obj *
ba60: 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c *list;...if (Tcl
ba70: 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 _ListObjGetEleme
ba80: 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e nts(interp, alpn
ba90: 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 , &cnt, &list) !
baa0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 = TCL_OK) {..
bab0: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 Tls_Free((char
bac0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
bad0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
bae0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 ROR;..}.../* Det
baf0: 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 ermine the memor
bb00: 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 y required for t
bb10: 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 he protocol-list
bb20: 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b */..for (i = 0;
bb30: 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b i < cnt; i++) {
bb40: 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 .. Tcl_GetStr
bb50: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b ingFromObj(list[
bb60: 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 i], &len);..
bb70: 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b if (len > 255) {
bb80: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
bb90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 ult(interp, "ALP
bba0: 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 N protocol names
bbb0: 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 too long", (cha
bbc0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 r *) NULL);...Tc
bbd0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
bbe0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
bbf0: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 MPORT", "ALPN",
bc00: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
bc10: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f *) NULL);...Tls_
bc20: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
bc30: 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 atePtr);...retur
bc40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
bc50: 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f }.. protos_
bc60: 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e 74 29 len += 1 + (int)
bc70: 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 len;..}.../* Bu
bc80: 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 ild the complete
bc90: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a protocol-list *
bca0: 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c /..protos = ckal
bcb0: 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b loc(protos_len);
bcc0: 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 ../* protocol-li
bcd0: 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 sts consist of 8
bce0: 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 -bit length-pref
bcf0: 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e ixed, byte strin
bd00: 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 gs */..for (j =
bd10: 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 0, p = protos; j
bd20: 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 < cnt; j++) {..
bd30: 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 char *str =
bd40: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
bd50: 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c mObj(list[j], &l
bd60: 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d en);.. *p++ =
bd70: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 (unsigned char)
bd80: 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 len;.. memcp
bd90: 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a 65 5f y(p, str, (size_
bda0: 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 t) len);.. p
bdb0: 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 += len;..}.../*
bdc0: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f SSL_set_alpn_pro
bdd0: 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 tos makes a copy
bde0: 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c of the protocol
bdf0: 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 -list */../* Not
be00: 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e e: This function
be10: 73 20 72 65 76 65 72 73 65 73 20 74 68 65 20 72 s reverses the r
be20: 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 eturn value conv
be30: 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 ention */..if (S
be40: 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 SL_set_alpn_prot
be50: 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c os(statePtr->ssl
be60: 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 , protos, protos
be70: 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 _len)) {.. Tc
be80: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
be90: 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c 50 4e nterp, "Set ALPN
bea0: 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c 65 protocols faile
beb0: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 d: ", GET_ERR_RE
bec0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
bed0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c NULL);.. Tcl
bee0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
bef0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
bf00: 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 PORT", "ALPN", "
bf10: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
bf20: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c ) NULL);.. Tl
bf30: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
bf40: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
bf50: 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a ckfree(protos);.
bf60: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
bf70: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 ERROR;..}.../* S
bf80: 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c tore protocols l
bf90: 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 ist */..statePtr
bfa0: 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f ->protos = proto
bfb0: 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 s;..statePtr->pr
bfc0: 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f otos_len = proto
bfd0: 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 s_len;. } els
bfe0: 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 e {..statePtr->p
bff0: 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 rotos = NULL;..s
c000: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f tatePtr->protos_
c010: 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a len = 0;. }..
c020: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 /*. * SS
c030: 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 L Callbacks.
c040: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f */. SSL_set_
c050: 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 app_data(statePt
c060: 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 r->ssl, (void *)
c070: 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f statePtr);./* po
c080: 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a int back to us *
c090: 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 /. SSL_set_ve
c0a0: 72 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 rify(statePtr->s
c0b0: 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 sl, verify, Veri
c0c0: 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 fyCallback);.
c0d0: 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 SSL_set_info_ca
c0e0: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d llback(statePtr-
c0f0: 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 >ssl, InfoCallba
c100: 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c ck);.. /* Cal
c110: 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 lback for observ
c120: 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 ing protocol mes
c130: 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 sages */.#ifndef
c140: 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f OPENSSL_NO_SSL_
c150: 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 TRACE. /* voi
c160: 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 d SSL_CTX_set_ms
c170: 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 g_callback_arg(s
c180: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 tatePtr->ctx, (v
c190: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
c1a0: 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 . void SSL_CT
c1b0: 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 X_set_msg_callba
c1c0: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ck(statePtr->ctx
c1d0: 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 , MessageCallbac
c1e0: 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 k); */. SSL_s
c1f0: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f et_msg_callback_
c200: 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73 arg(statePtr->ss
c210: 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 l, (void *)state
c220: 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 Ptr);. SSL_se
c230: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 t_msg_callback(s
c240: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 tatePtr->ssl, Me
c250: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a ssageCallback);.
c260: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 #endif.. /* C
c270: 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 reate Tcl_Channe
c280: 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f l BIO Handler */
c290: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 . statePtr->p
c2a0: 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 _bio.= BIO_new_t
c2b0: 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f cl(statePtr, BIO
c2c0: 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 _NOCLOSE);. s
c2d0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 tatePtr->bio.= B
c2e0: 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c IO_new(BIO_f_ssl
c2f0: 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 ());.. if (se
c300: 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 rver) {../* Serv
c310: 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a er callbacks */.
c320: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 .SSL_CTX_set_tls
c330: 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 ext_servername_a
c340: 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 rg(statePtr->ctx
c350: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
c360: 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 tr);..SSL_CTX_se
c370: 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e t_tlsext_servern
c380: 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 ame_callback(sta
c390: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 tePtr->ctx, SNIC
c3a0: 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 allback);..SSL_C
c3b0: 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 TX_set_client_he
c3c0: 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d llo_cb(statePtr-
c3d0: 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 >ctx, HelloCallb
c3e0: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ack, (void *)sta
c3f0: 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61 tePtr);..if (sta
c400: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d tePtr->protos !=
c410: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 NULL) {.. SS
c420: 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 L_CTX_set_alpn_s
c430: 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 elect_cb(statePt
c440: 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c r->ctx, ALPNCall
c450: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 back, (void *)st
c460: 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20 atePtr);.#ifdef
c470: 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 USE_NPN.. if
c480: 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 (tls1_2 == 0 &&
c490: 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 tls1_3 == 0) {..
c4a0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 .SSL_CTX_set_nex
c4b0: 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 t_protos_adverti
c4c0: 73 65 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d sed_cb(statePtr-
c4d0: 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 >ctx, NPNCallbac
c4e0: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 k, (void *)state
c4f0: 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e Ptr);.. }.#en
c500: 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 dif..}.../* Enab
c510: 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e le server to sen
c520: 64 20 63 65 72 74 20 72 65 71 75 65 73 74 20 61 d cert request a
c530: 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 fter handshake (
c540: 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f TLS 1.3 only) */
c550: 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 ../* A write ope
c560: 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 ration must take
c570: 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43 place for the C
c580: 65 72 74 69 66 69 63 61 74 65 20 52 65 71 75 65 ertificate Reque
c590: 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e st to be.. sen
c5a0: 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c t to the client,
c5b0: 20 74 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e this can be don
c5c0: 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 e with SSL_do_ha
c5d0: 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 ndshake(). */..i
c5e0: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f f (request && po
c5f0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 20 st_handshake &&
c600: 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 tls1_3) {.. S
c610: 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 SL_verify_client
c620: 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 _post_handshake(
c630: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
c640: 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f .}.../* set auto
c650: 6d 61 74 69 63 20 63 75 72 76 65 20 73 65 6c 65 matic curve sele
c660: 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 ction */..SSL_se
c670: 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 61 74 t_ecdh_auto(stat
c680: 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a ePtr->ssl, 1);..
c690: 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20 6d ./* Set server m
c6a0: 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 ode */..statePtr
c6b0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 ->flags |= TLS_T
c6c0: 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f CL_SERVER;..SSL_
c6d0: 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 set_accept_state
c6e0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
c6f0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f . } else {../
c700: 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 * Client callbac
c710: 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 ks */.#ifdef USE
c720: 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65 50 _NPN..if (stateP
c730: 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 tr->protos != NU
c740: 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 LL && tls1_2 ==
c750: 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 0 && tls1_3 == 0
c760: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 ) {.. SSL_CTX
c770: 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f _set_next_proto_
c780: 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 select_cb(stateP
c790: 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c tr->ctx, ALPNCal
c7a0: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 lback, (void *)s
c7b0: 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e tatePtr);..}.#en
c7c0: 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e dif.../* Session
c7d0: 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c caching */..SSL
c7e0: 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e _CTX_set_session
c7f0: 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 _cache_mode(stat
c800: 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 ePtr->ctx, SSL_S
c810: 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 ESS_CACHE_CLIENT
c820: 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 | SSL_SESS_CACH
c830: 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 E_NO_INTERNAL_ST
c840: 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 ORE);..SSL_CTX_s
c850: 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 ess_set_new_cb(s
c860: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 tatePtr->ctx, Se
c870: 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a ssionCallback);.
c880: 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 ../* Enable post
c890: 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 handshake Authe
c8a0: 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 ntication extens
c8b0: 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c ion. TLS 1.3 onl
c8c0: 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a y, not http/2. *
c8d0: 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 /..if (request &
c8e0: 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 & post_handshake
c8f0: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 ) {.. SSL_set
c900: 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f _post_handshake_
c910: 61 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 auth(statePtr->s
c920: 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 sl, 1);..}.../*
c930: 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 Set client mode
c940: 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e */..SSL_set_conn
c950: 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 ect_state(stateP
c960: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a tr->ssl);. }.
c970: 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 SSL_set_bio(
c980: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 statePtr->ssl, s
c990: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 tatePtr->p_bio,
c9a0: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 statePtr->p_bio)
c9b0: 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 ;. BIO_set_ss
c9c0: 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c l(statePtr->bio,
c9d0: 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 statePtr->ssl,
c9e0: 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 BIO_NOCLOSE);..
c9f0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 /*. * End
ca00: 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 of SSL Init.
ca10: 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 */. dprintf
ca20: 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c ("Returning %s",
ca30: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
ca40: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
ca50: 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 lf));. Tcl_Se
ca60: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 tResult(interp,
ca70: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
ca80: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
ca90: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c ePtr->self), TCL
caa0: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 _VOLATILE);..
cab0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
cac0: 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d ----------------
cb00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
cb10: 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d * UnimportObjCm
cb20: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 d --. *. *.This
cb30: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
cb40: 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 oked to remove t
cb50: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
cb60: 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a el filter.. *. *
cb70: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
cb80: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
cb90: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
cba0: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d ffects:. *.May m
cbb0: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 odify the behavi
cbc0: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e or of an IO chan
cbd0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nel.. *. *------
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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
cc20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 /.static int.Uni
cc30: 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 mportObjCmd(Clie
cc40: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
cc50: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
cc60: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
cc70: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
cc80: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
cc90: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 l_Channel chan;.
cca0: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 ./* The channel
ccb0: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e to set a mode on
ccc0: 2e 20 2a 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 . */. (void)
ccd0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
cce0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
ccf0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ");.. if (obj
cd00: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
cd10: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
cd20: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
cd30: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
cd40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
cd50: 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 }.. chan = Tc
cd60: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
cd70: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 erp, Tcl_GetStri
cd80: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c ng(objv[1]), NUL
cd90: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e L);. if (chan
cda0: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
cdb0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
cdc0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
cdd0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 }.. /* Make
cde0: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
cdf0: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
ce00: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
ce10: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
ce20: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 hannel(chan);..
ce30: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
ce40: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
ce50: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
ce60: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
ce70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
ce80: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
ce90: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
cea0: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 elName(chan),...
ceb0: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
cec0: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a hannel", NULL);.
ced0: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f . Tcl_SetErro
cee0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
cef0: 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c LS", "UNIMPORT",
cf00: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
cf10: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
cf20: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
cf30: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
cf40: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 . if (Tcl_Uns
cf50: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 tackChannel(inte
cf60: 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c rp, chan) == TCL
cf70: 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 _ERROR) {..retur
cf80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
cf90: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }.. return T
cfa0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
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 2d ----------------
cff0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e ---. *. * CTX_In
d000: 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 it -- construct
d010: 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e a SSL_CTX instan
d020: 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 ce. *. * Results
d030: 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c :. *.A valid SSL
d040: 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 _CTX instance or
d050: 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 NULL.. *. * Sid
d060: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f e effects:. *.co
d070: 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e nstructs SSL con
d080: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a text (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 2d ----------------
d0d0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 ---. */.static S
d0e0: 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 SL_CTX *.CTX_Ini
d0f0: 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 t(State *statePt
d100: 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c r, int isServer,
d110: 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 int proto, char
d120: 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 *keyfile, char
d130: 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 *certfile,. u
d140: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 nsigned char *ke
d150: 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 y, unsigned char
d160: 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f *cert, int key_
d170: 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 len, int cert_le
d180: 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c n, char *CApath,
d190: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c . char *CAfil
d1a0: 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 e, char *ciphers
d1b0: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 , char *ciphersu
d1c0: 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c ites, int level,
d1d0: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 char *DHparams)
d1e0: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 {. Tcl_Inter
d1f0: 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 p *interp = stat
d200: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
d210: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d SSL_CTX *ctx =
d220: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 NULL;. Tcl_D
d230: 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 String ds;. T
d240: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a cl_DString ds1;.
d250: 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 2c int off = 0,
d260: 20 61 62 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 abort = 0;.
d270: 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 int load_private
d280: 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 _key;. const
d290: 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 SSL_METHOD *meth
d2a0: 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 od;.. dprintf
d2b0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
d2c0: 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 if (!proto) {..
d2d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d2e0: 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c (interp, "no val
d2f0: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 id protocol sele
d300: 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 cted", (char *)
d310: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
d320: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
d330: 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f /* create SSL co
d340: 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 ntext */.#if OPE
d350: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
d360: 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 BER >= 0x1010000
d370: 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 0L || defined(NO
d380: 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL2) || define
d390: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
d3a0: 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 2). if (ENABL
d3b0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
d3c0: 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 OTO_SSL2)) {..Tc
d3d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d3e0: 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f nterp, "SSL2 pro
d3f0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
d400: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ted", (char *) N
d410: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
d420: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
d430: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
d440: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL3) || defined
d450: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
d460: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
d470: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
d480: 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c TO_SSL3)) {..Tcl
d490: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
d4a0: 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 terp, "SSL3 prot
d4b0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
d4c0: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ed", (char *) NU
d4d0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
d4e0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
d4f0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
d500: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
d510: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
d520: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
d530: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
d540: 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f O_TLS1)) {..Tcl_
d550: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d560: 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 erp, "TLS 1.0 pr
d570: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
d580: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
d590: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
d5a0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
d5b0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
d5c0: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
d5d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d5e0: 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 LS1_1). if (E
d5f0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
d600: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 S_PROTO_TLS1_1))
d610: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
d620: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
d630: 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.1 protocol n
d640: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
d650: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
d660: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
d670: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
d680: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
d690: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
d6a0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 SSL_NO_TLS1_2).
d6b0: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
d6c0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
d6d0: 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f TLS1_2)) {..Tcl_
d6e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d6f0: 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 erp, "TLS 1.2 pr
d700: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
d710: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
d720: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
d730: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
d740: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
d750: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 _TLS1_3) || defi
d760: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d770: 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 LS1_3). if (E
d780: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
d790: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 S_PROTO_TLS1_3))
d7a0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
d7b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
d7c0: 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.3 protocol n
d7d0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
d7e0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
d7f0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
d800: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 }.#endif. if
d810: 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a (proto == 0) {.
d820: 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 6e ./* Use full ran
d830: 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 ge */..SSL_CTX_s
d840: 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 et_min_proto_ver
d850: 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 53 sion(ctx, 0);..S
d860: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 SL_CTX_set_max_p
d870: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
d880: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 , 0);. }..
d890: 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 switch (proto)
d8a0: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 {.#if OPENSSL_VE
d8b0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
d8c0: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 x10100000L && !d
d8d0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
d8e0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
d8f0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
d900: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
d910: 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 SSL2:..method =
d920: 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32 isServer ? SSLv2
d930: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
d940: 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f : SSLv2_client_
d950: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
d960: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
d970: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
d980: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
d990: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 SL_NO_SSL3) && !
d9a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d9b0: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a NO_SSL3_METHOD).
d9c0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
d9d0: 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 TO_SSL3:..method
d9e0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 = isServer ? SS
d9f0: 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f Lv3_server_metho
da00: 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 d() : SSLv3_clie
da10: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
da20: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
da30: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
da40: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
da50: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 ENSSL_NO_TLS1) &
da60: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
da70: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f SL_NO_TLS1_METHO
da80: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f D). case TLS_
da90: 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 PROTO_TLS1:..met
daa0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
dab0: 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 TLSv1_server_me
dac0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 thod() : TLSv1_c
dad0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
dae0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
daf0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
db00: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
db10: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
db20: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
db30: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
db40: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_1_METHOD).
db50: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
db60: 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d LS1_1:..method =
db70: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 isServer ? TLSv
db80: 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 1_1_server_metho
db90: 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c d() : TLSv1_1_cl
dba0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
dbb0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
dbc0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
dbd0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
dbe0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
dbf0: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
dc00: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
dc10: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 _2_METHOD). c
dc20: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
dc30: 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 S1_2:..method =
dc40: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 isServer ? TLSv1
dc50: 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 _2_server_method
dc60: 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 () : TLSv1_2_cli
dc70: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
dc80: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
dc90: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
dca0: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
dcb0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
dcc0: 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 _3). case TLS
dcd0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 _PROTO_TLS1_3:..
dce0: 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 /* Use the gener
dcf0: 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f ic method and co
dd00: 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 nstraint range a
dd10: 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 fter context is
dd20: 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 created */..meth
dd30: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
dd40: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f TLS_server_metho
dd50: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 d() : TLS_client
dd60: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
dd70: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 k;.#endif. de
dd80: 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 fault:../* Negot
dd90: 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 61 iate highest ava
dda0: 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 ilable SSL/TLS v
ddb0: 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f ersion */..metho
ddc0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
ddd0: 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 LS_server_method
dde0: 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f () : TLS_client_
ddf0: 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 method();.#if OP
de00: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
de10: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
de20: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
de30: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
de40: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
de50: 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e SL2)..off |= (EN
de60: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
de70: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f _PROTO_SSL2) ?
de80: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 0 : SSL_OP_NO_S
de90: 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 SLv2);.#endif.#i
dea0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 f !defined(NO_SS
deb0: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
dec0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
ded0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
dee0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
def0: 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a TO_SSL3) ? 0 :
df00: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 SSL_OP_NO_SSLv3
df10: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
df20: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
df30: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
df40: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 SSL_NO_TLS1)..of
df50: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
df60: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
df70: 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c LS1) ? 0 : SSL
df80: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 _OP_NO_TLSv1);.#
df90: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
dfa0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 ed(NO_TLS1_1) &&
dfb0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
dfc0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 L_NO_TLS1_1)..of
dfd0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
dfe0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
dff0: 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c LS1_1) ? 0 : SSL
e000: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b _OP_NO_TLSv1_1);
e010: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
e020: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
e030: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
e040: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 SSL_NO_TLS1_2)..
e050: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
e060: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
e070: 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 _TLS1_2) ? 0 : S
e080: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 SL_OP_NO_TLSv1_2
e090: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
e0a0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
e0b0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
e0c0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
e0d0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
e0e0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
e0f0: 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a TO_TLS1_3) ? 0 :
e100: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
e110: 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 _3);.#endif..bre
e120: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 ak;. }.. E
e130: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
e140: 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c ;.. ctx = SSL
e150: 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 _CTX_new(method)
e160: 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 20 ;. if (!ctx)
e170: 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b {..return(NULL);
e180: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
e190: 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 getenv(SSLKEYLOG
e1a0: 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 FILE)) {..SSL_CT
e1b0: 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c X_set_keylog_cal
e1c0: 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f lback(ctx, KeyLo
e1d0: 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 gCallback);.
e1e0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 }..#if !defined(
e1f0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 NO_TLS1_3) && !d
e200: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e210: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 O_TLS1_3). if
e220: 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 (proto == TLS_P
e230: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 ROTO_TLS1_3) {..
e240: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f SSL_CTX_set_min_
e250: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
e260: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f x, TLS1_3_VERSIO
e270: 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 N);..SSL_CTX_set
e280: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 _max_proto_versi
e290: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 on(ctx, TLS1_3_V
e2a0: 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 ERSION);. }.#
e2b0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f endif.. /* Fo
e2c0: 72 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 rce cipher selec
e2d0: 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 tion order by se
e2e0: 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 rver */. if (
e2f0: 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 !isServer) {..SS
e300: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e L_CTX_set_option
e310: 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 s(ctx, SSL_OP_CI
e320: 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 PHER_SERVER_PREF
e330: 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a ERENCE);. }..
e340: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
e350: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
e360: 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 0100000L. Ope
e370: 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 nSSL_add_all_alg
e380: 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f orithms(); /* Lo
e390: 61 64 20 63 69 70 68 65 72 73 20 61 6e 64 20 64 ad ciphers and d
e3a0: 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64 69 66 igests */.#endif
e3b0: 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
e3c0: 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 t_app_data(ctx,
e3d0: 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 (void*)interp);.
e3e0: 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 /* remember the
e3f0: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 interpreter */.
e400: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f SSL_CTX_set_o
e410: 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f ptions(ctx, SSL_
e420: 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 OP_ALL);./* all
e430: 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 SSL bug workarou
e440: 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 nds */. SSL_C
e450: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 TX_set_options(c
e460: 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f tx, SSL_OP_NO_CO
e470: 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 MPRESSION);./* d
e480: 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 isable compressi
e490: 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f on even if suppo
e4a0: 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f rted */. SSL_
e4b0: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 CTX_set_options(
e4c0: 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 ctx, off);../* d
e4d0: 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 isable protocol
e4e0: 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 versions */.#if
e4f0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
e500: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 NUMBER < 0x10101
e510: 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 000L. SSL_CTX
e520: 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 _set_mode(ctx, S
e530: 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 SL_MODE_AUTO_RET
e540: 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e RY);./* handle n
e550: 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e ew handshakes in
e560: 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 background. On
e570: 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 by default in Op
e580: 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a enSSL 1.1.1. */.
e590: 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 #endif. SSL_C
e5a0: 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 TX_sess_set_cach
e5b0: 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 e_size(ctx, 128)
e5c0: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 ;.. /* Set us
e5d0: 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 er defined ciphe
e5e0: 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 rs, cipher suite
e5f0: 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 s, and security
e600: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 level */. if
e610: 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c ((ciphers != NUL
e620: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 L) && !SSL_CTX_s
e630: 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 et_cipher_list(c
e640: 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a tx, ciphers)) {.
e650: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
e660: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 t(interp, "Set c
e670: 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e iphers failed: N
e680: 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 o valid ciphers"
e690: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
e6a0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ;..SSL_CTX_free(
e6b0: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ctx);..return NU
e6c0: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
e6d0: 20 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 ((ciphersuites
e6e0: 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c != NULL) && !SSL
e6f0: 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 _CTX_set_ciphers
e700: 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 uites(ctx, ciphe
e710: 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c rsuites)) {..Tcl
e720: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
e730: 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 terp, "Set ciphe
e740: 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a r suites failed:
e750: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 No valid cipher
e760: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c s", (char *) NUL
e770: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
e780: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
e790: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
e7a0: 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 /* Set security
e7b0: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 level */. if
e7c0: 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 (level > -1 &&
e7d0: 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a level < 6) {../*
e7e0: 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 SSL_set_securit
e7f0: 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f y_level */..SSL_
e800: 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 CTX_set_security
e810: 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 _level(ctx, leve
e820: 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f l);. }.. /
e830: 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 * set some callb
e840: 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f acks */. SSL_
e850: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
e860: 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 passwd_cb(ctx, P
e870: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 asswordCallback)
e880: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 ;. SSL_CTX_se
e890: 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 t_default_passwd
e8a0: 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 _cb_userdata(ctx
e8b0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
e8c0: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 tr);.. /* rea
e8d0: 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d d a Diffie-Hellm
e8e0: 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 an parameters fi
e8f0: 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 le, or use the b
e900: 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 uilt-in one */.#
e910: 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f ifdef OPENSSL_NO
e920: 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 _DH. if (DHpa
e930: 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a rams != NULL) {.
e940: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
e950: 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 t(interp, "DH pa
e960: 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 rameter support
e970: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 not available",
e980: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
e990: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
e9a0: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c x);..return NULL
e9b0: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 ;. }.#else.
e9c0: 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 {..DH* dh;..if
e9d0: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 (DHparams != NU
e9e0: 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a LL) {.. BIO *
e9f0: 62 69 6f 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 bio;.. bio =
ea00: 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e BIO_new_file(F2N
ea10: 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c (DHparams, &ds),
ea20: 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 "r");.. if (
ea30: 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 !bio) {...Tcl_DS
ea40: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
ea50: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
ea60: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c lt(interp, "Coul
ea70: 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 d not find DH pa
ea80: 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 rameters file",
ea90: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
eaa0: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
eab0: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
eac0: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 LL;.. }...
ead0: 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 dh = PEM_read_b
eae0: 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c io_DHparams(bio,
eaf0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c NULL, NULL, NUL
eb00: 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 L);.. BIO_fre
eb10: 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c e(bio);.. Tcl
eb20: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
eb30: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 );.. if (!dh)
eb40: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 {...Tcl_AppendR
eb50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 esult(interp, "C
eb60: 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 ould not read DH
eb70: 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d parameters from
eb80: 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 file", (char *)
eb90: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 NULL);...SSL_CT
eba0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
ebb0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 eturn NULL;..
ebc0: 20 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f }.. SSL_CTX_
ebd0: 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 set_tmp_dh(ctx,
ebe0: 64 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 dh);.. DH_fre
ebf0: 65 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 e(dh);...} else
ec00: 7b 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65 {.. /* Use we
ec10: 6c 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 ll known DH para
ec20: 6d 65 74 65 72 73 20 74 68 61 74 20 68 61 76 65 meters that have
ec30: 20 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 built-in suppor
ec40: 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a t in OpenSSL */.
ec50: 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 . if (!SSL_CT
ec60: 58 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 X_set_dh_auto(ct
ec70: 78 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 x, 1)) {...Tcl_A
ec80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
ec90: 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 rp, "Could not e
eca0: 6e 61 62 6c 65 20 73 65 74 20 44 48 20 61 75 74 nable set DH aut
ecb0: 6f 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 o: ", GET_ERR_RE
ecc0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
ecd0: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 NULL);...SSL_CT
ece0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
ecf0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 eturn NULL;..
ed00: 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 }..}. }.#end
ed10: 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f if.. /* set o
ed20: 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a ur certificate *
ed30: 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 /. load_priva
ed40: 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 te_key = 0;.
ed50: 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 if (certfile !=
ed60: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 NULL) {..load_pr
ed70: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a ivate_key = 1;..
ed80: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 .if (SSL_CTX_use
ed90: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c _certificate_fil
eda0: 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 e(ctx, F2N(certf
edb0: 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 ile, &ds), SSL_F
edc0: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 ILETYPE_PEM) <=
edd0: 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 0) {.. Tcl_DS
ede0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
edf0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
ee00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
ee10: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 nable to set cer
ee20: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c tificate file ",
ee30: 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c certfile, ": ",
ee40: 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f ...GET_ERR_REASO
ee50: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
ee60: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
ee70: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
ee80: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 return NULL;..
ee90: 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 }..Tcl_DStringFr
eea0: 65 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 7d 20 ee(&ds);.. }
eeb0: 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d else if (cert !=
eec0: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 NULL) {..load_p
eed0: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a rivate_key = 1;.
eee0: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 .if (SSL_CTX_use
eef0: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e _certificate_ASN
ef00: 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 1(ctx, cert_len,
ef10: 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 cert) <= 0) {..
ef20: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
ef30: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e sult(interp, "un
ef40: 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 able to set cert
ef50: 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 47 45 ificate: ",...GE
ef60: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 T_ERR_REASON(),
ef70: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
ef80: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 . SSL_CTX_fre
ef90: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 e(ctx);.. ret
efa0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 urn NULL;..}.
efb0: 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 } else {..certf
efc0: 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30 ile = (char*)X50
efd0: 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 9_get_default_ce
efe0: 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 rt_file();...if
eff0: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 (SSL_CTX_use_cer
f000: 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 tificate_file(ct
f010: 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c x, certfile, SSL
f020: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c _FILETYPE_PEM) <
f030: 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 = 0) {.#if 0..
f040: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
f050: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 lt(interp, "unab
f060: 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c le to use defaul
f070: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 t certificate fi
f080: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 le ", certfile,
f090: 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f ": ",...GET_ERR_
f0a0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
f0b0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
f0c0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
f0d0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
f0e0: 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 LL;.#endif..}.
f0f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 }.. /* set
f100: 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 our private key
f110: 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f */. if (load_
f120: 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 private_key) {..
f130: 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e if (keyfile == N
f140: 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 ULL && key == NU
f150: 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 LL) {.. keyfi
f160: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 le = certfile;..
f170: 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 }...if (keyfile
f180: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
f190: 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61 /* get the priva
f1a0: 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 te key associate
f1b0: 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74 d with this cert
f1c0: 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 ificate */..
f1d0: 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e if (keyfile == N
f1e0: 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 ULL) {...keyfile
f1f0: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 = certfile;..
f200: 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 }... if (SS
f210: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 L_CTX_use_Privat
f220: 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 eKey_file(ctx, F
f230: 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2N(keyfile, &ds)
f240: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 , SSL_FILETYPE_P
f250: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 EM) <= 0) {...Tc
f260: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
f270: 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 s);.../* flush t
f280: 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 he passphrase wh
f290: 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 ich might be lef
f2a0: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 t in the result
f2b0: 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 */...Tcl_SetResu
f2c0: 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c lt(interp, NULL,
f2d0: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 TCL_STATIC);...
f2e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
f2f0: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
f300: 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b to set public k
f310: 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 ey file ", keyfi
f320: 6c 65 2c 20 22 20 22 2c 0a 09 09 20 20 20 20 47 le, " ",... G
f330: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
f340: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
f350: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
f360: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e ctx);...return N
f370: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 ULL;.. }..
f380: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
f390: 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 (&ds);...} else
f3a0: 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 if (key != NULL)
f3b0: 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f {.. if (SSL_
f3c0: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b CTX_use_PrivateK
f3d0: 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 ey_ASN1(EVP_PKEY
f3e0: 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b _RSA, ctx, key,k
f3f0: 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a ey_len) <= 0) {.
f400: 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 ../* flush the p
f410: 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 assphrase which
f420: 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e might be left in
f430: 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 the result */..
f440: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
f450: 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c nterp, NULL, TCL
f460: 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f _STATIC);...Tcl_
f470: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f480: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
f490: 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 set public key:
f4a0: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f ", GET_ERR_REASO
f4b0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
f4c0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 LL);...SSL_CTX_f
f4d0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 ree(ctx);...retu
f4e0: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a rn NULL;.. }.
f4f0: 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e .}../* Now we kn
f500: 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e ow that a key an
f510: 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e d cert have been
f520: 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a set against.. *
f530: 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 the SSL context
f540: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 */..if (!SSL_CT
f550: 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f X_check_private_
f560: 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 key(ctx)) {..
f570: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
f580: 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 t(interp, "priva
f590: 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 te key does not
f5a0: 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66 match the certif
f5b0: 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 icate public key
f5c0: 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 ",.... (char
f5d0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
f5e0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
f5f0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
f600: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ULL;..}. }..
f610: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 73 65 /* Set to use
f620: 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f default locatio
f630: 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43 n and file for C
f640: 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f ertificate Autho
f650: 72 69 74 79 20 28 43 41 29 20 63 65 72 74 69 66 rity (CA) certif
f660: 69 63 61 74 65 73 2e 20 54 68 65 0a 20 20 20 20 icates. The.
f670: 20 2a 20 76 65 72 69 66 79 20 70 61 74 68 20 61 * verify path a
f680: 6e 64 20 73 74 6f 72 65 20 63 61 6e 20 62 65 20 nd store can be
f690: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 overridden by th
f6a0: 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 65 e SSL_CERT_DIR e
f6b0: 6e 76 20 76 61 72 2e 20 54 68 65 20 76 65 72 69 nv var. The veri
f6c0: 66 79 20 66 69 6c 65 20 63 61 6e 0a 20 20 20 20 fy file can.
f6d0: 20 2a 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e * be overridden
f6e0: 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 by the SSL_CERT
f6f0: 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a _FILE env var. *
f700: 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 /. if (!SSL_C
f710: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 TX_set_default_v
f720: 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 erify_paths(ctx)
f730: 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20 ) {..abort++;.
f740: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 }.. /* Over
f750: 72 69 64 65 73 20 66 6f 72 20 74 68 65 20 43 41 rides for the CA
f760: 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 verify path and
f770: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23 file */. {.#
f780: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
f790: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
f7a0: 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41 70 000000L..if (CAp
f7b0: 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 ath != NULL || C
f7c0: 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b Afile != NULL) {
f7d0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
f7e0: 67 20 64 73 31 3b 0a 09 20 20 20 20 69 66 20 28 g ds1;.. if (
f7f0: 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 !SSL_CTX_load_ve
f800: 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 rify_locations(c
f810: 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 tx, F2N(CAfile,
f820: 26 64 73 29 2c 20 46 32 4e 28 43 41 70 61 74 68 &ds), F2N(CApath
f830: 2c 20 26 64 73 31 29 29 29 20 7b 0a 09 09 61 62 , &ds1))) {...ab
f840: 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 ort++;.. }..
f850: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
f860: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 ee(&ds);.. Tc
f870: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
f880: 73 31 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 s1);... /* Se
f890: 74 20 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f t list of CAs to
f8a0: 20 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 send to client
f8b0: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 when requesting
f8c0: 61 20 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69 a client certifi
f8d0: 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 cate */.. /*
f8e0: 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f https://sourcefo
f8f0: 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 rge.net/p/tls/bu
f900: 67 73 2f 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f gs/57/ */.. /
f910: 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 * XXX:TODO: Let
f920: 74 68 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 the user supply
f930: 76 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 values here inst
f940: 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 ead of something
f950: 20 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 that exists on
f960: 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a the filesystem *
f970: 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 /.. STACK_OF(
f980: 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 X509_NAME) *cert
f990: 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 Names = SSL_load
f9a0: 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 _client_CA_file(
f9b0: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 F2N(CAfile, &ds)
f9c0: 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 );.. if (cert
f9d0: 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b Names != NULL) {
f9e0: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 ...SSL_CTX_set_c
f9f0: 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 lient_CA_list(ct
fa00: 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 x, certNames);..
fa10: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 }.. Tcl_D
fa20: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
fa30: 0a 09 7d 0a 0a 23 65 6c 73 65 0a 09 69 66 20 28 ..}..#else..if (
fa40: 43 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20 CApath != NULL)
fa50: 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f {.. if (!SSL_
fa60: 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f CTX_load_verify_
fa70: 64 69 72 28 63 74 78 2c 20 46 32 4e 28 43 41 70 dir(ctx, F2N(CAp
fa80: 61 74 68 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 ath, &ds))) {...
fa90: 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a abort++;.. }.
faa0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
fab0: 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 09 69 Free(&ds);..}..i
fac0: 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c f (CAfile != NUL
fad0: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53 L) {.. if (!S
fae0: 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 SL_CTX_load_veri
faf0: 66 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e fy_file(ctx, F2N
fb00: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 29 20 (CAfile, &ds)))
fb10: 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 {...abort++;..
fb20: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
fb30: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a ringFree(&ds);..
fb40: 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 . /* Set list
fb50: 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20 of CAs to send
fb60: 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 to client when r
fb70: 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65 equesting a clie
fb80: 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a nt certificate *
fb90: 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 /.. STACK_OF(
fba0: 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 X509_NAME) *cert
fbb0: 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 Names = SSL_load
fbc0: 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 _client_CA_file(
fbd0: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 F2N(CAfile, &ds)
fbe0: 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 );.. if (cert
fbf0: 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b Names != NULL) {
fc00: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 ...SSL_CTX_set_c
fc10: 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 lient_CA_list(ct
fc20: 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 x, certNames);..
fc30: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 }.. Tcl_D
fc40: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
fc50: 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d ..}.#endif. }
fc60: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 .. return ctx
fc70: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 0a 20 --------------.
fcc0: 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d *. * StatusObjCm
fcd0: 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 d -- return cert
fce0: 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e ificate for conn
fcf0: 65 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 ected peer.. *.
fd00: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
fd10: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
fd20: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
fd30: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
fd40: 2e 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
fd90: 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 tatic int.Status
fda0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
fdb0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
fdc0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
fdd0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
fde0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
fdf0: 5d 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a ]) {. State *
fe00: 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 statePtr;. X5
fe10: 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 09 *peer;. Tc
fe20: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 l_Obj *objPtr;.
fe30: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
fe40: 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 han;. char *c
fe50: 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 hannelName, *cip
fe60: 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f hers;. int mo
fe70: 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e de;. const un
fe80: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f signed char *pro
fe90: 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 to;. unsigned
fea0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e int len;. in
feb0: 74 20 6e 69 64 2c 20 72 65 73 3b 0a 20 20 20 20 t nid, res;.
fec0: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 (void) clientDat
fed0: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 a;.. dprintf(
fee0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
fef0: 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 if (objc < 2 ||
ff00: 6f 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a objc > 3 || (obj
ff10: 63 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d c == 3 && !strcm
ff20: 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 p(Tcl_GetString(
ff30: 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 objv[1]), "-loca
ff40: 6c 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f l"))) {..Tcl_Wro
ff50: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
ff60: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f , 1, objv, "?-lo
ff70: 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a cal? channel");.
ff80: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
ff90: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
ffa0: 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 Get channel Id
ffb0: 2a 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 */. channelNa
ffc0: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 me = Tcl_GetStri
ffd0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 28 ngFromObj(objv[(
ffe0: 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20 objc == 2 ? 1 :
fff0: 32 29 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 2)], (Tcl_Size *
10000 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 63 68 61 ) NULL);. cha
10010 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
10020 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e el(interp, chann
10030 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a elName, &mode);.
10040 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
10050 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
10060 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
10070 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
10080 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
10090 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
100a0 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
100b0 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
100c0 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
100d0 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 el(chan);. if
100e0 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
100f0 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
10100 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
10110 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
10120 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
10130 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
10140 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
10150 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 e(chan),..."\":
10160 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
10170 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f l", NULL);..Tcl_
10180 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
10190 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 erp, "TLS", "STA
101a0 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c TUS", "CHANNEL",
101b0 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
101c0 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
101d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
101e0 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 }. statePt
101f0 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 r = (State *) Tc
10200 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
10210 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a anceData(chan);.
10220 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 . /* Get cert
10230 69 66 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 ificate for peer
10240 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 or self */.
10250 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b if (objc == 2) {
10260 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 ..peer = SSL_get
10270 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 _peer_certificat
10280 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
10290 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
102a0 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 peer = SSL_get_c
102b0 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 ertificate(state
102c0 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
102d0 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 . /* Get X509
102e0 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 certificate inf
102f0 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 o */. if (pee
10300 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 r) {..objPtr = T
10310 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e ls_NewX509Obj(in
10320 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 terp, peer);..if
10330 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 (objc == 2) {..
10340 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 70 65 X509_free(pe
10350 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20 3d er);.. peer =
10360 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 NULL;..}. }
10370 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d else {..objPtr =
10380 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
10390 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0, NULL);. }.
103a0 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d . /* Peer nam
103b0 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 e */. LAPPEND
103c0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
103d0 50 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c Ptr, "peername",
103e0 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 SSL_get0_peerna
103f0 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c me(statePtr->ssl
10400 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 ), -1);. LAPP
10410 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 END_INT(interp,
10420 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22 2c objPtr, "sbits",
10430 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f SSL_get_cipher_
10440 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 bits(statePtr->s
10450 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 sl, NULL));..
10460 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 ciphers = (char
10470 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 *)SSL_get_cipher
10480 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
10490 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
104a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
104b0 20 22 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 "cipher", ciphe
104c0 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a rs, -1);.. /*
104d0 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30 39 Verify the X509
104e0 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72 65 certificate pre
104f0 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 sented by the pe
10500 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e er */. LAPPEN
10510 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
10520 6a 50 74 72 2c 20 22 76 65 72 69 66 79 52 65 73 jPtr, "verifyRes
10530 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 69 ult",..X509_veri
10540 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 fy_cert_error_st
10550 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 ring(SSL_get_ver
10560 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 ify_result(state
10570 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b Ptr->ssl)), -1);
10580 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 .. /* Verify
10590 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 mode */. mode
105a0 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 = SSL_get_verif
105b0 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d y_mode(statePtr-
105c0 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d >ssl);. if (m
105d0 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 ode && SSL_VERIF
105e0 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 Y_NONE) {..LAPPE
105f0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
10600 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f bjPtr, "verifyMo
10610 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 de", "none", -1)
10620 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
10630 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a Tcl_Obj *listObj
10640 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
10650 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 tObj(0, NULL);..
10660 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f if (mode && SSL_
10670 56 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 VERIFY_PEER) {..
10680 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
10690 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
106a0 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c erp, listObjPtr,
106b0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
106c0 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a j("peer", -1));.
106d0 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 .}..if (mode &&
106e0 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f SSL_VERIFY_FAIL_
106f0 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 IF_NO_PEER_CERT)
10700 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
10710 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
10720 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a (interp, listObj
10730 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
10740 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e ngObj("fail if n
10750 6f 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31 o peer cert", -1
10760 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 ));..}..if (mode
10770 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 && SSL_VERIFY_C
10780 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 LIENT_ONCE) {..
10790 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
107a0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
107b0 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 rp, listObjPtr,
107c0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
107d0 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 ("client once",
107e0 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f -1));..}..if (mo
107f0 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 de && SSL_VERIFY
10800 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 _POST_HANDSHAKE)
10810 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
10820 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
10830 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a (interp, listObj
10840 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
10850 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 ngObj("post hand
10860 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d shake", -1));..}
10870 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e ..LAPPEND_OBJ(in
10880 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 terp, objPtr, "v
10890 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 74 erifyMode", list
108a0 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a 20 ObjPtr). }..
108b0 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 /* Verify mod
108c0 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 4c e depth */. L
108d0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
108e0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 p, objPtr, "veri
108f0 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 65 fyDepth", SSL_ge
10900 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 73 t_verify_depth(s
10910 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a tatePtr->ssl));.
10920 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 . /* Report t
10930 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 he selected prot
10940 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 ocol as a result
10950 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 of the negotiat
10960 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 ion */. SSL_g
10970 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 et0_alpn_selecte
10980 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c d(statePtr->ssl,
10990 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a &proto, &len);.
109a0 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
109b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
109c0 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 "alpn", (char *)
109d0 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 proto, (Tcl_Size
109e0 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 ) len);. LAPP
109f0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
10a00 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f objPtr, "protoco
10a10 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 l", SSL_get_vers
10a20 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ion(statePtr->ss
10a30 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a l), -1);.. /*
10a40 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 Valid for non-R
10a50 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 SA signature and
10a60 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 TLS 1.3 */.
10a70 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b if (objc == 2) {
10a80 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f ..res = SSL_get_
10a90 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e peer_signature_n
10aa0 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c id(statePtr->ssl
10ab0 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 , &nid);. } e
10ac0 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c lse {..res = SSL
10ad0 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e _get_signature_n
10ae0 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c id(statePtr->ssl
10af0 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 , &nid);. }.
10b00 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 if (!res) {ni
10b10 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 d = 0;}. LAPP
10b20 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
10b30 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 objPtr, "signatu
10b40 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 reHashAlgorithm"
10b50 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 , OBJ_nid2ln(nid
10b60 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 69 66 20 ), -1);.. if
10b70 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 (objc == 2) {..r
10b80 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 es = SSL_get_pee
10b90 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 r_signature_type
10ba0 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 _nid(statePtr->s
10bb0 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d sl, &nid);. }
10bc0 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 else {..res = S
10bd0 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 SL_get_signature
10be0 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 _type_nid(stateP
10bf0 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a tr->ssl, &nid);.
10c00 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 }. if (!r
10c10 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 es) {nid = 0;}.
10c20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
10c30 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10c40 73 69 67 6e 61 74 75 72 65 54 79 70 65 22 2c 20 signatureType",
10c50 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c OBJ_nid2ln(nid),
10c60 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 -1);.. Tcl_S
10c70 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
10c80 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
10c90 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
10ca0 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
10cf0 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 * ConnectionInf
10d00 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 oObjCmd -- retur
10d10 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 n connection inf
10d20 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a o from OpenSSL..
10d30 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
10d40 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e *.A list of conn
10d50 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a ection info. *.
10d60 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10da0 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
10db0 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e c int Connection
10dc0 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e InfoObjCmd(Clien
10dd0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
10de0 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
10df0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
10e00 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
10e10 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
10e20 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 _Channel chan;..
10e30 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 /* The channel t
10e40 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 o set a mode on
10e50 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 */. State *st
10e60 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 atePtr;../* clie
10e70 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c nt state for ssl
10e80 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 socket */. T
10e90 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 cl_Obj *objPtr,
10ea0 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f *listPtr;. co
10eb0 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 nst SSL *ssl;.
10ec0 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 const SSL_CIPH
10ed0 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 ER *cipher;.
10ee0 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f const SSL_SESSIO
10ef0 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 N *session;.
10f00 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 const EVP_MD *md
10f10 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 ;. (void) cli
10f20 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 entData;.. if
10f30 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 (objc != 2) {..
10f40 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
10f50 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
10f60 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 , "channel");..r
10f70 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
10f80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 ;. }.. cha
10f90 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
10fa0 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 el(interp, Tcl_G
10fb0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
10fc0 6f 62 6a 76 5b 31 5d 2c 20 28 54 63 6c 5f 53 69 objv[1], (Tcl_Si
10fd0 7a 65 20 2a 29 4e 55 4c 4c 29 2c 20 4e 55 4c 4c ze *)NULL), NULL
10fe0 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 );. if (chan
10ff0 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
11000 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
11010 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
11020 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 }.. /* Make
11030 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
11040 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
11050 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
11060 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
11070 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 hannel(chan);.
11080 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 if (Tcl_GetCha
11090 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 nnelType(chan) !
110a0 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 = Tls_ChannelTyp
110b0 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 e()) {..Tcl_Appe
110c0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
110d0 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
110e0 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
110f0 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 lName(chan),..
11100 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 "\": not a TLS
11110 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 channel", NULL)
11120 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 ;..Tcl_SetErrorC
11130 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
11140 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c ", "CONNECTION",
11150 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
11160 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
11170 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 NULL);..return(T
11180 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
11190 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
111a0 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
111b0 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 NULL);.. /*
111c0 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 Connection info
111d0 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 */. statePtr
111e0 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 = (State *)Tcl_G
111f0 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 etChannelInstanc
11200 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 eData(chan);.
11210 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74 72 2d ssl = statePtr-
11220 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 >ssl;. if (ss
11230 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a l != NULL) {../*
11240 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 connection stat
11250 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 e */..LAPPEND_ST
11260 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11270 2c 20 22 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 , "state", SSL_s
11280 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 tate_string_long
11290 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a (ssl), -1);.../*
112a0 20 47 65 74 20 53 4e 49 20 72 65 71 75 65 73 74 Get SNI request
112b0 65 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a ed server name *
112c0 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
112d0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
112e0 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c servername", SSL
112f0 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 _get_servername(
11300 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 ssl, TLSEXT_NAME
11310 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c TYPE_host_name),
11320 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 -1);.../* Get p
11330 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 rotocol */..LAPP
11340 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11350 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f objPtr, "protoco
11360 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 l", SSL_get_vers
11370 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a ion(ssl), -1);..
11380 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 6f ./* Renegotiatio
11390 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 n allowed */..LA
113a0 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
113b0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 p, objPtr, "rene
113c0 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 gotiation_allowe
113d0 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 d", SSL_get_secu
113e0 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e re_renegotiation
113f0 5f 73 75 70 70 6f 72 74 28 28 53 53 4c 20 2a 29 _support((SSL *)
11400 20 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 ssl));.../* Get
11410 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 security level
11420 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 */..LAPPEND_INT(
11430 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11440 22 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 "security_level"
11450 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 , SSL_get_securi
11460 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a ty_level(ssl));.
11470 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 ../* Session inf
11480 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f o */..LAPPEND_BO
11490 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 OL(interp, objPt
114a0 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 r, "session_reus
114b0 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e ed", SSL_session
114c0 5f 72 65 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a _reused(ssl));..
114d0 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69 6e ./* Is server in
114e0 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 fo */..LAPPEND_B
114f0 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
11500 74 72 2c 20 22 69 73 5f 73 65 72 76 65 72 22 2c tr, "is_server",
11510 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 SSL_is_server(s
11520 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 sl));.../* Is DT
11530 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 LS */..LAPPEND_B
11540 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
11550 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 2c 20 53 tr, "is_dtls", S
11560 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 6c 29 29 SL_is_dtls(ssl))
11570 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
11580 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 Cipher info */.
11590 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f cipher = SSL_
115a0 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 get_current_ciph
115b0 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 er(ssl);. if
115c0 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 (cipher != NULL)
115d0 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46 {..char buf[BUF
115e0 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 SIZ] = {0};..int
115f0 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b bits, alg_bits;
11600 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d .../* Cipher nam
11610 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 e */..LAPPEND_ST
11620 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11630 2c 20 22 63 69 70 68 65 72 22 2c 20 53 53 4c 5f , "cipher", SSL_
11640 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 CIPHER_get_name(
11650 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 cipher), -1);...
11660 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 /* RFC name of c
11670 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e ipher */..LAPPEN
11680 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
11690 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 72 64 5f jPtr, "standard_
116a0 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50 48 45 name", SSL_CIPHE
116b0 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 R_standard_name(
116c0 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 cipher), -1);...
116d0 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20 /* OpenSSL name
116e0 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 of cipher */..LA
116f0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11700 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73 , objPtr, "opens
11710 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53 sl_name", OPENSS
11720 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28 53 53 L_cipher_name(SS
11730 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 L_CIPHER_standar
11740 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 29 2c d_name(cipher)),
11750 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 -1);.../* numbe
11760 72 20 6f 66 20 73 65 63 72 65 74 20 62 69 74 73 r of secret bits
11770 20 75 73 65 64 20 66 6f 72 20 63 69 70 68 65 72 used for cipher
11780 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f */..bits = SSL_
11790 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73 28 CIPHER_get_bits(
117a0 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 cipher, &alg_bit
117b0 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 s);..LAPPEND_INT
117c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
117d0 20 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c 20 "secret_bits",
117e0 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f bits);..LAPPEND_
117f0 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
11800 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62 tr, "algorithm_b
11810 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b its", alg_bits);
11820 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 ../* alg_bits is
11830 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63 72 actual key secr
11840 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65 20 et bits. If use
11850 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74 20 bits and secret
11860 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 73 (algorithm) bits
11870 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74 68 65 differ,.. the
11880 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 69 74 rest of the bit
11890 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e 65 s are fixed, i.e
118a0 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 . for limited ex
118b0 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 62 69 port ciphers (bi
118c0 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a ts < 56) */.../*
118d0 20 49 6e 64 69 63 61 74 65 73 20 77 68 69 63 68 Indicates which
118e0 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f SSL/TLS protoco
118f0 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 73 74 20 l version first
11900 64 65 66 69 6e 65 64 20 74 68 65 20 63 69 70 68 defined the ciph
11910 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 er */..LAPPEND_S
11920 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11930 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 r, "min_version"
11940 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 , SSL_CIPHER_get
11950 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29 _version(cipher)
11960 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 , -1);.../* Ciph
11970 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 er NID */..LAPPE
11980 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11990 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 4e 49 bjPtr, "cipherNI
119a0 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f D", (char *)OBJ_
119b0 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 nid2ln(SSL_CIPHE
119c0 52 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 R_get_cipher_nid
119d0 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
119e0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
119f0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 erp, objPtr, "di
11a00 67 65 73 74 4e 49 44 22 2c 20 28 63 68 61 72 20 gestNID", (char
11a10 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c *)OBJ_nid2ln(SSL
11a20 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 69 67 65 _CIPHER_get_dige
11a30 73 74 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c st_nid(cipher)),
11a40 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 -1);..LAPPEND_S
11a50 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11a60 72 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 65 4e r, "keyExchangeN
11a70 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a ID", (char *)OBJ
11a80 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 _nid2ln(SSL_CIPH
11a90 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 ER_get_kx_nid(ci
11aa0 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 pher)), -1);..LA
11ab0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11ac0 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 68 65 , objPtr, "authe
11ad0 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 nticationNID", (
11ae0 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c char *)OBJ_nid2l
11af0 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 n(SSL_CIPHER_get
11b00 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 68 65 72 _auth_nid(cipher
11b10 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 )), -1);.../* me
11b20 73 73 61 67 65 20 61 75 74 68 65 6e 74 69 63 61 ssage authentica
11b30 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 tion code - Ciph
11b40 65 72 20 69 73 20 41 45 41 44 20 28 65 2e 67 2e er is AEAD (e.g.
11b50 20 47 43 4d 20 6f 72 20 43 68 61 43 68 61 32 30 GCM or ChaCha20
11b60 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f /Poly1305) or no
11b70 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 t */../* Authent
11b80 69 63 61 74 65 64 20 45 6e 63 72 79 70 74 69 6f icated Encryptio
11b90 6e 20 77 69 74 68 20 61 73 73 6f 63 69 61 74 65 n with associate
11ba0 64 20 64 61 74 61 20 28 41 45 41 44 29 20 63 68 d data (AEAD) ch
11bb0 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f eck */..LAPPEND_
11bc0 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
11bd0 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 73 5f Ptr, "cipher_is_
11be0 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 aead", SSL_CIPHE
11bf0 52 5f 69 73 5f 61 65 61 64 28 63 69 70 68 65 72 R_is_aead(cipher
11c00 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 ));.../* Digest
11c10 75 73 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 used during the
11c20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b SSL/TLS handshak
11c30 65 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 65 e when using the
11c40 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 cipher. */..md
11c50 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 = SSL_CIPHER_get
11c60 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 _handshake_diges
11c70 74 28 63 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 t(cipher);..LAPP
11c80 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11c90 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 73 68 61 objPtr, "handsha
11ca0 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 63 68 61 ke_digest", (cha
11cb0 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 r *)EVP_MD_name(
11cc0 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 md), -1);.../* G
11cd0 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 et OpenSSL-speci
11ce0 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 fic ID, not IANA
11cf0 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ID */..LAPPEND_
11d00 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
11d10 74 72 2c 20 22 63 69 70 68 65 72 5f 69 64 22 2c tr, "cipher_id",
11d20 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 (int) SSL_CIPHE
11d30 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72 29 R_get_id(cipher)
11d40 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 );.../* Two-byte
11d50 20 49 44 20 75 73 65 64 20 69 6e 20 74 68 65 20 ID used in the
11d60 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 TLS protocol of
11d70 74 68 65 20 67 69 76 65 6e 20 63 69 70 68 65 72 the given cipher
11d80 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 */..LAPPEND_INT
11d90 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11da0 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 "protocol_id",
11db0 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 (int) SSL_CIPHER
11dc0 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 _get_protocol_id
11dd0 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 (cipher));.../*
11de0 54 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 Textual descript
11df0 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 ion of the ciphe
11e00 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 r */..if (SSL_CI
11e10 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e PHER_description
11e20 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 (cipher, buf, si
11e30 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 zeof(buf)) != NU
11e40 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 LL) {.. LAPPE
11e50 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11e60 62 6a 50 74 72 2c 20 22 64 65 73 63 72 69 70 74 bjPtr, "descript
11e70 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a ion", buf, -1);.
11e80 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
11e90 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f Session info */
11ea0 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 . session = S
11eb0 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 SL_get_session(s
11ec0 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 65 73 sl);. if (ses
11ed0 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a sion != NULL) {.
11ee0 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 .const unsigned
11ef0 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 char *ticket;..s
11f00 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 ize_t len2;..uns
11f10 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a igned int ulen;.
11f20 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 .const unsigned
11f30 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 char *session_id
11f40 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 , *proto;..unsig
11f50 6e 65 64 20 63 68 61 72 20 62 75 66 66 65 72 5b ned char buffer[
11f60 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b SSL_MAX_MASTER_K
11f70 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a EY_LENGTH];.../*
11f80 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 Report the sele
11f90 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 cted protocol as
11fa0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 a result of the
11fb0 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f ALPN negotiatio
11fc0 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f n */..SSL_SESSIO
11fd0 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 N_get0_alpn_sele
11fe0 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 cted(session, &p
11ff0 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c roto, &len2);..L
12000 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
12010 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e p, objPtr, "alpn
12020 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 ", (char *) prot
12030 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 o, (Tcl_Size) le
12040 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 n2);.../* Report
12050 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 the selected pr
12060 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 otocol as a resu
12070 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 lt of the NPN ne
12080 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 gotiation */.#if
12090 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c def USE_NPN..SSL
120a0 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f _get0_next_proto
120b0 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 73 6c 2c _negotiated(ssl,
120c0 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b &proto, &ulen);
120d0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
120e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e terp, objPtr, "n
120f0 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 pn", (char *) pr
12100 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 oto, (Tcl_Size)
12110 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 ulen);.#endif...
12120 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73 /* Resumable ses
12130 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 sion */..LAPPEND
12140 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
12150 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 jPtr, "resumable
12160 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 ", SSL_SESSION_i
12170 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73 s_resumable(sess
12180 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 ion));.../* Sess
12190 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 20 28 ion start time (
121a0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 seconds since ep
121b0 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 och) */..LAPPEND
121c0 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 _LONG(interp, ob
121d0 6a 50 74 72 2c 20 22 73 74 61 72 74 5f 74 69 6d jPtr, "start_tim
121e0 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f e", SSL_SESSION_
121f0 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e get_time(session
12200 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 ));.../* Timeout
12210 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 value - SSL_CTX
12220 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e _get_timeout (in
12230 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 seconds) */..LA
12240 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 PPEND_LONG(inter
12250 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 p, objPtr, "time
12260 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f out", SSL_SESSIO
12270 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 N_get_timeout(se
12280 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 ssion));.../* Se
12290 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 ssion id - TLSv1
122a0 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c .2 and below onl
122b0 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 y */..session_id
122c0 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
122d0 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 et_id(session, &
122e0 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f ulen);..LAPPEND_
122f0 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f BARRAY(interp, o
12300 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f bjPtr, "session_
12310 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c id", session_id,
12320 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e (Tcl_Size) ulen
12330 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
12340 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 context */..sess
12350 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 ion_id = SSL_SES
12360 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e SION_get0_id_con
12370 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 text(session, &u
12380 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 len);..LAPPEND_B
12390 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 ARRAY(interp, ob
123a0 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 jPtr, "session_c
123b0 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 69 6f 6e ontext", session
123c0 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 _id, (Tcl_Size)
123d0 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 ulen);.../* Sess
123e0 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 ion ticket - cli
123f0 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c ent only */..SSL
12400 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 _SESSION_get0_ti
12410 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 cket(session, &t
12420 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 icket, &len2);..
12430 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 LAPPEND_BARRAY(i
12440 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12450 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c session_ticket",
12460 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 ticket, (Tcl_Si
12470 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 ze) len2);.../*
12480 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c Session ticket l
12490 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28 69 6e ifetime hint (in
124a0 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 seconds) */..LA
124b0 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 PPEND_LONG(inter
124c0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 p, objPtr, "life
124d0 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 time", SSL_SESSI
124e0 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 ON_get_ticket_li
124f0 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 fetime_hint(sess
12500 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b ion));.../* Tick
12510 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a 23 et app data */.#
12520 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
12530 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
12540 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f 53 45 53 000000L..SSL_SES
12550 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 SION_get0_ticket
12560 5f 61 70 70 64 61 74 61 28 28 53 53 4c 5f 53 45 _appdata((SSL_SE
12570 53 53 49 4f 4e 20 2a 29 20 73 65 73 73 69 6f 6e SSION *) session
12580 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 , &ticket, &len2
12590 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 );..LAPPEND_BARR
125a0 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 AY(interp, objPt
125b0 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 r, "ticket_app_d
125c0 61 74 61 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 ata", ticket, (T
125d0 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a cl_Size) len2);.
125e0 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47 65 74 20 #endif.../* Get
125f0 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c master key */..l
12600 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f en2 = SSL_SESSIO
12610 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 N_get_master_key
12620 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 (session, buffer
12630 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 , SSL_MAX_MASTER
12640 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c _KEY_LENGTH);..L
12650 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e APPEND_BARRAY(in
12660 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d terp, objPtr, "m
12670 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 aster_key", buff
12680 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c er, (Tcl_Size) l
12690 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 en2);.../* Compr
126a0 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e ession id */..un
126b0 73 69 67 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 signed int id =
126c0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
126d0 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 65 73 73 compress_id(sess
126e0 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 ion);..LAPPEND_S
126f0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
12700 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f r, "compression_
12710 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 id", id == 1 ? "
12720 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 zlib" : "none",
12730 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 -1);. }..
12740 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 /* Compression i
12750 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 nfo */. if (s
12760 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 sl != NULL) {.#i
12770 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f fdef HAVE_SSL_CO
12780 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 MPRESSION..const
12790 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f COMP_METHOD *co
127a0 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 mp, *expn;..comp
127b0 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 = SSL_get_curre
127c0 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 nt_compression(s
127d0 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c sl);..expn = SSL
127e0 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 _get_current_exp
127f0 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c ansion(ssl);...L
12800 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
12810 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 p, objPtr, "comp
12820 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f ression", comp ?
12830 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 SSL_COMP_get_na
12840 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 me(comp) : "none
12850 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 ", -1);..LAPPEND
12860 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12870 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 Ptr, "expansion"
12880 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d , expn ? SSL_COM
12890 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 P_get_name(expn)
128a0 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a : "none", -1);.
128b0 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 #else..LAPPEND_S
128c0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
128d0 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 r, "compression"
128e0 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 , "none", -1);..
128f0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
12900 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 rp, objPtr, "exp
12910 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c ansion", "none",
12920 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 -1);.#endif.
12930 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 }.. /* Serve
12940 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a r info */. {.
12950 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c .long mode = SSL
12960 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e _CTX_get_session
12970 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 _cache_mode(stat
12980 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 ePtr->ctx);..cha
12990 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f r *msg;...if (mo
129a0 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 de & SSL_SESS_CA
129b0 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 CHE_OFF) {..
129c0 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 msg = "off";..}
129d0 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 else if (mode &
129e0 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 SSL_SESS_CACHE_C
129f0 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 LIENT) {.. ms
12a00 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d g = "client";..}
12a10 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 else if (mode &
12a20 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f SSL_SESS_CACHE_
12a30 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 6d SERVER) {.. m
12a40 73 67 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 sg = "server";..
12a50 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 } else if (mode
12a60 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
12a70 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 _BOTH) {.. ms
12a80 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 g = "both";..} e
12a90 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d lse {.. msg =
12aa0 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 "unknown";..}..
12ab0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
12ac0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 rp, objPtr, "ses
12ad0 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 sion_cache_mode"
12ae0 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 , msg, -1);.
12af0 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 }.. /* CA Lis
12b00 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e t */. /* IF n
12b10 6f 74 20 61 20 73 65 72 76 65 72 2c 20 73 61 6d ot a server, sam
12b20 65 20 61 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 e as SSL_get0_pe
12b30 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 er_CA_list. If s
12b40 65 72 76 65 72 20 73 61 6d 65 20 61 73 20 53 53 erver same as SS
12b50 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 L_CTX_get_client
12b60 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 _CA_list */.
12b70 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 listPtr = Tcl_Ne
12b80 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
12b90 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 );. STACK_OF(
12ba0 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c X509_NAME) *ca_l
12bb0 69 73 74 3b 0a 20 20 20 20 69 66 20 28 28 63 61 ist;. if ((ca
12bc0 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f _list = SSL_get_
12bd0 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 client_CA_list(s
12be0 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a sl)) != NULL) {.
12bf0 09 63 68 61 72 20 62 75 66 66 65 72 5b 42 55 46 .char buffer[BUF
12c00 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 SIZ];..for (int
12c10 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 i = 0; i < sk_X5
12c20 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 09_NAME_num(ca_l
12c30 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 ist); i++) {..
12c40 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d X509_NAME *nam
12c50 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 e = sk_X509_NAME
12c60 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 _value(ca_list,
12c70 69 29 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 6d i);.. if (nam
12c80 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 e) {...X509_NAME
12c90 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 _oneline(name, b
12ca0 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a uffer, BUFSIZ);.
12cb0 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
12cc0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
12cd0 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f p, listPtr, Tcl_
12ce0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 NewStringObj(buf
12cf0 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 fer, -1));..
12d00 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c }..}. }. L
12d10 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 APPEND_OBJ(inter
12d20 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 p, objPtr, "caLi
12d30 73 74 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 st", listPtr);.
12d40 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 LAPPEND_INT(i
12d50 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12d60 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b caListCount", sk
12d70 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 _X509_NAME_num(c
12d80 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 a_list));.. T
12d90 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
12da0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
12db0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
12dc0 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
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 2d 2d 2d 2d 2d ----------------
12df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e10 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 . *. * VersionOb
12e20 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 jCmd -- return v
12e30 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 ersion string fr
12e40 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 om OpenSSL.. *.
12e50 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
12e60 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
12e70 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
12e80 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
12e90 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
12ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
12ee0 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f tatic int.Versio
12ef0 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 nObjCmd(ClientDa
12f00 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
12f10 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
12f20 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
12f30 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
12f40 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []) {. Tcl_Ob
12f50 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 28 j *objPtr;. (
12f60 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
12f70 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 6f 62 6a ;. (void) obj
12f80 63 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 6f 62 c;. (void) ob
12f90 6a 76 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 jv;.. dprintf
12fa0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
12fb0 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 objPtr = Tcl_Ne
12fc0 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 wStringObj(OPENS
12fd0 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c SL_VERSION_TEXT,
12fe0 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 -1);. Tcl_Se
12ff0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
13000 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 p, objPtr);..
13010 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
13020 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
13070 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d * MiscObjCmd --
13080 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 misc commands.
13090 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
130a0 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
130b0 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
130c0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
130d0 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
130e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
130f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
13120 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 /.static int.Mis
13130 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 cObjCmd(ClientDa
13140 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
13150 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
13160 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
13170 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
13180 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 []) {. static
13190 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d const char *com
131a0 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 mands [] = { "re
131b0 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55 q", "strreq", NU
131c0 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 LL };. enum c
131d0 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 ommand { C_REQ,
131e0 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d C_STRREQ, C_DUMM
131f0 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a Y };. Tcl_Siz
13200 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69 e cmd;. int i
13210 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20 62 sStr;. char b
13220 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 20 20 uffer[16384];.
13230 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 (void) clientD
13240 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ata;.. dprint
13250 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
13260 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 if (objc < 2)
13270 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
13280 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
13290 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 bjv, "subcommand
132a0 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 ?args?");..retu
132b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
132c0 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f }. if (Tcl_
132d0 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 GetIndexFromObj(
132e0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c interp, objv[1],
132f0 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d commands, "comm
13300 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 and", 0, &cmd) !
13310 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 = TCL_OK) {..ret
13320 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
13330 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c }.. ERR_cl
13340 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 ear_error();..
13350 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d isStr = (cmd =
13360 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 = C_STRREQ);.
13370 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 switch ((enum c
13380 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 ommand) cmd) {..
13390 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 case C_REQ:..cas
133a0 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 e C_STRREQ: {..
133b0 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 EVP_PKEY *pke
133c0 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 y=NULL;.. X50
133d0 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 9 *cert=NULL;..
133e0 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 X509_NAME *na
133f0 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 me=NULL;.. Tc
13400 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 l_Obj **listv;..
13410 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 Tcl_Size lis
13420 74 63 3b 0a 09 20 20 20 20 69 6e 74 20 69 3b 0a tc;.. int i;.
13430 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e .. BIO *out=N
13440 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 ULL;... char
13450 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 *k_C="",*k_ST=""
13460 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 ,*k_L="",*k_O=""
13470 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d ,*k_OU="",*k_CN=
13480 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a "",*k_Email="";.
13490 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 . char *keyou
134a0 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a t,*pemout,*str;.
134b0 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 . int keysize
134c0 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 ,serial=0,days=3
134d0 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 65;..#if OPENSSL
134e0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
134f0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 < 0x30000000L..
13500 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d BIGNUM *bne =
13510 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 NULL;.. RSA
13520 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c *rsa = NULL;.#el
13530 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 se.. EVP_PKEY
13540 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c _CTX *ctx = NULL
13550 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 ;.#endif... i
13560 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 f ((objc<5) || (
13570 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c objc>6)) {...Tcl
13580 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
13590 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 terp, 2, objv, "
135a0 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 keysize keyfile
135b0 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 certfile ?info?"
135c0 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
135d0 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 ERROR;.. }...
135e0 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 if (Tcl_GetI
135f0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
13600 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 , objv[2], &keys
13610 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ize) != TCL_OK)
13620 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {...return TCL_E
13630 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 RROR;.. }..
13640 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 keyout=Tcl_Get
13650 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b String(objv[3]);
13660 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c .. pemout=Tcl
13670 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
13680 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 4]);.. if (is
13690 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 Str) {...Tcl_Set
136a0 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 Var(interp,keyou
136b0 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 t,"",0);...Tcl_S
136c0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d etVar(interp,pem
136d0 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 out,"",0);..
136e0 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 }... if (objc
136f0 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c >=6) {...if (Tcl
13700 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 _ListObjGetEleme
13710 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 nts(interp, objv
13720 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 [5], &listc, &li
13730 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 stv) != TCL_OK)
13740 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 {... return T
13750 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 CL_ERROR;...}...
13760 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 .if ((listc%2) !
13770 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c = 0) {... Tcl
13780 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
13790 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c p,"Information l
137a0 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 ist must have ev
137b0 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 en number of arg
137c0 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 uments",NULL);..
137d0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
137e0 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 ERROR;...}...for
137f0 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 (i=0; i<listc;
13800 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 i+=2) {... st
13810 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 r=Tcl_GetString(
13820 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 listv[i]);...
13830 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
13840 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 "days")==0) {...
13850 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 .if (Tcl_GetIntF
13860 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 romObj(interp,li
13870 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 stv[i+1],&days)!
13880 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 =TCL_OK)....
13890 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
138a0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
138b0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 f (strcmp(str,"s
138c0 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 erial")==0) {...
138d0 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 .if (Tcl_GetIntF
138e0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 romObj(interp,li
138f0 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c stv[i+1],&serial
13900 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 )!=TCL_OK)....
13910 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
13920 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 OR;... } else
13930 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
13940 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "C")==0) {....k_
13950 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 C=Tcl_GetString(
13960 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
13970 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
13980 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d rcmp(str,"ST")==
13990 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 0) {....k_ST=Tcl
139a0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
139b0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
139c0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
139d0 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 str,"L")==0) {..
139e0 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 ..k_L=Tcl_GetStr
139f0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
13a00 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
13a10 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 (strcmp(str,"O"
13a20 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 )==0) {....k_O=T
13a30 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
13a40 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
13a50 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
13a60 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 p(str,"OU")==0)
13a70 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 {....k_OU=Tcl_Ge
13a80 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
13a90 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
13aa0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
13ab0 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 ,"CN")==0) {....
13ac0 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 k_CN=Tcl_GetStri
13ad0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
13ae0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
13af0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 (strcmp(str,"Ema
13b00 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f il")==0) {....k_
13b10 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 Email=Tcl_GetStr
13b20 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
13b30 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ... } else {.
13b40 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
13b50 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e (interp,"Unknown
13b60 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c parameter",NULL
13b70 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c );....return TCL
13b80 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a _ERROR;... }.
13b90 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 ..}.. }..#if
13ba0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
13bb0 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
13bc0 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 000L.. bne =
13bd0 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 BN_new();.. r
13be0 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a sa = RSA_new();.
13bf0 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f . pkey = EVP_
13c00 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 PKEY_new();..
13c10 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c if (bne == NULL
13c20 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 || rsa == NULL
13c30 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 || pkey == NULL
13c40 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 || !BN_set_word(
13c50 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 bne,RSA_F4) ||..
13c60 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b .!RSA_generate_k
13c70 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69 ey_ex(rsa, keysi
13c80 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c ze, bne, NULL) |
13c90 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 | !EVP_PKEY_assi
13ca0 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61 gn_RSA(pkey, rsa
13cb0 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f )) {...EVP_PKEY_
13cc0 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a free(pkey);.../*
13cd0 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20 RSA_free(rsa);
13ce0 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45 freed by EVP_PKE
13cf0 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 Y_free */...BN_f
13d00 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a ree(bne);.#else.
13d10 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f . pkey = EVP_
13d20 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 RSA_gen((unsigne
13d30 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b d int) keysize);
13d40 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f .. ctx = EVP_
13d50 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 PKEY_CTX_new(pke
13d60 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 y,NULL);.. if
13d70 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c (pkey == NULL |
13d80 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c | ctx == NULL ||
13d90 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 !EVP_PKEY_keyge
13da0 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 n_init(ctx) ||..
13db0 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 .!EVP_PKEY_CTX_s
13dc0 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 et_rsa_keygen_bi
13dd0 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 ts(ctx, keysize)
13de0 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 || !EVP_PKEY_ke
13df0 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 ygen(ctx, &pkey)
13e00 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 ) {...EVP_PKEY_f
13e10 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 ree(pkey);...EVP
13e20 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63 _PKEY_CTX_free(c
13e30 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 tx);.#endif...Tc
13e40 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
13e50 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 rp,"Error genera
13e60 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79 ting private key
13e70 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 ",NULL);...retur
13e80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
13e90 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 } else {...if
13ea0 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 (isStr) {...
13eb0 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f out=BIO_new(BIO_
13ec0 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 s_mem());...
13ed0 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 PEM_write_bio_Pr
13ee0 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 ivateKey(out,pke
13ef0 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 y,NULL,NULL,0,NU
13f00 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 LL,NULL);...
13f10 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 i=BIO_read(out,b
13f20 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 uffer,sizeof(buf
13f30 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 fer)-1);... i
13f40 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a =(i<0) ? 0 : i;.
13f50 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d .. buffer[i]=
13f60 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f '\0';... Tcl_
13f70 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 SetVar(interp,ke
13f80 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a yout,buffer,0);.
13f90 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 .. BIO_flush(
13fa0 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f out);... BIO_
13fb0 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 free(out);...} e
13fc0 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d lse {... out=
13fd0 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 BIO_new(BIO_s_fi
13fe0 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f le());... BIO
13ff0 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 _write_filename(
14000 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 out,keyout);...
14010 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
14020 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c _PrivateKey(out,
14030 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 pkey,NULL,NULL,0
14040 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 ,NULL,NULL);...
14050 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f /* PEM_write_
14060 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65 bio_RSAPrivateKe
14070 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c y(out, rsa, NULL
14080 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c , NULL, 0, NULL,
14090 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 NULL); */...
140a0 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 BIO_free_all(ou
140b0 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 t);.. .}....if (
140c0 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 (cert=X509_new()
140d0 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 )==NULL) {...
140e0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 Tcl_SetResult(i
140f0 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e nterp,"Error gen
14100 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 69 63 erating certific
14110 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c ate request",NUL
14120 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b L);... EVP_PK
14130 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 EY_free(pkey);.#
14140 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
14150 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
14160 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 000000L... BN
14170 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 _free(bne);.#end
14180 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 6e 28 if... return(
14190 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a TCL_ERROR);...}.
141a0 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72 73 ...X509_set_vers
141b0 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 ion(cert,2);...A
141c0 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 SN1_INTEGER_set(
141d0 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e X509_get_serialN
141e0 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72 69 umber(cert),seri
141f0 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 al);...X509_gmti
14200 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d me_adj(X509_getm
14210 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 _notBefore(cert)
14220 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 ,0);...X509_gmti
14230 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d me_adj(X509_getm
14240 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c _notAfter(cert),
14250 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 (long)60*60*24*d
14260 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 ays);...X509_set
14270 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 _pubkey(cert,pke
14280 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 y);....name=X509
14290 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d _get_subject_nam
142a0 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 e(cert);....X509
142b0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
142c0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c by_txt(name,"C",
142d0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
142e0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
142f0 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 har *) k_C, -1,
14300 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
14310 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
14320 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 _txt(name,"ST",
14330 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
14340 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
14350 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 ar *) k_ST, -1,
14360 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
14370 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
14380 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d _txt(name,"L", M
14390 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
143a0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
143b0 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 r *) k_L, -1, -1
143c0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
143d0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
143e0 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 xt(name,"O", MBS
143f0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
14400 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
14410 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 *) k_O, -1, -1,
14420 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
14430 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
14440 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 (name,"OU", MBST
14450 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
14460 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
14470 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 ) k_OU, -1, -1,
14480 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
14490 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
144a0 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 (name,"CN", MBST
144b0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
144c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
144d0 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 ) k_CN, -1, -1,
144e0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
144f0 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
14500 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d (name,"Email", M
14510 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
14520 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
14530 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 r *) k_Email, -1
14540 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 , -1, 0);....X50
14550 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 9_set_subject_na
14560 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a me(cert,name);..
14570 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e ..if (!X509_sign
14580 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 (cert,pkey,EVP_s
14590 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20 20 ha256())) {...
145a0 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 X509_free(cert
145b0 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 );... EVP_PKE
145c0 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 Y_free(pkey);.#i
145d0 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
145e0 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
145f0 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 00000L... BN_
14600 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 free(bne);.#endi
14610 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 f... Tcl_SetR
14620 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 esult(interp,"Er
14630 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72 74 ror signing cert
14640 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a ificate",NULL);.
14650 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
14660 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 _ERROR;...}....i
14670 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 f (isStr) {...
14680 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 out=BIO_new(BI
14690 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 O_s_mem());...
146a0 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f PEM_write_bio_
146b0 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a X509(out,cert);.
146c0 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 .. i=BIO_read
146d0 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 (out,buffer,size
146e0 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 of(buffer)-1);..
146f0 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 . i=(i<0) ? 0
14700 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 : i;... buff
14710 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 er[i]='\0';...
14720 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 Tcl_SetVar(int
14730 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 erp,pemout,buffe
14740 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f r,0);... BIO_
14750 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 flush(out);...
14760 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b BIO_free(out);
14770 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 ...} else {...
14780 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 out=BIO_new(BI
14790 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 O_s_file());...
147a0 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c BIO_write_fil
147b0 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 ename(out,pemout
147c0 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 );... PEM_wri
147d0 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c te_bio_X509(out,
147e0 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49 4f cert);... BIO
147f0 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a _free_all(out);.
14800 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 ..}....X509_free
14810 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b (cert);...EVP_PK
14820 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 EY_free(pkey);.#
14830 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
14840 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
14850 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 000000L...BN_fre
14860 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 e(bne);.#endif..
14870 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b }..}..break;
14880 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 . default:..b
14890 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 reak;. }.
148a0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
148b0 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .../************
148c0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 ********/./* Ini
148d0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f t */
148e0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
148f0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d ----------------
14920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14940 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 -. *. * Tls_Free
14950 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 --. *. *.This p
14960 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 rocedure cleans
14970 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f up when a SSL so
14980 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e cket based chann
14990 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 el. *.is closed
149a0 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 and its referenc
149b0 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 e count falls be
149c0 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 low 1. *. * Resu
149d0 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a lts:. *.none. *.
149e0 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
149f0 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 . *.Frees all th
14a00 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d e state. *. *---
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 2d 2d 2d 2d 2d ----------------
14a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a50 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 . */.void.Tls_Fr
14a60 65 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 ee(char *blockPt
14a70 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a r) {. State *
14a80 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
14a90 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 e *)blockPtr;..
14aa0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
14ab0 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 ed");.. Tls_C
14ac0 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a lean(statePtr);.
14ad0 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b ckfree(block
14ae0 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Ptr);.}.../*. *-
14af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b30 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 --. *. * Tls_Cle
14b40 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 an --. *. *.This
14b50 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e procedure clean
14b60 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 s up when a SSL
14b70 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 socket based cha
14b80 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 nnel. *.is close
14b90 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 d and its refere
14ba0 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 nce count falls
14bb0 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 below 1. This s
14bc0 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c hould. *.be call
14bd0 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 ed synchronously
14be0 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f by the ClosePro
14bf0 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a c, not in the. *
14c00 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 .EventuallyFree
14c10 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 callback.. *. *
14c20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 Results:. *.none
14c30 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
14c40 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c cts:. *.Frees al
14c50 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 l the state. *.
14c60 2a 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 2d ----------------
14c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ca0 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c ----. */.void Tl
14cb0 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 s_Clean(State *s
14cc0 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 tatePtr) {. d
14cd0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
14ce0 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
14cf0 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 we're assuming
14d00 68 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20 here that we're
14d10 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a single-threaded.
14d20 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 */. if (
14d30 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
14d40 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b != (Tcl_TimerTok
14d50 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c en) NULL) {..Tcl
14d60 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 _DeleteTimerHand
14d70 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 ler(statePtr->ti
14d80 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d mer);..statePtr-
14d90 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 >timer = NULL;.
14da0 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 }.. if (st
14db0 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 atePtr->protos)
14dc0 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65 50 {..ckfree(stateP
14dd0 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 tr->protos);..st
14de0 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d atePtr->protos =
14df0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
14e00 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62 if (statePtr->b
14e10 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 io) {../* This w
14e20 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 ill call SSL_shu
14e30 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30 tdown. Bug 14140
14e40 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 45 */..dprintf("
14e50 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 BIO_free_all(%p)
14e60 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ", statePtr->bio
14e70 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c );..BIO_free_all
14e80 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b (statePtr->bio);
14e90 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 ..statePtr->bio
14ea0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
14eb0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
14ec0 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 ssl) {..dprintf(
14ed0 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 "SSL_free(%p)",
14ee0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
14ef0 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 .SSL_free(stateP
14f00 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 tr->ssl);..state
14f10 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b Ptr->ssl = NULL;
14f20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
14f30 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a tatePtr->ctx) {.
14f40 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 .SSL_CTX_free(st
14f50 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 atePtr->ctx);..s
14f60 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e tatePtr->ctx = N
14f70 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
14f80 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
14f90 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 lback) {..Tcl_De
14fa0 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
14fb0 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
14fc0 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 .statePtr->callb
14fd0 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ack = NULL;.
14fe0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
14ff0 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a tr->password) {.
15000 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
15010 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 t(statePtr->pass
15020 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 word);..statePtr
15030 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c ->password = NUL
15040 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
15050 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 (statePtr->vcmd)
15060 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 {..Tcl_DecrRefC
15070 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 ount(statePtr->v
15080 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d cmd);..statePtr-
15090 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 >vcmd = NULL;.
150a0 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 }.. dprintf
150b0 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d ("Returning");.}
150c0 0a 0c 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 ...#if TCL_MAJOR
150d0 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23 64 65 _VERSION > 8.#de
150e0 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e fine MIN_VERSION
150f0 20 22 39 2e 30 22 0a 23 65 6c 73 65 0a 23 64 65 "9.0".#else.#de
15100 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e fine MIN_VERSION
15110 20 22 38 2e 35 22 0a 23 65 6e 64 69 66 0a 0a 2f "8.5".#endif../
15120 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15160 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
15170 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 s_Init --. *. *.
15180 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 This is a packag
15190 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e e initialization
151a0 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 procedure, whic
151b0 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 h is called. *.b
151c0 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 y Tcl when this
151d0 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 package is to be
151e0 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 added to an int
151f0 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 erpreter.. *. *
15200 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f Results: Ssl co
15210 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 nfigured and loa
15220 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ded. *. * Side e
15230 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 ffects:. *. crea
15240 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 te the ssl comma
15250 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 nd, initialize s
15260 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a sl context. *. *
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 2d 2d ----------------
15290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
152a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
152b0 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 ---. */.DLLEXPOR
152c0 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 T int Tls_Init(T
152d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
152e0 70 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 p) {. const c
152f0 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 har tlsTclInitSc
15300 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c ript[] = {.#incl
15310 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a ude "tls.tcl.h".
15320 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 .0x00. };..
15330 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
15340 64 22 29 3b 0a 0a 23 69 66 64 65 66 20 55 53 45 d");..#ifdef USE
15350 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 20 69 _TCL_STUBS. i
15360 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 f (Tcl_InitStubs
15370 28 69 6e 74 65 72 70 2c 20 4d 49 4e 5f 56 45 52 (interp, MIN_VER
15380 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c SION, 0) == NULL
15390 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
153a0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e ERROR;. }.#en
153b0 64 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c 5f dif. if (Tcl_
153c0 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 PkgRequire(inter
153d0 70 2c 20 22 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 p, "Tcl", MIN_VE
153e0 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c RSION, 0) == NUL
153f0 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
15400 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
15410 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 if (TlsLibIni
15420 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 t(0) != TCL_OK)
15430 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
15440 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 ult(interp, "cou
15450 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a ld not initializ
15460 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 e SSL library",
15470 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
15480 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
15490 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 R;. }.. Tc
154a0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
154b0 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
154c0 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 65 :ciphers", Ciphe
154d0 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e rsObjCmd, (Clien
154e0 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 tData) NULL, (Tc
154f0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
15500 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
15510 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
15520 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
15530 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f :connection", Co
15540 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 nnectionInfoObjC
15550 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
15560 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 NULL, (Tcl_CmdD
15570 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
15580 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
15590 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
155a0 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 erp, "tls::hands
155b0 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 hake", Handshake
155c0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
155d0 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f ata) NULL, (Tcl_
155e0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
155f0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
15600 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
15610 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 (interp, "tls::i
15620 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 mport", ImportOb
15630 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
15640 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d a) NULL, (Tcl_Cm
15650 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
15660 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
15670 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
15680 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 nterp, "tls::uni
15690 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 mport", Unimport
156a0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
156b0 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f ata) NULL, (Tcl_
156c0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
156d0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
156e0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
156f0 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 (interp, "tls::s
15700 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 tatus", StatusOb
15710 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
15720 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d a) NULL, (Tcl_Cm
15730 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
15740 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
15750 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
15760 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 nterp, "tls::ver
15770 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 sion", VersionOb
15780 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
15790 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d a) NULL, (Tcl_Cm
157a0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
157b0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
157c0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
157d0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 nterp, "tls::mis
157e0 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 c", MiscObjCmd,
157f0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c (ClientData) NUL
15800 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 L, (Tcl_CmdDelet
15810 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
15820 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
15830 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
15840 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 "tls::protocols
15850 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 ", ProtocolsObjC
15860 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
15870 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 NULL, (Tcl_CmdD
15880 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
15890 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 L);.. if (int
158a0 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c erp) {..Tcl_Eval
158b0 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 (interp, tlsTclI
158c0 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20 20 20 nitScript);.
158d0 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 }.. return Tc
158e0 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 l_PkgProvide(int
158f0 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d erp, PACKAGE_NAM
15900 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 E, PACKAGE_VERSI
15910 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d ON);.}../*. *---
15920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15950 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 ---*. *. *.Tls_S
15960 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a afeInit --. *. *
15970 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .---------------
15980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159a0 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 -*. *.Standard p
159b0 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65 rocedure require
159c0 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 d by 'load'.. *.
159d0 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 Initializes this
159e0 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 extension for a
159f0 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 safe interprete
15a00 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d r.. *.----------
15a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a30 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 ------*. *. *.Si
15a40 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 de effects:. *..
15a50 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 As of 'Tls_Init'
15a60 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 . *. *.Result:.
15a70 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *..A standard Tc
15a80 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a l error code.. *
15a90 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
15aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 ---------*. */.D
15ad0 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 LLEXPORT int Tls
15ae0 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e _SafeInit(Tcl_In
15af0 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a terp *interp) {.
15b00 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
15b10 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 led");. retur
15b20 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 n(Tls_Init(inter
15b30 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d p));.}../*. *---
15b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b70 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 ---*. *. *.TlsLi
15b80 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d bInit --. *. *.-
15b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
15bc0 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 . *.Initializes
15bd0 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 SSL library once
15be0 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e per application
15bf0 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.------------
15c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c20 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 ----*. *. *.Side
15c30 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e effects:. *..in
15c40 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 itializes SSL li
15c50 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 brary. *. *.Resu
15c60 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a lt:. *..none. *.
15c70 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
15c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ca0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 --------*. */.st
15cb0 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 atic int TlsLibI
15cc0 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 nit(int uninitia
15cd0 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 lize) {. stat
15ce0 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a ic int initializ
15cf0 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 ed = 0;. int
15d00 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b status = TCL_OK;
15d10 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
15d20 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
15d30 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
15d40 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 EADS). size_t
15d50 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 num_locks;.#end
15d60 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e if.. if (unin
15d70 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 itialize) {..if
15d80 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b (!initialized) {
15d90 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 .. dprintf("A
15da0 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 sked to uninitia
15db0 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 lize, but we are
15dc0 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 not initialized
15dd0 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e ");... return
15de0 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 (TCL_OK);..}...d
15df0 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f printf("Asked to
15e00 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b uninitialize");
15e10 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ..#if defined(OP
15e20 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
15e30 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
15e40 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 READS)..Tcl_Mute
15e50 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b xLock(&init_mx);
15e60 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a ...if (locks) {.
15e70 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 . free(locks)
15e80 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e ;.. locks = N
15e90 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 ULL;.. locksC
15ea0 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e ount = 0;..}.#en
15eb0 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 dif..initialized
15ec0 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e = 0;..#if defin
15ed0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
15ee0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
15ef0 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c CL_THREADS)..Tcl
15f00 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e _MutexUnlock(&in
15f10 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a it_mx);.#endif..
15f20 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b .return(TCL_OK);
15f30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
15f40 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
15f50 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c dprintf("Called,
15f60 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 but using cache
15f70 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 d value");..retu
15f80 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20 20 rn(status);.
15f90 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 }.. dprintf("
15fa0 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 Called");..#if d
15fb0 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
15fc0 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
15fd0 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
15fe0 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 Tcl_MutexLoc
15ff0 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e k(&init_mx);.#en
16000 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 dif. initiali
16010 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 zed = 1;..#if de
16020 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
16030 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
16040 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 d(TCL_THREADS).
16050 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 num_locks = 1
16060 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 ;. locksCount
16070 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 = (int) num_loc
16080 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 ks;. locks =
16090 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c malloc(sizeof(*l
160a0 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b ocks) * num_lock
160b0 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c s);. memset(l
160c0 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 ocks, 0, sizeof(
160d0 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f *locks) * num_lo
160e0 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 cks);.#endif..
160f0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 /* Initialize
16100 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 BOTH libcrypto a
16110 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 nd libssl. */.
16120 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 OPENSSL_init_s
16130 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f sl(OPENSSL_INIT_
16140 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 LOAD_SSL_STRINGS
16150 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f | OPENSSL_INIT_
16160 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 LOAD_CRYPTO_STRI
16170 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 NGS..| OPENSSL_I
16180 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 NIT_ADD_ALL_CIPH
16190 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e ERS | OPENSSL_IN
161a0 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 IT_ADD_ALL_DIGES
161b0 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 TS, NULL);..
161c0 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c BIO_new_tcl(NULL
161d0 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 , 0);..#if 0.
161e0 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 /*. * XXX:T
161f0 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 ODO: Remove this
16200 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63 code and replac
16210 65 20 69 74 20 77 69 74 68 20 61 20 63 68 65 63 e it with a chec
16220 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f k. * for eno
16230 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 ugh entropy and
16240 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 do not try to cr
16250 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 eate our own.
16260 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74 * terrible ent
16270 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 ropy. */.
16280 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20 /*. * Seed
16290 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 the random numbe
162a0 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 r generator in t
162b0 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a he SSL library,.
162c0 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65 * using the
162d0 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 do/while constr
162e0 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 uct because of t
162f0 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 he bug note in t
16300 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 he. * OpenSS
16310 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f L FAQ at http://
16320 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f www.openssl.org/
16330 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c support/faq.html
16340 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 #USER1. *.
16350 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66 * The crux of
16360 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 the problem is
16370 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64 that Solaris 7 d
16380 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 oes not have a.
16390 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f * /dev/rando
163a0 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f m or /dev/urando
163b0 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 63 m device so it c
163c0 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f annot gather eno
163d0 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f ugh. * entro
163e0 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 py from the RAND
163f0 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53 _seed() when TLS
16400 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 initializes and
16410 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20 refuses. *
16420 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45 to go further. E
16430 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 arlier versions
16440 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 of OpenSSL carri
16450 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 ed on regardless
16460 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 .. */. sr
16470 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e and((unsigned in
16480 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 t) time((time_t
16490 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 *) NULL));. d
164a0 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b o {..for (i = 0;
164b0 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a i < 16; i++) {.
164c0 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d . rnd_seed[i]
164d0 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 32 = 1 + (char) (2
164e0 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 55.0 * rand()/(R
164f0 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 AND_MAX+1.0));..
16500 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 }..RAND_seed(rnd
16510 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e _seed, sizeof(rn
16520 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 d_seed));. }
16530 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 while (RAND_stat
16540 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 us() != 1);.#end
16550 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 if..#if defined(
16560 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
16570 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
16580 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 THREADS)..Tcl_Mu
16590 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f texUnlock(&init_
165a0 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 mx);.#endif..
165b0 20 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b return(status);
165c0 0a 7d 0a .}.